From 17ae9d30d8a8a6178ce36a9bb028c0bf2b1b89ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 6 Oct 2008 17:51:29 +0200 Subject: [PATCH] Allow to have many times the same field in a form view --- tryton/gui/window/view_form/view/form.py | 61 +++++++++++-------- .../window/view_form/view/form_gtk/parser.py | 31 +++++++--- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/tryton/gui/window/view_form/view/form.py b/tryton/gui/window/view_form/view/form.py index caf8a928f9..a6cdfe605b 100644 --- a/tryton/gui/window/view_form/view/form.py +++ b/tryton/gui/window/view_form/view/form.py @@ -65,8 +65,9 @@ class ViewForm(ParserView): for button in self.buttons: button.form = self - self.widgets = dict([(name, ViewWidget(self, widget, name)) - for name, widget in children.items()]) + self.widgets = dict([(name, [ViewWidget(self, widget, name) + for widget in widgets]) + for name, widgets in children.items()]) vbox = gtk.VBox() vp = gtk.Viewport() @@ -151,12 +152,13 @@ class ViewForm(ParserView): return value def __getitem__(self, name): - return self.widgets[name] + return self.widgets[name][0] def destroy(self): - for widget in self.widgets.keys(): - self.widgets[widget].widget.destroy() - del self.widgets[widget] + for widget_name in self.widgets.keys(): + for widget in self.widgets[widget_name]: + widget.widget.destroy() + del self.widgets[widget_name] self.widget.destroy() del self.widget del self.widgets @@ -169,8 +171,9 @@ class ViewForm(ParserView): def set_value(self): model = self.screen.current_model if model: - for widget in self.widgets.values(): - widget.set_value(model) + for widgets in self.widgets.values(): + for widget in widgets: + widget.set_value(model) def sel_ids_get(self): if self.screen.current_model: @@ -184,14 +187,16 @@ class ViewForm(ParserView): def reset(self): model = self.screen.current_model - for name, widget in self.widgets.items(): - widget.reset(model) + for name, widgets in self.widgets.items(): + for widget in widgets: + widget.reset(model) def signal_record_changed(self, *args): - for widget in self.widgets.values(): - if hasattr(widget.widget, 'screen'): - for view in widget.widget.screen.views: - view.signal_record_changed(*args) + for widgets in self.widgets.values(): + for widget in widgets: + if hasattr(widget.widget, 'screen'): + for view in widget.widget.screen.views: + view.signal_record_changed(*args) def display(self): model = self.screen.current_model @@ -199,8 +204,9 @@ class ViewForm(ParserView): # Force to set mfields in model for field in model.mgroup.fields: model[field].get(model, check_load=False) - for widget in self.widgets.values(): - widget.display(model) + for widgets in self.widgets.values(): + for widget in widgets: + widget.display(model) for button in self.buttons: button.state_set(model) return True @@ -209,20 +215,23 @@ class ViewForm(ParserView): for notebook in self.notebooks: notebook.set_current_page(0) if self.cursor_widget in self.widgets: - self.widgets[self.cursor_widget].widget.grab_focus() + self.widgets[self.cursor_widget][0].widget.grab_focus() model = self.screen.current_model - position = len(self.widgets) + position = 0 + for widgets in self.widgets: + position += len(widgets) focus_widget = None if model: - for widget in self.widgets.values(): - modelfield = model.mgroup.mfields.get(widget.widget_name, None) - if not modelfield: - continue - if not modelfield.get_state_attrs(model).get('valid', True): - if widget.widget.position > position: + for widgets in self.widgets.values(): + for widget in widgets: + modelfield = model.mgroup.mfields.get(widget.widget_name, None) + if not modelfield: continue - position = widget.widget.position - focus_widget = widget + if not modelfield.get_state_attrs(model).get('valid', True): + if widget.widget.position > position: + continue + position = widget.widget.position + focus_widget = widget if focus_widget: for notebook in self.notebooks: for i in range(notebook.get_n_pages()): 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 4a0a696f19..2f27e0577d 100644 --- a/tryton/gui/window/view_form/view/form_gtk/parser.py +++ b/tryton/gui/window/view_form/view/form_gtk/parser.py @@ -431,7 +431,9 @@ class ParserForm(ParserInterface): cursor_widget = cursor_widget2 notebook_list.extend(notebook_list2) button_list += buttons - dict_widget.update(widgets) + for widget_name, widgets in widgets.items(): + dict_widget.setdefault(widget_name, []) + dict_widget[widget_name].extend(widgets) elif node.localName == 'page': if attrs and 'angle' in attrs: @@ -447,7 +449,9 @@ class ParserForm(ParserInterface): cursor_widget = cursor_widget2 notebook_list.extend(notebook_list2) button_list += buttons - dict_widget.update(widgets) + for widget_name, widgets in widgets.items(): + dict_widget.setdefault(widget_name, []) + dict_widget[widget_name].extend(widgets) notebook.append_page(widget, label) elif node.localName == 'field': @@ -473,7 +477,8 @@ class ParserForm(ParserInterface): model, fields[name]) self.widget_id += 1 widget_act.position = self.widget_id - dict_widget[name] = widget_act + dict_widget.setdefault(name, []) + dict_widget[name].append(widget_act) size = int(attrs.get('colspan', WIDGETS_TYPE[ftype][1])) expand = WIDGETS_TYPE[ftype][2] if 'expand' in attrs: @@ -503,7 +508,9 @@ class ParserForm(ParserInterface): if not cursor_widget: cursor_widget = cursor_widget2 notebook_list.extend(notebook_list2) - dict_widget.update(widgets) + for widget_name, widgets in widgets.items(): + dict_widget.setdefault(widget_name, []) + dict_widget[widget_name].extend(widgets) button_list += buttons text = '' if 'name' in attrs and attrs['name'] in fields: @@ -534,7 +541,9 @@ class ParserForm(ParserInterface): cursor_widget = cursor_widget2 notebook_list.extend(notebook_list2) button_list += buttons - dict_widget.update(widgets) + for widget_name, widgets in widgets.items(): + dict_widget.setdefault(widget_name, []) + dict_widget[widget_name].extend(widgets) if 'position' in attrs: hpaned.set_position(int(attrs['position'])) elif node.localName == 'vpaned': @@ -548,7 +557,9 @@ class ParserForm(ParserInterface): cursor_widget = cursor_widget2 notebook_list.extend(notebook_list2) button_list += buttons - dict_widget.update(widgets) + for widget_name, widgets in widgets.items(): + dict_widget.setdefault(widget_name, []) + dict_widget[widget_name].extend(widgets) if 'position' in attrs: vpaned.set_position(int(attrs['position'])) elif node.localName == 'child1': @@ -559,7 +570,9 @@ class ParserForm(ParserInterface): cursor_widget = cursor_widget2 notebook_list.extend(notebook_list2) button_list += buttons - dict_widget.update(widgets) + for widget_name, widgets in widgets.items(): + dict_widget.setdefault(widget_name, []) + dict_widget[widget_name].extend(widgets) paned.pack1(widget, resize=True, shrink=True) elif node.localName == 'child2': widget, widgets, buttons, on_write, notebook_list, cursor_widget2 = \ @@ -569,7 +582,9 @@ class ParserForm(ParserInterface): cursor_widget = cursor_widget2 notebook_list.extend(notebook_list2) button_list += buttons - dict_widget.update(widgets) + for widget_name, widgets in widgets.items(): + dict_widget.setdefault(widget_name, []) + dict_widget[widget_name].extend(widgets) paned.pack2(widget, resize=True, shrink=True) for (button, src, name, widget) in container.trans_box: button.connect('clicked', self.translate, model, name,