Reviewers: ,
Please review this at http://codereview.tryton.org/96002/
Affected files:
M tryton/gui/window/view_form/screen/screen.py
M tryton/gui/window/view_form/view/list.py
Index: tryton/gui/window/view_form/screen/screen.py
===================================================================
--- a/tryton/gui/window/view_form/screen/screen.py
+++ b/tryton/gui/window/view_form/screen/screen.py
@@ -2,6 +2,7 @@
#this repository contains the full copyright notices and license terms.
"Screen"
import gobject
+import json
import copy
import xml.dom.minidom
import tryton.rpc as rpc
@@ -250,6 +251,18 @@
return False
def destroy(self):
+ first_view = self.views[0] if self.views else None
+ is_tree = (first_view and first_view.view_type == 'tree'
+ and first_view.children_field)
+ if is_tree:
+ _, tree_path = first_view.get_expanded_path()
+ try:
+ json_domain = json.dumps(self.domain)
+ json_path = json.dumps(tree_path)
+
rpc.execute('model', 'ir.ui.view_tree_expanded', 'set_expanded',
+ self.model_name, json_domain, json_path, rpc.CONTEXT)
+ except TrytonServerError:
+ pass
for view in self.views:
view.destroy()
self.group.signal_unconnect(self)
@@ -544,7 +557,7 @@
if idx > 0:
record = top_record.group[idx - 1]
- path = path[:-1] + ((path[-1][0], record.id,))
+ path = path[:-1] + ((path[-1][0], record.id,),)
else:
path = path[:-1]
if path:
@@ -561,6 +574,17 @@
self.current_view.reset()
if ids:
self.display(ids[0])
+ if (self.current_view.view_type == 'tree'
+ and self.current_view.children_field):
+ try:
+ json_domain = json.dumps(self.domain)
+ expanded_nodes = rpc.execute('model',
+ 'ir.ui.view_tree_expanded', 'get_expanded',
+ self.model_name, json_domain, rpc.CONTEXT)
+ expanded_nodes = json.loads(expanded_nodes)
+ except TrytonServerError:
+ expanded_nodes = []
+ self.current_view.open_nodes(expanded_nodes)
else:
self.current_record = None
self.display()
Index: tryton/gui/window/view_form/view/list.py
===================================================================
--- a/tryton/gui/window/view_form/view/list.py
+++ b/tryton/gui/window/view_form/view/list.py
@@ -149,6 +149,21 @@
prev.next[id(self.group)] = None
self.rows_reordered(None, None, new_order)
+ def idpath2path(self, idpath):
+ group = self.group
+ path = ()
+ while idpath:
+ current_id = idpath.pop(0)
+ ids_in_group = [r.id for r in group]
+ try:
+ idx = ids_in_group.index(current_id)
+ except ValueError:
+ return None
+ path += (idx,)
+ group = group[idx].children_group(self.children_field,
+ check_load=True)
+ return path
+
def __len__(self):
return len(self.group)
@@ -829,3 +844,28 @@
pass
else:
renderer.set_property('editable', False)
+
+ def get_expanded_path(self, starting_path=(), starting_id_path=()):
+ # Use id instead of position because the position may change
between
+ # load
+ paths, id_paths = [], []
+ record = self.store.on_get_iter(starting_path)
+ for path_idx in range(self.store.on_iter_n_children(record)):
+ path = starting_path + (path_idx,)
+ opened = self.widget_tree.row_expanded(path)
+ if opened:
+ paths.append(path)
+ opened_record = self.store.on_get_iter(path)
+ id_path = starting_id_path + (opened_record.id,)
+ id_paths.append(id_path)
+ child_paths, child_id_paths = self.get_expanded_path(path,
+ id_path)
+ paths += child_paths
+ id_paths += child_id_paths
+ return paths, id_paths
+
+ def open_nodes(self, nodes):
+ for node in nodes:
+ expand_path = self.store.idpath2path(node)
+ if expand_path:
+ self.widget_tree.expand_to_path(expand_path)
--
[email protected] mailing list