From 670d4ecfe78f57563ecc559f5a6801c8c5bcf59d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 7 Mar 2008 11:56:13 +0100 Subject: [PATCH] Better exclude fields for One2Many - exclude fields on the screen level - form parser don't put empty widget in table, it just skip it --- tryton/gui/window/view_form/screen/screen.py | 12 ++++++------ .../gui/window/view_form/view/form_gtk/one2many.py | 7 ++++--- .../gui/window/view_form/view/form_gtk/parser.py | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py index a0e39d22a0..6e4e792752 100644 --- a/tryton/gui/window/view_form/screen/screen.py +++ b/tryton/gui/window/view_form/screen/screen.py @@ -16,7 +16,7 @@ class Screen(SignalEvent): parent=None, context=None, views_preload=None, tree_saves=True, domain=None, create_new=False, row_activate=None, hastoolbar=False, default_get=None, show_search=False, window=None, limit=80, - readonly=False, form=None): + readonly=False, form=None, exclude_field=None): if view_ids is None: view_ids = [] if view_type is None: @@ -69,6 +69,7 @@ class Screen(SignalEvent): self.readonly = readonly self.form = form self.fields_view_tree = None + self.exclude_field = exclude_field if view_type: self.view_to_load = view_type[1:] @@ -219,8 +220,7 @@ class Screen(SignalEvent): def add_view_custom(self, arch, fields, display=False, toolbar=None): return self.add_view(arch, fields, display, True, toolbar=toolbar) - def add_view_id(self, view_id, view_type, display=False, - exclude_field=None, context=None): + def add_view_id(self, view_id, view_type, display=False, context=None): if view_type in self.views_preload: return self.add_view(self.views_preload[view_type]['arch'], self.views_preload[view_type]['fields'], display, @@ -233,9 +233,9 @@ class Screen(SignalEvent): except Exception, exception: rpc.process_exception(exception, self.window) raise - if exclude_field: - if exclude_field in view['fields']: - del view['fields'][exclude_field] + if self.exclude_field: + if self.exclude_field in view['fields']: + del view['fields'][self.exclude_field] return self.add_view(view['arch'], view['fields'], display, toolbar=view.get('toolbar', False), context=context) diff --git a/tryton/gui/window/view_form/view/form_gtk/one2many.py b/tryton/gui/window/view_form/view/form_gtk/one2many.py index 3a1a9df8df..689dd0e548 100644 --- a/tryton/gui/window/view_form/view/form_gtk/one2many.py +++ b/tryton/gui/window/view_form/view/form_gtk/one2many.py @@ -58,7 +58,8 @@ class Dialog(object): self.dia.show_all() self.screen = Screen(model_name, view_type=[], parent=parent, - window=self.dia) + window=self.dia, + exclude_field=attrs.get('relation_field', None)) self.screen.models._context.update(model_ctx) if not model: model = self.screen.new(context=default_get_ctx) @@ -74,7 +75,6 @@ class Dialog(object): context=default_get_ctx) else: self.screen.add_view_id(False, 'form', display=True, - exclude_field=attrs.get('relation_field', None), context=default_get_ctx) viewport.add(self.screen.widget) width, height = self.screen.screen_container.size_get() @@ -218,7 +218,8 @@ class One2Many(WidgetInterface): parent=self.parent, views_preload=attrs.get('views', {}), tree_saves=attrs.get('saves', False), create_new=True, row_activate=self._on_activate, - default_get=attrs.get('default_get', {}), window=self._window) + default_get=attrs.get('default_get', {}), window=self._window, + exclude_field=attrs.get('relation_field', None)) self.screen.signal_connect(self, 'record-message', self._sig_label) menuitem_title.get_child().set_text(self.screen.current_view.title) 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 53731b6ac2..5033962acb 100644 --- a/tryton/gui/window/view_form/view/form_gtk/parser.py +++ b/tryton/gui/window/view_form/view/form_gtk/parser.py @@ -200,6 +200,15 @@ class _container(object): wid_list.reverse() table.set_focus_chain(wid_list) + def empty_add(self, colspan=1): + (table, width, height) = self.cont[-1] + if colspan > self.col[-1]: + colspan = self.col[-1] + if colspan + width > self.col[-1]: + self.newline() + (table, width, height) = self.cont[-1] + self.cont[-1] = (table, width + colspan, height) + class ParserForm(ParserInterface): @@ -267,6 +276,9 @@ 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) button_list.append(label) label.set_use_markup(True) @@ -343,11 +355,13 @@ class ParserForm(ParserInterface): name = str(attrs['name']) del attrs['name'] if name not in fields: + container.empty_add(int(attrs.get('colspan', 1))) continue ftype = attrs.get('widget', fields[name]['type']) fields[name].update(attrs) fields[name]['model'] = model if not ftype in WIDGETS_TYPE: + container.empty_add(int(attrs.get('colspan', 1))) continue fields[name]['name'] = name