[hamster-applet] trying to select the same row after updates, cleaned up the fact tree a little



commit 578fcb3c1382b16add3a9c68dd0f608963f1d0f7
Author: Toms Bauģis <toms baugis gmail com>
Date:   Fri Jan 15 01:27:43 2010 +0000

    trying to select the same row after updates, cleaned up the fact tree a little

 hamster/applet.py           |    2 +
 hamster/stats.py            |   39 +++++++++------------
 hamster/stats_overview.py   |   26 +++++++-------
 hamster/widgets/facttree.py |   81 +++++++++++++++++++++++++------------------
 4 files changed, 79 insertions(+), 69 deletions(-)
---
diff --git a/hamster/applet.py b/hamster/applet.py
index b8339bf..5e92839 100755
--- a/hamster/applet.py
+++ b/hamster/applet.py
@@ -354,6 +354,7 @@ class HamsterApplet(object):
         today = (dt.datetime.now() - dt.timedelta(hours = self.day_start.hour,
                                                   minutes = self.day_start.minute)).date()
 
+        self.treeview.detach_model()
         self.treeview.clear()
 
         facts = runtime.storage.get_facts(today)
@@ -376,6 +377,7 @@ class HamsterApplet(object):
                           by_category.setdefault(fact['category'], 0) + duration
             self.treeview.add_fact(fact)
 
+        self.treeview.attach_model()
 
         if not facts:
             self._gui.get_object("today_box").hide()
diff --git a/hamster/stats.py b/hamster/stats.py
index e53954c..8c29d37 100644
--- a/hamster/stats.py
+++ b/hamster/stats.py
@@ -188,15 +188,11 @@ class StatsViewer(object):
     
     def on_fact_selection_changed(self, tree):
         """ enables and disables action buttons depending on selected item """
-        selection = tree.get_selection()
-        (model, iter) = selection.get_selected()
+        fact = tree.get_selected_fact()
+        real_fact = fact is not None and isinstance(fact, dict)
 
-        id = -1
-        if iter:
-            id = model[iter][0]
-
-        self.get_widget('remove').set_sensitive(id != -1)
-        self.get_widget('edit').set_sensitive(id != -1)
+        self.get_widget('remove').set_sensitive(real_fact)
+        self.get_widget('edit').set_sensitive(real_fact)
 
         return True
 
@@ -320,26 +316,25 @@ class StatsViewer(object):
 
 
     def on_add_clicked(self, button):
-        selection = self.fact_tree.get_selection()
-        (model, iter) = selection.get_selected()
-
-        selected_date = self.view_date
-        if iter and model[iter][6]: # TODO - here we should check if heading maybe specifies a date
-            selected_date = model[iter][6]["date"]
-
+        fact = self.fact_tree.get_selected_fact()
+        if not fact:
+            return
+        
+        if isinstance(fact, dt.date):
+            selected_date = fact
+        else:
+            selected_date = fact["date"]
+        
         dialogs.edit.show(fact_date = selected_date)
 
     def on_remove_clicked(self, button):
         self.overview.delete_selected()
 
     def on_edit_clicked(self, button):
-        selection = self.fact_tree.get_selection()
-        (model, iter) = selection.get_selected()
-
-        if model[iter][0] == -1:
-            return #not a fact
-
-        dialogs.edit.show(fact_id = model[iter][0])
+        fact = self.fact_tree.get_selected_fact()
+        if not fact or isinstance(fact, date):
+            return
+        dialogs.edit.show(fact_id = fact["id"])
 
     def on_tabs_window_deleted(self, widget, event):
         self.close_window()
diff --git a/hamster/stats_overview.py b/hamster/stats_overview.py
index 6da77c4..d94e621 100644
--- a/hamster/stats_overview.py
+++ b/hamster/stats_overview.py
@@ -56,7 +56,7 @@ class OverviewBox(gtk.VBox):
         self.fact_tree = widgets.FactTree()
         self.fact_tree.connect("row-activated", self.on_facts_row_activated)
         self.fact_tree.connect("key-press-event", self.on_facts_keys)
