From 54cbf4e010e2025597a9504a19bfd6fed945a5ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 3 Sep 2008 20:29:14 +0200 Subject: [PATCH] Add cell renderer date with command processing and mask encoding for list view --- tryton/common/cellrendererdate.py | 83 +++++++++++++++++++ tryton/common/date_widget.py | 65 ++++++++------- .../window/view_form/view/list_gtk/parser.py | 13 ++- 3 files changed, 128 insertions(+), 33 deletions(-) create mode 100644 tryton/common/cellrendererdate.py diff --git a/tryton/common/cellrendererdate.py b/tryton/common/cellrendererdate.py new file mode 100644 index 0000000000..f24a2736f9 --- /dev/null +++ b/tryton/common/cellrendererdate.py @@ -0,0 +1,83 @@ +#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 +import gobject +import pango +from date_widget import mapping, DateEntry, compute_date +import re +import time +from mx.DateTime import RelativeDateTime +from mx.DateTime import DateTime +from mx.DateTime import now +from mx.DateTime import strptime + + +class CellRendererDate(gtk.GenericCellRenderer): + __gproperties__ = { + 'text': (gobject.TYPE_STRING, None, 'Text', + 'Text', gobject.PARAM_READWRITE), + 'foreground': (gobject.TYPE_STRING, None, 'Foreground', + 'Foreground', gobject.PARAM_READWRITE), + 'background': (gobject.TYPE_STRING, None, 'Background', + 'Background', gobject.PARAM_READWRITE), + 'editable': (gobject.TYPE_INT, 'Editable', + 'Editable', 0, 10, 0, gobject.PARAM_READWRITE), + } + + def __init__(self, format): + self.__gobject_init__() + self._renderer = gtk.CellRendererText() + self.set_property("mode", self._renderer.get_property("mode")) + + self.format = format + self.cmd = '' + + def do_set_property(self, pspec, value): + setattr(self, pspec.name, value) + self._renderer.set_property(pspec.name, value) + self.set_property("mode", self._renderer.get_property("mode")) + + def do_get_property(self, pspec): + return getattr(self, pspec.name) + + def on_get_size(self, widget, cell_area): + return self._renderer.get_size(widget, cell_area) + + def on_render(self, window, widget, background_area, cell_area, + expose_area, flags): + return self._renderer.render(window, widget, background_area, + cell_area, expose_area, flags) + + def on_activate(self, event, widget, path, background_area, cell_area, + flags): + return self._renderer.activate(event, widget, path, background_area, + cell_area, flags) + + def on_start_editing(self, event, widget, path, background_area, + cell_area, flags): + editable = DateEntry(self.format, self._date_cb, self._process_cb) + editable.set_text(self.text) + editable.grab_focus() + editable.show() + return editable + + def _date_cb(self, event): + if event.keyval in (gtk.keysyms.BackSpace,): + self.cmd = self.cmd[:-1] + return True + if event.keyval < 250: + value = chr(event.keyval) + self.cmd += value + return True + + def _process_cb(self, ok, widget, event=None): + if ok: + self._date_cb(event) + else: + if hasattr(event, 'keyval') and not event.keyval == gtk.keysyms.Escape: + dt = widget.date_get() + res= compute_date(self.cmd, dt, widget.format) + if res: + widget.date_set(res) + self.cmd = '' + +gobject.type_register(CellRendererDate) diff --git a/tryton/common/date_widget.py b/tryton/common/date_widget.py index 757a7489ad..05e80e86b5 100644 --- a/tryton/common/date_widget.py +++ b/tryton/common/date_widget.py @@ -174,11 +174,11 @@ class DateEntry(gtk.Entry): self.stop_emission("key-press-event") return True elif event.keyval in (ord('+'),ord('-'),ord('=')): - self.mode_cmd = True - self.date_get() - if self.callback_process: self.callback_process(True, self, event) - self.stop_emission("key-press-event") - return True + self.mode_cmd = True + self.date_get() + if self.callback_process: self.callback_process(True, self, event) + self.stop_emission("key-press-event") + return True elif self.mode_cmd: if self.callback: self.callback(event) return True @@ -218,38 +218,39 @@ class ComplexEntry(gtk.HBox): self.widget_cmd.show() self._date_cb(event) else: - data = self.widget.get_text() if hasattr(event, 'keyval') and not event.keyval == gtk.keysyms.Escape: - lst = { - '^=(\d+)w$': lambda dt,r: dt+RelativeDateTime(day=0, month=0, weeks = int(r.group(1))), - '^=(\d+)d$': lambda dt,r: dt+RelativeDateTime(day=int(r.group(1))), - '^=(\d+)m$': lambda dt,r: dt+RelativeDateTime(day=0, month = int(r.group(1))), - '^=(2\d\d\d)y$': lambda dt,r: dt+RelativeDateTime(year = int(r.group(1))), - '^=(\d+)h$': lambda dt,r: dt+RelativeDateTime(hour = int(r.group(1))), - '^([\\+-]\d+)h$': lambda dt,r: dt+RelativeDateTime(hours = int(r.group(1))), - '^([\\+-]\d+)w$': lambda dt,r: dt+RelativeDateTime(days = 7*int(r.group(1))), - '^([\\+-]\d+)d$': lambda dt,r: dt+RelativeDateTime(days = int(r.group(1))), - '^([\\+-]\d+)m$': lambda dt,r: dt+RelativeDateTime(months = int(r.group(1))), - '^([\\+-]\d+)y$': lambda dt,r: dt+RelativeDateTime(years = int(r.group(1))), - '^=$': lambda dt,r: now(), - '^-$': lambda dt,r: False - } cmd = self.widget_cmd.get_text() - for r,f in lst.items(): - groups = re.match(r, cmd) - if groups: - dt = self.widget.date_get() - if not dt: - dt = time.strftime(self.widget.format, time.localtime()) - dt = strptime(dt, self.widget.format) - self.widget.date_set(f(dt,groups)) - break - - # Compute HERE using DATA and setting WIDGET - pass + dt = self.widget.date_get() + res = compute_date(cmd, dt, self.widget.format) + if res: + self.widget.date_set(res) self.widget_cmd.set_text('') self.widget_cmd.hide() + +def compute_date(cmd, dt, format): + lst = { + '^=(\d+)w$': lambda dt,r: dt+RelativeDateTime(day=0, month=0, weeks = int(r.group(1))), + '^=(\d+)d$': lambda dt,r: dt+RelativeDateTime(day=int(r.group(1))), + '^=(\d+)m$': lambda dt,r: dt+RelativeDateTime(day=0, month = int(r.group(1))), + '^=(2\d\d\d)y$': lambda dt,r: dt+RelativeDateTime(year = int(r.group(1))), + '^=(\d+)h$': lambda dt,r: dt+RelativeDateTime(hour = int(r.group(1))), + '^([\\+-]\d+)h$': lambda dt,r: dt+RelativeDateTime(hours = int(r.group(1))), + '^([\\+-]\d+)w$': lambda dt,r: dt+RelativeDateTime(days = 7*int(r.group(1))), + '^([\\+-]\d+)d$': lambda dt,r: dt+RelativeDateTime(days = int(r.group(1))), + '^([\\+-]\d+)m$': lambda dt,r: dt+RelativeDateTime(months = int(r.group(1))), + '^([\\+-]\d+)y$': lambda dt,r: dt+RelativeDateTime(years = int(r.group(1))), + '^=$': lambda dt,r: now(), + '^-$': lambda dt,r: False + } + for r,f in lst.items(): + groups = re.match(r, cmd) + if groups: + if not dt: + dt = time.strftime(format, time.localtime()) + dt = strptime(dt, format) + return f(dt, groups) + if __name__ == '__main__': import sys def main(args): 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 30b6045b78..1bf9489cc0 100644 --- a/tryton/gui/window/view_form/view/list_gtk/parser.py +++ b/tryton/gui/window/view_form/view/list_gtk/parser.py @@ -21,6 +21,7 @@ from tryton.common import DT_FORMAT, DHM_FORMAT, COLORS, node_attributes, \ TRYTON_ICON, HM_FORMAT import tryton.common as common from tryton.common.cellrendererbutton import CellRendererButton +from tryton.common.cellrendererdate import CellRendererDate from tryton.action import Action from tryton.translate import date_format @@ -231,7 +232,8 @@ class ParserTree(ParserInterface): class Char(object): - def __init__(self, field_name, model, treeview=None, attrs=None, window=None): + def __init__(self, field_name, model, treeview=None, attrs=None, + window=None): self.field_name = field_name self.model = model self.attrs = attrs or {} @@ -317,6 +319,15 @@ class Date(Char): server_format = DT_FORMAT display_format = date_format() + 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 = CellRendererDate(self.display_format) + self.treeview = treeview + self.window = window + def get_textual_value(self, model): value = model[self.field_name].get_client(model) if not value: