From 23a7fcc389fa796b61c2070bc41f02208936d8d8 Mon Sep 17 00:00:00 2001 From: DrFrasierCrane Date: Wed, 5 Dec 2007 10:17:40 +0100 Subject: [PATCH] Make treeview nodes reordering work properly. --- straw/FeedListView.py | 75 ++++++++++++++++++++++++++++++++++++++++--------- straw/model/__init__.py | 4 ++- 2 files changed, 65 insertions(+), 14 deletions(-) diff --git a/straw/FeedListView.py b/straw/FeedListView.py index 3b06be3..0a972ec 100644 --- a/straw/FeedListView.py +++ b/straw/FeedListView.py @@ -36,27 +36,17 @@ class FeedListModel: ''' The model for the feed list view ''' def __init__(self): - # name, pixbuf, unread, foreground - self.store = gtk.TreeStore(gtk.gdk.Pixbuf, str, str, str, gobject.TYPE_PYOBJECT) - # unread, weight, status_flag feed object, allow_children - # str, int, 'gboolean', gobject.TYPE_PYOBJECT, 'gboolean' - import time s = time.time() - print "BEFORE!!!" - self.refresh_tree() self._init_signals() - - print "AFTER!!!" - print time.time() - s - #self._populate_tree(None, None, []) - def refresh_tree(self): self.store = gtk.TreeStore(gtk.gdk.Pixbuf, str, str, str, gobject.TYPE_PYOBJECT) self.categories, self.feeds = FeedManager.get_model() self.nodes = TreeViewManager.get_nodes() + + #self.store.connect("rows-reordered", self._on_rows_reordered) self._populate_tree(1, None, []) #self.store.clear() @@ -171,7 +161,7 @@ class FeedsView(MVP.WidgetView): self._widget.append_column(column) selection = self._widget.get_selection() - selection.set_mode(gtk.SELECTION_MULTIPLE) + selection.set_mode(gtk.SELECTION_SINGLE) self._widget.connect("button_press_event", self._on_button_press_event) self._widget.connect("popup-menu", self._on_popup_menu) @@ -189,6 +179,65 @@ class FeedsView(MVP.WidgetView): action.connect('activate', self.on_display_properties_feed) self.popup = uifactory.get_popup('/feedlist_popup') + treeview = self._widget + + treeview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, + [("example", 0, 0)], gtk.gdk.ACTION_COPY) + treeview.enable_model_drag_dest([("example", 0, 0)], + gtk.gdk.ACTION_COPY) + treeview.connect("drag_data_received", self.on_dragdata_received_cb) + + def on_dragdata_received_cb(self, treeview, drag_context, x, y, selection, info, eventtime): + model, iter_to_copy = treeview.get_selection().get_selected() + #print locals() + temp = treeview.get_dest_row_at_pos(x, y) + #temp = treeview.get_drag_dest_row() + + if temp != None: + path, pos = temp + else: + path, pos = (len(model)-1,), gtk.TREE_VIEW_DROP_AFTER + + target_iter = model.get_iter(path) + path_of_target_iter = model.get_path(target_iter) + + if self.check_row_path(model, iter_to_copy, target_iter): + path = model.get_path(iter_to_copy) + #model.insert_before(None, None, model[path]) + #print model[path][Column.object].obj.title + print "previous = %s" % str(path) + print "target = %s" % str(path_of_target_iter) + print path_of_target_iter[len(path_of_target_iter) - 1] + + self.iter_copy(model, iter_to_copy, target_iter, pos) + drag_context.finish(True, True, eventtime) + #model.remove(iter_to_copy) + #treeview.expand_all() + else: + drag_context.finish(False, False, eventtime) + + def check_row_path(self, model, iter_to_copy, target_iter): + path_of_iter_to_copy = model.get_path(iter_to_copy) + path_of_target_iter = model.get_path(target_iter) + if path_of_target_iter[0:len(path_of_iter_to_copy)] == path_of_iter_to_copy: + return False + else: + return True + + def iter_copy(self, model, iter_to_copy, target_iter, pos): + path = model.get_path(iter_to_copy) + + if (pos == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE) or (pos == gtk.TREE_VIEW_DROP_INTO_OR_AFTER): + new_iter = model.prepend(target_iter, model[path]) + elif pos == gtk.TREE_VIEW_DROP_BEFORE: + new_iter = model.insert_before(None, target_iter, model[path]) + elif pos == gtk.TREE_VIEW_DROP_AFTER: + new_iter = model.insert_after(None, target_iter, model[path]) + + n = model.iter_n_children(iter_to_copy) + for i in range(n): + next_iter_to_copy = model.iter_nth_child(iter_to_copy, n - i - 1) + self.iter_copy(model, next_iter_to_copy, new_iter, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE) def _model_set(self): self._widget.set_model(self._model.model) diff --git a/straw/model/__init__.py b/straw/model/__init__.py index ed05733..9dba465 100644 --- a/straw/model/__init__.py +++ b/straw/model/__init__.py @@ -199,7 +199,9 @@ class TreeViewNode(GObject): def obj_changed(self, obj, property): if property.name == "unread-count": - self.store.set(self.treeiter, 3, self.obj.unread_count) + #print self.store[(0, 0, 3)][1] + pass + #self.store.set(self.treeiter, 3, self.obj.unread_count) elif property.name == "status": if (self.obj.status & straw.FS_UPDATING) > 0: title = self.store.get_value(self.treeiter, 1) -- 2.11.4.GIT