-        self.fact_tree.connect("edit_clicked", lambda tree, fact: self.on_edit_clicked(fact))
+        self.fact_tree.connect("edit-clicked", lambda tree, fact: self.on_edit_clicked(fact))
 
         scroll.add(self.fact_tree)
         self.add(scroll)
@@ -70,6 +70,7 @@ class OverviewBox(gtk.VBox):
 
 
     def fill_facts_tree(self):
+        # remember any selection - will try to match by        
         self.fact_tree.detach_model()
         self.fact_tree.clear()
 
@@ -84,7 +85,7 @@ class OverviewBox(gtk.VBox):
         # push them in tree
         for date, facts in dates:
             fact_date = date.strftime(C_("overview list", "%A, %b %d"))
-            self.fact_tree.add_group(fact_date, facts)
+            self.fact_tree.add_group(fact_date, date, facts)
 
         self.fact_tree.attach_model()
 
@@ -130,19 +131,18 @@ class OverviewBox(gtk.VBox):
 
 
     """ events """
-    def on_edit_clicked(self, button):
-        selection = self.fact_tree.get_selection()
-        (model, iter) = selection.get_selected()
-
-        if model[iter][0] == -1:
-            return #not a fact
-
-        dialogs.edit.show(self, fact_id = model[iter][0])
+    def on_edit_clicked(self, fact):
+        self.launch_edit(fact)
 
     def on_facts_row_activated(self, tree, path, column):
-        selection = tree.get_selection()
-        (model, iter) = selection.get_selected()
-        custom_fact = dialogs.edit.show(self, fact_id = model[iter][0])
+        self.launch_edit(tree.get_selected_fact())
+            
+    def launch_edit(self, fact_or_date):
+        if isinstance(fact_or_date, dt.date):
+            dialogs.edit.show(self, fact_date = fact_or_date)
+        else:
+            dialogs.edit.show(self, fact_id = fact_or_date["id"])
+
 
     def on_facts_keys(self, tree, event):
         if (event.keyval == gtk.keysyms.Delete):
diff --git a/hamster/widgets/facttree.py b/hamster/widgets/facttree.py
index 7521384..516dd1f 100644
--- a/hamster/widgets/facttree.py
+++ b/hamster/widgets/facttree.py
@@ -27,20 +27,28 @@ from tags import TagCellRenderer
 import pango
 
 def parent_painter(column, cell, model, iter):
-    cell_text = model.get_value(iter, 1)
+    fact = model.get_value(iter, 0)
+    parent_info = model.get_value(iter, 2)
 
-    if model.get_value(iter, 6) is None:
-        if model.get_path(iter) == (0,):
-            text = '<span weight="heavy">%s</span>' % cell_text
+    if fact is None:
+        if model.get_path(iter) == (0,):  # first row
+            text = '<span weight="heavy">%s</span>' % parent_info["label"]
         else:
-            text = '<span weight="heavy" rise="-20000">%s</span>' % cell_text
+            text = '<span weight="heavy" rise="-20000">%s</span>' % parent_info["label"]
 
         cell.set_property('markup', text)
 
     else:
