Add cell renderer date with command processing and mask encoding for list view

This commit is contained in:
Cédric Krier committed 2008-09-03 20:29:14 +02:00
1 parent 00bfe945f3
commit 54cbf4e010
3 files changed
+128 -33

No files matched your search

+83
View File
@@ -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)
+33 -32
View File
@@ -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):
@@ -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: