1
0
mirror of https://github.com/gryf/pygtktalog.git synced 2025-12-17 19:40:21 +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 = \
"""
GPL v2
@@ -37,6 +37,9 @@ from gtkmvc import Controller
from c_config import ConfigController
from views.v_config import ConfigView
from c_search import SearchController
from views.v_search import SearchView
import views.v_dialogs as Dialogs
from views.v_image import ImageView
@@ -124,7 +127,6 @@ class MainController(Controller):
# generate recent menu
self.__generate_recent_menu()
self.view['tag_cloud_textview'].connect("populate-popup",
self.on_tag_cloud_textview_popup)
# in case model has opened file, register tags
@@ -181,6 +183,8 @@ class MainController(Controller):
return True
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:
return False
if event.button != 1:
@@ -222,6 +226,7 @@ class MainController(Controller):
self.view['tag_path'].set_text(txt + ", " +tag1)
self.__tag_cloud()
self.model.get_root_entries()
self.__set_files_hiden_columns_visible(True)
self.view['files'].set_model(self.model.files_list)
self.__hide_details()
@@ -409,6 +414,7 @@ class MainController(Controller):
self.view['tag_path_box'].hide()
self.model.selected_tags = []
self.model.refresh_discs_tree()
self.__set_files_hiden_columns_visible(False)
# cleanup files and detiles
try:
@@ -464,7 +470,6 @@ class MainController(Controller):
textview.get_window(gtk.TEXT_WINDOW_TEXT).\
set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
def on_tag_cloud_click(self, tag, textview, event, b_iter, data):
"""react on click on connected tag items"""
tag_cloud = self.view['tag_cloud_textview']
@@ -487,18 +492,8 @@ class MainController(Controller):
self.view['tag_path'].set_text(txt + ", " +tag1)
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):
"""NOTE: quit / close window signal"""
self.on_quit_activate(window)
return True
@@ -688,6 +683,7 @@ class MainController(Controller):
if path:
iter = self.model.discs_tree.get_iter(path)
id = self.model.discs_tree.get_value(iter, 0)
self.__set_files_hiden_columns_visible(False)
self.model.get_root_entries(id)
self.__get_item_info(id)
@@ -700,7 +696,7 @@ class MainController(Controller):
else:
treeview.expand_row(path, False)
return
def on_discs_key_release_event(self, treeview, event):
if gtk.gdk.keyval_name(event.keyval) == 'Menu':
ids = self.__get_tv_selection_ids(treeview)
@@ -710,13 +706,13 @@ class MainController(Controller):
self.__popup_menu(event, 'discs_popup')
return True
return False
def on_images_key_release_event(self, iconview, event):
if gtk.gdk.keyval_name(event.keyval) == 'Menu':
self.__popup_menu(event, 'img_popup')
return True
return False
def on_images_button_press_event(self, iconview, event):
#try:
# 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",
"You have to select at least one image to delete.")
return
if self.model.config.confd['delwarn']:
obj = Dialogs.Qst('Delete images', 'Delete selected images?',
'Selected images will be permanently removed from catalog.')
if not obj.run():
return
model = self.view['images'].get_model()
for path in list_of_paths:
iter = model.get_iter(path)
@@ -778,7 +774,7 @@ class MainController(Controller):
list_of_paths = self.view['images'].get_selected_items()
model = self.view['images'].get_model()
count = 0
if len(list_of_paths) == 0:
@@ -808,12 +804,12 @@ class MainController(Controller):
def on_img_delete2_activate(self, menu_item):
"""remove images, but keep thumbnails"""
list_of_paths = self.view['images'].get_selected_items()
if not list_of_paths:
Dialogs.Inf("Delete images", "No images selected",
"You have to select at least one image to delete.")
return
if self.model.config.confd['delwarn']:
obj = Dialogs.Qst('Delete images', 'Delete selected images?',
'Selected images will be permanently removed from ' + \
@@ -871,13 +867,13 @@ class MainController(Controller):
menu_items = ['update1','rename1','delete2', 'statistics1']
for menu_item in menu_items:
self.view[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_tree.get_iter(path)
ancestor = self.model.discs_tree.get_value(treeiter, 3) == 1
self.view['update1'].set_sensitive(ancestor)
self.__popup_menu(event)
def on_expand_all1_activate(self, menu_item):
@@ -917,8 +913,6 @@ class MainController(Controller):
self.view['edit2'].set_sensitive(True)
self.__popup_menu(event, 'files_popup')
return True
#if event.button == 1:
# return False
def on_files_cursor_changed(self, treeview):
"""Show details of selected file/directory"""
@@ -937,7 +931,7 @@ class MainController(Controller):
except TypeError:
return
self.__popup_menu(event, 'files_popup')
if gtk.gdk.keyval_name(event.keyval) == 'BackSpace':
d_path, d_column = self.view['discs'].get_cursor()
if d_path and d_column:
@@ -953,11 +947,12 @@ class MainController(Controller):
first_iter = f_model.get_iter_first()
first_child_value = f_model.get_value(first_iter, 0)
# get two steps up
val = self.model.get_parent_discs_value(first_child_value)
parent_value = self.model.get_parent_discs_value(val)
val = self.model.get_parent_id(first_child_value)
parent_value = self.model.get_parent_id(val)
iter = self.model.discs_tree.get_iter_first()
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:
path = self.model.discs_tree.get_path(iter)
self.view['discs'].set_cursor(path)
@@ -976,8 +971,9 @@ class MainController(Controller):
f_iter = self.model.files_list.get_iter(row)
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.
self.__set_files_hiden_columns_visible(False)
self.model.get_root_entries(current_id)
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):
self.view['discs'].expand_row(d_path, False)
iter = self.model.discs_tree.get_iter(d_path)
new_iter = self.model.discs_tree.iter_children(iter)
discs_model = self.model.discs_tree
iterator = discs_model.get_iter(d_path)
new_iter = discs_model.iter_children(iterator)
if 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:
path = self.model.discs_tree.get_path(new_iter)
path = discs_model.get_path(new_iter)
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
def on_cancel_clicked(self, widget):
@@ -1003,7 +1000,10 @@ class MainController(Controller):
return
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
# NOTE: recent signal
@@ -1014,7 +1014,7 @@ class MainController(Controller):
# NOTE: add tags / images
def on_delete_tag2_activate(self, menu_item):
pass
def on_delete_tag_activate(self, menu_item):
ids = self.__get_tv_selection_ids(self.view['files'])
if not ids:
@@ -1115,20 +1115,20 @@ class MainController(Controller):
self.on_delete2_activate(menu_item)
if self.view['images'].is_focus():
self.on_img_delete_activate(menu_item)
def on_delete2_activate(self, menu_item):
try:
selection = self.view['discs'].get_selection()
model, selected_iter = selection.get_selected()
except:
return
if not selected_iter:
Dialogs.Inf("Delete disc", "No disc selected",
"You have to select disc first before you " +\
"can delete it")
return
if self.model.config.confd['delwarn']:
name = model.get_value(selected_iter, 1)
obj = Dialogs.Qst('Delete %s' % name, 'Delete %s?' % name,
@@ -1172,12 +1172,12 @@ class MainController(Controller):
model, list_of_paths = selection.get_selected_rows()
except TypeError:
return
if not list_of_paths:
Dialogs.Inf("Delete files", "No files selected",
"You have to select at least one file to delete.")
return
if self.model.config.confd['delwarn']:
obj = Dialogs.Qst("Delete files", "Delete files?",
"Selected files and directories will be" + \
@@ -1239,7 +1239,7 @@ class MainController(Controller):
self.model.unsaved_project = True
self.__set_title(filepath=self.model.filename, modified=True)
return
def on_edit1_activate(self, menu_item):
"""Make sufficient menu items sensitive in right cases"""
# TODO: consolidate popup-menus with edit menu
@@ -1247,7 +1247,7 @@ class MainController(Controller):
self.view['delete1'].set_sensitive(False)
else:
self.view['delete1'].set_sensitive(True)
def on_debugbtn_clicked(self, widget):
"""Debug. To remove in stable version, including button in GUI"""
if __debug__:
@@ -1263,10 +1263,45 @@ class MainController(Controller):
print "files have focus", self.view['files'].is_focus()
print "discs have focus", self.view['discs'].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
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):
if self.statusbar_id:
self.view['mainStatus'].remove(self.context_id, self.statusbar_id)
@@ -1307,6 +1342,11 @@ class MainController(Controller):
#########################
# 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):
"""get selection from treeview and return coresponding ids' from
connected model or None"""
@@ -1369,28 +1409,39 @@ class MainController(Controller):
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')
cellpb = gtk.CellRendererPixbuf()
cell = gtk.CellRendererText()
c.pack_start(cellpb, False)
c.pack_start(cell, True)
c.set_attributes(cellpb, stock_id=6)
c.set_attributes(cell, text=1)
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_attributes(cellpb, stock_id=7)
c.set_attributes(cell, text=2)
c.set_sort_column_id(2)
c.set_resizable(True)
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_resizable(True)
c.set_visible(False)
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,
# self.DND_TARGETS,