From f0cc7f35d665d6633d2b62dd20aa5dd13cf6c086 Mon Sep 17 00:00:00 2001
From: Nick Hall <nick__hall@hotmail.com>
Date: Fri, 18 Jan 2013 18:53:38 +0000
Subject: [PATCH] Use public interface of Gtk.TreeModel in listview code

svn: r21166
---
 gramps/gui/views/listview.py                  | 116 +++++++-----------
 .../gui/views/treemodels/citationtreemodel.py |   2 +-
 gramps/gui/views/treemodels/flatbasemodel.py  |  15 +--
 gramps/gui/views/treemodels/placemodel.py     |   2 +-
 gramps/gui/views/treemodels/treebasemodel.py  |  49 +++-----
 gramps/plugins/view/persontreeview.py         |   5 +-
 gramps/plugins/view/placetreeview.py          |  41 +++----
 7 files changed, 89 insertions(+), 141 deletions(-)

diff --git a/gramps/gui/views/listview.py b/gramps/gui/views/listview.py
index 3f75772cc..6c0b1ddf8 100644
--- a/gramps/gui/views/listview.py
+++ b/gramps/gui/views/listview.py
@@ -63,7 +63,7 @@ from gramps.gen.errors import WindowActiveError
 from ..filters import SearchBar
 from ..widgets.menuitem import add_menuitem
 from gramps.gen.constfunc import UNITYPE
-from gramps.gen.const import CUSTOM_FILTERS, USE_TIPS
+from gramps.gen.const import CUSTOM_FILTERS
 from gramps.gen.utils.debug import profile
 from gramps.gen.utils.string import data_recover_msg
 from gramps.gen.utils.file import get_unicode_path_from_file_chooser
@@ -177,7 +177,8 @@ class ListView(NavigationView):
             self.list.drag_dest_set_target_list(tglist)
 
         scrollwindow = Gtk.ScrolledWindow()
-        scrollwindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+        scrollwindow.set_policy(Gtk.PolicyType.AUTOMATIC,
+                                Gtk.PolicyType.AUTOMATIC)
         scrollwindow.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
         scrollwindow.add(self.list)
 
@@ -325,9 +326,6 @@ class ListView(NavigationView):
             self.__display_column_sort()
             self.goto_active(None)
 
