1
0
mirror of https://github.com/gryf/pygtktalog.git synced 2025-12-17 11:30:19 +01:00

* Clean up TreeStore model for files.

* Added observer variable to main model, so that clicked file id in
   search window can be easly passed to main controller and jump to that
   file.
 * Some cosmetic changes.
This commit is contained in:
2008-05-08 08:45:23 +00:00
parent 1b0d76e6ba
commit 697bd8124c

View File

@@ -22,7 +22,7 @@
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
__version__ = "0.8" __version__ = "1.0 RC1"
LICENCE = \ LICENCE = \
""" """
GPL v2 GPL v2
@@ -37,6 +37,9 @@ from gtkmvc import Controller
from c_config import ConfigController from c_config import ConfigController
from views.v_config import ConfigView from views.v_config import ConfigView
from c_search import SearchController
from views.v_search import SearchView
import views.v_dialogs as Dialogs import views.v_dialogs as Dialogs
from views.v_image import ImageView from views.v_image import ImageView
@@ -124,7 +127,6 @@ class MainController(Controller):
# generate recent menu # generate recent menu
self.__generate_recent_menu() self.__generate_recent_menu()
self.view['tag_cloud_textview'].connect("populate-popup", self.view['tag_cloud_textview'].connect("populate-popup",
self.on_tag_cloud_textview_popup) self.on_tag_cloud_textview_popup)
# in case model has opened file, register tags # in case model has opened file, register tags
@@ -181,6 +183,8 @@ class MainController(Controller):
return True return True
def on_tag_cloud_textview_event_after(self, textview, event): def on_tag_cloud_textview_event_after(self, textview, event):
"""check, if and what tag user clicked. generate apropriate output
in files treview"""
if event.type != gtk.gdk.BUTTON_RELEASE: if event.type != gtk.gdk.BUTTON_RELEASE:
return False return False
if event.button != 1: if event.button != 1:
@@ -222,6 +226,7 @@ class MainController(Controller):
self.view['tag_path'].set_text(txt + ", " +tag1) self.view['tag_path'].set_text(txt + ", " +tag1)
self.__tag_cloud() self.__tag_cloud()
self.model.get_root_entries() self.model.get_root_entries()
self.__set_files_hiden_columns_visible(True)
self.view['files'].set_model(self.model.files_list) self.view['files'].set_model(self.model.files_list)
self.__hide_details() self.__hide_details()
@@ -409,6 +414,7 @@ class MainController(Controller):
self.view['tag_path_box'].hide() self.view['tag_path_box'].hide()
self.model.selected_tags = [] self.model.selected_tags = []
self.model.refresh_discs_tree() self.model.refresh_discs_tree()
self.__set_files_hiden_columns_visible(False)
# cleanup files and detiles # cleanup files and detiles
try: try:
@@ -464,7 +470,6 @@ class MainController(Controller):
textview.get_window(gtk.TEXT_WINDOW_TEXT).\ textview.get_window(gtk.TEXT_WINDOW_TEXT).\
set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
def on_tag_cloud_click(self, tag, textview, event, b_iter, data): def on_tag_cloud_click(self, tag, textview, event, b_iter, data):
"""react on click on connected tag items""" """react on click on connected tag items"""
tag_cloud = self.view['tag_cloud_textview'] tag_cloud = self.view['tag_cloud_textview']
@@ -487,18 +492,8 @@ class MainController(Controller):
self.view['tag_path'].set_text(txt + ", " +tag1) self.view['tag_path'].set_text(txt + ", " +tag1)
self.__tag_cloud() self.__tag_cloud()
#elif event.type == gtk.gdk.MOTION_NOTIFY:
# window = tag_cloud.get_window(gtk.TEXT_WINDOW_TEXT)
# if window:
# window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2))
#else:
# window = tag_cloud.get_window(gtk.TEXT_WINDOW_TEXT)
# if window:
# window.set_cursor(None)
# NOTE: quit / close window
def on_main_destroy_event(self, window, event): def on_main_destroy_event(self, window, event):
"""NOTE: quit / close window signal"""
self.on_quit_activate(window) self.on_quit_activate(window)
return True return True
@@ -688,6 +683,7 @@ class MainController(Controller):
if path: if path:
iter = self.model.discs_tree.get_iter(path) iter = self.model.discs_tree.get_iter(path)
id = self.model.discs_tree.get_value(iter, 0) id = self.model.discs_tree.get_value(iter, 0)
self.__set_files_hiden_columns_visible(False)
self.model.get_root_entries(id) self.model.get_root_entries(id)
self.__get_item_info(id) self.__get_item_info(id)
@@ -700,7 +696,7 @@ class MainController(Controller):
else: else:
treeview.expand_row(path, False) treeview.expand_row(path, False)
return return
def on_discs_key_release_event(self, treeview, event): def on_discs_key_release_event(self, treeview, event):
if gtk.gdk.keyval_name(event.keyval) == 'Menu': if gtk.gdk.keyval_name(event.keyval) == 'Menu':
ids = self.__get_tv_selection_ids(treeview) ids = self.__get_tv_selection_ids(treeview)
@@ -710,13 +706,13 @@ class MainController(Controller):
self.__popup_menu(event, 'discs_popup') self.__popup_menu(event, 'discs_popup')
return True return True
return False return False
def on_images_key_release_event(self, iconview, event): def on_images_key_release_event(self, iconview, event):
if gtk.gdk.keyval_name(event.keyval) == 'Menu': if gtk.gdk.keyval_name(event.keyval) == 'Menu':
self.__popup_menu(event, 'img_popup') self.__popup_menu(event, 'img_popup')
return True return True
return False return False
def on_images_button_press_event(self, iconview, event): def on_images_button_press_event(self, iconview, event):
#try: #try:
# path_and_cell = iconview.get_item_at_pos(int(event.x), # path_and_cell = iconview.get_item_at_pos(int(event.x),
@@ -741,13 +737,13 @@ class MainController(Controller):
Dialogs.Inf("Delete images", "No images selected", Dialogs.Inf("Delete images", "No images selected",
"You have to select at least one image to delete.") "You have to select at least one image to delete.")
return return
if self.model.config.confd['delwarn']: if self.model.config.confd['delwarn']:
obj = Dialogs.Qst('Delete images', 'Delete selected images?', obj = Dialogs.Qst('Delete images', 'Delete selected images?',
'Selected images will be permanently removed from catalog.') 'Selected images will be permanently removed from catalog.')
if not obj.run(): if not obj.run():
return return
model = self.view['images'].get_model() model = self.view['images'].get_model()
for path in list_of_paths: for path in list_of_paths:
iter = model.get_iter(path) iter = model.get_iter(path)
@@ -778,7 +774,7 @@ class MainController(Controller):
list_of_paths = self.view['images'].get_selected_items() list_of_paths = self.view['images'].get_selected_items()
model = self.view['images'].get_model() model = self.view['images'].get_model()
count = 0 count = 0
if len(list_of_paths) == 0: if len(list_of_paths) == 0:
@@ -808,12 +804,12 @@ class MainController(Controller):
def on_img_delete2_activate(self, menu_item): def on_img_delete2_activate(self, menu_item):
"""remove images, but keep thumbnails""" """remove images, but keep thumbnails"""
list_of_paths = self.view['images'].get_selected_items() list_of_paths = self.view['images'].get_selected_items()
if not list_of_paths: if not list_of_paths:
Dialogs.Inf("Delete images", "No images selected", Dialogs.Inf("Delete images", "No images selected",
"You have to select at least one image to delete.") "You have to select at least one image to delete.")
return return
if self.model.config.confd['delwarn']: if self.model.config.confd['delwarn']:
obj = Dialogs.Qst('Delete images', 'Delete selected images?', obj = Dialogs.Qst('Delete images', 'Delete selected images?',
'Selected images will be permanently removed from ' + \ 'Selected images will be permanently removed from ' + \
@@ -871,13 +867,13 @@ class MainController(Controller):
menu_items = ['update1','rename1','delete2', 'statistics1'] menu_items = ['update1','rename1','delete2', 'statistics1']
for menu_item in menu_items: for menu_item in menu_items:
self.view[menu_item].set_sensitive(not not ids) self.view[menu_item].set_sensitive(not not ids)
# checkout, if we dealing with disc or directory # checkout, if we dealing with disc or directory
# if ancestor is 'root', then activate "update" menu item # if ancestor is 'root', then activate "update" menu item
treeiter = self.model.discs_tree.get_iter(path) treeiter = self.model.discs_tree.get_iter(path)
ancestor = self.model.discs_tree.get_value(treeiter, 3) == 1 ancestor = self.model.discs_tree.get_value(treeiter, 3) == 1
self.view['update1'].set_sensitive(ancestor) self.view['update1'].set_sensitive(ancestor)
self.__popup_menu(event) self.__popup_menu(event)
def on_expand_all1_activate(self, menu_item): def on_expand_all1_activate(self, menu_item):
@@ -917,8 +913,6 @@ class MainController(Controller):
self.view['edit2'].set_sensitive(True) self.view['edit2'].set_sensitive(True)
self.__popup_menu(event, 'files_popup') self.__popup_menu(event, 'files_popup')
return True return True
#if event.button == 1:
# return False
def on_files_cursor_changed(self, treeview): def on_files_cursor_changed(self, treeview):
"""Show details of selected file/directory""" """Show details of selected file/directory"""
@@ -937,7 +931,7 @@ class MainController(Controller):
except TypeError: except TypeError:
return return
self.__popup_menu(event, 'files_popup') self.__popup_menu(event, 'files_popup')
if gtk.gdk.keyval_name(event.keyval) == 'BackSpace': if gtk.gdk.keyval_name(event.keyval) == 'BackSpace':
d_path, d_column = self.view['discs'].get_cursor() d_path, d_column = self.view['discs'].get_cursor()
if d_path and d_column: if d_path and d_column:
@@ -953,11 +947,12 @@ class MainController(Controller):
first_iter = f_model.get_iter_first() first_iter = f_model.get_iter_first()
first_child_value = f_model.get_value(first_iter, 0) first_child_value = f_model.get_value(first_iter, 0)
# get two steps up # get two steps up
val = self.model.get_parent_discs_value(first_child_value) val = self.model.get_parent_id(first_child_value)
parent_value = self.model.get_parent_discs_value(val) parent_value = self.model.get_parent_id(val)
iter = self.model.discs_tree.get_iter_first() iter = self.model.discs_tree.get_iter_first()
while iter: while iter:
current_value = self.model.discs_tree.get_value(iter, 0) current_value = self.model.discs_tree.get_value(iter,
0)
if current_value == parent_value: if current_value == parent_value:
path = self.model.discs_tree.get_path(iter) path = self.model.discs_tree.get_path(iter)
self.view['discs'].set_cursor(path) self.view['discs'].set_cursor(path)
@@ -976,8 +971,9 @@ class MainController(Controller):
f_iter = self.model.files_list.get_iter(row) f_iter = self.model.files_list.get_iter(row)
current_id = self.model.files_list.get_value(f_iter, 0) current_id = self.model.files_list.get_value(f_iter, 0)
if self.model.files_list.get_value(f_iter,4) == 1: if self.model.files_list.get_value(f_iter, 6) == 1:
# ONLY directories. files are omitted. # ONLY directories. files are omitted.
self.__set_files_hiden_columns_visible(False)
self.model.get_root_entries(current_id) self.model.get_root_entries(current_id)
d_path, d_column = self.view['discs'].get_cursor() d_path, d_column = self.view['discs'].get_cursor()
@@ -985,15 +981,16 @@ class MainController(Controller):
if not self.view['discs'].row_expanded(d_path): if not self.view['discs'].row_expanded(d_path):
self.view['discs'].expand_row(d_path, False) self.view['discs'].expand_row(d_path, False)
iter = self.model.discs_tree.get_iter(d_path) discs_model = self.model.discs_tree
new_iter = self.model.discs_tree.iter_children(iter) iterator = discs_model.get_iter(d_path)
new_iter = discs_model.iter_children(iterator)
if new_iter: if new_iter:
while new_iter: while new_iter:
current_value = self.model.discs_tree.get_value(new_iter, 0) current_value = discs_model.get_value(new_iter, 0)
if current_value == current_id: if current_value == current_id:
path = self.model.discs_tree.get_path(new_iter) path = discs_model.get_path(new_iter)
self.view['discs'].set_cursor(path) self.view['discs'].set_cursor(path)
new_iter = self.model.discs_tree.iter_next(new_iter) new_iter = discs_model.iter_next(new_iter)
return return
def on_cancel_clicked(self, widget): def on_cancel_clicked(self, widget):
@@ -1003,7 +1000,10 @@ class MainController(Controller):
return return
def on_find_activate(self, widget): def on_find_activate(self, widget):
# TODO: implement searcher """search button/menu activated. Show search window"""
if not self.model.search_created:
c = SearchController(self.model)
v = SearchView(c)
return return
# NOTE: recent signal # NOTE: recent signal
@@ -1014,7 +1014,7 @@ class MainController(Controller):
# NOTE: add tags / images # NOTE: add tags / images
def on_delete_tag2_activate(self, menu_item): def on_delete_tag2_activate(self, menu_item):
pass pass
def on_delete_tag_activate(self, menu_item): def on_delete_tag_activate(self, menu_item):
ids = self.__get_tv_selection_ids(self.view['files']) ids = self.__get_tv_selection_ids(self.view['files'])
if not ids: if not ids:
@@ -1115,20 +1115,20 @@ class MainController(Controller):
self.on_delete2_activate(menu_item) self.on_delete2_activate(menu_item)
if self.view['images'].is_focus(): if self.view['images'].is_focus():
self.on_img_delete_activate(menu_item) self.on_img_delete_activate(menu_item)
def on_delete2_activate(self, menu_item): def on_delete2_activate(self, menu_item):
try: try:
selection = self.view['discs'].get_selection() selection = self.view['discs'].get_selection()
model, selected_iter = selection.get_selected() model, selected_iter = selection.get_selected()
except: except:
return return
if not selected_iter: if not selected_iter:
Dialogs.Inf("Delete disc", "No disc selected", Dialogs.Inf("Delete disc", "No disc selected",
"You have to select disc first before you " +\ "You have to select disc first before you " +\
"can delete it") "can delete it")
return return
if self.model.config.confd['delwarn']: if self.model.config.confd['delwarn']:
name = model.get_value(selected_iter, 1) name = model.get_value(selected_iter, 1)
obj = Dialogs.Qst('Delete %s' % name, 'Delete %s?' % name, obj = Dialogs.Qst('Delete %s' % name, 'Delete %s?' % name,
@@ -1172,12 +1172,12 @@ class MainController(Controller):
model, list_of_paths = selection.get_selected_rows() model, list_of_paths = selection.get_selected_rows()
except TypeError: except TypeError:
return return
if not list_of_paths: if not list_of_paths:
Dialogs.Inf("Delete files", "No files selected", Dialogs.Inf("Delete files", "No files selected",
"You have to select at least one file to delete.") "You have to select at least one file to delete.")
return return
if self.model.config.confd['delwarn']: if self.model.config.confd['delwarn']:
obj = Dialogs.Qst("Delete files", "Delete files?", obj = Dialogs.Qst("Delete files", "Delete files?",
"Selected files and directories will be" + \ "Selected files and directories will be" + \
@@ -1239,7 +1239,7 @@ class MainController(Controller):
self.model.unsaved_project = True self.model.unsaved_project = True
self.__set_title(filepath=self.model.filename, modified=True) self.__set_title(filepath=self.model.filename, modified=True)
return return
def on_edit1_activate(self, menu_item): def on_edit1_activate(self, menu_item):
"""Make sufficient menu items sensitive in right cases""" """Make sufficient menu items sensitive in right cases"""
# TODO: consolidate popup-menus with edit menu # TODO: consolidate popup-menus with edit menu
@@ -1247,7 +1247,7 @@ class MainController(Controller):
self.view['delete1'].set_sensitive(False) self.view['delete1'].set_sensitive(False)
else: else:
self.view['delete1'].set_sensitive(True) self.view['delete1'].set_sensitive(True)
def on_debugbtn_clicked(self, widget): def on_debugbtn_clicked(self, widget):
"""Debug. To remove in stable version, including button in GUI""" """Debug. To remove in stable version, including button in GUI"""
if __debug__: if __debug__:
@@ -1263,10 +1263,45 @@ class MainController(Controller):
print "files have focus", self.view['files'].is_focus() print "files have focus", self.view['files'].is_focus()
print "discs have focus", self.view['discs'].is_focus() print "discs have focus", self.view['discs'].is_focus()
print "images have focus", self.view['images'].is_focus() print "images have focus", self.view['images'].is_focus()
c = self.view['files'].get_column(0)
c.set_visible(not c.get_visible())
c = self.view['files'].get_column(2)
c.set_visible(not c.get_visible())
##################### #####################
# observed properetis # observed properetis
def property_point_value_change(self, model, old, new):
"""File was activated in search window through the observable
property - select it on the discs and files treeview, and get
file description"""
if new:
discs_tree = self.view['discs']
discs_model = discs_tree.get_model()
parent_id = self.model.get_parent_id(new)
def foreach_disctree(model, path, iterator, data):
"""find path in model to desired value"""
if model.get_value(iterator, 0) == data:
discs_tree.expand_to_path(path)
discs_tree.set_cursor(path)
return False
discs_model.foreach(foreach_disctree, parent_id)
files_list = self.view['files']
files_model = files_list.get_model()
def foreach_fileslist(model, path, iterator, data):
"""find path in model to desired value"""
if model.get_value(iterator, 0) == data:
files_list.set_cursor(path)
self.__get_item_info(data)
return False
files_model.foreach(foreach_fileslist, new)
return
def property_statusmsg_value_change(self, model, old, new): def property_statusmsg_value_change(self, model, old, new):
if self.statusbar_id: if self.statusbar_id:
self.view['mainStatus'].remove(self.context_id, self.statusbar_id) self.view['mainStatus'].remove(self.context_id, self.statusbar_id)
@@ -1307,6 +1342,11 @@ class MainController(Controller):
######################### #########################
# private class functions # private class functions
def __set_files_hiden_columns_visible(self, boolean):
"""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 __get_tv_selection_ids(self, treeview): def __get_tv_selection_ids(self, treeview):
"""get selection from treeview and return coresponding ids' from """get selection from treeview and return coresponding ids' from
connected model or None""" connected model or None"""
@@ -1369,28 +1409,39 @@ class MainController(Controller):
v.get_selection().set_mode(gtk.SELECTION_MULTIPLE) v.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
c = gtk.TreeViewColumn('Disc', gtk.CellRendererText(), text=1)
c.set_sort_column_id(1)
c.set_resizable(True)
c.set_visible(False)
self.view['files'].append_column(c)
c = gtk.TreeViewColumn('Filename') c = gtk.TreeViewColumn('Filename')
cellpb = gtk.CellRendererPixbuf() cellpb = gtk.CellRendererPixbuf()
cell = gtk.CellRendererText() cell = gtk.CellRendererText()
c.pack_start(cellpb, False) c.pack_start(cellpb, False)
c.pack_start(cell, True) c.pack_start(cell, True)
c.set_attributes(cellpb, stock_id=6) c.set_attributes(cellpb, stock_id=7)
c.set_attributes(cell, text=1) c.set_attributes(cell, text=2)
c.set_sort_column_id(1)
c.set_resizable(True)
self.view['files'].append_column(c)
c = gtk.TreeViewColumn('Size', gtk.CellRendererText(), text=2)
c.set_sort_column_id(2) c.set_sort_column_id(2)
c.set_resizable(True) c.set_resizable(True)
self.view['files'].append_column(c) self.view['files'].append_column(c)
c = gtk.TreeViewColumn('Date', gtk.CellRendererText(), text=3) c = gtk.TreeViewColumn('Path', gtk.CellRendererText(), text=3)
c.set_sort_column_id(3) c.set_sort_column_id(3)
c.set_resizable(True) c.set_resizable(True)
c.set_visible(False)
self.view['files'].append_column(c) self.view['files'].append_column(c)
self.view['files'].set_search_column(1)
c = gtk.TreeViewColumn('Size', gtk.CellRendererText(), text=4)
c.set_sort_column_id(4)
c.set_resizable(True)
self.view['files'].append_column(c)
c = gtk.TreeViewColumn('Date', gtk.CellRendererText(), text=5)
c.set_sort_column_id(5)
c.set_resizable(True)
self.view['files'].append_column(c)
self.view['files'].set_search_column(2)
#v.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, #v.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
# self.DND_TARGETS, # self.DND_TARGETS,