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

Reply via email to