From 9db905cab16671f67fa5de38ab3f9e61326df621 Mon Sep 17 00:00:00 2001 From: Max Usachev Date: Wed, 9 Jun 2010 13:49:50 +0300 Subject: [PATCH] more work on Hildon interface --- ui/hildon_ui.py | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 135 insertions(+), 7 deletions(-) diff --git a/ui/hildon_ui.py b/ui/hildon_ui.py index 3cc1605..9c0776b 100644 --- a/ui/hildon_ui.py +++ b/ui/hildon_ui.py @@ -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() -- 1.7.9.5