more work on Hildon interface
authorMax Usachev <maxusachev@gmail.com>
Wed, 9 Jun 2010 10:49:50 +0000 (13:49 +0300)
committerMax Usachev <maxusachev@gmail.com>
Wed, 9 Jun 2010 11:34:35 +0000 (14:34 +0300)
ui/hildon_ui.py

index 3cc1605..9c0776b 100644 (file)
@@ -5,35 +5,74 @@ Hildon UI for Meabook
 import gtk
 import hildon
 import gettext
+from meabook.database.SQLite import SQLite
 
 _ = gettext.gettext
 
-class HildonMeabook(Meabook):
+class HildonMeabook():
     def __init__(self, basedir):
+        self.database = SQLite(basedir)
         self.window = hildon.StackableWindow()
         self.window.set_title(_('Meabook'))
         self.window.connect('destroy', self.exit)
-        # creating menu
+
+        # create menu buttons
         menu = hildon.AppMenu()
-        self.window.set_app_menu(menu)
         settings_button = hildon.Button(gtk.HILDON_SIZE_AUTO, \
             hildon.BUTTON_ARRANGEMENT_HORIZONTAL, _('Settings'))
-        settings_button.connect('clicked', self.show_settings_dialog)
         about_button = hildon.Button(gtk.HILDON_SIZE_AUTO, \
             hildon.BUTTON_ARRANGEMENT_HORIZONTAL, _('About'))
+
+        # create filter widgets
+        self.level1_filter = gtk.RadioButton(None, _('Filiation'))
+        self.level2_filter = gtk.RadioButton(self.level1_filter, _('Depart'))
+        self.level3_filter = gtk.RadioButton(self.level1_filter, _('People'))
+        for filter_widget in [self.level1_filter, self.level2_filter, \
+            self.level3_filter]:
+            filter_widget.set_mode(False)
+
+        # create items list
+        self.selector = hildon.TouchSelector(text=True)
+
+        # connect signals
+        self.callback_id = self.selector.connect('changed', \
+            self.show_middlelevel_dialog)
+        settings_button.connect('clicked', self.show_settings_dialog)
         about_button.connect('clicked', self.show_about_dialog)
+        self.level1_filter.connect('clicked', self.apply_filter, \
+            self.database.get_toplevel_entries)
+        self.level2_filter.connect('clicked', self.apply_filter, \
+            self.database.get_middlelevel_entries)
+        self.level3_filter.connect('clicked', self.apply_filter, \
+            self.database.get_lowlevel_entries)
+
+        # fill items list
+        for filter_widget in [self.level1_filter, self.level2_filter, \
+            self.level3_filter]:
+            if filter_widget.get_active():
+                self.apply_filter(filter_widget, self.database.get_toplevel_entries)
+                break
+
+        # packing widgets
+        self.window.add(self.selector)
+        menu.add_filter(self.level1_filter)
+        menu.add_filter(self.level2_filter)
+        menu.add_filter(self.level3_filter)
         menu.append(settings_button)
         menu.append(about_button)
         menu.show_all()
-        self.parea = hildon.PannableArea()
-        self.window.add(self.parea)
+        self.window.set_app_menu(menu)
         self.window.show_all()
 
     def start(self):
+        """Start the program."""
+
         gtk.main()
 
     def exit(self, event):
-        # add here DB disconnect
+        """Exit the program."""
+
+        self.database.close()
         gtk.main_quit()
 
     def show_settings_dialog(self, widget):
@@ -41,3 +80,92 @@ class HildonMeabook(Meabook):
 
     def show_about_dialog(self, widget):
         print 'about'
+
+    def apply_filter(self, widget, db_function):
+        """Updates toplevel selector with different level items."""
+
+        # blocks 'change' event for selector
+        self.selector.handler_block(self.callback_id)
+
+        # update list content
+        self.selector.get_model(0).clear()
+        for item in db_function():
+            self.selector.append_text(item)
+        self.selector.unselect_all(0)
+
+        self.window.set_title(' - '.join([_('Meabook'), widget.get_label()]))
+        # reconnect signal. depends on current filter
+        if widget == self.level1_filter:
+            self.callback_id = self.selector.connect('changed', \
+                self.show_middlelevel_dialog)
+        elif widget == self.level2_filter:
+            self.callback_id = self.selector.connect('changed', \
+                self.show_lowlevel_dialog)
+
+    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_info)
+        for item in self.database.get_lowlevel_entries():
+            selector.append_text(item)
+        window.show_all()
+
+    def show_item_info(self, widget, column):
+        """Shows detailed item information."""
+
+        def create_button(title, value):
+            """Create HildonButton."""
+
+            button = hildon.Button(gtk.HILDON_SIZE_AUTO | \
+                gtk.HILDON_SIZE_FINGER_HEIGHT, \
+                hildon.BUTTON_ARRANGEMENT_VERTICAL, title, value)
+            button.set_style(hildon.BUTTON_STYLE_PICKER)
+            button.set_alignment(0, 0, 0, 0)
+            return button
+
+        attrs = {
+            'givenName': _('Name'),
+            'cn': _('Full Name'),
+            'o': _('Filiation'),
+            'ou': _('Department'),
+            'title': _('Job'),
+            'mobile': _('Phone (Mobile)'),
+            'telephoneNumber': _('Phone (General)'),
+            'homePhone': _('Phone (Home)'),
+            'uid': _('Unique identificator'),
+        }
+        selected_item = widget.get_current_text()
+        entry = self.database.get_entry(selected_item)
+        window = hildon.StackableWindow()
+        window.set_title(selected_item)
+        pannable_area = hildon.PannableArea()
+        vbox = gtk.VBox()
+
+        for key in entry:
+            button = create_button(attrs.get(key, key) , entry[key])
+            vbox.pack_start(button)
+
+        pannable_area.add_with_viewport(vbox)
+        window.add(pannable_area)
+        window.show_all()