X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=ui%2Fhildon_ui%2Fhildon_ui.py;fp=ui%2Fhildon_ui%2Fhildon_ui.py;h=0000000000000000000000000000000000000000;hb=469a3b869154372bbce8192ef21a3d5de88f745e;hp=0a115682bd1da216788acc0fbeddae8f780a2dee;hpb=97f7a66e7e4576d623c7a35a9597966ab30026ec;p=meabook diff --git a/ui/hildon_ui/hildon_ui.py b/ui/hildon_ui/hildon_ui.py deleted file mode 100644 index 0a11568..0000000 --- a/ui/hildon_ui/hildon_ui.py +++ /dev/null @@ -1,360 +0,0 @@ -""" -Hildon UI for Meabook -""" - -import gtk -import hildon -import gobject -from gettext import gettext as _ -from meabook.constants import * -from meabook.ui.ui import MeabookUI -from meabook.ui.hildon_ui.common import * -from meabook.ui.hildon_ui.info import InfoDialog -from meabook.ui.hildon_ui.about import AboutDialog -from meabook.ui.hildon_ui.search import SearchDialog -from meabook.ui.hildon_ui.imports import ImportDialog -from meabook.ui.hildon_ui.configuration import ConfigurationDialog, \ - FieldsConfigurationDialog, FieldsOrderConfigurationDialog - - -def set_selector_content(selector, handler, items=[]): - """Updates selector widget content.""" - - selector.handler_block(handler) # temporary block handler - # setting new content - # model: name, internal_name, type - model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_INT, \ - gobject.TYPE_STRING) - for name, internal_name, item_type in items: - model.append((name, internal_name, item_type)) - if selector.get_num_columns(): - selector.remove_column(0) - selector.append_text_column(model, False) - selector.unselect_all(0) - selector.handler_unblock(handler) # reconnect callback - - -def set_box_content(box, handler, items=[]): - """Updates box widget content.""" - - def on_button_click(widget): - handler(widget.get_title(), widget.get_data('iname')) - - for child in box.get_children(): - box.remove(child) - for title, value, internal_name, item_type in items: - button = create_button(title, value) - button.connect('clicked', on_button_click) - button.set_data('iname', internal_name) - button.set_relief(gtk.RELIEF_NONE) - button.show() - box.pack_start(button, expand=False) - - - -class HildonMeabook(MeabookUI): - """Main Meabook UI.""" - - def __init__(self, controller, renderer, config): - MeabookUI.__init__(self, controller, renderer, config) - self.handler = None - self.window = hildon.StackableWindow() - self.window.set_title(_('Meabook')) - self.window.connect('destroy', self.exit) - # create menu buttons - menu = hildon.AppMenu() - settings_button = create_menu_button(_('Settings')) - about_button = create_menu_button(_('About')) - import_button = create_menu_button(_('Import')) - search_button = create_menu_button(_('Search')) - # create filter widgets and connect signals - 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) - filter_widget.connect('toggled', self.apply_filter_cb) - # create items widgets - self.selector = hildon.TouchSelector() - self.box_container = hildon.PannableArea() - self.box = gtk.VBox() - # create search widgets - widgets_box = gtk.VBox() - self.search_widgets_box = gtk.HBox() - self.search_entry = hildon.Entry(gtk.HILDON_SIZE_AUTO | \ - gtk.HILDON_SIZE_FINGER_HEIGHT) - clear_search_entry_container = gtk.EventBox() - clear_search_entry_image = gtk.image_new_from_icon_name( \ - 'general_delete', gtk.HILDON_SIZE_FINGER_HEIGHT) - # connect signals - settings_button.connect('clicked', self.show_settings_dialog_cb) - about_button.connect('clicked', self.show_about_dialog_cb) - import_button.connect('clicked', self.show_import_dialog_cb) - search_button.connect('clicked', self.show_search_dialog_cb) - self.handler = self.selector.connect('changed', self.select_item_cb) - self.search_entry.connect('key-release-event', self.search_item_cb) - clear_search_entry_container.connect('button-press-event', \ - self.clear_search_entry_cb) - # packing widgets - # packing search widgets - clear_search_entry_container.add(clear_search_entry_image) - self.search_widgets_box.pack_start(self.search_entry, expand=True) - self.search_widgets_box.pack_start(clear_search_entry_container, \ - expand=False, padding=24) - # packing items widgets - self.box_container.add_with_viewport(self.box) - widgets_box.pack_start(self.selector, expand=True) - widgets_box.pack_start(self.box_container, expand=True) - widgets_box.pack_end(self.search_widgets_box, expand=False) - self.window.add(widgets_box) - # packing menu widgets - menu.add_filter(self.level1_filter) - menu.add_filter(self.level2_filter) - menu.add_filter(self.level3_filter) - menu.append(settings_button) - menu.append(import_button) - menu.append(search_button) - menu.append(about_button) - menu.show_all() - self.window.set_app_menu(menu) - self.window.show_all() - - def _show_ui(self, view='selector', show_search=False): - """Shows necessary widgets for selected view.""" - - if view == 'selector': - self.box_container.hide() - self.selector.show() - elif view == 'box': - self.selector.hide() - self.box_container.show_all() - else: - self.selector.hide() - self.box_container.hide() - if show_search: - self.search_entry.set_text('') - self.search_entry.set_placeholder(_('Enter search text here')) - self.search_widgets_box.show_all() - else: - self.search_widgets_box.hide() - - def _unfreeze_ui(self): - while gtk.events_pending(): - gtk.main_iteration(False) - - def _update_title(self, title): - if title is not None: - self.window.set_title(title) - - def _show_items_dialog(self, title, items, touch_selector_view=True): - """Creates dialog with items. If 'touch_selector_view' is True, - then items will be shown in TouchSelector widget, else each item - will be shown as Button in PannableArea.""" - - window = hildon.StackableWindow() - window.set_title(title) - if touch_selector_view: - container = hildon.TouchSelector() - handler = container.connect('changed', self.select_item_cb) - set_selector_content(container, handler, items) - else: - widgets_box = gtk.VBox() - container = hildon.PannableArea() - container.add_with_viewport(widgets_box) - set_box_content(widgets_box, self._show_item_dialog, items) - window.add(container) - window.show_all() - - def _show_item_dialog(self, title, entry_id): - """Shows detailed item information.""" - - def show_fields_settings_dialog_cb(widget, parent, entry_id, func): - self.controller.show_fields_configuration_dialog(parent) - func(parent, entry_id) - - def show_fields_order_settings_dialog_cb(widget, parent, entry_id, \ - func): - self.controller.show_fields_order_configuration_dialog() - func(parent, entry_id) - - def update_entry(window, entry_id): - # create widgets - entry = self.controller.get_item(entry_id) - widgets_table = gtk.Table(rows=1, columns=1) - info_box = gtk.VBox() - image_box = gtk.VBox() - pannable_area = hildon.PannableArea() - image = self.renderer.render_image(dict(entry)) - for fname, fvalue in entry: - if fname == 'image': - continue - button = self.renderer.render_button(_(fname) , fvalue, fname) - if fname in (FIELD_PHONE_HOME, FIELD_PHONE_GENERAL, \ - FIELD_PHONE_INTERNAL, FIELD_PHONE_MOBILE): - button.connect('clicked', self.call_cb) - else: - button.connect('clicked', self.show_details_cb) - info_box.pack_start(button, expand=False) - # pack widgets - image_box.pack_start(image, expand=False) - widgets_table.attach(image_box, 0, 1, 0, 1, xoptions=gtk.FILL| \ - gtk.SHRINK, yoptions=gtk.FILL, xpadding=14, ypadding=8) - pannable_area.add_with_viewport(info_box) - widgets_table.attach(pannable_area, 1, 2, 0, 1, ypadding=8) - child = window.get_child() - if child: - child.destroy() - window.add(widgets_table) - widgets_table.show_all() - - - # create widgets - window = hildon.StackableWindow() - window.set_title(title) - menu = hildon.AppMenu() - fields_button = create_menu_button(_('Fields to show')) - order_button = create_menu_button(_('Fields order')) - fields_button.connect('clicked', show_fields_settings_dialog_cb, \ - window, entry_id, update_entry) - order_button.connect('clicked', show_fields_order_settings_dialog_cb, \ - window, entry_id, update_entry) - menu.append(fields_button) - menu.append(order_button) - - update_entry(window, entry_id) - window.set_app_menu(menu) - menu.show_all() - window.show_all() - - - # Implementation of Base UI interface - def start(self): - self.apply_filter_cb(self.level1_filter) - gtk.main() - - def exit(self, event): - gtk.main_quit() - self.controller.stop() - - def create_information_dialog(self, title, message): - InfoDialog(title, message).run() - - def create_about_dialog(self): - AboutDialog().run() - - def create_import_dialog(self): - return ImportDialog().run() - - def create_progress_dialog(self, title=None): - self._update_title(title) - self._show_ui('hide', False) - hildon.hildon_gtk_window_set_progress_indicator(self.window, 1) - self._unfreeze_ui() - - def create_configuration_dialog(self, all_fields, fields_to_show, \ - ordered_fields): - dialog = ConfigurationDialog(all_fields, fields_to_show, ordered_fields) - dialog.run() - - def create_fields_configuration_dialog(self, all_fields, fields_to_show, \ - parent): - dialog = FieldsConfigurationDialog(all_fields, fields_to_show, parent) - return dialog.run() - - def create_fields_order_configuration_dialog(self, all_fields, \ - ordered_fields): - dialog = FieldsOrderConfigurationDialog(all_fields, ordered_fields) - return dialog.run() - - def create_search_dialog(self, controller): - results = SearchDialog(controller).run() - if results: - self._show_items_dialog(_('Search results'), - self.controller.get_files_by_pattern_ex(results[0], results[1]), - touch_selector_view=False) - - - # Hildon UI callbacks - def show_about_dialog_cb(self, widget): - """Shows About Dialog.""" - - self.controller.show_about_dialog() - - def show_import_dialog_cb(self, widget): - """Shows Import Dialog.""" - - if self.controller.show_import_dialog(): - self._show_ui('selector') - self.apply_filter_cb(self.level1_filter) - hildon.hildon_gtk_window_set_progress_indicator(self.window, 0) - - def show_settings_dialog_cb(self, widget): - """Shows Config dialog.""" - - self.controller.show_configuration_dialog() - - def show_search_dialog_cb(self, widget): - """Show Search dialog.""" - - self.controller.show_search_dialog() - - def apply_filter_cb(self, widget): - """Updates toplevel selector with different level items.""" - - if not widget.get_active(): - return - - self._update_title(' - '.join([_('Meabook'), widget.get_label()])) - - if widget == self.level1_filter: - self._show_ui() - set_selector_content(self.selector, self.handler, \ - self.controller.get_all_folders()) - elif widget == self.level2_filter: - self._show_ui() - set_selector_content(self.selector, self.handler, \ - self.controller.get_all_subfolders()) - else: - self._show_ui(view='box', show_search=True) - set_box_content(self.box, self._show_item_dialog, \ - self.controller.get_files_by_pattern()) - self.search_entry.grab_focus() - - def select_item_cb(self, widget, column): - """ - Emits when changes selector content. - Opens new StackableWindow with new content. - """ - - item_name, internal_name, item_type = \ - widget.get_model(0)[widget.get_active(0)] - if item_type == TYPE_DIRECTORY: - self._show_items_dialog(item_name, self.controller.get_items( \ - internal_name)) - else: - self._show_item_dialog(item_name, internal_name) - - def search_item_cb(self, widget, event): - """Emits every time when user enter letter in search entry.""" - - set_box_content(self.box, self._show_item_dialog, \ - self.controller.get_files_by_pattern(widget.get_text())) - widget.grab_focus() - - def clear_search_entry_cb(self, widget, event): - """Clears search entry content.""" - - self.search_entry.set_text('') - set_box_content(self.box, self._show_item_dialog, \ - self.controller.get_files_by_pattern()) - - def call_cb(self, widget): - """Make a phone call.""" - - self.controller.call(widget.get_value()) - - def show_details_cb(self, widget): - """Show widget text in dialog.""" - - InfoDialog(widget.get_title(), widget.get_value()).run()