Reviewers: nicoe, ced,


Please review this at http://codereview.tryton.org/414004/

Affected files:
  M tryton/gui/window/view_form/view/form.py
  A tryton/gui/window/view_form/view/timeline_widget.py


Index: tryton/gui/window/view_form/view/form.py
===================================================================
--- a/tryton/gui/window/view_form/view/form.py
+++ b/tryton/gui/window/view_form/view/form.py
@@ -8,6 +8,7 @@
 from interface import ParserView
 from tryton.action import Action
 from tryton.common import RPCExecute, RPCException
+from .timeline_widget import TimelineWidget

 _ = gettext.gettext

@@ -23,6 +24,7 @@
         for button in self.buttons:
             if isinstance(button, gtk.Button):
                 button.connect('clicked', self.button_clicked)
+        self.timeline_widget = TimelineWidget(screen)

         # Force to display the first time it switches on a page
         # This avoids glitch in position of widgets
@@ -52,7 +54,7 @@
         viewport.set_shadow_type(gtk.SHADOW_ETCHED_IN)
         viewport.add(scroll)
         vbox.pack_start(viewport, expand=True, fill=True)
-
+ vbox.pack_start(self.timeline_widget.widget, expand=True, fill=True)
         self.widget = vbox

     def __getitem__(self, name):
@@ -135,6 +137,7 @@
                 widget.display(record, field)
         for button in self.buttons:
             button.state_set(record)
+        self.timeline_widget.display(record)
         return True

     def set_cursor(self, new=False, reset_view=True):
@@ -199,3 +202,4 @@
                 self.screen.reload(written=True)
         else:
             self.screen.display()
+
Index: tryton/gui/window/view_form/view/timeline_widget.py
===================================================================
new file mode 100644
--- /dev/null
+++ b/tryton/gui/window/view_form/view/timeline_widget.py
@@ -0,0 +1,76 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from datetime import datetime
+import gtk
+from gettext import gettext as _
+from tryton.common import RPCExecute, RPCException
+
+class TimelineWidget(object):
+    '''
+    TODO:
+        After: Modify the look using graphics libraries (goocanvas,
+        graphviz,?) and add the "zooming" mechanism between the dates.
+    '''
+
+    def __init__(self, screen):
+        self.screen = screen
+        # history box
+        self.adjustment = gtk.Adjustment()
+        self.label = gtk.Label(_('This record contains data history:'))
+        self.label.set_justify(gtk.JUSTIFY_LEFT)
+        self.scale = gtk.HScale(self.adjustment)
+        self.scale.set_update_policy(gtk.UPDATE_DELAYED)
+        self.scale.set_draw_value(False)
+ self.scale_id = self.scale.connect('value-changed', self.change_record)
+        self.time_label = gtk.Label('Current time')
+        self.widget = gtk.VBox()
+        self.widget.pack_start(self.label, False)
+        self.widget.pack_start(self.scale, False)
+        self.widget.pack_start(self.time_label, False)
+
+    def set_timeline(self, dates):
+        length = len(dates)
+        print length
+        self.scale.handler_block(self.scale_id)
+        self.adjustment.set_all(length, 0, length+1, 1, 1, 1)
+        self.scale.handler_unblock(self.scale_id)
+        self.scale.set_slider_size_fixed(1)
+        self.scale.clear_marks()
+        for i in range(length):
+            days = datetime.now().day - dates[i].day
+            if days == 0:
+                time_mark = dates[i].strftime('%H:%M')
+            elif days == 1:
+                time_mark = '1 day'
+            else:
+                time_mark = '%d days' % days
+            self.scale.add_mark(i, gtk.POS_BOTTOM, '<small>%s</small>' %
+                time_mark)
+ self.scale.add_mark(length+1, gtk.POS_BOTTOM, '<small>Current</small>')
+
+    def display(self, record):
+        self.widget.hide()
+        if self.screen.views_preload:
+            info = self.screen.views_preload['form']
+ if info['type'] == 'form' and info['history'] and hasattr(record,
+            'model_name'):
+                try:
+                    result = RPCExecute('model', record.model_name,
+                        'get_history_tables', record.id)
+                except RPCException:
+                    return
+                else:
+                    self.set_timeline(result)
+                    self.widget.show()
+
+    def change_record(self, dt):
+        '''
+        TODO:
+            * set data record with chosen datetime in scale;
+ * if the chosen date is not current, it should disable the form for
+              editing;
+            * Move scale cursor to right date when screen reloaded;
+            * Set label with correct chosen date;
+            * More?
+        '''
+        self.screen.reload()
\ No newline at end of file


--
[email protected] mailing list

Reply via email to