-            if USE_TIPS and self.model.tooltip_column() is not None:
-                self.list.set_tooltip_column(self.model.tooltip_column())
-
             self.dirty = False
             cput4 = time.clock()
             self.uistate.show_filter_results(self.dbstate, 
@@ -403,27 +401,21 @@ class ListView(NavigationView):
         if not handle or handle in self.selected_handles():
             return
 
-        if self.model.get_flags() & Gtk.TreeModelFlags.LIST_ONLY:
-            # Flat
-            path = self.model.node_map.get_path_from_handle(handle)
-        else:
-            # Tree
-            path = None
-            node = self.model.get_node(handle)
-            if node:
-                iter = self.model.get_iter(node)
-                has_parent, parent_iter = self.model.do_iter_parent(iter)
-                if has_parent:
-                    parent_path = self.model.do_get_path(parent_iter)
-                    if parent_path:
-                        parent_path_list = parent_path.get_indices()
-                        for i in range(len(parent_path_list)):
-                            expand_path = Gtk.TreePath(
-                                    tuple([x for x in parent_path_list[:i+1]]))
-                            self.list.expand_row(expand_path, False)
-                path = self.model.do_get_path(iter)
+        iter_ = self.model.get_iter_from_handle(handle)
+        if iter_:
+            if not (self.model.get_flags() & Gtk.TreeModelFlags.LIST_ONLY):
+                # Expand tree
+                parent_iter = self.model.iter_parent(iter_)
+                if parent_iter:
+                    parent_path = self.model.get_path(parent_iter)
+                    parent_path_list = parent_path.get_indices()
+                    for i in range(len(parent_path_list)):
+                        expand_path = Gtk.TreePath(
+                                tuple([x for x in parent_path_list[:i+1]]))
+                        self.list.expand_row(expand_path, False)
 
-        if path is not None:
+            # Select active object
+            path = self.model.get_path(iter_)
             self.selection.unselect_all()
             self.selection.select_path(path)
             self.list.scroll_to_cell(path, None, 1, 0.5, 0)
@@ -567,15 +559,11 @@ class ListView(NavigationView):
         if not prompt:
             self.uistate.set_busy_cursor(False)
         
-    def blist(self, store, path, iter, sel_list):
+    def blist(self, store, path, iter_, sel_list):
         '''GtkTreeSelectionForeachFunc
             construct a list sel_list with all selected handles
         '''
-        if store.do_get_flags() & Gtk.TreeModelFlags.LIST_ONLY:
-            handle = store.node_map.get_handle(path.get_indices()[0])
-        else:
-            handle = store.get_handle(store.get_node_from_iter(iter))
-
+        handle = store.get_handle_from_iter(iter_)
         if handle is not None:
             sel_list.append(handle)
 
@@ -809,10 +797,9 @@ class ListView(NavigationView):
                 # Tree
                 store, paths = self.selection.get_selected_rows()
                 if paths:
-                    firstsel = paths[0]
-                    firstnode = self.model.get_node_from_iter(
-                                    self.model.do_get_iter(firstsel)[1])
-                    if len(paths)==1 and firstnode.handle is None:
+                    firstsel = self.model.get_iter(paths[0])
+                    handle = self.model.get_handle_from_iter(firstsel)
+                    if len(paths)==1 and handle is None:
                         return self.expand_collapse_tree_branch()
                     else:
                         self.edit(obj)
@@ -893,19 +880,17 @@ class ListView(NavigationView):
             if event.keyval in (Gdk.KEY_Return, Gdk.KEY_KP_Enter):
                 store, paths = self.selection.get_selected_rows()
                 if paths:
-                    firstsel = paths[0]
-                    firstnode = self.model.get_node_from_iter(
-                                    self.model.do_get_iter(firstsel)[1])
-                    if len(paths) == 1 and firstnode.handle is None:
+                    iter_ = self.model.get_iter(paths[0])
+                    handle = self.model.get_handle_from_iter(iter_)
+                    if len(paths) == 1 and handle is None:
                         return self.expand_collapse_tree_branch()
         else:
             if event.keyval in (Gdk.KEY_Return, Gdk.KEY_KP_Enter):
                 store, paths = self.selection.get_selected_rows()
                 if paths:
-                    firstsel = paths[0]
-                    firstnode = self.model.get_node_from_iter(
-                                    self.model.do_get_iter(firstsel)[1])
-                    if len(paths) == 1 and firstnode.handle is None:
+                    iter_ = self.model.get_iter(paths[0])
+                    handle = self.model.get_handle_from_iter(iter_)
+                    if len(paths) == 1 and handle is None:
                         return self.expand_collapse_tree()
                     else:
                         self.edit(obj)
@@ -920,9 +905,9 @@ class ListView(NavigationView):
         store, paths = self.selection.get_selected_rows()
         if paths:
             firstsel = paths[0]
-            firstnode = self.model.get_node_from_iter(
-                                    self.model.do_get_iter(firstsel)[1])
-            if firstnode.handle:
+            iter_ = self.model.get_iter(firstsel)
+            handle = self.model.get_handle_from_iter(iter_)
+            if handle:
                 return False
             if self.list.row_expanded(firstsel):
                 self.list.collapse_row(firstsel)
@@ -939,9 +924,9 @@ class ListView(NavigationView):
         store, paths = self.selection.get_selected_rows()
         if paths:
             firstsel = paths[0]
-            firstnode = self.model.get_node_from_iter(
-                                    self.model.do_get_iter(firstsel)[1])
-            if firstnode.handle:
+            iter_ = self.model.get_iter(firstsel)
+            handle = self.model.get_handle_from_iter(iter_)
+            if handle:
                 return False
             if self.list.row_expanded(firstsel):
                 self.list.collapse_row(firstsel)
@@ -1061,36 +1046,29 @@ class ListView(NavigationView):
                 ofile.end_row()
         else:
             # Tree model
-            hasmodel, iter = self.model.do_get_iter((0,))
-            if hasmodel:
-                node = self.model.get_node_from_iter(iter)
-                self.write_node(node, len(levels), [], ofile, data_cols)
+            iter_ = self.model.get_iter((0,))
+            if iter_:
+                self.write_node(iter_, len(levels), [], ofile, data_cols)
         
         ofile.end_page()
         ofile.close()
         
-    def write_node(self, node, depth, level, ofile, data_cols):
-        if node is None:
-            return
-        while node is not None:
-            iternode = self.model.get_iter(node)
-            new_level = level + [self.model.do_get_value(iternode, 0)]
-            if self.model.get_handle(node):
+    def write_node(self, iter_, depth, level, ofile, data_cols):
+
+        while iter_:
+            new_level = level + [self.model.get_value(iter_, 0)]
+            if self.model.get_handle_from_iter(iter_):
                 ofile.start_row()
                 padded_level = new_level + [''] * (depth - len(new_level))
                 list(map(ofile.write_cell, padded_level))
                 for index in data_cols:
-                    ofile.write_cell(self.model.do_get_value(iternode, index))
+                    ofile.write_cell(self.model.get_value(iter_, index))
                 ofile.end_row()
 
-            has_child, first_child = self.model.do_iter_children(iternode)
-            if has_child:
-                self.write_node(self.model.get_node_from_iter(first_child),
-                                depth, new_level, ofile, data_cols)
-            has_next = self.model.do_iter_next(iternode)
-            node = self.model.get_node_from_iter(iternode)
-            if not has_next:
-                node = None
+            first_child = self.model.iter_children(iter_)
+            self.write_node(first_child, depth, new_level, ofile, data_cols)
+
+            iter_ = self.model.iter_next(iter_)
 
     ####################################################################
     # Template functions
diff --git a/gramps/gui/views/treemodels/citationtreemodel.py b/gramps/gui/views/treemodels/citationtreemodel.py
index eb1dbf49c..e172bd521 100644
--- a/gramps/gui/views/treemodels/citationtreemodel.py
+++ b/gramps/gui/views/treemodels/citationtreemodel.py
@@ -173,7 +173,7 @@ class CitationTreeModel(CitationBaseModel, TreeBaseModel):
         data        The object data.
         """
         sort_key = self.sort_func2(data)
-        if self.get_node(data[5]):
+        if self._get_node(data[5]):
             self.add_node(data[5], handle, sort_key, handle, secondary=True)
 
     def do_get_n_columns(self):
diff --git a/gramps/gui/views/treemodels/flatbasemodel.py b/gramps/gui/views/treemodels/flatbasemodel.py
index 433910017..b859843ff 100644
--- a/gramps/gui/views/treemodels/flatbasemodel.py
+++ b/gramps/gui/views/treemodels/flatbasemodel.py
@@ -526,7 +526,7 @@ class FlatBaseModel(GObject.Object, Gtk.TreeModel):
                     col = search[1][0]
                     text = search[1][1]
                     inv = search[1][2]
-                    func = lambda x: self.get_value_from_handle(x, col) or UEMPTY
+                    func = lambda x: self._get_value(x, col) or UEMPTY
                     if search[2]:
                         self.search = ExactSearchFilter(func, text, inv)
                     else:
@@ -705,17 +705,12 @@ class FlatBaseModel(GObject.Object, Gtk.TreeModel):
             node = self.do_get_iter(path)[1]
             self.row_changed(path, node)
 
-    def handle2path(self, handle):
-        """
-        Obtain from a handle, a path.
-        Part of common api with flat/treebasemodel
-        """
-        return self.on_get_path_from_handle(handle)
-
     def get_iter_from_handle(self, handle):
         """
         Get the iter for a gramps handle.
         """
+        if self.node_map.get_path_from_handle(handle) is None:
+            return None
         return self.node_map.new_iter(handle)
 
     def get_handle_from_iter(self, iter):
@@ -775,7 +770,7 @@ class FlatBaseModel(GObject.Object, Gtk.TreeModel):
         except IndexError:
             return False, Gtk.TreeIter()
 
-    def get_value_from_handle(self, handle, col):
+    def _get_value(self, handle, col):
         """
         Given handle and column, return unicode value in the column
         We need this to search in the column in the GUI
@@ -796,7 +791,7 @@ class FlatBaseModel(GObject.Object, Gtk.TreeModel):
         """
         #print 'do_get_val', iter, iter.user_data, col
         handle = self.node_map._index2hndl[iter.user_data][1]
-        val = self.get_value_from_handle(handle, col)
+        val = self._get_value(handle, col)
         #print 'val is', val, type(val)
 
         #GTK 3 should convert unicode objects automatically, but this
diff --git a/gramps/gui/views/treemodels/placemodel.py b/gramps/gui/views/treemodels/placemodel.py
index 542d02902..2bc6fbe69 100644
--- a/gramps/gui/views/treemodels/placemodel.py
+++ b/gramps/gui/views/treemodels/placemodel.py
@@ -358,7 +358,7 @@ class PlaceTreeModel(PlaceBaseModel, TreeBaseModel):
         if node.name:
             return '<i>%s</i>' % cgi.escape(node.name)
         else:
-            level = len(self.do_get_path(self.get_iter(node)).get_indices())
+            level = len(self.do_get_path(self._get_iter(node)).get_indices())
             heading = '<i>%s</i>' % cgi.escape(COUNTRYLEVELS['default'][level])
             # This causes a problem with Gtk3 unless we cast to str.
             return str(heading)
diff --git a/gramps/gui/views/treemodels/treebasemodel.py b/gramps/gui/views/treemodels/treebasemodel.py
index f710713c7..b69a7d2f4 100644
--- a/gramps/gui/views/treemodels/treebasemodel.py
+++ b/gramps/gui/views/treemodels/treebasemodel.py
@@ -643,7 +643,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
 
             if not self._in_build:
                 # emit row_inserted signal
-                iternode = self.get_iter(child_node)
+                iternode = self._get_iter(child_node)
                 path = self.do_get_path(iternode)
                 self.row_inserted(path, iternode)
                 if handle:
@@ -680,7 +680,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
             self.__displayed -= 1
             self.__total -= 1
         elif node.parent: # don't remove the hidden root node
-            iternode = self.get_iter(node)
+            iternode = self._get_iter(node)
             path = self.do_get_path(iternode)
             self.nodemap.node(node.parent).remove_child(node, self.nodemap)
             del self.tree[node.ref]
@@ -718,7 +718,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
             if node.parent is None:
                 path = iter = None
             else:
-                iternode = self.get_iter(node)
+                iternode = self._get_iter(node)
                 path = self.do_get_path(iternode)
             # activate when https://bugzilla.gnome.org/show_bug.cgi?id=684558
             # is resolved
@@ -748,7 +748,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         """
         if sys.version_info[0] >= 3:
             assert isinstance(handle, str)
-        if self.get_node(handle) is not None:
+        if self._get_node(handle) is not None:
             return # row already exists
         cput = time.clock()
         if not self.search or \
@@ -772,7 +772,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         if sys.version_info[0] >= 3:
             assert isinstance(handle, str)
         cput = time.clock()
-        node = self.get_node(handle)
+        node = self._get_node(handle)
         if node is None:
             return # row not currently displayed
 
@@ -785,7 +785,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
             if not parent.children:
                 if parent.handle:
                     # emit row_has_child_toggled signal
-                    iternode = self.get_iter(parent)
+                    iternode = self._get_iter(parent)
                     path = self.do_get_path(iternode)
                     self.row_has_child_toggled(path, iternode)
                 else:
@@ -803,7 +803,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         """
         if sys.version_info[0] >= 3:
             assert isinstance(handle, str)
-        if self.get_node(handle) is None:
+        if self._get_node(handle) is None:
             return # row not currently displayed
 
         self.delete_row_by_handle(handle)
@@ -812,7 +812,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         # If the node hasn't moved, all we need is to call row_changed.
         #self.row_changed(path, node)
 
-    def new_iter(self, nodeid):
+    def _new_iter(self, nodeid):
         """
         Return a new iter containing the nodeid in the nodemap
         """
@@ -823,7 +823,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         iter.user_data = nodeid
         return iter
 
-    def get_iter(self, node):
+    def _get_iter(self, node):
         """
         Return an iter from the node.
         iters are always created afresh
@@ -834,37 +834,20 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         :param path: node as it appears in the treeview
         :type path: Node
         """
-        iter = self.new_iter(id(node))
+        iter = self._new_iter(id(node))
         return iter
 
-    def get_handle(self, node):
-        """
-        Get the gramps handle for a node.  Return None if the node does
-        not correspond to a gramps object.
-        """
-        handle = node.handle
-        if handle and not isinstance(handle, UNITYPE):
-            handle = handle.decode('utf-8')
-        return handle
-
-    def get_node(self, handle):
+    def _get_node(self, handle):
         """
         Get the node for a handle.
         """
         return self.handle2node.get(handle)
 
-    def handle2path(self, handle):
-        """
-        Obtain from a handle, a path.
-        Part of common api with flat/treebasemodel
-        """
-        return self.do_get_path(self.get_iter(self.get_node(handle)))
-
     def get_iter_from_handle(self, handle):
         """
         Get the iter for a gramps handle.
         """
-        return self.get_iter(self._get_node(handle))
+        return self._get_iter(self._get_node(handle))
         
     def get_handle_from_iter(self, iter):
         """
@@ -963,7 +946,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         for index in pathlist:
             _index = (-index - 1) if self.__reverse else index
             node = self.nodemap.node(node.children[_index][1])
-        return True, self.get_iter(node)
+        return True, self._get_iter(node)
 
     def get_node_from_iter(self, iter):
         if iter and iter.user_data:
@@ -1023,7 +1006,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
                 nodeid = nodeparent.children[-1 if self.__reverse else 0][1]
             else:
                 return False, None
-        return True, self.new_iter(nodeid)
+        return True, self._new_iter(nodeid)
         
     def do_iter_has_child(self, iter):
         """
@@ -1053,7 +1036,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         if node.children:
             if len(node.children) > index:
                 _index = (-index - 1) if self.__reverse else index
-                return True, self.new_iter(node.children[_index][1])
+                return True, self._new_iter(node.children[_index][1])
             else:
                 return False, None
         else:
@@ -1065,6 +1048,6 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
         """
         node = self.get_node_from_iter(iterchild)
         if node.parent:
-            return True, self.new_iter(node.parent)
+            return True, self._new_iter(node.parent)
         else:
             return False, None
diff --git a/gramps/plugins/view/persontreeview.py b/gramps/plugins/view/persontreeview.py
index 0b6d65838..da4688da1 100644
--- a/gramps/plugins/view/persontreeview.py
+++ b/gramps/plugins/view/persontreeview.py
@@ -169,9 +169,8 @@ class PersonTreeView(BasePersonView):
             pathids = path.get_indices()
             if len(pathids) == 1:
                 path = Gtk.TreePath((pathids[0], 0))
-            nodeiter = model.do_get_iter(path)[1]
-            node = model.get_node_from_iter(nodeiter)
-            handle = model.get_handle(node)
+            iter_ = model.get_iter(path)
+            handle = model.get_handle_from_iter(iter_)
             basepers = self.dbstate.db.get_person_from_handle(handle)
         if basepers:
             preset_name(basepers, name)
diff --git a/gramps/plugins/view/placetreeview.py b/gramps/plugins/view/placetreeview.py
index 16819dc40..f9ff0c32e 100644
--- a/gramps/plugins/view/placetreeview.py
+++ b/gramps/plugins/view/placetreeview.py
@@ -200,34 +200,27 @@ class PlaceTreeView(PlaceBaseView):
         level1 = level2 = level3 = ""
         if len(pathlist) == 1:
             path = pathlist[0]
-            suc, node = model.do_get_iter(path)
-            if suc:
-                noden = model.get_node_from_iter(node)
+            iter_ = model.get_iter(path)
+            if iter_:
                 if len(path) == 1:
-                    level[0] = noden.name
+                    level[0] = model.get_node_from_iter(iter_).name
                 elif len(path) == 2:
-                    level[1] = noden.name
-                    suc, parent = model.do_iter_parent(node)
-                    parentn = model.get_node_from_iter(parent)
-                    level[0] = parentn.name
+                    level[1] = model.get_node_from_iter(iter_).name
+                    parent = model.iter_parent(iter_)
+                    level[0] = model.get_node_from_iter(parent).name
                 elif len(path) == 3:
-                    level[2] = noden.name
-                    suc, parent = model.do_iter_parent(node)
-                    parentn = model.get_node_from_iter(parent)
-                    level[1] = parentn.name
-                    suc, parent = model.do_iter_parent(parent)
-                    parentn = model.get_node_from_iter(parent)
-                    level[0] = parentn.name
+                    level[2] = model.get_node_from_iter(iter_).name
+                    parent = model.iter_parent(iter_)
+                    level[1] = model.get_node_from_iter(parent).name
+                    parent = model.iter_parent(parent)
+                    level[0] = model.get_node_from_iter(parent).name
                 else:
-                    suc, parent = model.do_iter_parent(node)
-                    parentn = model.get_node_from_iter(parent)
-                    level[2] = parentn.name
-                    suc, parent = model.do_iter_parent(parent)
-                    parentn = model.get_node_from_iter(parent)
-                    level[1] = parentn.name
-                    suc, parent = model.do_iter_parent(parent)
-                    parentn = model.get_node_from_iter(parent)
-                    level[0] = parentn.name
+                    parent = model.iter_parent(iter_)
+                    level[2] = model.get_node_from_iter(parent).name
+                    parent = model.iter_parent(parent)
+                    level[1] = model.get_node_from_iter(parent).name
+                    parent = model.iter_parent(parent)
+                    level[0] = model.get_node_from_iter(parent).name
 
         for ind in [0, 1, 2]: 
             if level[ind] and level[ind] == COUNTRYLEVELS['default'][ind+1]: