diff --git a/CHANGELOG b/CHANGELOG index 9af4823ef2..993fb89b90 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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 diff --git a/tryton/gui/window/view_form/view/form_gtk/parser.py b/tryton/gui/window/view_form/view/form_gtk/parser.py index c90d7ed73a..b7d82935ee 100644 --- a/tryton/gui/window/view_form/view/form_gtk/parser.py +++ b/tryton/gui/window/view_form/view/form_gtk/parser.py @@ -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']: 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 2505d926a0..4a560f3acf 100644 --- a/tryton/gui/window/view_form/view/list_gtk/parser.py +++ b/tryton/gui/window/view_form/view/list_gtk/parser.py @@ -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):