appuifw.app.body=self.view
appuifw.app.exit_key_handler=self.exit
try:
- self.lock.wait()
while not self.exit_flag:
self.refresh()
self.lock.wait()
Called when the current view must be updated. Never call
directly. Subclasses should extend this method, not update.
"""
- pass
+ self.refresh_menu()
def refresh_menu(self):
"""
def __init__(self):
super(ListView, self).__init__()
self.current_index = None
- self.set_view(appuifw.Listbox(self.items(),self.entry_selected))
+ self.items_cache = []
+ self.set_view(appuifw.Listbox([], self.entry_selected))
self.view.bind(EKeyUpArrow,lambda: self.arrow_key_pressed(-1))
self.view.bind(EKeyDownArrow,lambda: self.arrow_key_pressed(1))
self.index_changed()
self.current_index = None
+ def refresh(self):
+ self.refresh_list()
+ super(ListView, self).refresh()
+
+ def refresh_list(self):
+ """ Reload the list items. Calls items() again. """
+ # Remember which item was selected
+ selected = self.selected_item()
+ # Refresh the list
+ self.items_cache = self.items()
+ try:
+ # Try to find the selected item in the new list (based on
+ # the display text).
+ selected_index = self.items_cache.index(selected)
+ except ValueError:
+ # If the selected item is no longer present, just keep the
+ # index the same (but be careful not to fall off the end).
+ selected_index = self.clip_index(self.selected_index())
+ # Update the items in the view
+ self.view.set_list(self.items_cache, selected_index)
+
def run(self):
self.index_changed()
super(ListView, self).run()
def set_index(self,index):
""" Changes the currently selected item to index. """
- self.view.set_list(self.items(),index % len(self.items()))
+ self.view.set_list(self.items_cache, self.clip_index(index))
def selected_item(self):
""" Returns the (title of the) currently selected list item. """
self.refresh()
def refresh(self):
- self.widgets = self.generate_widgets()
- self.redisplay_widgets()
+ self.refresh_widgets()
super(WidgetBasedListView,self).refresh()
+
+ def refresh_widgets(self):
+ """ Refresh the widget list. Calls generate_widgets(). """
+ self.widgets = self.generate_widgets()
def redisplay_widgets(self):
"""
Redisplay the widgets. Should be called if the widgets
themselves have changed, does not call generate_widgets again.
"""
- self.set_index(self.selected_index())
+ self.refresh_list()
def items(self):
# Let ListView show each widget's text.