From 94cb7b10b4054a02bad0de044fdff3c61944de5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 20 Jul 2014 12:54:40 +0200 Subject: [PATCH] Manage tree_state attribute issue4028 review13371003 --- CHANGELOG | 2 + doc/usage.rst | 2 +- tryton/gui/window/view_form/screen/screen.py | 44 +++++++++++++------- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d668b859d6..8dc2afb85c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +* Manage tree_state attribute +* Add simple tree_state support on form view * Change range operator of search widget to be included * Explicitly set value of parent field diff --git a/doc/usage.rst b/doc/usage.rst index 166099518c..d0a54d79b6 100644 --- a/doc/usage.rst +++ b/doc/usage.rst @@ -474,7 +474,7 @@ Save Width/Height: .. _Menu-Options-Form-Save_Tree_State: Save Tree Expanded State: - Check box to enable saving of manually expanded nodes in trees. + Check box to enable saving of expanded and selected nodes in trees/lists. .. _Menu-Options-Form-Spell_Checking: diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py index 19b32c63d2..2ec76edbb5 100644 --- a/tryton/gui/window/view_form/screen/screen.py +++ b/tryton/gui/window/view_form/screen/screen.py @@ -600,57 +600,73 @@ class Screen(SignalEvent): def set_tree_state(self): view = self.current_view - if (not CONFIG['client.save_tree_state'] - or not view - or view.view_type != 'tree' - or not self.group): + if view.view_type not in ('tree', 'form'): return if id(view) in self.tree_states_done: return + if view.view_type == 'form' and self.tree_states_done: + return parent = self.parent.id if self.parent else None + expanded_nodes, selected_nodes = [], [] timestamp = self.parent._timestamp if self.parent else None state = self.tree_states[parent][view.children_field] if state: state_timestamp, expanded_nodes, selected_nodes = state if timestamp != state_timestamp: state = None - if state is None: + if state is None and CONFIG['client.save_tree_state']: json_domain = self.get_tree_domain(parent) try: expanded_nodes, selected_nodes = RPCExecute('model', 'ir.ui.view_tree_state', 'get', self.model_name, json_domain, - self.current_view.children_field) + view.children_field) expanded_nodes = json.loads(expanded_nodes) selected_nodes = json.loads(selected_nodes) except RPCException: logging.getLogger(__name__).warn( _('Unable to get view tree state')) - expanded_nodes = [] - selected_nodes = [] self.tree_states[parent][view.children_field] = ( timestamp, expanded_nodes, selected_nodes) - view.expand_nodes(expanded_nodes) - view.select_nodes(selected_nodes) + if view.view_type == 'tree': + view.expand_nodes(expanded_nodes) + view.select_nodes(selected_nodes) + else: + if selected_nodes: + record = None + for node in selected_nodes[0]: + new_record = self.group.get(node) + if not new_record: + break + else: + record = new_record + if record and record != self.current_record: + self.current_record = record + # Force a display of the view to synchronize the + # widgets with the new record + view.display() self.tree_states_done.add(id(view)) def save_tree_state(self, store=True): if not CONFIG['client.save_tree_state']: return + parent = self.parent.id if self.parent else None + timestamp = self.parent._timestamp if self.parent else None for view in self.views: if view.view_type == 'form': for widgets in view.widgets.itervalues(): for widget in widgets: if hasattr(widget, 'screen'): widget.screen.save_tree_state(store) - elif (view.view_type == 'tree' and view.children_field): - parent = self.parent.id if self.parent else None - timestamp = self.parent._timestamp if self.parent else None + if len(self.views) == 1 and self.current_record: + self.tree_states[parent][view.children_field] = ( + timestamp, [], [[self.current_record.id]]) + elif view.view_type == 'tree': paths = view.get_expanded_paths() selected_paths = view.get_selected_paths() self.tree_states[parent][view.children_field] = ( timestamp, paths, selected_paths) - if store: + if store and view.attributes.get('tree_state', False): json_domain = self.get_tree_domain(parent) json_paths = json.dumps(paths) json_selected_path = json.dumps(selected_paths)