X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Fgui%2Fgui.py;h=30ae4e2745bd6290ac47487bfdffca6d57c748f9;hb=f5dcb1ff56f0883463ddd14780bf1f89ce3c222e;hp=1dc34b291ea2d2875aa3405657900e978701188a;hpb=dc0517146e17ffb7d66a52f3c196b03c52f34cac;p=matthijs%2Fupstream%2Fmobilegtd.git diff --git a/src/gui/gui.py b/src/gui/gui.py index 1dc34b2..30ae4e2 100644 --- a/src/gui/gui.py +++ b/src/gui/gui.py @@ -93,7 +93,6 @@ def save_gui(object): object.old_menu = appuifw.app.menu object.old_exit_key_handler = appuifw.app.exit_key_handler object.old_title=appuifw.app.title - object.lock = Ao_lock() def restore_gui(object): appuifw.app.body = object.old_gui @@ -101,21 +100,28 @@ def restore_gui(object): appuifw.app.exit_key_handler = object.old_exit_key_handler appuifw.app.title = object.old_title - -class ListView(object): +class View(object): def __init__(self): - self.view = appuifw.Listbox(self.items(),self.change_entry) + self.title = None + self.view = None + self.lock = Ao_lock() + self.exit_flag = False + super(View, self).__init__() def set_title(self, title): self.title = title - - def change_entry(self): - pass - + + def set_view(self, view): + """ + Sets the main view to be displayed (e.g., an appuifw.Listbox + instance). + """ + self.view = view + def run(self): self.adjustment = None - appuifw.app.screen=COMMON_CONFIG['screen'].encode('utf-8') save_gui(self) + appuifw.app.screen=COMMON_CONFIG['screen'].encode('utf-8') appuifw.app.title=self.title appuifw.app.body=self.view appuifw.app.exit_key_handler=self.exit @@ -127,10 +133,31 @@ class ListView(object): except: pass restore_gui(self) + def exit(self): self.exit_flag = True self.lock.signal() + super(View, self).exit() + + def refresh(self): + """ + Update the gui after a change in model or some user interaction. + Should be filled by subclasses. + """ + super(View, self).refresh() + +class ListView(View): + def __init__(self): + super(ListView, self).__init__() + self.set_view(appuifw.Listbox(self.items(),self.change_entry)) + def change_entry(self): + """ + This function is called when the user selects an an entry (e.g., + navigates to it and push the ok button). + """ + super(ListView).change_entry() + def update(self,subject=None): #logger.log(u'Updated %s'%repr(self)) if self.lock: @@ -166,7 +193,6 @@ class WidgetBasedListView(ListView): def __init__(self): self.widgets = self.generate_widgets() super(WidgetBasedListView,self).__init__() - self.exit_flag = False def run(self): self.refresh() @@ -196,6 +222,7 @@ class KeyBindingView(object): def __init__(self): self.binding_map = {} + super(KeyBindingView,self).__init__() def set_keybindings(self, binding_map): """ @@ -236,13 +263,26 @@ class KeyBindingView(object): self.view.bind(key,no_action) class SearchableListView(WidgetBasedListView): - def __init__(self,entry_filters): - self.current_entry_filter_index = 0 - self.entry_filters = entry_filters - self.filtered_list = self.entry_filters[0] + def __init__(self): + self.current_entry_filter_index = -1 + self.entry_filters = [] + self.filtered_list = lambda:[] self.lock = None super(SearchableListView,self).__init__() + def set_filters(self, entry_filters): + """ + Set the filters that could be applied to this list. Each filter + can be applied in turn by calling switch_entry_filter (for + example from a key binding). + + The entry_filters argument should be a list of filters. The + active filter is stored into self.filtered_list and should be + processed by generate_widgets in the subclass. + """ + self.current_entry_filter_index = 0 + self.entry_filters = entry_filters + self.filtered_list = self.entry_filters[0] def search_item(self): selected_item = appuifw.selection_list(self.all_widget_texts(),search_field=1) @@ -250,6 +290,7 @@ class SearchableListView(WidgetBasedListView): selected_item = self.selected_index() self.view.set_list(self.items(),selected_item) self.set_bindings_for_selection(selected_item) + def switch_entry_filter(self): self.current_entry_filter_index += 1 self.filtered_list = self.entry_filters[self.current_entry_filter_index % len(self.entry_filters)] @@ -257,9 +298,8 @@ class SearchableListView(WidgetBasedListView): class EditableListView(SearchableListView,KeyBindingView): - def __init__(self,entry_filters): - KeyBindingView.__init__(self) - super(EditableListView, self).__init__(entry_filters) + def __init__(self): + super(EditableListView, self).__init__() def key_and_menu_bindings(self,selected_index): key_and_menu_bindings=[]