From 7d19c32e09bba5bcb43a28fbff4f3ef9c35a669c Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 26 Jul 2013 14:08:15 +0200 Subject: misc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/featherweight.py | 13 +++- src/trees.py | 177 ++++++++++++++++++++++++++------------------------- 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]) -- cgit v1.2.3-70-g09d2