[hamster-applet] more accurate cell width detection. should refactor
- From: Toms Baugis <tbaugis src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [hamster-applet] more accurate cell width detection. should refactor
- Date: Sat, 16 Jan 2010 12:36:03 +0000 (UTC)
commit a2a22ff1be2f85a3703b1ca03e47aac7fde755b0
Author: Toms Bauģis <toms baugis gmail com>
Date: Sat Jan 16 11:56:06 2010 +0000
more accurate cell width detection. should refactor
hamster/widgets/facttree.py | 98 +++++++++++++++++++++++++++----------------
1 files changed, 62 insertions(+), 36 deletions(-)
---
diff --git a/hamster/widgets/facttree.py b/hamster/widgets/facttree.py
index e82a640..ca6e05d 100644
--- a/hamster/widgets/facttree.py
+++ b/hamster/widgets/facttree.py
@@ -80,15 +80,21 @@ class FactTree(gtk.TreeView):
self.connect("key-press-event", self._on_key_pressed)
self.connect("configure-event", lambda *args: self.columns_autosize())
-
self.show()
self.longest_activity_category = 0 # we will need this for the cell renderer
-
-
+ self.longest_interval = 0 # we will need this for the cell renderer
+ self.longest_duration = 0 # we will need this for the cell renderer
self.stored_selection = None
self.box = None
+
+
+ pixmap = gtk.gdk.Pixmap(None, 10, 10, 24)
+ _test_context = pixmap.cairo_create()
+ self._test_layout = _test_context.create_layout()
+ font = pango.FontDescription(gtk.Style().font_desc.to_string())
+ self._test_layout.set_font_description(font)
def fix_row_heights(self):
@@ -100,13 +106,32 @@ class FactTree(gtk.TreeView):
def clear(self):
self.store_model.clear()
self.longest_activity_category = 0
+ self.longest_interval = 0
+ self.longest_duration = 0
- def add_fact(self, fact, parent = None):
- self.longest_activity_category = max(self.longest_activity_category,
- len(fact["name"]) + len(fact["category"]))
+ def update_longest_dimensions(self, fact):
+ interval = "%s -" % fact["start_time"].strftime("%H:%M")
+ if fact["end_time"]:
+ interval = "%s %s" % (interval, fact["end_time"].strftime("%H:%M"))
+ self._test_layout.set_markup(interval)
+ w, h = self._test_layout.get_pixel_size()
+ self.longest_interval = max(self.longest_interval, w + 20)
+
+ self._test_layout.set_markup("%s - <small>%s</small> " % (fact["name"], fact["category"]))
+ w, h = self._test_layout.get_pixel_size()
+ self.longest_activity_category = max(self.longest_activity_category, w + 10)
+
+ self._test_layout.set_markup(" %s" % stuff.format_duration(fact["delta"]))
+ w, h = self._test_layout.get_pixel_size()
+ self.longest_duration = max(self.longest_duration, w + 10)
+
+
+ def add_fact(self, fact, parent = None):
+ self.update_longest_dimensions(fact)
self.store_model.append(parent, [fact, None])
+
def add_group(self, group_label, group_date, facts):
total = sum([stuff.duration_minutes(fact["delta"]) for fact in facts])
@@ -129,7 +154,11 @@ class FactTree(gtk.TreeView):
self.set_model()
+
def attach_model(self):
+ # attach model is also where we calculate the bounding box widths
+
+
self.set_model(self.store_model)
self.expand_all()
@@ -137,6 +166,7 @@ class FactTree(gtk.TreeView):
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()
@@ -198,7 +228,7 @@ class FactCellRenderer(gtk.GenericCellRenderer):
self.tag_font = pango.FontDescription(default_font)
self.tag_font.set_size(pango.SCALE * 8)
- self.layout = None
+ self.layout, self.tag_layout = None, None
self.col_padding = 10
self.row_padding = 4
@@ -234,6 +264,9 @@ class FactCellRenderer(gtk.GenericCellRenderer):
self.layout = context.create_layout()
self.layout.set_font_description(self.label_font)
+ self.tag_layout = context.create_layout()
+ self.tag_layout.set_font_description(self.tag_font)
+
if "id" in self.data:
fact, parent = self.data, None
@@ -301,12 +334,9 @@ class FactCellRenderer(gtk.GenericCellRenderer):
""" activity, category, tags, description in middle """
# we want our columns look aligned, so we will do fixed offset from
- # both sides, in letter length
- self.layout.set_markup("8")
- letter_w, letter_h = self.layout.get_pixel_size()
-
- box_x = letter_w * 14
- box_w = width - letter_w * 15 - max(letter_w * 10, duration_w)
+ # both sides, in letter length
+ box_x = widget.longest_interval + self.col_padding
+ box_w = width - (widget.longest_interval - self.col_padding) - widget.longest_duration
context.translate(box_x, 2)
@@ -320,29 +350,29 @@ class FactCellRenderer(gtk.GenericCellRenderer):
if not selected:
self.set_color(context, widget.get_style().text[gtk.STATE_INSENSITIVE])
- self.layout.set_markup(" - %s" % fact["category"])
+ self.layout.set_markup(" - <small>%s</small>" % fact["category"])
label_w, label_h = self.layout.get_pixel_size()
context.show_layout(self.layout)
- act_cat_offset = (widget.longest_activity_category + 4) * letter_w
+ act_cat_offset = widget.longest_activity_category
context.move_to(act_cat_offset, 0)
context.set_source_rgb(0,0,0)
- self.layout.set_font_description(self.tag_font)
cur_x, cur_y = act_cat_offset, 0
- for i, tag in enumerate(fact["tags"]):
- tag_w, tag_h = Tag.tag_size(tag, self.layout)
-
- if i > 0 and cur_x + tag_w >= box_w:
- cur_x = act_cat_offset
- cur_y += tag_h + 4
-
- Tag(context, self.layout, True, tag, None,
- gtk.gdk.Rectangle(cur_x, cur_y, box_w - cur_x, height - cur_y))
-
- cur_x += tag_w + 4
+ if fact["tags"]:
+ for i, tag in enumerate(fact["tags"]):
+ tag_w, tag_h = Tag.tag_size(tag, self.tag_layout)
+
+ if i > 0 and cur_x + tag_w >= box_w:
+ cur_x = act_cat_offset
+ cur_y += tag_h + 4
+
+ Tag(context, self.tag_layout, True, tag, None,
+ gtk.gdk.Rectangle(cur_x, cur_y, box_w - cur_x, height - cur_y))
+
+ cur_x += tag_w + 4
+ cur_y += tag_h + 4
- self.layout.set_font_description(self.label_font)
if fact["description"]:
self.layout.set_markup("<small>%s</small>" % fact["description"])
@@ -351,7 +381,6 @@ class FactCellRenderer(gtk.GenericCellRenderer):
x, y = cur_x, cur_y + 4
if cur_x + label_w > box_w:
x = 0
- y = label_h + 4
context.move_to(x, y)
self.layout.set_width((box_w - x) * pango.SCALE)
@@ -391,15 +420,12 @@ class FactCellRenderer(gtk.GenericCellRenderer):
""" activity, category, tags, description in middle """
# we want our columns look aligned, so we will do fixed offset from
# both sides, in letter length
- layout.set_markup("8")
- letter_w, letter_h = layout.get_pixel_size()
-
- box_x = letter_w * 14
- box_w = width - letter_w * 15 - max(letter_w * 14, duration_w)
+ box_x = widget.longest_interval + self.col_padding
+ box_w = width - (widget.longest_interval + self.col_padding) - widget.longest_duration
- act_cat_offset = (widget.longest_activity_category + 4) * letter_w
+ act_cat_offset = widget.longest_activity_category
- required_height = letter_h
+ required_height = duration_h
if fact["tags"]:
layout.set_font_description(self.tag_font)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]