=== modified file 'Makefile.in' === modified file 'NEWS' --- NEWS 2010-04-16 03:50:28 +0000 +++ NEWS 2010-05-14 14:28:07 +0000 @@ -1,4 +1,21 @@ =============== +Version 2.30.1 +=============== + Bugfixes + * translations were not appearing in standalone + * database file change monitor now follows symlinks + * fixed rounding error in totals (regression) + * standalone can be now closed using standard Ctrl+w keystroke + + Updated translations + * ca@valencia (Gil Forcada) + * cs (Adrian Guniš) + * en_GB (Philip Withnall) + * et (Mattias Põldaru) + * sr (Бранко Кокановић) + + +=============== Version 2.30.0 =============== Updated translations === modified file 'aclocal.m4' === modified file 'config.guess' === modified file 'config.sub' === modified file 'configure' === modified file 'configure.ac' === modified file 'data/Makefile.in' === modified file 'data/art/Makefile.in' === modified file 'data/hamster.ui' === modified file 'debian/changelog' === modified file 'gnome-doc-utils.make' === modified file 'help/Makefile.in' === modified file 'ltmain.sh' === modified file 'm4/libtool.m4' === modified file 'm4/ltversion.m4' === modified file 'po/ca@valencia.po' === modified file 'po/cs.po' === modified file 'po/en_GB.po' === modified file 'po/et.po' === modified file 'src/Makefile.in' === modified file 'src/gnome-time-tracker' --- src/gnome-time-tracker 2010-04-16 03:50:28 +0000 +++ src/gnome-time-tracker 2010-05-14 14:28:07 +0000 @@ -153,7 +153,7 @@ gtk.accel_map_add_entry("/tracking/add", gtk.keysyms.n, gtk.gdk.CONTROL_MASK) gtk.accel_map_add_entry("/tracking/overview", gtk.keysyms.o, gtk.gdk.CONTROL_MASK) gtk.accel_map_add_entry("/tracking/stats", gtk.keysyms.i, gtk.gdk.CONTROL_MASK) - gtk.accel_map_add_entry("/tracking/quit", gtk.keysyms.Escape, 0) + gtk.accel_map_add_entry("/tracking/quit", gtk.keysyms.w, gtk.gdk.CONTROL_MASK) gtk.accel_map_add_entry("/edit/prefs", gtk.keysyms.p, gtk.gdk.CONTROL_MASK) gtk.accel_map_add_entry("/help/contents", gtk.keysyms.F1, 0) === modified file 'src/hamster-standalone' --- src/hamster-standalone 2010-04-16 03:50:28 +0000 +++ src/hamster-standalone 2010-05-14 14:28:07 +0000 @@ -153,7 +153,7 @@ gtk.accel_map_add_entry("/tracking/add", gtk.keysyms.n, gtk.gdk.CONTROL_MASK) gtk.accel_map_add_entry("/tracking/overview", gtk.keysyms.o, gtk.gdk.CONTROL_MASK) gtk.accel_map_add_entry("/tracking/stats", gtk.keysyms.i, gtk.gdk.CONTROL_MASK) - gtk.accel_map_add_entry("/tracking/quit", gtk.keysyms.Escape, 0) + gtk.accel_map_add_entry("/tracking/quit", gtk.keysyms.w, gtk.gdk.CONTROL_MASK) gtk.accel_map_add_entry("/edit/prefs", gtk.keysyms.p, gtk.gdk.CONTROL_MASK) gtk.accel_map_add_entry("/help/contents", gtk.keysyms.F1, 0) === modified file 'src/hamster/Makefile.in' === modified file 'src/hamster/configuration.py' --- src/hamster/configuration.py 2010-02-10 02:52:31 +0000 +++ src/hamster/configuration.py 2010-05-14 14:28:07 +0000 @@ -100,7 +100,7 @@ - self.database_file = gio.File(self.database_path) + self.database_file = gio.File(os.path.realpath(self.database_path)) self.db_monitor = self.database_file.monitor_file() self.db_monitor.connect("changed", on_db_file_change) === modified file 'src/hamster/db.py' --- src/hamster/db.py 2010-04-16 03:50:28 +0000 +++ src/hamster/db.py 2010-05-14 14:28:07 +0000 @@ -159,10 +159,10 @@ activity = self.fetchone("select name from activities where id = ?", (id, )) existing_activity = self.__get_activity_by_name(activity['name'], category_id) - if id == existing_activity['id']: # we are already there, go home - return False - if existing_activity: #ooh, we have something here! + if id == existing_activity['id']: # we are already there, go home + return False + # first move all facts that belong to movable activity to the new one update = """ UPDATE facts === modified file 'src/hamster/defs.py' --- src/hamster/defs.py 2010-04-16 03:50:28 +0000 +++ src/hamster/defs.py 2010-05-14 14:28:07 +0000 @@ -1,5 +1,5 @@ DATA_DIR = "/usr/share" LIB_DIR = "/usr/lib" -VERSION = "2.30.0.1" +VERSION = "2.30.1" PACKAGE = "hamster-applet" PYTHONDIR = "/usr/lib/python2.6/dist-packages" === modified file 'src/hamster/edit_activity.py' --- src/hamster/edit_activity.py 2010-02-10 02:52:31 +0000 +++ src/hamster/edit_activity.py 2010-05-14 14:28:07 +0000 @@ -167,7 +167,7 @@ else: time, date = start_time, start_date - if time and date: + if time is not None and date: return dt.datetime.combine(date, time) else: return None @@ -232,7 +232,6 @@ def on_start_date_entered(self, widget): self.validate_fields() - self.start_time.grab_focus() def on_start_time_entered(self, widget): start_time = self.start_time.get_time() @@ -241,7 +240,6 @@ self.end_time.set_start_time(start_time) self.validate_fields() - self.end_time.grab_focus() def on_end_time_entered(self, widget): self.validate_fields() === modified file 'src/hamster/keybinder/Makefile.in' === modified file 'src/hamster/overview_totals.py' --- src/hamster/overview_totals.py 2010-02-10 02:52:31 +0000 +++ src/hamster/overview_totals.py 2010-05-14 14:28:07 +0000 @@ -33,6 +33,7 @@ from configuration import runtime, dialogs from hamster.i18n import C_ +from collections import defaultdict class TotalsBox(gtk.VBox): @@ -148,42 +149,45 @@ total_label = _("%s hours tracked total") % ("%.1f" % (total_hours / 60.0)) self.get_widget("total_hours").set_text(total_label) + + category_sums, activity_sums, tag_sums = defaultdict(dt.timedelta), defaultdict(dt.timedelta), defaultdict(dt.timedelta), + for fact in facts: if self.selected_categories and fact["category"] not in self.selected_categories: - fact["delta"] = dt.timedelta() + continue if self.selected_activities and fact["name"] not in self.selected_activities: - fact["delta"] = dt.timedelta() + continue if self.selected_tags and len(set(self.selected_tags) - set(fact["tags"])) > 0: - fact["delta"] = dt.timedelta() - - - - # category totals - category_sums = stuff.totals(facts, - lambda fact: (fact["category"]), - lambda fact: fact["delta"].seconds + fact["delta"].days * 24 * 60 * 60) - for entry in category_sums: - category_sums[entry] = category_sums[entry] / 60 / 60.0 - + continue + + category_sums[fact["category"]] += fact["delta"] + activity_sums[fact["name"]] += fact["delta"] + for tag in fact["tags"]: + tag_sums[tag] += fact["delta"] + + + for key in category_sums: + category_sums[key] = stuff.duration_minutes(category_sums[key]) / 60.0 + + for key in activity_sums: + activity_sums[key] = stuff.duration_minutes(activity_sums[key]) / 60.0 + + for key in tag_sums: + tag_sums[key] = stuff.duration_minutes(tag_sums[key]) / 60.0 + + + #category totals if category_sums: if self.category_sums: - category_sums = [(key, category_sums[key]) for key in self.category_sums[0]] + category_sums = [(key, category_sums[key] or 0) for key in self.category_sums[0]] else: category_sums = sorted(category_sums.items(), key=lambda x:x[1], reverse = True) self.category_sums = zip(*category_sums) - - # activity totals - activity_sums = stuff.totals(facts, - lambda fact: (fact["name"]), - lambda fact: fact["delta"].seconds + fact["delta"].days * 24 * 60 * 60) - for entry in activity_sums: - activity_sums[entry] = activity_sums[entry] / 60 / 60.0 - if self.activity_sums: - activity_sums = [(key, activity_sums[key]) for key in self.activity_sums[0]] + activity_sums = [(key, activity_sums[key] or 0) for key in self.activity_sums[0]] else: activity_sums = sorted(activity_sums.items(), key=lambda x:x[1], reverse = True) @@ -191,25 +195,14 @@ # tag totals - tag_sums = {} - for fact in facts: - for tag in fact["tags"]: - tag_sums.setdefault(tag, 0) - tag_sums[tag] += fact["delta"].seconds + fact["delta"].days * 24 * 60 * 60 - - for entry in tag_sums: - tag_sums[entry] = tag_sums[entry] / 60 / 60.0 - if tag_sums: if self.tag_sums: - tag_sums = [(key, tag_sums[key]) for key in self.tag_sums[0]] + tag_sums = [(key, tag_sums[key] or 0) for key in self.tag_sums[0]] else: tag_sums = sorted(tag_sums.items(), key=lambda x:x[1], reverse = True) self.tag_sums = zip(*tag_sums) - - self.get_widget("totals_by_category").set_size_request(10,10) if self.category_sums: self.get_widget("totals_by_category").set_size_request(280, len(self.category_sums[0]) * 20) === modified file 'src/hamster/stats.py' --- src/hamster/stats.py 2010-02-10 02:52:31 +0000 +++ src/hamster/stats.py 2010-05-14 14:28:07 +0000 @@ -386,13 +386,13 @@ summary += "\n\n" + _("Hamster would like to observe you some more!") elif early_percent >= 20: summary += "\n\n" + _("With %s percent of all facts starting before \ -9am you seem to be an early bird." % ("%d" % early_percent)) +9am you seem to be an early bird.") % ("%d" % early_percent) elif late_percent >= 20: summary += "\n\n" + _("With %s percent of all facts starting after \ -11pm you seem to be a night owl." % ("%d" % late_percent)) +11pm you seem to be a night owl.") % ("%d" % late_percent) elif short_percent >= 20: summary += "\n\n" + _("With %s percent of all tasks being shorter \ -than 15 minutes you seem to be a busy bee." % ("%d" % short_percent)) +than 15 minutes you seem to be a busy bee.") % ("%d" % short_percent) self.explore_summary.set_text(summary) === modified file 'src/hamster/widgets/Makefile.in' === modified file 'src/hamster/widgets/facttree.py' --- src/hamster/widgets/facttree.py 2010-02-10 02:52:31 +0000 +++ src/hamster/widgets/facttree.py 2010-05-14 14:28:07 +0000 @@ -119,7 +119,7 @@ self.longest_interval = max(self.longest_interval, w + 20) - self._test_layout.set_markup("%s - %s " % (fact["name"], fact["category"])) + self._test_layout.set_markup("%s - %s " % (stuff.escape_pango(fact["name"]), stuff.escape_pango(fact["category"]))) w, h = self._test_layout.get_pixel_size() self.longest_activity_category = max(self.longest_activity_category, w + 10) === modified file 'src/hamster/widgets/timeinput.py' --- src/hamster/widgets/timeinput.py 2010-02-10 02:52:31 +0000 +++ src/hamster/widgets/timeinput.py 2010-05-14 14:28:07 +0000 @@ -130,7 +130,7 @@ return self.time def _format_time(self, time): - if not time: + if time is None: return "" return time.strftime("%H:%M").lower()