[hamster-applet] unified fact filtering between activities and totals;
- From: Toms Baugis <tbaugis src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [hamster-applet] unified fact filtering between activities and totals;
- Date: Sat, 19 Dec 2009 01:16:28 +0000 (UTC)
commit 1a3b0ca464207005eb82b6f3175961dfc6f365c6
Author: Toms Bauģis <toms baugis gmail com>
Date: Sat Dec 19 01:15:59 2009 +0000
unified fact filtering between activities and totals;
overview will be moved out some place else
data/stats.ui | 279 ++++++++++++++++++++++++++++++++++++++-------
data/stats_overview.ui | 49 --------
data/stats_reports.ui | 118 -------------------
hamster/stats.py | 163 +++++++++++++++++++++++++-
hamster/stats_overview.py | 31 ++----
hamster/stats_reports.py | 169 ++-------------------------
6 files changed, 417 insertions(+), 392 deletions(-)
---
diff --git a/data/stats.ui b/data/stats.ui
index 5e6a31c..2c2d3ef 100644
--- a/data/stats.ui
+++ b/data/stats.ui
@@ -4,77 +4,278 @@
<!-- interface-naming-policy project-wide -->
<!-- interface-local-resource-path /home/toms/cvs/hamster/data/art -->
<object class="GtkWindow" id="tabs_window">
- <property name="border_width">12</property>
<property name="title" translatable="yes">Overview - Hamster</property>
<property name="window_position">center</property>
<property name="default_width">800</property>
<property name="default_height">600</property>
<child>
- <object class="GtkNotebook" id="window_tabs">
+ <object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tab_hborder">8</property>
- <property name="tab_vborder">4</property>
- <signal name="switch_page" handler="on_window_tabs_switch_page"/>
+ <property name="orientation">vertical</property>
<child>
- <object class="GtkAlignment" id="overview_tab">
+ <object class="GtkToolbar" id="toolbar1">
<property name="visible">True</property>
<child>
- <placeholder/>
+ <object class="GtkToolItem" id="range_pick">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolItem" id="date_ranges">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkHBox" id="preset_range">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkButton" id="prev">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="on_prev_clicked"/>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-back</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="home">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="on_home_clicked"/>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-home</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="next">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="on_next_clicked"/>
+ <child>
+ <object class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-forward</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="range_box">
+ <property name="no_show_all">True</property>
+ <property name="top_padding">3</property>
+ <property name="bottom_padding">3</property>
+ <property name="left_padding">6</property>
+ <child>
+ <object class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkAlignment" id="range_start_box">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">to</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="range_end_box">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolItem" id="toolbutton6">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolItem" id="toolbutton7">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="top_padding">3</property>
+ <property name="bottom_padding">3</property>
+ <property name="left_padding">6</property>
+ <property name="right_padding">6</property>
+ <child>
+ <object class="GtkEntry" id="entry1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">•</property>
+ <property name="width_chars">30</property>
+ <property name="secondary_icon_stock">gtk-find</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
</child>
- </object>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="overview_labe1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Overview</property>
</object>
<packing>
- <property name="tab_fill">False</property>
+ <property name="expand">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkAlignment" id="reports_tab">
+ <object class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
+ <property name="top_padding">12</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
<child>
- <placeholder/>
+ <object class="GtkLabel" id="overview_label">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">21.12.2009 - 28.12.2009</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="size" value="15000"/>
+ </attributes>
+ </object>
</child>
</object>
<packing>
+ <property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
- <child type="tab">
- <object class="GtkLabel" id="statistics_label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Reports</property>
- </object>
- <packing>
- <property name="position">2</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
<child>
- <object class="GtkAlignment" id="stats_tab">
+ <object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
+ <property name="top_padding">10</property>
+ <property name="bottom_padding">10</property>
+ <property name="left_padding">10</property>
+ <property name="right_padding">10</property>
<child>
- <placeholder/>
+ <object class="GtkNotebook" id="window_tabs">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tab_hborder">8</property>
+ <property name="tab_vborder">4</property>
+ <signal name="switch_page" handler="on_window_tabs_switch_page"/>
+ <child>
+ <object class="GtkAlignment" id="overview_tab">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="overview_labe1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Activities</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="reports_tab">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="reports_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Totals</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
- <child type="tab">
- <object class="GtkLabel" id="label17">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Statistics</property>
- </object>
- <packing>
- <property name="position">2</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
</object>
</child>
</object>
diff --git a/data/stats_overview.ui b/data/stats_overview.ui
index 2465070..f99ac92 100644
--- a/data/stats_overview.ui
+++ b/data/stats_overview.ui
@@ -13,55 +13,6 @@
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkToolButton" id="prev">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Previous</property>
- <property name="stock_id">gtk-go-back</property>
- <signal name="clicked" handler="on_prev_clicked"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="home">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">This Week</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-home</property>
- <signal name="clicked" handler="on_home_clicked"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="next">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Next</property>
- <property name="stock_id">gtk-go-forward</property>
- <signal name="clicked" handler="on_next_clicked"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparatorToolItem" id="toolbutton1">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
<object class="GtkToolButton" id="add">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
diff --git a/data/stats_reports.ui b/data/stats_reports.ui
index c70339f..440a567 100644
--- a/data/stats_reports.ui
+++ b/data/stats_reports.ui
@@ -12,111 +12,6 @@
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkToolButton" id="prev">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Previous</property>
- <property name="stock_id">gtk-go-back</property>
- <signal name="clicked" handler="on_prev_clicked"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="home">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">This Week</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-home</property>
- <signal name="clicked" handler="on_home_clicked"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="next">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Next</property>
- <property name="stock_id">gtk-go-forward</property>
- <signal name="clicked" handler="on_next_clicked"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparatorToolItem" id="toolbutton2">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioToolButton" id="day">
- <property name="visible">True</property>
- <property name="is_important">True</property>
- <property name="label" translatable="yes"> _Day</property>
- <property name="use_underline">True</property>
- <property name="icon_widget">day_icon1</property>
- <property name="active">True</property>
- <signal name="toggled" handler="on_day_toggled"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioToolButton" id="week">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="is_important">True</property>
- <property name="label" translatable="yes"> _Week</property>
- <property name="use_underline">True</property>
- <property name="icon_widget">week_icon1</property>
- <property name="active">True</property>
- <signal name="toggled" handler="on_week_toggled"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioToolButton" id="month">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="is_important">True</property>
- <property name="label" translatable="yes"> _Month</property>
- <property name="use_underline">True</property>
- <property name="icon_widget">month_icon1</property>
- <property name="active">True</property>
- <signal name="toggled" handler="on_month_toggled"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparatorToolItem" id="<separator>1">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
<object class="GtkToolButton" id="report_button">
<property name="visible">True</property>
<property name="is_important">True</property>
@@ -318,19 +213,6 @@
</object>
</child>
</object>
- <object class="GtkImage" id="day_icon1">
- <property name="visible">True</property>
- <property name="pixbuf">art/stock_calendar-view-day.png</property>
- </object>
- <object class="GtkImage" id="week_icon1">
- <property name="visible">True</property>
- <property name="pixbuf">art/stock_calendar-view-week.png</property>
- </object>
- <object class="GtkImage" id="month_icon1">
- <property name="visible">True</property>
- <property name="tooltip_text" translatable="yes">Show month</property>
- <property name="pixbuf">art/stock_calendar-view-month.png</property>
- </object>
<object class="GtkFileChooserDialog" id="save_report_dialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">Save report – Time Tracker</property>
diff --git a/hamster/stats.py b/hamster/stats.py
index 678088a..9922814 100644
--- a/hamster/stats.py
+++ b/hamster/stats.py
@@ -27,14 +27,19 @@ import pango
import stuff
-import widgets
-
from configuration import runtime, GconfStore
from stats_overview import OverviewBox
from stats_reports import ReportsBox
from stats_stats import StatsBox
+import widgets
+import charting
+import datetime as dt
+import calendar
+
+from hamster.i18n import C_
+
class StatsViewer(object):
def __init__(self, parent = None):
@@ -42,20 +47,168 @@ class StatsViewer(object):
self._gui = stuff.load_ui_file("stats.ui")
self.window = self.get_widget("tabs_window")
+
+
+ self.view_date = dt.date.today()
+ #set to monday
+ self.start_date = self.view_date - \
+ dt.timedelta(self.view_date.weekday() + 1)
+ # look if we need to start on sunday or monday
+ self.start_date = self.start_date + \
+ dt.timedelta(stuff.locale_first_weekday())
+
+ self.end_date = self.start_date + dt.timedelta(6)
+
self.overview = OverviewBox()
self.get_widget("overview_tab").add(self.overview)
self.reports = ReportsBox()
self.get_widget("reports_tab").add(self.reports)
+
+ self.range_combo = gtk.combo_box_new_text()
+ self.range_combo.append_text(_("Week"))
+ self.range_combo.append_text(_("Month"))
+ self.range_combo.append_text(_("Date Range"))
+ self.range_combo.set_row_separator_func(lambda row, iter: row[iter][0] == "-")
+ self.range_combo.append_text("-")
+ self.range_combo.append_text("All")
+ self.range_combo.set_active(0)
+ self.range_combo.connect("changed", self.on_range_combo_changed)
+
+
+
+ self.get_widget("range_pick").add(self.range_combo)
+
+
+ self.start_date_input = widgets.DateInput(self.start_date)
+ self.start_date_input.connect("date-entered", self.on_start_date_entered)
+ self.get_widget("range_start_box").add(self.start_date_input)
- self.stats = StatsBox()
- self.get_widget("stats_tab").add(self.stats)
+ self.end_date_input = widgets.DateInput(self.end_date)
+ self.end_date_input.connect("date-entered", self.on_end_date_entered)
+ self.get_widget("range_end_box").add(self.end_date_input)
self._gui.connect_signals(self)
-
self.window.show_all()
+
+ self.search()
+
+ def set_title(self):
+ dates_dict = stuff.dateDict(self.start_date, "start_")
+ dates_dict.update(stuff.dateDict(self.end_date, "end_"))
+
+ if self.start_date.year != self.end_date.year:
+ # overview label if start and end years don't match
+ # letter after prefixes (start_, end_) is the one of
+ # standard python date formatting ones- you can use all of them
+ # see http://docs.python.org/library/time.html#time.strftime
+ overview_label = _(u"%(start_B)s %(start_d)s, %(start_Y)s â?? %(end_B)s %(end_d)s, %(end_Y)s") % dates_dict
+ elif self.start_date.month != self.end_date.month:
+ # overview label if start and end month do not match
+ # letter after prefixes (start_, end_) is the one of
+ # standard python date formatting ones- you can use all of them
+ # see http://docs.python.org/library/time.html#time.strftime
+ overview_label = _(u"%(start_B)s %(start_d)s â?? %(end_B)s %(end_d)s, %(end_Y)s") % dates_dict
+ else:
+ # overview label for interval in same month
+ # letter after prefixes (start_, end_) is the one of
+ # standard python date formatting ones- you can use all of them
+ # see http://docs.python.org/library/time.html#time.strftime
+ overview_label = _(u"%(start_B)s %(start_d)s â?? %(end_d)s, %(end_Y)s") % dates_dict
+
+
+ self.get_widget("overview_label").set_markup("<b>%s</b>" % overview_label)
+
+
+ def search(self):
+ self.set_title()
+ self.start_date_input.set_date(self.start_date)
+ self.end_date_input.set_date(self.end_date)
+
+ facts = runtime.storage.get_facts(self.start_date, self.end_date)
+
+ self.overview.search(self.start_date, self.end_date, facts)
+ self.reports.search(self.start_date, self.end_date, facts)
+
+
+
+
+
+ def on_range_combo_changed(self, combo):
+ idx = combo.get_active()
+
+ self.get_widget("preset_range").hide()
+ self.get_widget("range_box").hide()
+
+ if idx == 0: # week
+ self.start_date = self.view_date - dt.timedelta(self.view_date.weekday() + 1)
+ self.start_date = self.start_date + dt.timedelta(stuff.locale_first_weekday())
+ self.end_date = self.start_date + dt.timedelta(6)
+ self.get_widget("preset_range").show()
+
+ elif idx == 1: #month
+ self.start_date = self.view_date - dt.timedelta(self.view_date.day - 1) #set to beginning of month
+ first_weekday, days_in_month = calendar.monthrange(self.view_date.year, self.view_date.month)
+ self.end_date = self.start_date + dt.timedelta(days_in_month - 1)
+ self.get_widget("preset_range").show()
+
+ elif idx == 2:
+ self.get_widget("range_box").show()
+
+ self.search()
+
+ def on_start_date_entered(self, input):
+ self.start_date = input.get_date().date()
+ self.view_date = self.start_date
+ self.search()
+
+ def on_end_date_entered(self, input):
+ self.end_date = input.get_date().date()
+ self.search()
+
+ def _chosen_range(self):
+ return self.range_combo.get_active()
+
+ def on_prev_clicked(self, button):
+ if self._chosen_range() == 0: # week
+ self.start_date -= dt.timedelta(7)
+ self.end_date -= dt.timedelta(7)
+ elif self._chosen_range() == 1: # month
+ self.end_date = self.start_date - dt.timedelta(1)
+ first_weekday, days_in_month = calendar.monthrange(self.end_date.year, self.end_date.month)
+ self.start_date = self.end_date - dt.timedelta(days_in_month - 1)
+
+ self.view_date = self.start_date
+ self.search()
+
+ def on_next_clicked(self, button):
+ if self._chosen_range() == 0: # week
+ self.start_date += dt.timedelta(7)
+ self.end_date += dt.timedelta(7)
+ elif self._chosen_range() == 1: # month
+ self.start_date = self.end_date + dt.timedelta(1)
+ first_weekday, days_in_month = calendar.monthrange(self.start_date.year, self.start_date.month)
+ self.end_date = self.start_date + dt.timedelta(days_in_month - 1)
+
+ self.view_date = self.start_date
+ self.search()
+
+
+ def on_home_clicked(self, button):
+ self.view_date = dt.date.today()
+ if self._chosen_range() == 0: # week
+ self.start_date = self.view_date - dt.timedelta(self.view_date.weekday() + 1)
+ self.start_date = self.start_date + dt.timedelta(stuff.locale_first_weekday())
+ self.end_date = self.start_date + dt.timedelta(6)
+
+ elif self._chosen_range() == 1: # month
+ self.start_date = self.view_date - dt.timedelta(self.view_date.day - 1) #set to beginning of month
+ first_weekday, days_in_month = calendar.monthrange(self.view_date.year, self.view_date.month)
+ self.end_date = self.start_date + dt.timedelta(days_in_month - 1)
+
+ self.search()
def get_widget(self, name):
""" skip one variable (huh) """
diff --git a/hamster/stats_overview.py b/hamster/stats_overview.py
index 3731b11..a227f36 100644
--- a/hamster/stats_overview.py
+++ b/hamster/stats_overview.py
@@ -65,7 +65,7 @@ class OverviewBox(gtk.VBox):
self.fact_tree = widgets.FactTree()
self.get_widget("overview_facts_box").add(self.fact_tree)
- self.fill_facts_tree()
+ #self.fill_facts_tree()
self.fact_tree.connect("cursor-changed", self.on_fact_selection_changed)
self.fact_tree.connect("row-activated", self.on_facts_row_activated)
self.fact_tree.connect("key-press-event", self.on_facts_keys)
@@ -75,8 +75,8 @@ class OverviewBox(gtk.VBox):
runtime.dispatcher.add_handler('activity_updated', self.after_activity_update)
runtime.dispatcher.add_handler('day_updated', self.after_activity_update)
- def fill_facts_tree(self):
- facts = runtime.storage.get_facts(self.start_date, self.end_date)
+ def fill_facts_tree(self, facts):
+ facts = facts or runtime.storage.get_facts(self.start_date, self.end_date)
self.fact_tree.clear()
@@ -95,30 +95,15 @@ class OverviewBox(gtk.VBox):
self.fact_tree.add_group(fact_date, facts)
+ def search(self, start_date, end_date, facts):
+ self.start_date = start_date
+ self.end_date = end_date
+ self.fill_facts_tree(facts)
+
""" events """
def after_activity_update(self, widget, renames):
self.fill_facts_tree()
- def on_prev_clicked(self, button):
- self.start_date -= dt.timedelta(7)
- self.end_date -= dt.timedelta(7)
- self.fill_facts_tree()
-
- def on_next_clicked(self, button):
- self.start_date += dt.timedelta(7)
- self.end_date += dt.timedelta(7)
- self.fill_facts_tree()
-
- def on_home_clicked(self, button):
- self.view_date = dt.date.today()
-
- self.start_date = self.view_date - dt.timedelta(self.view_date.weekday() + 1)
- self.start_date = self.start_date + dt.timedelta(stuff.locale_first_weekday())
- self.end_date = self.start_date + dt.timedelta(6)
-
- self.fill_facts_tree()
-
-
def on_fact_selection_changed(self, tree):
""" enables and disables action buttons depending on selected item """
selection = tree.get_selection()
diff --git a/hamster/stats_reports.py b/hamster/stats_reports.py
index 4e4c13b..a2285f2 100644
--- a/hamster/stats_reports.py
+++ b/hamster/stats_reports.py
@@ -105,17 +105,6 @@ class ReportsBox(gtk.VBox):
self.get_widget("totals_by_activity").add(self.activity_chart);
-
- self.week_view = self.get_widget("week")
- self.month_view = self.get_widget("month")
- self.month_view.set_group(self.week_view)
- self.day_view = self.get_widget("day")
- self.day_view.set_group(self.week_view)
-
- #initiate the form in the week view
- self.week_view.set_active(True)
-
-
runtime.dispatcher.add_handler('activity_updated', self.after_activity_update)
runtime.dispatcher.add_handler('day_updated', self.after_fact_update)
@@ -130,8 +119,15 @@ class ReportsBox(gtk.VBox):
runtime.dispatcher.add_handler('gconf_on_day_start_changed', self.on_day_start_changed)
self.report_chooser = None
- self.fill_totals_tree()
- self.do_graph()
+ #self.fill_totals_tree()
+ #self.do_graph()
+
+
+ def search(self, start_date, end_date, facts):
+ self.start_date = start_date
+ self.end_date = end_date
+ self.fill_totals_tree(facts)
+ self.do_graph(facts)
@@ -268,59 +264,8 @@ class ReportsBox(gtk.VBox):
by_duration,
stack_keys = all_categories)
-
- def set_title(self):
- if self.day_view.get_active():
- # date format for overview label when only single day is visible
- # Using python datetime formatting syntax. See:
- # http://docs.python.org/library/time.html#time.strftime
- start_date_str = self.view_date.strftime(C_("single day overview",
- "%B %d, %Y"))
- # Overview label if looking on single day
- overview_label = _(u"Totals for %(date)s") % \
- ({"date": start_date_str})
- else:
- dates_dict = stuff.dateDict(self.start_date, "start_")
- dates_dict.update(stuff.dateDict(self.end_date, "end_"))
-
- if self.start_date.year != self.end_date.year:
- # overview label if start and end years don't match
- # letter after prefixes (start_, end_) is the one of
- # standard python date formatting ones- you can use all of them
- # see http://docs.python.org/library/time.html#time.strftime
- overview_label = _(u"Totals for %(start_B)s %(start_d)s, %(start_Y)s â?? %(end_B)s %(end_d)s, %(end_Y)s") % dates_dict
- elif self.start_date.month != self.end_date.month:
- # overview label if start and end month do not match
- # letter after prefixes (start_, end_) is the one of
- # standard python date formatting ones- you can use all of them
- # see http://docs.python.org/library/time.html#time.strftime
- overview_label = _(u"Totals for %(start_B)s %(start_d)s â?? %(end_B)s %(end_d)s, %(end_Y)s") % dates_dict
- else:
- # overview label for interval in same month
- # letter after prefixes (start_, end_) is the one of
- # standard python date formatting ones- you can use all of them
- # see http://docs.python.org/library/time.html#time.strftime
- overview_label = _(u"Totals for %(start_B)s %(start_d)s â?? %(end_d)s, %(end_Y)s") % dates_dict
-
- if self.week_view.get_active():
- dayview_caption = _("Week")
- elif self.month_view.get_active():
- dayview_caption = _("Month")
- else:
- dayview_caption = _("Day")
-
- self.get_widget("overview_label").set_markup("<b>%s</b>" % overview_label)
- self.get_widget("dayview_caption").set_markup("%s" % (dayview_caption))
-
-
- def do_graph(self):
- self.set_title()
-
- if self.day_view.get_active():
- facts = runtime.storage.get_facts(self.view_date)
- else:
- facts = runtime.storage.get_facts(self.start_date, self.end_date)
-
+ def do_graph(self, facts = None):
+ facts = facts or runtime.storage.get_facts(self.start_date, self.end_date)
self.get_widget("report_button").set_sensitive(len(facts) > 0)
@@ -337,9 +282,6 @@ class ReportsBox(gtk.VBox):
self.do_charts(facts)
-
-
-
def get_widget(self, name):
""" skip one variable (huh) """
return self._gui.get_object(name)
@@ -355,95 +297,6 @@ class ReportsBox(gtk.VBox):
self.do_graph()
- def on_prev_clicked(self, button):
- if self.day_view.get_active():
- self.view_date -= dt.timedelta(1)
- if self.view_date < self.start_date:
- self.start_date -= dt.timedelta(7)
- self.end_date -= dt.timedelta(7)
- else:
- if self.week_view.get_active():
- self.start_date -= dt.timedelta(7)
- self.end_date -= dt.timedelta(7)
-
- elif self.month_view.get_active():
- self.end_date = self.start_date - dt.timedelta(1)
- first_weekday, days_in_month = calendar.monthrange(self.end_date.year, self.end_date.month)
- self.start_date = self.end_date - dt.timedelta(days_in_month - 1)
-
- self.view_date = self.start_date
-
- self.do_graph()
-
- def on_next_clicked(self, button):
- if self.day_view.get_active():
- self.view_date += dt.timedelta(1)
- if self.view_date > self.end_date:
- self.start_date += dt.timedelta(7)
- self.end_date += dt.timedelta(7)
- else:
- if self.week_view.get_active():
- self.start_date += dt.timedelta(7)
- self.end_date += dt.timedelta(7)
- elif self.month_view.get_active():
- self.start_date = self.end_date + dt.timedelta(1)
- first_weekday, days_in_month = calendar.monthrange(self.start_date.year, self.start_date.month)
- self.end_date = self.start_date + dt.timedelta(days_in_month - 1)
-
- self.view_date = self.start_date
-
- self.do_graph()
-
- def on_home_clicked(self, button):
- self.view_date = dt.date.today()
- if self.week_view.get_active():
- self.start_date = self.view_date - dt.timedelta(self.view_date.weekday() + 1)
- self.start_date = self.start_date + dt.timedelta(stuff.locale_first_weekday())
- self.end_date = self.start_date + dt.timedelta(6)
-
- elif self.month_view.get_active():
- self.start_date = self.view_date - dt.timedelta(self.view_date.day - 1) #set to beginning of month
- first_weekday, days_in_month = calendar.monthrange(self.view_date.year, self.view_date.month)
- self.end_date = self.start_date + dt.timedelta(days_in_month - 1)
-
- self.do_graph()
-
- def on_day_toggled(self, button):
- self.start_date = self.view_date - dt.timedelta(self.view_date.weekday() + 1)
- self.start_date = self.start_date + dt.timedelta(stuff.locale_first_weekday())
- self.end_date = self.start_date + dt.timedelta(6)
-
- self.get_widget("prev").set_tooltip_text(_("Previous day"))
- self.get_widget("next").set_tooltip_text(_("Next day"))
- self.get_widget("home").set_tooltip_text(_("Today"))
- self.get_widget("home").set_label(_("Today"))
-
- self.do_graph()
-
- def on_week_toggled(self, button):
- self.start_date = self.view_date - dt.timedelta(self.view_date.weekday() + 1)
- self.start_date = self.start_date + dt.timedelta(stuff.locale_first_weekday())
- self.end_date = self.start_date + dt.timedelta(6)
-
- self.get_widget("prev").set_tooltip_text(_("Previous week"))
- self.get_widget("next").set_tooltip_text(_("Next week"))
- self.get_widget("home").set_tooltip_text(_("This week"))
- self.get_widget("home").set_label(_("This Week"))
- self.do_graph()
-
-
- def on_month_toggled(self, button):
- self.start_date = self.view_date - dt.timedelta(self.view_date.day - 1) #set to beginning of month
- first_weekday, days_in_month = calendar.monthrange(self.view_date.year, self.view_date.month)
- self.end_date = self.start_date + dt.timedelta(days_in_month - 1)
-
- self.get_widget("prev").set_tooltip_text(_("Previous month"))
- self.get_widget("next").set_tooltip_text(_("Next month"))
- self.get_widget("home").set_tooltip_text(_("This month"))
- self.get_widget("home").set_label(_("This Month"))
- self.do_graph()
-
-
def init_report_dialog(self):
chooser = self.get_widget('save_report_dialog')
chooser.set_action(gtk.FILE_CHOOSER_ACTION_SAVE)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]