From 888ae8cd74db91003130ee106d91c6a7cd1ffabe Mon Sep 17 00:00:00 2001 From: DrFrasierCrane Date: Fri, 21 Dec 2007 19:24:01 +0100 Subject: [PATCH] Implemented node deletion. --- straw/FeedListView.py | 42 +++++++++++++++++++----------------------- straw/FeedManager.py | 31 +++++++++++++++++++++++++++++++ straw/storage/SQLiteDAO.py | 9 +++++++++ 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/straw/FeedListView.py b/straw/FeedListView.py index 4105a71..cae0081 100644 --- a/straw/FeedListView.py +++ b/straw/FeedListView.py @@ -48,10 +48,13 @@ class TreeViewNode(object): #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": - 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))) + iter = self.iter + 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) + if iter: + self.store.set(self.iter, 3, self.node.unread_count) elif property.name == "status": if (self.node.status & straw.FS_UPDATING) > 0: title = self.store.get_value(self.iter, 1) @@ -182,7 +185,7 @@ class FeedListModel: def _create_row(self, node, editable = False): return self.store.append(node.parent_iter, [node.pixbuf, - node.title, + helpers.pango_escape(node.title), 'black', node.unread_count, node, editable]) @@ -240,7 +243,7 @@ class FeedsView(MVP.WidgetView): self._widget.append_column(column) selection = self._widget.get_selection() - selection.set_mode(gtk.SELECTION_SINGLE) + selection.set_mode(gtk.SELECTION_MULTIPLE) self._widget.connect("button_press_event", self._on_button_press_event) self._widget.connect("popup-menu", self._on_popup_menu) @@ -371,10 +374,14 @@ class FeedsView(MVP.WidgetView): self.popup.popup(None, None, None, event.button, time) retval = 1 return retval - - def get_selected_tv_node(self): + + def selected(self): selection = self._widget.get_selection() (model, pathlist) = selection.get_selected_rows() + nodes = [model[path][Column.object] for path in pathlist] + + for tv_node in nodes: + yield tv_node def foreach_selected(self, func): selection = self._widget.get_selection() @@ -389,16 +396,6 @@ class FeedsView(MVP.WidgetView): return def on_menu_add_child_activate(self, *args): - """category = Category() - category.parent = self.node_at_popup.node#FeedManager.get_model()[1] - category.norder = len(self.node_at_popup.node.children) - self.new_child = TreeViewNode(category, self.model.store) - iter = self.model._create_row(self.new_child, editable = True) - path = self.model.store.get_path(iter) - column = self._widget.get_column(0) - #self._widget.grab_focus() - self._widget.expand_row(self.node_at_popup.path, False) - self._widget.set_cursor_on_cell(path, focus_column = column, start_editing = True)""" self.begin_add_category(self.node_at_popup.node) def begin_add_category(self, node): @@ -437,13 +434,12 @@ class FeedsView(MVP.WidgetView): self.foreach_selected(lambda o,*args: o.feed.mark_items_as_read()) def on_remove_selected_feed(self, *args): - def remove(*args): - (object, model, treeiter) = args - model.remove(treeiter) - feedlist = feeds.get_feedlist_instance() - idx = feedlist.index(object.feed) - del feedlist[idx] - self.foreach_selected(remove) + nodes = [tv_node for tv_node in self.selected()] + + FeedManager.delete_nodes([tv_node.node.id for tv_node in nodes]) + + for node in nodes: + self.model.store.remove(node.iter) def on_node_edit_title_canceled(self, cellrenderer): if self.new_child: diff --git a/straw/FeedManager.py b/straw/FeedManager.py index a98ecab..0873709 100644 --- a/straw/FeedManager.py +++ b/straw/FeedManager.py @@ -82,6 +82,10 @@ def move_node(node, target_path): fm = _get_instance() fm.move_node(node, target_path) +def delete_nodes(node_ids): + fm = _get_instance() + fm.delete_nodes(node_ids) + class FeedManager(GObject): __gsignals__ = { "item-added" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)), @@ -141,6 +145,33 @@ class FeedManager(GObject): node.move(new_parent, target_path[-1:][0]) + def delete_nodes(self, node_ids): + self.dao.tx_begin() + + for id in node_ids: + self.delete_node(id) + + self.dao.tx_commit() + + def delete_node(self, id): + if not self.nodes.has_key(id): + return + + node = self.nodes[id] + + for child_node in list(node.children): + self.delete_node(child_node.id) + + node.parent.remove_child(node) + del self.nodes[id] + + if node.type == "F": + debug("deleting F %s" % id) + self.dao.delete_feed(id) + elif node.type == "C": + debug("deleting C %s" % id) + self.dao.delete_category(id) + def save_all(self, save_list): for item in save_list: if isinstance(item, Feed): diff --git a/straw/storage/SQLiteDAO.py b/straw/storage/SQLiteDAO.py index 804dbfe..d490572 100644 --- a/straw/storage/SQLiteDAO.py +++ b/straw/storage/SQLiteDAO.py @@ -140,3 +140,12 @@ class DAO(object): entities.append(entity) return self._get_indexed(entities, "id") + + def delete_category(self, id): + self.storage.query("DELETE FROM categories WHERE id = ?", (id,)) + self.storage.query("DELETE FROM nodes WHERE id = ?", (id,)) + + def delete_feed(self, id): + self.storage.query("DELETE FROM items WHERE feed_id = ?", (id,)) + self.storage.query("DELETE FROM feeds WHERE id = ?", (id,)) + self.storage.query("DELETE FROM nodes WHERE id = ?", (id,)) -- 2.11.4.GIT