-        activity_name = stuff.escape_pango(cell_text)
-        description = stuff.escape_pango(model.get_value(iter, 4))
-        category = stuff.escape_pango(model.get_value(iter, 5))
+        if fact["end_time"]:
+            fact_time = "%s - %s " % (fact["start_time"].strftime("%H:%M"),
+                                   fact["end_time"].strftime("%H:%M"))
+        else:
+            fact_time = fact["start_time"].strftime("%H:%M ")
+        
+
+        activity_name = stuff.escape_pango("%s %s" % (fact_time, fact["name"]))
+        description = stuff.escape_pango(fact["description"])
+        category = stuff.escape_pango(fact["category"])
 
         markup = stuff.format_activity(activity_name,
                                        category,
@@ -52,8 +60,8 @@ def duration_painter(column, cell, model, iter):
     cell.set_property('xalign', 1)
 
 
-    text = model.get_value(iter, 2)
-    if model.get_value(iter, 6) is None:
+    text = model.get_value(iter, 1)
+    if model.get_value(iter, 0) is None:
         if model.get_path(iter) == (0,):
             text = '<span weight="heavy">%s</span>' % text
         else:
@@ -63,9 +71,7 @@ def duration_painter(column, cell, model, iter):
 def action_painter(column, cell, model, iter):
     cell.set_property('xalign', 1)
 
-
-    text = model.get_value(iter, 2)
-    if model.get_value(iter, 6) is None:
+    if model.get_value(iter, 0) is None:
         cell.set_property("stock_id", "")
     else:
         cell.set_property("stock_id", "gtk-edit")
@@ -83,12 +89,12 @@ class FactTree(gtk.TreeView):
         self.set_headers_visible(False)
         self.set_show_expanders(False)
 
-        self.store_model = gtk.TreeStore(int, str, str, str, str, str, gobject.TYPE_PYOBJECT)
-        #id, caption, duration, date (invisible), description, category
+        # fact (None for parent), duration, parent data (if any)
+        self.store_model = gtk.TreeStore(gobject.TYPE_PYOBJECT, str, gobject.TYPE_PYOBJECT)
         self.set_model(self.store_model)
 
 
-        # name
+        # start time - end time, name, category
         nameColumn = gtk.TreeViewColumn()
         nameCell = gtk.CellRendererText()
         #nameCell.set_property("ellipsize", pango.ELLIPSIZE_END)
@@ -96,9 +102,10 @@ class FactTree(gtk.TreeView):
         nameColumn.set_cell_data_func(nameCell, parent_painter)
         self.append_column(nameColumn)
 
+        # tags
         tag_cell = TagCellRenderer()
         tag_cell.set_font_size(8);
-        tagColumn = gtk.TreeViewColumn("", tag_cell, data=6)
+        tagColumn = gtk.TreeViewColumn("", tag_cell, data=0)
         tagColumn.set_expand(True)
         self.append_column(tagColumn)
 
@@ -121,6 +128,8 @@ class FactTree(gtk.TreeView):
         self.connect("key-press-event", self._on_key_pressed)
 
         self.show()
+        
+        self.stored_selection = None
 
     def clear(self):
         self.store_model.clear()
@@ -134,26 +143,18 @@ class FactTree(gtk.TreeView):
         else:
             fact_time = fact["start_time"].strftime("%H:%M ")
 
-        self.store_model.append(parent, [fact["id"],
-                                   "%s %s" % (fact_time, fact["name"]),
-                                   stuff.format_duration(fact["delta"]),
-                                   fact["start_time"].strftime('%Y-%m-%d'),
-                                   fact["description"],
-                                   fact["category"],
-                                   fact])
+        self.store_model.append(parent, [fact,
+                                         stuff.format_duration(fact["delta"]),
+                                         None])
 
-    def add_group(self, group_label, facts):
+    def add_group(self, group_label, group_date, facts):
         total = sum([stuff.duration_minutes(fact["delta"]) for fact in facts])
 
         # adds group of facts with the given label
-        group_row = self.store_model.append(None,
-                                    [-1,
-                                     group_label,
-                                     stuff.format_duration(total),
-                                     "",
-                                     "",
-                                     "",
-                                     None])
+        group_row = self.store_model.append(None, [None,
+                                                   stuff.format_duration(total),
+                                                   dict(date = group_date,
+                                                        label = group_label)])
 
         for fact in facts:
             self.add_fact(fact, group_row)
@@ -161,16 +162,28 @@ class FactTree(gtk.TreeView):
         self.expand_all()
 
     def detach_model(self):
+        # ooh, somebody is going for refresh!
+        # let's save selection too - maybe it will come handy
+        selection = self.get_selection()
+        self.stored_selection = selection.get_selected_rows()[1]
+        
         self.set_model()
 
     def attach_model(self):
         self.set_model(self.store_model)
         self.expand_all()
+        
+        if self.stored_selection:
+            selection = self.get_selection()
+            selection.select_path(self.stored_selection[0])
 
     def get_selected_fact(self):
         selection = self.get_selection()
         (model, iter) = selection.get_selected()
-        return model[iter][6]
+        if iter:
+            return model[iter][0] or model[iter][2]["date"]
+        else:
+            return None
 
 
     def _on_button_release_event(self, tree, event):



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]