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
-
+
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
+
+
+
+ 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"))