[hamster-applet] unified fact filtering between activities and totals;



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">&#x2022;</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="&lt;separator&gt;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 &#x2013; 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]