From ecfc080b47741624c68333b74256c51f730c869f Mon Sep 17 00:00:00 2001 From: Max Usachev Date: Fri, 11 Jun 2010 12:28:45 +0300 Subject: [PATCH] adapted HildonUI for MVC pattern --- ui/hildon_ui.py | 234 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 137 insertions(+), 97 deletions(-) diff --git a/ui/hildon_ui.py b/ui/hildon_ui.py index ef89400..cc69d98 100644 --- a/ui/hildon_ui.py +++ b/ui/hildon_ui.py @@ -4,14 +4,13 @@ Hildon UI for Meabook import gtk import hildon +import gobject import gettext -from meabook.config import Config -from meabook.database.SQLite import SQLite +from meabook.ui.ui import MeabookUI _ = gettext.gettext - def create_button(title, value): """Create HildonButton.""" @@ -23,10 +22,11 @@ def create_button(title, value): return button -class HildonMeabook(): - def __init__(self, basedir): - self.database = SQLite(basedir) - self.config = Config(basedir, self.database) +class HildonMeabook(MeabookUI): + def __init__(self, controller): + MeabookUI.__init__(self, controller) + self.internal_names = [] + self.callback_id = None self.window = hildon.StackableWindow() self.window.set_title(_('Meabook')) self.window.connect('destroy', self.exit) @@ -39,9 +39,9 @@ class HildonMeabook(): 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')) + self.level1_filter = gtk.RadioButton(None, _('level1')) + self.level2_filter = gtk.RadioButton(self.level1_filter, _('level2')) + self.level3_filter = gtk.RadioButton(self.level2_filter, _('level3')) for filter_widget in [self.level1_filter, self.level2_filter, \ self.level3_filter]: filter_widget.set_mode(False) @@ -50,23 +50,14 @@ class HildonMeabook(): 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 + settings_button.connect('clicked', self.show_settings_dialog_cb) + about_button.connect('clicked', self.show_about_dialog_cb) + self.level1_filter.connect('toggled', self.apply_filter_cb, \ + self.controller.get_level1_items) + self.level2_filter.connect('toggled', self.apply_filter_cb, \ + self.controller.get_level2_items) + self.level3_filter.connect('toggled', self.apply_filter_cb, \ + self.controller.get_level3_items) # packing widgets self.window.add(self.selector) @@ -79,26 +70,36 @@ class HildonMeabook(): self.window.set_app_menu(menu) self.window.show_all() - def start(self): - """Start the program.""" + def _set_selector_content(self, items): + self.internal_names = [] + for item in items: + self.selector.append_text(item[0]) + self.internal_names.append(item[1]) + # Implementation of Base UI interface + def start(self): gtk.main() def exit(self, event): - """Exit the program.""" - - self.database.close() gtk.main_quit() + 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 + + def show_items(self, items, 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, \ + self.controller.get_level1_items, items) + elif level == 2: + self.level2_filter.set_active(True) + else: + self.level3_filter.set_active(True) - def show_settings_dialog(self, widget): - """Shows Config dialog.""" - - dialog = ConfigurationDialog(self.database, self.config) - dialog.run() - - def show_about_dialog(self, widget): - """Shows About dialog.""" - + def show_about_dialog(self): dialog = hildon.Dialog() dialog.set_title(_('About')) label = gtk.Label('\nMeabook v0.1\n') @@ -107,29 +108,42 @@ class HildonMeabook(): dialog.run() dialog.destroy() - def apply_filter(self, widget, db_function): + def show_fields_to_show_dialog(self): + ConfigurationDialog(self.controller, page=1) + + def show_fileds_order_dialog(self): + ConfigurationDialog(self.controller, page=2) + + + # Hildon UI callbacks + def show_about_dialog_cb(self, widget): + """Shows About Dialog.""" + + self.show_about_dialog() + + def show_settings_dialog_cb(self, widget): + """Shows Config dialog.""" + + ConfigurationDialog(self.controller) + + def apply_filter_cb(self, widget, func, items=None): """Updates toplevel selector with different level items.""" + if not widget.get_active(): + return + # blocks 'change' event for selector - self.selector.handler_block(self.callback_id) + try: + self.selector.handler_block(self.callback_id) + except: + pass # update list content self.selector.get_model(0).clear() - for item in db_function(): - self.selector.append_text(item) + self._set_selector_content(items or func()) 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) - else: - self.callback_id = self.selector.connect('changed', \ - self.show_item_dialog) def _create_items_dialog(self, title): """Creates dialog for showing items.""" @@ -184,89 +198,115 @@ class HildonMeabook(): class ConfigurationDialog: """Configuration dialog""" - def __init__(self, database, config): - self.config = config - self.database = database + def __init__(self, controller, page=1): + self.controller = controller + self.window = hildon.StackableWindow() self.window.set_title(_('Configuration')) + self.window.connect('destroy', self.close_dialog_cb) # create menu menu = hildon.AppMenu() self.button_order = gtk.RadioButton(None, _('Order')) + self.button_fields = gtk.RadioButton(self.button_order, _('Fields')) self.button_order.set_mode(False) - self.button_order.connect('clicked', self.show_order_settings, \ - self.database.get_fields()) - self.button_items = gtk.RadioButton(self.button_order, _('Items')) - self.button_items.set_mode(False) - self.button_items.connect('clicked', self.show_items_settings, \ - self.database.get_fields()) - menu.add_filter(self.button_items) + self.button_fields.set_mode(False) + menu.add_filter(self.button_fields) menu.add_filter(self.button_order) menu.show_all() # create other widgets self.window.set_app_menu(menu) self.selector = hildon.TouchSelector(text=True) - self.callback_id = self.selector.connect('changed', \ - self.save_selected_fields) self.pannable_area = hildon.PannableArea() vbox = gtk.VBox() vbox.pack_start(self.selector) vbox.pack_start(self.pannable_area) self.window.add(vbox) - def show_items_settings(self, widget, items): - """Shows dialog for selecting necessary items.""" + self.window.show_all() + + # switches to necessary page + if page == 1: + self.button_fields.set_active(True) + self.show_fields_settings_cb(None) + else: + self.button_order.set_active(True) + self.show_order_settings_cb(None) + + # connect signals + self.button_order.connect('clicked', self.show_order_settings_cb) + self.button_fields.connect('clicked', self.show_fields_settings_cb) + + def show_fields_settings_cb(self, widget): + """Shows dialog for selecting fields to show.""" self.pannable_area.hide() - # blocks 'change' event for selector - self.selector.handler_block(self.callback_id) + + fields = self.controller.get_fields() # fill items list - for item in items: - self.selector.append_text(_(item)) + self.selector.get_model(0).clear() + for field in fields: + self.selector.append_text(_(field)) self.selector.set_column_selection_mode( \ hildon.TOUCH_SELECTOR_SELECTION_MODE_MULTIPLE) self.selector.unselect_all(0) - # mark necessary items - items_to_select = self.config.get_fields() + # mark necessary fields + fields_to_select = self.controller.config.get_fields() model = self.selector.get_model(0) - for index, item in enumerate(items): - if item in items_to_select: + for index, field in enumerate(fields): + if field in fields_to_select: self.selector.select_iter(0, model.get_iter(index), False) - self.selector.show() + self.selector.show_all() - # reconnect signal - self.selector.connect('changed', self.save_selected_fields) + def show_order_settings_cb(self, widget): + """Shows dialog for setting fields order.""" - def show_order_settings(self, widget, items): - """Shows dialog for selecting items order.""" + + def show_fields_chooser(widget): + """Shows dialog to select field from fields list.""" + + dialog = hildon.PickerDialog(self.window) + dialog.set_title(_('Field selection')) + selector = hildon.TouchSelector(text=True) + dialog.set_selector(selector) + selector.set_column_selection_mode( \ + hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE) + + # fill fields list + for field in self.controller.get_fields(): + selector.append_text(field) + + dialog.run() + widget.set_value(selector.get_current_text()) + dialog.destroy() self.selector.hide() + vbox = gtk.VBox() - for item in items: - button = create_button(item, '') - button.set_style(hildon.BUTTON_STYLE_NORMAL) - button.set_alignment(0, 0.5, 0, 0) + for index, field in enumerate(self.controller.config.get_order()): + button = create_button(' '.join([_('Position'), str(index)]), \ + _(field)) + button.connect('clicked', show_fields_chooser) vbox.pack_start(button) + self.pannable_area.add_with_viewport(vbox) self.pannable_area.show_all() - def run(self): - """Runs dialog.""" - - # activate first tab - # FIXME: read from config - self.window.show_all() - self.button_items.set_active(True) - - def save_selected_fields(self, widget, column): - """Save selected choice.""" + def close_dialog_cb(self, event): + """Save selected options.""" model = self.selector.get_model(0) selected_items = [model[index][0] for index in [item[0] for item in \ self.selector.get_selected_rows(0)]] - self.config.set_fields(selected_items) + self.controller.config.set_fields(selected_items) + + try: + self.controller.config.set_order([button.get_value() for button in \ + self.pannable_area.get_child().get_children()[0].get_children()]) + except AttributeError: + pass -- 1.7.9.5