aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2013-07-26 14:08:15 +0200
committerMattias Andrée <maandree@operamail.com>2013-07-26 14:08:15 +0200
commit7d19c32e09bba5bcb43a28fbff4f3ef9c35a669c (patch)
tree4cd96bb8ee89486bfd46bb353b75555b3bae8563 /src
parentmove tree stuff into module trees (diff)
downloadpytagomacs-7d19c32e09bba5bcb43a28fbff4f3ef9c35a669c.tar.gz
pytagomacs-7d19c32e09bba5bcb43a28fbff4f3ef9c35a669c.tar.bz2
pytagomacs-7d19c32e09bba5bcb43a28fbff4f3ef9c35a669c.tar.xz
misc
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
-rwxr-xr-xsrc/featherweight.py13
-rw-r--r--src/trees.py177
2 files changed, 102 insertions, 88 deletions
diff --git a/src/featherweight.py b/src/featherweight.py
index c153797..d5e1d47 100755
--- a/src/featherweight.py
+++ b/src/featherweight.py
@@ -51,8 +51,17 @@ with touch('%s/feeds' % root) as feeds_flock:
print('\033[?1049h\033[?25l', end = '')
try:
- Tree('My Feeds', feeds).interact()
-
+ tree = Tree('My Feeds', feeds)
+ while True:
+ (action, node) = tree.interact()
+ if action == 'quit':
+ break
+ elif action == 'edit':
+ if node is not None:
+ pass
+ elif action == 'open':
+ pass
+
except:
pass
finally:
diff --git a/src/trees.py b/src/trees.py
index 1332cf5..ce73e31 100644
--- a/src/trees.py
+++ b/src/trees.py
@@ -25,24 +25,24 @@ from subprocess import Popen, PIPE
class Tree():
def __init__(self, root, feeds):
- global islinux, count, height, width, line, curline, lineoff, collapsed_count, select_stack
+ global count, height, width
self.root = root
self.feeds = feeds
- islinux = ('TERM' not in os.environ) or (os.environ['TERM'] == 'linux')
+ self.islinux = ('TERM' not in os.environ) or (os.environ['TERM'] == 'linux')
count = self.count_new(feeds)
- select_stack = [(None, None)]
- collapsed_count = 0
+ self.select_stack = [(None, None)]
+ self.collapsed_count = 0
height_width = Popen('stty size'.split(' '), stdout = PIPE, stderr = PIPE).communicate()[0]
(height, width) = height_width.decode('utf-8', 'error')[:-1].split(' ')
height, width = int(height), int(width)
- line = 0
- curline = 0
- lineoff = 0
+ self.line = 0
+ self.curline = 0
+ self.lineoff = 0
def count_new(self, feeds):
@@ -63,28 +63,32 @@ class Tree():
def print_node(self, feed, last, indent):
- global line, curline, lineoff, height, islinux, select_stack
+ global height, width
title = feed['title']
prefix = indent + ('└' if last else '├')
collapsed = False
if ('inner' not in feed) or (self.is_expanded(feed)):
- prefix += '── ' if islinux else '─╼ '
+ prefix += '── ' if self.islinux else '─╼ '
else:
collapsed = True
- prefix += '─┘ ' if islinux else '─┚ '
+ prefix += '─┘ ' if self.islinux else '─┚ '
if feed['new'] > 0:
prefix += '\033[01;31m(%i)\033[00m ' % feed['new']
- if select_stack[-1][0] is feed:
+ prefixlen = len('%s--- %s' % (indent, ('(%i) ' % feed['new']) if feed['new'] > 0 else ''))
+ if prefixlen + len(title) > width:
+ if width - prefixlen - 3 >= 0:
+ title = title[: width - prefixlen - 3] + '...'
+ if self.select_stack[-1][0] is feed:
title = '\033[01;34m%s\033[00m' % title
- if lineoff <= curline < lineoff + height:
- if curline > lineoff:
+ if self.lineoff <= self.curline < self.lineoff + height:
+ if self.curline > self.lineoff:
print()
print(prefix + title, end = '')
- curline += 1
- if line >= 0:
- line += 1
- if select_stack[-1][0] is feed:
- line = ~line
+ self.curline += 1
+ if self.line >= 0:
+ self.line += 1
+ if self.select_stack[-1][0] is feed:
+ self.line = ~self.line
if ('inner' in feed) and not collapsed:
inner = feed['inner']
for feed in inner:
@@ -92,41 +96,41 @@ class Tree():
def print_tree(self):
- global line, curline, lineoff, height, width, count, select_stack
- line = 0
- curline = 0
+ global height, width, count
+ self.line = 0
+ self.curline = 0
height_width = Popen('stty size'.split(' '), stdout = PIPE, stderr = PIPE).communicate()[0]
(height, width) = height_width.decode('utf-8', 'error')[:-1].split(' ')
height, width = int(height), int(width)
print('\033[H\033[2J', end = '')
title = self.root
- if len(select_stack) == 1:
+ if len(self.select_stack) == 1:
title = '\033[01;34m%s\033[00m' % title
- if lineoff <= curline < lineoff + height:
+ if self.lineoff <= self.curline < self.lineoff + height:
if count > 0:
print('\033[01;31m(%i)\033[00m ' % count, end = '')
print(title, end = '')
- line += 1
- curline += 1
- if len(select_stack) == 1:
- line = ~line
+ self.line += 1
+ self.curline += 1
+ if len(self.select_stack) == 1:
+ self.line = ~self.line
for feed in self.feeds:
self.print_node(feed, feed is self.feeds[-1], '')
sys.stdout.flush()
- line = ~line
- if not (lineoff < line <= lineoff + height):
- lineoff = line - height // 2
- if not (lineoff < line <= lineoff + height):
- lineoff -= 1
- if lineoff < 0:
- lineoff = 0
+ self.line = ~self.line
+ if not (self.lineoff < self.line <= self.lineoff + height):
+ self.lineoff = self.line - height // 2
+ if not (self.lineoff < self.line <= self.lineoff + height):
+ self.lineoff -= 1
+ if self.lineoff < 0:
+ self.lineoff = 0
self.print_tree()
def interact(self):
- global height, width, line, curline, lineoff, collapsed_count, select_stack
+ global height, width
self.print_tree()
buf = ''
@@ -134,120 +138,121 @@ class Tree():
buf += sys.stdin.read(1)
buf = buf[-10:]
if buf.endswith('\033[A'):
- if select_stack[-1][0] is not None:
- cur = select_stack[-1][0]
- curi = select_stack[-1][1]
- select_stack.pop()
+ if self.select_stack[-1][0] is not None:
+ cur = self.select_stack[-1][0]
+ curi = self.select_stack[-1][1]
+ self.select_stack.pop()
if curi > 0:
- par = select_stack[-1][0]
+ par = self.select_stack[-1][0]
par = self.feeds if par is None else par['inner']
curi -= 1
cur = par[curi]
- select_stack.append((cur, curi))
+ self.select_stack.append((cur, curi))
while ('inner' in cur) and self.is_expanded(cur):
curi = len(cur['inner']) - 1
cur = cur['inner'][curi]
- select_stack.append((cur, curi))
+ self.select_stack.append((cur, curi))
self.print_tree()
elif buf.endswith('\033[1;5A'):
- if select_stack[-1][0] is not None:
- cur = select_stack[-1][0]
- curi = select_stack[-1][1]
- select_stack.pop()
+ if self.select_stack[-1][0] is not None:
+ cur = self.select_stack[-1][0]
+ curi = self.select_stack[-1][1]
+ self.select_stack.pop()
if curi > 0:
- par = select_stack[-1][0]
+ par = self.select_stack[-1][0]
par = self.feeds if par is None else par['inner']
- select_stack.append((par[curi - 1], curi - 1))
+ self.select_stack.append((par[curi - 1], curi - 1))
self.print_tree()
elif buf.endswith('\033[B'):
- if select_stack[-1][0] is None:
+ if self.select_stack[-1][0] is None:
if len(self.feeds) > 0:
- select_stack.append((self.feeds[0], 0))
+ self.select_stack.append((self.feeds[0], 0))
self.print_tree()
else:
- cur = select_stack[-1][0]
- curi = select_stack[-1][1]
+ cur = self.select_stack[-1][0]
+ curi = self.select_stack[-1][1]
if ('inner' in cur) and self.is_expanded(cur):
- select_stack.append((cur['inner'][0], 0))
+ self.select_stack.append((cur['inner'][0], 0))
self.print_tree()
else:
- backup = select_stack[:]
- while len(select_stack) > 1:
- par = select_stack[-2][0]
+ backup = self.select_stack[:]
+ while len(self.select_stack) > 1:
+ par = self.select_stack[-2][0]
par = self.feeds if par is None else par['inner']
- select_stack.pop()
+ self.select_stack.pop()
if curi + 1 < len(par):
- select_stack.append((par[curi + 1], curi + 1))
+ self.select_stack.append((par[curi + 1], curi + 1))
backup = None
self.print_tree()
break
- cur = select_stack[-1][0]
- curi = select_stack[-1][1]
+ cur = self.select_stack[-1][0]
+ curi = self.select_stack[-1][1]
if backup is not None:
- select_stack[:] = backup
+ self.select_stack[:] = backup
elif buf.endswith('\033[1;5B'):
- while select_stack[-1][0] is not None:
- cur = select_stack[-1][0]
- curi = select_stack[-1][1]
- par = select_stack[-2][0]
+ while self.select_stack[-1][0] is not None:
+ cur = self.select_stack[-1][0]
+ curi = self.select_stack[-1][1]
+ par = self.select_stack[-2][0]
par = self.feeds if par is None else par['inner']
if curi + 1 < len(par):
- select_stack.pop()
- select_stack.append((par[curi + 1], curi + 1))
+ self.select_stack.pop()
+ self.select_stack.append((par[curi + 1], curi + 1))
self.print_tree()
break
- elif select_stack[-2][0] is not None:
- select_stack.pop()
+ elif self.select_stack[-2][0] is not None:
+ self.select_stack.pop()
else:
break
elif buf.endswith('\033[C'):
- if select_stack[-1][0] is None:
+ if self.select_stack[-1][0] is None:
if len(self.feeds) > 0:
- select_stack.append((self.feeds[0], 0))
+ self.select_stack.append((self.feeds[0], 0))
self.print_tree()
else:
- cur = select_stack[-1][0]
- curi = select_stack[-1][1]
+ cur = self.select_stack[-1][0]
+ curi = self.select_stack[-1][1]
if 'inner' in cur:
if not self.is_expanded(cur):
cur['expanded'] = True
- collapsed_count -= 1
- select_stack.append((cur['inner'][0], 0))
+ self.collapsed_count -= 1
+ self.select_stack.append((cur['inner'][0], 0))
self.print_tree()
elif buf.endswith('\033[D'):
- if len(select_stack) > 1:
- select_stack.pop()
+ if len(self.select_stack) > 1:
+ self.select_stack.pop()
self.print_tree()
elif buf.endswith('\033[1;5D'):
- select_stack[:] = select_stack[:1]
+ self.select_stack[:] = self.select_stack[:1]
self.print_tree()
elif buf.endswith(' '):
- cur = select_stack[-1][0]
+ cur = self.select_stack[-1][0]
if cur is None:
def expand(feed, value):
- global collapsed_count
if 'inner' in feed:
cur_value = self.is_expanded(feed)
if cur_value != value:
feed['expanded'] = value
- collapsed_count += -1 if value else 1
+ self.collapsed_count += -1 if value else 1
for inner in feed['inner']:
expand(inner, value)
- value = collapsed_count != 0
+ value = self.collapsed_count != 0
for feed in self.feeds:
expand(feed, value)
else:
if 'inner' in cur:
value = not self.is_expanded(cur)
- collapsed_count += -1 if value else 1
+ self.collapsed_count += -1 if value else 1
cur['expanded'] = value
self.print_tree()
elif buf.endswith(chr(ord('L') - ord('@'))):
self.print_tree()
elif buf.endswith('q'):
- break
+ return ('quit', None)
+ elif buf.endswith('e'):
+ return ('edit', self.select_stack[-1][0])
elif buf.endswith('\t'):
- print('Tab')
+ return ('back', None)
elif buf.endswith('\n'):
- print('Enter')
+ return ('open', self.select_stack[-1][0])