Manage dynamic label and prefix, suffix on tree view
review693002
This commit is contained in:
1 parent
5fe2b8063f
commit
56e088c82a
3 files changed
+85
-48
No files matched your search
@@ -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):
|
||||
|
||||
Reference in new issue
Block a user