Add cell renderer date with command processing and mask encoding for list view
This commit is contained in:
1 parent
00bfe945f3
commit
54cbf4e010
3 files changed
+128
-33
No files matched your search
@@ -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)
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user