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