implemented level switching
authorMax Usachev <maxusachev@gmail.com>
Fri, 11 Jun 2010 10:52:27 +0000 (13:52 +0300)
committerMax Usachev <maxusachev@gmail.com>
Fri, 11 Jun 2010 10:52:27 +0000 (13:52 +0300)
ui/hildon_ui.py

index cc69d98..d3d6a81 100644 (file)
@@ -26,7 +26,8 @@ class HildonMeabook(MeabookUI):
     def __init__(self, controller):
         MeabookUI.__init__(self, controller)
         self.internal_names = []
-        self.callback_id = None
+        self.handler = None
+        self.level = 1
         self.window = hildon.StackableWindow()
         self.window.set_title(_('Meabook'))
         self.window.connect('destroy', self.exit)
@@ -52,6 +53,7 @@ class HildonMeabook(MeabookUI):
         # connect signals
         settings_button.connect('clicked', self.show_settings_dialog_cb)
         about_button.connect('clicked', self.show_about_dialog_cb)
+        self.handler = self.selector.connect('changed', self.select_item_cb)
         self.level1_filter.connect('toggled', self.apply_filter_cb, \
             self.controller.get_level1_items)
         self.level2_filter.connect('toggled', self.apply_filter_cb, \
@@ -70,11 +72,36 @@ class HildonMeabook(MeabookUI):
         self.window.set_app_menu(menu)
         self.window.show_all()
 
-    def _set_selector_content(self, items):
+    def _set_selector_content(self, selector, handler, items):
+        """Updates selector content."""
+
+        # temporary block handler
+        selector.handler_block(handler)
+
         self.internal_names = []
+        selector.get_model(0).clear()
         for item in items:
-            self.selector.append_text(item[0])
+            selector.append_text(item[0])
             self.internal_names.append(item[1])
+        selector.unselect_all(0)
+
+        # reconnect callback
+        selector.handler_unblock(handler)
+
+    def _show_items_dialog(self, title, items):
+        """Creates dialog with items."""
+
+        selector = hildon.TouchSelector(text=True)
+        window = hildon.StackableWindow()
+        window.set_title(title)
+        window.connect('destroy', self._decrease_level)
+        window.add(selector)
+        handler = selector.connect('changed', self.select_item_cb)
+        self._set_selector_content(selector, handler, items)
+        window.show_all()
+
+    def _decrease_level(self, widget):
+        self.level -= 1
 
     # Implementation of Base UI interface
     def start(self):
@@ -85,11 +112,10 @@ class HildonMeabook(MeabookUI):
         self.controller.stop()
 
     def get_current_level(self):
-        if self.level1_filter.get_active(): return 1
-        elif self.level2_filter.get_active(): return 2
-        else: return 3
+        return self.level
 
     def show_items(self, items, level):
+        self.level = level
         if level == 1:  # level1_button is not in gorup, process separately
             self.level1_filter.set_active(True)
             self.apply_filter_cb(self.level1_filter, \
@@ -132,47 +158,30 @@ class HildonMeabook(MeabookUI):
         if not widget.get_active():
             return
 
-        # blocks 'change' event for selector
-        try:
-            self.selector.handler_block(self.callback_id)
-        except:
-            pass
+        if widget == self.level1_filter: self.level = 1
+        elif widget == self.level2_filter: self.level = 2
+        else: self.level = 3
 
         # update list content
-        self.selector.get_model(0).clear()
-        self._set_selector_content(items or func())
-        self.selector.unselect_all(0)
+        self._set_selector_content(self.selector, self.handler, items or func())
 
         self.window.set_title(' - '.join([_('Meabook'), widget.get_label()]))
 
-    def _create_items_dialog(self, title):
-        """Creates dialog for showing items."""
-
-        selector = hildon.TouchSelector(text=True)
-        window = hildon.StackableWindow()
-        window.set_title(title)
-        window.add(selector)
-        return window, selector
-
-    def show_middlelevel_dialog(self, widget, column):
-        """Shows subitems of selected level1-item."""
-
-        selected_item = widget.get_current_text()
-        window, selector = self._create_items_dialog(selected_item)
-        selector.connect('changed', self.show_lowlevel_dialog)
-        for item in self.database.get_middlelevel_entries(selected_item):
-            selector.append_text(item)
-        window.show_all()
-
-    def show_lowlevel_dialog(self, widget, column):
-        """Shows lowlevel items."""
-
-        selected_item = widget.get_current_text()
-        window, selector = self._create_items_dialog(selected_item)
-        selector.connect('changed', self.show_item_dialog)
-        for item in self.database.get_lowlevel_entries():
-            selector.append_text(item)
-        window.show_all()
+    def select_item_cb(self, widget, column):
+        """Emits when changes selector content."""
+
+        name, internal_name = widget.get_current_text(), \
+            widget.get_active(0)
+        if self.level == 1:
+            items = self.controller.get_level2_items((name, internal_name))
+            self._show_items_dialog(name, items)
+            self.level = 2
+        elif self.level == 2:
+            items = self.controller.get_level3_items((name, internal_name))
+            self._show_items_dialog(name, items)
+            self.level = 3
+        else:
+            print 'show item details'
 
     def show_item_dialog(self, widget, column):
         """Shows detailed item information."""
@@ -202,7 +211,7 @@ class ConfigurationDialog:
         self.controller = controller
 
         self.window = hildon.StackableWindow()
-        self.window.set_title(_('Configuration'))
+        self.window.set_title(_('Settings'))
         self.window.connect('destroy', self.close_dialog_cb)
 
         # create menu