# HG changeset patch # User Björn Ricks # Date 1306314046 -7200 # Node ID 2b600cccf95e0e9189d60e95b8defc38762e9161 # Parent 4b58763e75c19e81774353d3b81507cd39df4d25 Add scrolling in entry list to be able to select all entries Fixes #1571 diff -r 4b58763e75c1 -r 2b600cccf95e getan/view.py --- a/getan/view.py Thu May 19 13:04:21 2011 +0200 +++ b/getan/view.py Wed May 25 11:00:46 2011 +0200 @@ -22,21 +22,37 @@ class ListWidget(urwid.BoxWidget): def _update_view(self): logger.debug("ListWidget: update view now.") + if self.size and len(self.rows) > self.size[1]: + start_idx = self.top + end_idx = start_idx + self.size[1] - 6 + else: + start_idx = self.top + end_idx = start_idx + len(self.rows) + listbox = urwid.LineBox(urwid.Padding( + urwid.ListBox(urwid.SimpleListWalker(self.rows[start_idx: + end_idx])), + ('fixed left', 1), + ('fixed right', 1))) + + self.body = urwid.AttrWrap(listbox, 'body') + self.frame.set_body(self.body) self.frame.set_footer(self.footer) self.frame.set_header(self.header) def update_focus(self, focus, unfocus=-1): - logger.debug("ListWidget: focus row (index = %d)" % focus) - logger.debug("ListWidget: unfocus row (index = %d)" % unfocus) + self.focused = focus if focus >= 0 and focus <= len(self.rows)-1: self.rows[focus].focus = True self.rows[focus].update_w() if unfocus >= 0: self.rows[unfocus].focus = False self.rows[unfocus].update_w() + if self.size: + self.validate_view() def render(self, size, focus=False): + self.size = size maxcol, maxrow = size return self.frame.render((maxcol, maxrow), focus) @@ -60,16 +76,24 @@ return None def up(self): - logger.debug("ListWidget: navigate to upper row.") if self.focused > 0: - self.focused = self.focused - 1 - self.update_focus(self.focused, self.focused+1) + logger.debug("ListWidget: navigate to upper row.") + self.update_focus(self.focused-1, self.focused) def down(self): - logger.debug("ListWidget: navigate to lower row.") if self.focused < len(self.rows) - 1: - self.focused = self.focused + 1 - self.update_focus(self.focused, self.focused-1) + logger.debug("ListWidget: navigate to lower row.") + self.update_focus(self.focused+1, self.focused) + + def validate_view(self): + if self.focused < self.top: + self.top = self.focused + self._update_view() + if self.focused + 8 >= self.top + self.size[1]: + self.top = self.focused - (self.size[1]) + 9 + if self.top < 0: + self.top = 0 + self._update_view() def select(self): if not self.rows: return None @@ -170,8 +194,10 @@ def __init__(self, controller, rows): self.selection = [] self.focused = 0 + self.size = () + self.top = 0 self.controller = controller - self.raw_projects = rows + self.raw_rows = rows self.header = urwid.LineBox(urwid.AttrWrap(urwid.Text("\n%s\n" % _('List of registered projects')),'project_header')) @@ -276,6 +302,8 @@ class EntryList(ListWidget): def __init__(self, rows): self.selection = [] + self.top = 0 + self.size = () self.focused = 0 self.rows = [EntryNode(x) for x in rows] listbox = urwid.ListBox(urwid.SimpleListWalker(self.rows)) @@ -290,11 +318,10 @@ footer=self.footer) def set_rows(self, rows): - logger.debug("EntryList: set new entries.") - self.rows = [EntryNode(x) for x in rows] - listbox = urwid.LineBox(urwid.ListBox(urwid.SimpleListWalker( - self.rows))) - self.body = urwid.AttrWrap(listbox, 'entry_body') + if rows: + self.rows = [EntryNode(x) for x in rows] + else: + self.rows = [] self._update_view()