Manage dynamic label and prefix, suffix on tree view

review693002
This commit is contained in:
Cédric Krier committed 2013-03-15 21:44:59 +01:00
1 parent 5fe2b8063f
commit 56e088c82a
3 files changed
+85 -48

No files matched your search

+2
View File
@@ -1,3 +1,5 @@
* Manage dynamic label
* Manage prefix, suffix on tree view
* Manage selection_change_with on Selection and Reference fields
* Add Dict fields on form
* Remove Goto
@@ -29,7 +29,12 @@ class StateMixin(object):
class Label(StateMixin, gtk.Label):
pass
def state_set(self, record):
super(Label, self).state_set(record)
if not self.attrs.get('string', True) and 'name' in self.attrs:
field = record.group.fields[self.attrs['name']]
self.set_text(field.get_client(record) or '')
class VBox(StateMixin, gtk.VBox):
@@ -238,7 +243,7 @@ class ParserForm(ParserInterface):
and attr_name in fields[attrs['name']].attrs:
attrs[attr_name] = fields[attrs['name']
].attrs[attr_name]
if not text:
if 'string' not in attrs:
if gtk.widget_get_default_direction() == \
gtk.TEXT_DIR_RTL:
text = _(':') + \
@@ -254,9 +259,6 @@ class ParserForm(ParserInterface):
text += node.data
else:
text += node.toxml()
if not text:
container.empty_add(int(attrs.get('colspan', 1)))
continue
label = Label(text, attrs=attrs)
state_widgets.append(label)
if CONFIG['client.modepda']:
@@ -156,54 +156,33 @@ class ParserTree(ParserInterface):
col = gtk.TreeViewColumn(fields[fname].attrs['string'])
uri_types = ('url', 'email', 'callto', 'sip')
if ('icon' in node_attrs
or cell_type in uri_types):
if cell_type in uri_types:
render_pixbuf = CellRendererClickablePixbuf()
def clicked(renderer, path, fname, protocol):
store = self.treeview.get_model()
record = store.get_value(store.get_iter(path), 0)
value = record[fname].get(record)
if value:
if protocol == 'email':
value = 'mailto:%s' % value
elif protocol == 'callto':
value = 'callto:%s' % value
elif protocol == 'sip':
value = 'sip:%s' % value
webbrowser.open(value, new=2)
render_pixbuf.connect('clicked', clicked, fname,
cell_type)
prefixes = []
suffixes = []
if cell_type in ('url', 'email', 'callto', 'sip'):
prefixes.append(Affix(fname, self.treeview, node_attrs,
protocol=cell_type))
if 'icon' in node_attrs:
prefixes.append(Affix(fname, self.treeview, node_attrs))
for affix in node.childNodes:
affix_attrs = node_attributes(affix)
if affix.localName == 'prefix':
list_ = prefixes
else:
render_pixbuf = gtk.CellRendererPixbuf()
col.pack_start(render_pixbuf, expand=False)
icon = node_attrs.get('icon', 'tryton-web-browser')
list_ = suffixes
list_.append(Affix(fname, self.treeview, affix_attrs))
def setter(column, cell, store, iter, fname):
if (hasattr(self.treeview, 'get_realized')
and not self.treeview.get_realized()):
return
record = store.get_value(iter, 0)
field = record[fname]
field.state_set(record, states=('invisible',))
invisible = field.get_state_attrs(record
).get('invisible', False)
cell.set_property('visible', not invisible)
if icon in record.group.fields:
value = record[icon].get_client(record) or ''
else:
value = icon
common.ICONFACTORY.register_icon(value)
pixbuf = treeview.render_icon(stock_id=value,
size=gtk.ICON_SIZE_BUTTON, detail=None)
cell.set_property('pixbuf', pixbuf)
col.set_cell_data_func(render_pixbuf, setter, fname)
for prefix in prefixes:
col.pack_start(prefix.renderer, expand=False)
col.set_cell_data_func(prefix.renderer, prefix.setter)
col.pack_start(renderer, expand=True)
col.set_cell_data_func(renderer, cell.setter)
col.name = fname
for suffix in suffixes:
col.pack_start(suffix.renderer, expand=False)
col.set_cell_data_func(suffix.renderer, suffix.setter)
hbox = gtk.HBox(False, 2)
label = gtk.Label(fields[fname].attrs['string'])
label.show()
@@ -221,7 +200,6 @@ class ParserTree(ParserInterface):
col.set_widget(hbox)
col._type = fields[fname].attrs['type']
col.set_cell_data_func(renderer, cell.setter)
col.set_clickable(True)
twidth = {
'integer': 60,
@@ -325,6 +303,61 @@ class ParserTree(ParserInterface):
return False
class Affix(object):
def __init__(self, field_name, treeview, attrs, protocol=None):
super(Affix, self).__init__()
self.field_name = attrs.get('name', field_name)
self.attrs = attrs
self.protocol = protocol
self.icon = attrs.get('icon')
if protocol:
self.renderer = CellRendererClickablePixbuf()
self.renderer.connect('clicked', self.clicked)
if not self.icon:
self.icon = 'tryton-web-browser'
elif self.icon:
self.renderer = gtk.CellRendererPixbuf()
else:
self.renderer = gtk.CellRendererText()
self.treeview = treeview
@realized
def setter(self, column, cell, store, iter_):
record = store.get_value(iter_, 0)
field = record[self.field_name]
field.state_set(record, states=('invisible',))
invisible = field.get_state_attrs(record).get('invisible', False)
cell.set_property('visible', not invisible)
if self.icon:
if self.icon in record.group.fields:
value = record[self.icon].get_client(record) or ''
else:
value = self.icon
common.ICONFACTORY.register_icon(value)
pixbuf = self.treeview.render_icon(stock_id=value,
size=gtk.ICON_SIZE_BUTTON, detail=None)
cell.set_property('pixbuf', pixbuf)
else:
text = self.attrs.get('string', '')
if not text:
text = field.get_client(record) or ''
cell.set_property('text', text)
def clicked(self, renderer, path):
store = self.treeview.get_model()
record = store.get_value(store.get_iter(path), 0)
value = record[self.field_name].get(record)
if value:
if self.protocol == 'email':
value = 'mailto:%s' % value
elif self.protocol == 'callto':
value = 'callto:%s' % value
elif self.protocol == 'sip':
value = 'sip:%s' % value
webbrowser.open(value, new=2)
class Char(object):
def __init__(self, field_name, model_name, treeview, attrs=None):