From 72901758bac08d5eca7537b82fc9f181b92ee89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 25 Aug 2008 11:54:09 +0200 Subject: [PATCH] Add progressbar widget inspired from openerp rev571 --- .../window/view_form/view/form_gtk/parser.py | 2 + .../view_form/view/form_gtk/progressbar.py | 37 ++++++++++++++++ tryton/gui/window/view_form/view/list.py | 4 ++ .../view_form/view/list_gtk/editabletree.py | 6 +++ .../window/view_form/view/list_gtk/parser.py | 42 +++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 tryton/gui/window/view_form/view/form_gtk/progressbar.py diff --git a/tryton/gui/window/view_form/view/form_gtk/parser.py b/tryton/gui/window/view_form/view/form_gtk/parser.py index 511fd703f8..e7cbab5658 100644 --- a/tryton/gui/window/view_form/view/form_gtk/parser.py +++ b/tryton/gui/window/view_form/view/form_gtk/parser.py @@ -752,6 +752,7 @@ from many2many import Many2Many from many2one import Many2One from url import Email, URL, CallTo, SIP from image import Image as Image2 +from progressbar import ProgressBar WIDGETS_TYPE = { @@ -776,4 +777,5 @@ WIDGETS_TYPE = { 'callto' : (CallTo, 1, False, False), 'sip' : (SIP, 1, False, False), 'image' : (Image2, 1, False, False), + 'progressbar': (ProgressBar, 1, False, False), } diff --git a/tryton/gui/window/view_form/view/form_gtk/progressbar.py b/tryton/gui/window/view_form/view/form_gtk/progressbar.py new file mode 100644 index 0000000000..4bb29f38f8 --- /dev/null +++ b/tryton/gui/window/view_form/view/form_gtk/progressbar.py @@ -0,0 +1,37 @@ +#This file is part of Tryton. The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. +import gtk +from interface import WidgetInterface +import locale + + +class ProgressBar(WidgetInterface): + 'Progress Bar' + orientations = { + 'left_to_right': gtk.PROGRESS_LEFT_TO_RIGHT, + 'right_to_left': gtk.PROGRESS_RIGHT_TO_LEFT, + 'bottom_to_top': gtk.PROGRESS_BOTTOM_TO_TOP, + 'top_to_bottom': gtk.PROGRESS_TOP_TO_BOTTOM, + } + + def __init__(self, window, parent, model, attrs=None): + super(ProgressBar, self).__init__(window, parent, model=model, attrs=attrs) + self.digits = attrs.get('digits', (14, 2)) + self.widget = gtk.ProgressBar() + orientation = self.orientations.get(attrs.get('orientation', + 'left_to_right'), gtk.PROGRESS_LEFT_TO_RIGHT) + self.widget.set_orientation(orientation) + + def display(self, model, model_field): + super(ProgressBar, self).display(model, model_field) + if not model_field: + self.widget.set_text('') + self.widget.set_fraction(0.0) + return False + value = float(model_field.get(model) or 0.0) + if isinstance(self.digits, str): + digits = self._view.model.expr_eval(self.digits) + else: + digits = self.digits + self.widget.set_text(locale.format('%.' + str(digits[1]) + 'f', + value, True)) + self.widget.set_fraction(value / 100.0) diff --git a/tryton/gui/window/view_form/view/list.py b/tryton/gui/window/view_form/view/list.py index 7295e18ea1..440e8aef62 100644 --- a/tryton/gui/window/view_form/view/list.py +++ b/tryton/gui/window/view_form/view/list.py @@ -504,6 +504,8 @@ class ViewList(ParserView): renderer = renderers[0] if isinstance(renderer, gtk.CellRendererToggle): editable = renderer.get_property('activatable') + elif isinstance(renderer, gtk.CellRendererProgress): + editable = False else: editable = renderer.get_property('editable') if column.get_visible() and editable: @@ -535,5 +537,7 @@ class ViewList(ParserView): for renderer in col.get_cell_renderers(): if isinstance(renderer, gtk.CellRendererToggle): renderer.set_property('activatable', False) + elif isinstance(renderer, gtk.CellRendererProgress): + pass else: renderer.set_property('editable', False) diff --git a/tryton/gui/window/view_form/view/list_gtk/editabletree.py b/tryton/gui/window/view_form/view/list_gtk/editabletree.py index 27adf76e35..c0e9032738 100644 --- a/tryton/gui/window/view_form/view/list_gtk/editabletree.py +++ b/tryton/gui/window/view_form/view/list_gtk/editabletree.py @@ -74,6 +74,8 @@ class EditableTreeView(gtk.TreeView): renderer = cols[idx].get_cell_renderers()[0] if isinstance(renderer, gtk.CellRendererToggle): editable = renderer.get_property('activatable') + elif isinstance(renderer, gtk.CellRendererProgress): + editable = False else: editable = renderer.get_property('editable') if cols[idx].get_visible() and editable: @@ -88,6 +90,8 @@ class EditableTreeView(gtk.TreeView): renderer = cols[idx].get_cell_renderers()[0] if isinstance(renderer, gtk.CellRendererToggle): editable = renderer.get_property('activatable') + elif isinstance(renderer, gtk.CellRendererProgress): + editable = False else: editable = renderer.get_property('editable') if cols[idx].get_visible() and editable: @@ -183,6 +187,8 @@ class EditableTreeView(gtk.TreeView): renderer = column.get_cell_renderers()[0] if isinstance(renderer, gtk.CellRendererToggle): editable = renderer.get_property('activatable') + elif isinstance(renderer, gtk.CellRendererProgress): + editable = False else: editable = renderer.get_property('editable') if column.get_visible() and editable: diff --git a/tryton/gui/window/view_form/view/list_gtk/parser.py b/tryton/gui/window/view_form/view/list_gtk/parser.py index c57e046c94..a2bda0f763 100644 --- a/tryton/gui/window/view_form/view/list_gtk/parser.py +++ b/tryton/gui/window/view_form/view/list_gtk/parser.py @@ -101,6 +101,8 @@ class ParserTree(ParserInterface): if editable and not node_attrs.get('readonly', False): if isinstance(renderer, gtk.CellRendererToggle): renderer.set_property('activatable', True) + elif isinstance(renderer, gtk.CellRendererProgress): + pass else: renderer.set_property('editable', True) renderer.connect_after('editing-started', send_keys, @@ -592,6 +594,45 @@ class Selection(Char): return res +class ProgressBar(object): + orientations = { + 'left_to_right': gtk.PROGRESS_LEFT_TO_RIGHT, + 'right_to_left': gtk.PROGRESS_RIGHT_TO_LEFT, + 'bottom_to_top': gtk.PROGRESS_BOTTOM_TO_TOP, + 'top_to_bottom': gtk.PROGRESS_TOP_TO_BOTTOM, + } + + def __init__(self, field_name, model, treeview=None, attrs=None, window=None): + self.field_name = field_name + self.model = model + self.attrs = attrs or {} + self.renderer = gtk.CellRendererProgress() + orientation = self.orientations.get(self.attrs.get('orientation', + 'left_to_right'), gtk.PROGRESS_LEFT_TO_RIGHT) + self.renderer.set_property('orientation', orientation) + self.treeview = treeview + self.window = window + + def setter(self, column, cell, store, iter): + model = store.get_value(iter, 0) + value = float(self.get_textual_value(model) or 0.0) + cell.set_property('value', value) + if isinstance(self.attrs.get('digits'), str): + digit = model.expr_eval(self.attrs['digits'])[1] + else: + digit = self.attrs.get('digits', (16, 2))[1] + text = locale.format('%.' + str(digit) + 'f', value, True) + cell.set_property('text', text + '%') + + def open_remote(self, model, create, changed=False, text=None): + raise NotImplementedError + + def get_textual_value(self, model): + return model[self.field_name].get_client(model) or '' + + def value_from_text(self, model, text): + return float(text) + CELLTYPES = { 'char': Char, 'many2one': M2O, @@ -610,4 +651,5 @@ CELLTYPES = { 'email': Char, 'callto': Char, 'sip': Char, + 'progressbar': ProgressBar, }