From c9a9059d07b0665ae39f866df8ad3a99d0aa5d28 Mon Sep 17 00:00:00 2001 From: DrFrasierCrane Date: Sun, 16 Dec 2007 19:51:11 +0100 Subject: [PATCH] Yet another fixes to tree view manipulation... --- straw/FeedListView.py | 24 ++++++++++---- straw/FeedManager.py | 3 +- straw/model/__init__.py | 73 ++++++++++++++++++++---------------------- straw/storage/SQLiteStorage.py | 5 ++- 4 files changed, 57 insertions(+), 48 deletions(-) diff --git a/straw/FeedListView.py b/straw/FeedListView.py index 7210f32..f5982ae 100644 --- a/straw/FeedListView.py +++ b/straw/FeedListView.py @@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ +from error import debug from model import Feed, Item, Category import Config import FeedManager @@ -44,7 +45,14 @@ class TreeViewNode(object): self.node.connect("notify", self.obj_changed) def obj_changed(self, obj, property): + #debug("obj %d changed: property.name = %s, self.path = %s, self.store[path].id = %s" % (obj.id, property.name, str(self.path), str(self.store[self.path][Column.object].node.id))) + #debug("obj %d changed: property.name = %s, self.path = %s, self.store[path].id = %s" % (obj.id, property.name, str(self.path), str(self.store[self.path][Column.object].node.id))) if property.name == "unread-count": + #import time + #if self.unread_count == 794: + # time.sleep(2) + debug("obj %d changed: property.name = %s, self.path = %s, self.store[path].id = %s" % (obj.id, property.name, str(self.path), str(self.store[self.path][Column.object].node.id))) + debug("setting %d unread_count = %d, self.path = %s" % (obj.id, self.unread_count, str(self.path))) self.store.set(self.iter, 3, self.node.unread_count) elif property.name == "status": if (self.node.status & straw.FS_UPDATING) > 0: @@ -262,9 +270,9 @@ class FeedsView(MVP.WidgetView): treeview = self._widget treeview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, - [("example", 0, 0)], gtk.gdk.ACTION_COPY) + [("example", 0, 0)], gtk.gdk.ACTION_MOVE) treeview.enable_model_drag_dest([("example", 0, 0)], - gtk.gdk.ACTION_COPY) + gtk.gdk.ACTION_MOVE) treeview.connect("drag_data_received", self.on_dragdata_received_cb) def on_dragdata_received_cb(self, treeview, drag_context, x, y, selection, info, eventtime): @@ -307,7 +315,7 @@ class FeedsView(MVP.WidgetView): order = to_path.pop() if ":".join(map(str, to_path)): - iter = model.get_iter(":".join(to_path)) + iter = model.get_iter(":".join(map(str, to_path))) else: iter = None @@ -317,15 +325,19 @@ class FeedsView(MVP.WidgetView): to_path.append(path_of_target_iter[len(path_of_target_iter) - 1] + 1) print "%s -> %s" % (str(from_path), str(to_path)) - - FeedManager.move_node(model[from_path][Column.object].node, to_path) - + #print model[0][Column.object].node.id + node = model[from_path][Column.object].node self.iter_copy(model, iter_to_copy, target_iter, pos) + drag_context.finish(True, True, eventtime) + FeedManager.move_node(node, to_path) + #print model[0][Column.object].node.id #model.remove(iter_to_copy) #treeview.expand_all() else: drag_context.finish(False, False, eventtime) + + print model[0][Column.object].node.id def check_row_path(self, model, iter_to_copy, target_iter): path_of_iter_to_copy = model.get_path(iter_to_copy) diff --git a/straw/FeedManager.py b/straw/FeedManager.py index 4087407..b7751e2 100644 --- a/straw/FeedManager.py +++ b/straw/FeedManager.py @@ -283,10 +283,11 @@ class FeedManager(GObject): self.dao.save(obj) def on_parent_changed(self, obj, old_parent): - debug("saving %d" % (obj.id)) + debug("parent changed, saving %d" % (obj.id)) self.dao.save(obj) def on_norder_changed(self, obj, old_norder): + debug("norder changed, saving %d" % (obj.id)) self.dao.save(obj) _instance = None diff --git a/straw/model/__init__.py b/straw/model/__init__.py index d76cd4a..da06345 100644 --- a/straw/model/__init__.py +++ b/straw/model/__init__.py @@ -4,7 +4,14 @@ from straw.error import debug import gobject import straw -class Node(GObject): +class AsyncGObject(gobject.GObject): + def __init__(self): + gobject.GObject.__init__(self) + + def emit(self, *args): + gobject.idle_add(gobject.GObject.emit, self, *args) + +class Node(gobject.GObject): """ Represents a base of single node in the model tree. This class is meant for subclassing only, Node instances should not be used. @@ -33,10 +40,11 @@ class Node(GObject): self.unread_count = 0 self.norder = 0 self.children = [] + self.handler_ids_unread_changed = {} def __cmp__(self, other): - if not other: - return None + if other == None: + return -1 elif self.norder == other.norder: return 0 elif self.norder < other.norder: @@ -74,7 +82,7 @@ class Node(GObject): self.parent_id = value.id self.emit("parent-changed", old_value) - def add_child(self, node, norder = None, allow_append = True): + def add_child(self, node, norder = None, allow_append = True, emit_changes = True): debug("adding %d to %d with node.norder = %d, norder = %s" % (node.id, self.id, node.norder, str(norder))) if allow_append: if norder == None or norder >= len(self.children): @@ -99,53 +107,42 @@ class Node(GObject): debug("calculated norder = %d" % (norder)) node.props.norder = norder - - self.append_child(node) - def append_child(self, node): + self.append_child(node, emit_changes = emit_changes) + + def append_child(self, node, emit_changes = True): debug("appending %d to %d with norder = %d" % (node.id, self.id, node.norder)) insort(self.children, node) - node.connect("unread-count-changed", self.on_unread_count_changed) - self.props.unread_count += node.unread_count + self.handler_ids_unread_changed[node.id] = node.connect("unread-count-changed", self.on_unread_count_changed) + + if emit_changes: + self.props.unread_count += node.unread_count - def remove_child(self, node): + def remove_child(self, node, emit_changes = True): debug("removing %d from %d with norder = %d" % (node.id, self.id, node.norder)) for child in self.children[(node.norder + 1):]: child.props.norder -= 1 self.children.remove(node) - self.props.unread_count -= node.unread_count + + node.disconnect(self.handler_ids_unread_changed[node.id]) + + if emit_changes: + self.props.unread_count -= node.unread_count def move(self, new_parent, new_norder = None): debug("moving %d to %d (new_norder = %d)" % (self.id, new_parent.id, new_norder)) - - self.parent.remove_child(self) - new_parent.add_child(self, norder = new_norder, allow_append = False) - self.props.parent = new_parent - return old_parent = self.parent - - if new_parent != self.parent: - print "need to reparent %d -> %d" % (self.parent.id, new_parent.id) - self.props.parent = new_parent - print "reparented %d -> %d" % (old_parent.id, new_parent.id) - else: - for child in old_parent.children[(self.norder + 1):]: - child.props.norder -= 1 - - self.parent.children.remove(self) - - if not new_norder or new_norder >= len(self.parent.children): - new_norder = len(self.parent.children) - 1 - - for child in self.parent.children[new_norder:]: - child.props.norder += 1 - - self.props.norder = new_norder - insort(self.parent.children, self) + self.parent.remove_child(self, emit_changes = False) + new_parent.add_child(self, norder = new_norder, allow_append = False, emit_changes = False) + self.props.parent = new_parent + debug("changing unread count (old_parent %d: %d -> %d)" % (old_parent.id, old_parent.unread_count, old_parent.unread_count - self.unread_count)) + debug("changing unread count (new_parent %d: %d -> %d)" % (new_parent.id, new_parent.unread_count, new_parent.unread_count + self.unread_count)) + old_parent.props.unread_count -= self.unread_count + self.parent.props.unread_count += self.unread_count def get_by_path(self, path): - print "sss %d | %s | %s" % (self.id, str(path), str(len(self.children))) + #print "sss %d | %s | %s" % (self.id, str(path), str(len(self.children))) if len(path) == 0: return self elif path[0] < len(self.children): @@ -218,8 +215,8 @@ class Feed(Node): self.type = "F" self.items = [] - def add_child(self, node): - pass + def add_child(self, node, norder = None, allow_append = True): + debug("tried to add child to a feed %d!" % self.id) def do_get_property(self, property): if property.name == "title": diff --git a/straw/storage/SQLiteStorage.py b/straw/storage/SQLiteStorage.py index 42e477e..f230dbe 100644 --- a/straw/storage/SQLiteStorage.py +++ b/straw/storage/SQLiteStorage.py @@ -36,9 +36,6 @@ class SQLiteStorage: return c = self._connect() - - c.execute("PRAGMA cache_size = 20000;") - c.execute("PRAGMA synchronous = NORMAL;") try: sql = self._get_sql() @@ -53,6 +50,8 @@ class SQLiteStorage: if not self._connections.has_key(key): self._connections[key] = sqlite.connect(self._db_path) + self._connections[key].execute("PRAGMA cache_size = 20000;") + self._connections[key].execute("PRAGMA synchronous = NORMAL;") self._connections[key].row_factory = sqlite.Row return self._connections[key] -- 2.11.4.GIT