From 2b5b53ada1ad12d54fe0ce6d748fd72eddc0da2b Mon Sep 17 00:00:00 2001 From: gryf Date: Sun, 2 May 2010 19:02:35 +0200 Subject: [PATCH] Added popup menu for discs treeview, added separated glade files with interface and controllers --- pygtktalog/controllers/details.py | 18 +++ pygtktalog/controllers/discs.py | 150 +++++++++--------- pygtktalog/controllers/files.py | 33 ++++ pygtktalog/controllers/tags.py | 23 +++ pygtktalog/models/main.py | 9 +- pygtktalog/views/glade/details.glade | 138 +++++++++++++++++ pygtktalog/views/glade/discs.glade | 34 ++--- pygtktalog/views/glade/files.glade | 19 +++ pygtktalog/views/glade/tagcloud.glade | 22 +++ pygtktalog/views/glade/test.glade | 210 ++++++++++++++++++++++++++ pygtktalog/views/main.py | 77 +++++----- pygtktalog/views/main_menu.py | 36 +++++ pygtktalog/views/main_toolbar.py | 18 +++ src/ctrls/c_main.py | 4 - 14 files changed, 659 insertions(+), 132 deletions(-) create mode 100644 pygtktalog/controllers/details.py create mode 100644 pygtktalog/controllers/files.py create mode 100644 pygtktalog/controllers/tags.py create mode 100644 pygtktalog/views/glade/details.glade create mode 100644 pygtktalog/views/glade/files.glade create mode 100644 pygtktalog/views/glade/tagcloud.glade create mode 100644 pygtktalog/views/glade/test.glade create mode 100644 pygtktalog/views/main_menu.py create mode 100644 pygtktalog/views/main_toolbar.py diff --git a/pygtktalog/controllers/details.py b/pygtktalog/controllers/details.py new file mode 100644 index 0000000..dd628c6 --- /dev/null +++ b/pygtktalog/controllers/details.py @@ -0,0 +1,18 @@ +""" + Project: pyGTKtalog + Description: Controller for Details NoteBook + Type: core + Author: Roman 'gryf' Dobosz, gryf73@gmail.com + Created: 2009-08-30 +""" +from gtkmvc import Controller + + +class DetailsController(Controller): + """ + Controller for details NoteBook. + """ + + def register_view(self, view): + """Default view registration stuff""" + pass diff --git a/pygtktalog/controllers/discs.py b/pygtktalog/controllers/discs.py index 9c58967..bd0cf73 100644 --- a/pygtktalog/controllers/discs.py +++ b/pygtktalog/controllers/discs.py @@ -9,7 +9,9 @@ import gtk from gtkmvc import Controller -from pygtktalog.dialogs import info +from pygtktalog.logger import get_logger + +LOG = get_logger("discs ctrl") class DiscsController(Controller): @@ -21,8 +23,22 @@ class DiscsController(Controller): Controller.__init__(self, model, view) def register_view(self, view): - """Default view registration stuff""" - self.view['discs'].set_model(self.model.discs) + """ + Do DiscTree registration + """ + view['discs'].set_model(self.model.discs) + + # connect signals to popup menu - framework somehow omits automatic + # signal connection for subviews which are not under included to + # widgets tree + sigs = {'expand_all': ('activate', self.on_expand_all_activate), + 'collapse_all': ('activate', self.on_collapse_all_activate), + 'update': ('activate', self.on_update_activate), + 'rename': ('activate', self.on_rename_activate), + 'delete': ('activate', self.on_delete_activate), + 'statistics': ('activate', self.on_statistics_activate)} + for signal in sigs: + view.menu[signal].connect(sigs[signal][0], sigs[signal][1]) col = gtk.TreeViewColumn('kolumna') @@ -35,50 +51,34 @@ class DiscsController(Controller): col.set_attributes(cellpb, stock_id=0) col.set_attributes(cell, text=1) - self.view['discs'].append_column(col) - self.view['discs'].show() + view['discs'].append_column(col) + view['discs'].show() + + # signals def on_discs_button_press_event(self, treeview, event): """ - Handle right click on discs treeview. Show popup menu. + Handle right click on discs treeview - show popup menu. """ + LOG.debug('on_discs_button_press_event') + pathinfo = treeview.get_path_at_pos(int(event.x), int(event.y)) - time = event.time - try: - path, column, x, y = treeview.get_path_at_pos(int(event.x), - int(event.y)) - except TypeError: - treeview.get_selection().unselect_all() - return False + if event.button == 3 and pathinfo: + path, column, x, y = pathinfo - if event.button == 3: - """Right mouse button. Show context menu.""" - try: - selection = treeview.get_selection() - model, list_of_paths = selection.get_selected_rows() - except TypeError: - list_of_paths = [] + # Make sure, that there is selected row + sel = treeview.get_selection() + sel.unselect_all() + sel.select_path(path) - if path not in list_of_paths: - treeview.get_selection().unselect_all() - treeview.get_selection().select_path(path) - # setup menu - ids = self.__get_tv_selection_ids(treeview) - for menu_item in ['update1','rename1','delete2', 'statistics1']: - self.view.popup_menu[menu_item].set_sensitive(not not ids) - - # checkout, if we dealing with disc or directory - # if ancestor is 'root', then activate "update" menu item - treeiter = self.model.discs.get_iter(path) - #ancestor = self.model.discs.get_value(treeiter, 3) == 1 - #self.view['update1'].set_sensitive(ancestor) - - self.view.popup_menu['discs_popup'].popup(None, None, None, event.button, time) + self._popup_menu(sel, event, event.button) + return True def on_discs_cursor_changed(self, widget): """Show files on right treeview, after clicking the left disc treeview.""" + LOG.debug('on_discs_cursor_changed') model = self.view['discs'].get_model() path, column = self.view['discs'].get_cursor() if path: @@ -90,53 +90,59 @@ class DiscsController(Controller): return def on_discs_key_release_event(self, treeview, event): + """ + Trigger popup menu by pressing 'menu' key + """ + LOG.debug('on_discs_key_release_event') if gtk.gdk.keyval_name(event.keyval) == 'Menu': - ids = self.__get_tv_selection_ids(treeview) - menu_items = ['update1','rename1','delete2', 'statistics1'] - for menu_item in menu_items: - self.view[menu_item].set_sensitive(not not ids) - self.__popup_menu(event, 'discs_popup') + self._popup_menu(treeview.get_selection(), event, 0) return True return False def on_discs_row_activated(self, treeview, path, treecolumn): - """If possible, expand or collapse branch of discs tree""" + """ + If possible, expand or collapse branch of discs tree + """ if treeview.row_expanded(path): treeview.collapse_row(path) else: treeview.expand_row(path, False) - return - # private class functions - def __set_files_hiden_columns_visible(self, boolean): - """switch visibility of default hidden columns in files treeview""" - info("switch visibility of default hidden columns in files treeview") - #self.view['files'].get_column(0).set_visible(boolean) - #self.view['files'].get_column(2).set_visible(boolean) + def on_expand_all_activate(self, menu_item): + """ + Expand all + """ + self.view['discs'].expand_all() - def __get_tv_selection_ids(self, treeview): - """get selection from treeview and return coresponding ids' from - connected model or None""" - ids = [] - try: - selection = treeview.get_selection() - model, list_of_paths = selection.get_selected_rows() - for path in list_of_paths: - ids.append(model.get_value(model.get_iter(path), 0)) - return ids - except: - # DEBUG: treeview have no selection or smth is broken - if __debug__: - print "c_main.py: __get_tv_selection_ids(): error on", - print "getting selected items" - return - return None + def on_collapse_all_activate(self, menu_item): + self.view['discs'].collapse_all() - def __popup_menu(self, event, menu='discs_popup'): - """Popoup desired menu""" - self.view.discs_popup['discs_popup'].popup(None, None, None, 0, 0) - #self.view[menu].popup(None, None, None, event.button, - # event.time) - self.view.discs_popup['discs_popup'].show_all() - return + def on_update_activate(self, menu_item): + raise NotImplementedError + + def on_rename_activate(self, menu_item): + raise NotImplementedError + + def on_delete_activate(self, menu_item): + raise NotImplementedError + + def on_statistics_activate(self, menu_item): + raise NotImplementedError + + def _popup_menu(self, selection, event, button): + """ + Popup menu for discs treeview. Gather information from discs model, + and trigger menu popup. + """ + LOG.debug('_popup_menu') + model, list_of_paths = selection.get_selected_rows() + + #for path in list_of_paths: + # if model.get_value(model.get_iter(path), 4).parent_id == 1: + # self.view.popup_menu.disable_update(False) + # else: + # self.view.popup_menu.disable_update(True) + + self.view.menu['discs_popup'].popup(None, None, None, + button, event.time) diff --git a/pygtktalog/controllers/files.py b/pygtktalog/controllers/files.py new file mode 100644 index 0000000..22d41c0 --- /dev/null +++ b/pygtktalog/controllers/files.py @@ -0,0 +1,33 @@ +""" + Project: pyGTKtalog + Description: Controller for Files TreeView + Type: core + Author: Roman 'gryf' Dobosz, gryf73@gmail.com + Created: 2009-08-30 +""" +import gtk + +from gtkmvc import Controller + + +class FilesController(Controller): + """ + Controller for files TreeView list. + """ + + def register_view(self, view): + """Default view registration stuff""" + self.view['files'].set_model(self.model.discs) + + col = gtk.TreeViewColumn('kolumna2') + + cellpb = gtk.CellRendererPixbuf() + cell = gtk.CellRendererText() + + col.pack_start(cellpb, False) + col.pack_start(cell, True) + + col.set_attributes(cellpb, stock_id=0) + col.set_attributes(cell, text=1) + self.view['files'].append_column(col) + diff --git a/pygtktalog/controllers/tags.py b/pygtktalog/controllers/tags.py new file mode 100644 index 0000000..20dfb7d --- /dev/null +++ b/pygtktalog/controllers/tags.py @@ -0,0 +1,23 @@ +""" + Project: pyGTKtalog + Description: Controller for Tagcloud TextView + Type: core + Author: Roman 'gryf' Dobosz, gryf73@gmail.com + Created: 2009-08-30 +""" +from gtkmvc import Controller + + +class TagcloudController(Controller): + """ + Controller for Tagcloud TextView + """ + + #def __init__(self, model, view): + # """Initialize main controller""" + # Controller.__init__(self, model, view) + # return + + def register_view(self, view): + """Default view registration stuff""" + pass diff --git a/pygtktalog/models/main.py b/pygtktalog/models/main.py index 7966326..5454192 100644 --- a/pygtktalog/models/main.py +++ b/pygtktalog/models/main.py @@ -54,7 +54,8 @@ class MainModel(ModelMT): self.discs = gtk.TreeStore(gobject.TYPE_INT, gobject.TYPE_STRING, str, - gobject.TYPE_INT) + gobject.TYPE_INT, + gobject.TYPE_PYOBJECT) if self.cat_fname: self.open(self.cat_fname) @@ -195,7 +196,8 @@ class MainModel(ModelMT): """ """ session = Session() - dirs = session.query(File).filter(File.type == 1).all() + dirs = session.query(File).filter(File.type == 1) + dirs = dirs.order_by(File.filename).all() def get_children(parent_id=1, iterator=None): """ @@ -214,6 +216,7 @@ class MainModel(ModelMT): else: self.discs.set_value(myiter, 2, gtk.STOCK_DIRECTORY) self.discs.set_value(myiter, 3, fileob.parent_id) + self.discs.set_value(myiter, 4, fileob) get_children(fileob.id, myiter) return get_children() @@ -223,4 +226,4 @@ class MainModel(ModelMT): # TODO: get this thing right def get_root_entries(self, id): - LOG.debug("id: %s", str(id)) + LOG.debug("get_root_entries, id: %s", str(id)) diff --git a/pygtktalog/views/glade/details.glade b/pygtktalog/views/glade/details.glade new file mode 100644 index 0000000..012db42 --- /dev/null +++ b/pygtktalog/views/glade/details.glade @@ -0,0 +1,138 @@ + + + + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + GTK_WRAP_WORD + 2 + 2 + False + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_RESIZE_QUEUE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 3 + 3 + gtk-missing-image + 6 + + + + + False + False + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + File info + + + tab + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Double click to open image + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Images + + + tab + 1 + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + + + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + EXIF + + + tab + 2 + False + + + + + + diff --git a/pygtktalog/views/glade/discs.glade b/pygtktalog/views/glade/discs.glade index 2e7f723..20ec0ac 100644 --- a/pygtktalog/views/glade/discs.glade +++ b/pygtktalog/views/glade/discs.glade @@ -1,7 +1,7 @@ - - - + + + @@ -10,66 +10,66 @@ False True - + - + True Expand all nodes _Expand all True - + - + True Collapse all nodes _Collapse all True - + - + True - + True _Update True - + - + True _Rename True - + - + True _Delete True - + - + True _Statistics True - + diff --git a/pygtktalog/views/glade/files.glade b/pygtktalog/views/glade/files.glade new file mode 100644 index 0000000..53e5b96 --- /dev/null +++ b/pygtktalog/views/glade/files.glade @@ -0,0 +1,19 @@ + + + + + + + + True + True + True + + + + + + + + + diff --git a/pygtktalog/views/glade/tagcloud.glade b/pygtktalog/views/glade/tagcloud.glade new file mode 100644 index 0000000..985a68f --- /dev/null +++ b/pygtktalog/views/glade/tagcloud.glade @@ -0,0 +1,22 @@ + + + + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + word + False + + + + + + + + + + diff --git a/pygtktalog/views/glade/test.glade b/pygtktalog/views/glade/test.glade new file mode 100644 index 0000000..3c80715 --- /dev/null +++ b/pygtktalog/views/glade/test.glade @@ -0,0 +1,210 @@ + + + + + + + + True + GTK_ORIENTATION_VERTICAL + GTK_ORIENTATION_VERTICAL + + + True + + + True + _File + True + + + True + + + True + gtk-new + True + True + + + + + True + gtk-open + True + True + + + + + True + gtk-save + True + True + + + + + True + gtk-save-as + True + True + + + + + True + + + + + True + gtk-quit + True + True + + + + + + + + + True + _Edit + True + + + True + + + True + gtk-cut + True + True + + + + + True + gtk-copy + True + True + + + + + True + gtk-paste + True + True + + + + + True + gtk-delete + True + True + + + + + + + + + True + _View + True + + + + + True + _Help + True + + + True + + + True + gtk-about + True + True + + + + + + + + + False + + + + + True + True + + + True + GTK_RESIZE_QUEUE + + + True + True + + + + + False + True + + + + + True + True + + + True + True + + + + + 1 + + + + + True + + + True + 2 + False + + + + + True + + + False + 1 + + + + + False + 2 + + + + + + diff --git a/pygtktalog/views/main.py b/pygtktalog/views/main.py index fbb77db..5bf1f13 100644 --- a/pygtktalog/views/main.py +++ b/pygtktalog/views/main.py @@ -7,6 +7,8 @@ """ import os.path +import gtk + from gtkmvc import View @@ -53,8 +55,7 @@ class DiscsView(View): Initialize view """ View.__init__(self) - self.popup_menu = DiscsPopupView() - + self.menu = DiscsPopupView() class DiscsPopupView(View): """ @@ -69,47 +70,51 @@ class DiscsPopupView(View): """ View.__init__(self) + def disable_update(self, state): + """ + """ + self['update1'].set_sensitive(not state) -#class FilesView(View): -# """ -# Separate subview of Files TreeView as a table. -# """ -# glade = get_glade("files.glade") -# top = 'files' +class FilesView(View): + """ + Separate subview of Files TreeView as a table. + """ + glade = get_glade("files.glade") + top = 'files' -# def __init__(self): -# """ -# Initialize view -# """ -# View.__init__(self) + def __init__(self): + """ + Initialize view + """ + View.__init__(self) -#class TagcloudView(View): -# """ -# Textview subview with clickable tags. -# """ -# glade = get_glade("tagcloud.glade") -# top = 'tag_cloud_textview' +class TagcloudView(View): + """ + Textview subview with clickable tags. + """ + glade = get_glade("tagcloud.glade") + top = 'tag_cloud_textview' -# def __init__(self): -# """ -# Initialize view -# """ -# View.__init__(self) + def __init__(self): + """ + Initialize view + """ + View.__init__(self) -#class DetailsView(View): -# """ -# Notebook subview containing tabs with details and possibly Exif, images -# assocated with object and alternatively thumbnail. -# """ -# glade = get_glade("details.glade") -# top = 'notebook_details' +class DetailsView(View): + """ + Notebook subview containing tabs with details and possibly Exif, images + assocated with object and alternatively thumbnail. + """ + glade = get_glade("details.glade") + top = 'notebook_details' -# def __init__(self): -# """ -# Initialize view -# """ -# View.__init__(self) + def __init__(self): + """ + Initialize view + """ + View.__init__(self) diff --git a/pygtktalog/views/main_menu.py b/pygtktalog/views/main_menu.py new file mode 100644 index 0000000..d22b647 --- /dev/null +++ b/pygtktalog/views/main_menu.py @@ -0,0 +1,36 @@ +""" +Project: pyGTKtalog +Description: Menu for the main window +Type: interface +Author: Roman 'gryf' Dobosz, gryf73@gmail.com +Created: 2010-03-14 21:31:57 +""" + +import gtk + +from gtkmvc import View + + +class MainMenu(View): + def __init__(self): + View.__init__(self) + self['mainMenu'] = gtk.MenuBar() + + self['file_menu'] = gtk.MenuItem(_("_File")) + + accel_group = gtk.AccelGroup() + menu_items = (("/_File", None, None, 0, ""), + ("/File/_New", "N", None, 0, None), + ("/File/_Open", "O", None, 0, None), + ("/File/_Save", "S", None, 0, None), + ("/File/Save _As", None, None, 0, None), + ("/File/sep1", None, None, 0, ""), + ("/File/Quit", "Q", gtk.main_quit, 0, None), + ("/_Options", None, None, 0, ""), + ("/Options/Test", None, None, 0, None), + ("/_Help", None, None, 0, ""), + ("/_Help/About", None, None, 0, None),) + item_factory = gtk.ItemFactory(gtk.MenuBar, "
", accel_group) + item_factory.create_items(menu_items) + + diff --git a/pygtktalog/views/main_toolbar.py b/pygtktalog/views/main_toolbar.py new file mode 100644 index 0000000..882b4ab --- /dev/null +++ b/pygtktalog/views/main_toolbar.py @@ -0,0 +1,18 @@ +""" +Project: pyGTKtalog +Description: Toolbar for the main window +Type: interface +Author: Roman 'gryf' Dobosz, gryf73@gmail.com +Created: 2010-04-20 18:47:49 +""" + +import gtk + +from gtkmvc import View + + +class ToolBar(View): + def __init__(self): + View.__init__(self) + self['maintoolbar'] = gtk.Toolbar() + diff --git a/src/ctrls/c_main.py b/src/ctrls/c_main.py index 2274f50..0e99b9d 100644 --- a/src/ctrls/c_main.py +++ b/src/ctrls/c_main.py @@ -862,10 +862,6 @@ class MainController(Controller): self.__popup_menu(event) - def on_expand_all1_activate(self, menu_item): - self.view['discs'].expand_all() - return - def on_export_activate(self, menu_item): """export db file and coressponding images to tar.bz2 archive""" dialog = Dialogs.ChooseFilename(None, _("Choose export file"))