[hamster-applet] trying to select the same row after updates, cleaned up the fact tree a little
- From: Toms Baugis <tbaugis src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [hamster-applet] trying to select the same row after updates, cleaned up the fact tree a little
- Date: Fri, 15 Jan 2010 19:20:16 +0000 (UTC)
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]