瀏覽代碼

wxGUI/treemodel: refactor TreeModel to allow more flexible Node classes. (#797)

Label is now python property
Anna Petrasova 4 年之前
父節點
當前提交
07625f254f

+ 1 - 1
gui/wxpython/core/menutree.py

@@ -184,7 +184,7 @@ class MenuTreeModelBuilder:
 def removeSeparators(model, node=None):
 def removeSeparators(model, node=None):
     if not node:
     if not node:
         node = model.root
         node = model.root
-    if node.label:
+    if node.label or node is model.root:
         for child in reversed(node.children):
         for child in reversed(node.children):
             removeSeparators(model, child)
             removeSeparators(model, child)
     else:
     else:

+ 32 - 19
gui/wxpython/core/treemodel.py

@@ -28,12 +28,12 @@ class TreeModel(object):
 
 
     >>> tree = TreeModel(DictNode)
     >>> tree = TreeModel(DictNode)
     >>> root = tree.root
     >>> root = tree.root
-    >>> n1 = tree.AppendNode(parent=root, label='node1')
-    >>> n2 = tree.AppendNode(parent=root, label='node2')
-    >>> n11 = tree.AppendNode(parent=n1, label='node11', data={'xxx': 1})
-    >>> n111 = tree.AppendNode(parent=n11, label='node111', data={'xxx': 4})
-    >>> n12 = tree.AppendNode(parent=n1, label='node12', data={'xxx': 2})
-    >>> n21 = tree.AppendNode(parent=n2, label='node21', data={'xxx': 1})
+    >>> n1 = tree.AppendNode(parent=root, data={"label": "node1"})
+    >>> n2 = tree.AppendNode(parent=root, data={"label": "node2"})
+    >>> n11 = tree.AppendNode(parent=n1, data={"label": "node11", "xxx": 1})
+    >>> n111 = tree.AppendNode(parent=n11, data={"label": "node111", "xxx": 4})
+    >>> n12 = tree.AppendNode(parent=n1, data={"label": "node12", "xxx": 2})
+    >>> n21 = tree.AppendNode(parent=n2, data={"label": "node21", "xxx": 1})
     >>> [node.label for node in tree.SearchNodes(key='xxx', value=1)]
     >>> [node.label for node in tree.SearchNodes(key='xxx', value=1)]
     ['node11', 'node21']
     ['node11', 'node21']
     >>> [node.label for node in tree.SearchNodes(key='xxx', value=5)]
     >>> [node.label for node in tree.SearchNodes(key='xxx', value=5)]
@@ -44,15 +44,22 @@ class TreeModel(object):
     'node12'
     'node12'
     >>> print(tree)
     >>> print(tree)
     node1
     node1
+      * label : node1
       node11
       node11
+        * label : node11
         * xxx : 1
         * xxx : 1
         node111
         node111
+          * label : node111
           * xxx : 4
           * xxx : 4
       node12
       node12
+        * label : node12
         * xxx : 2
         * xxx : 2
     node2
     node2
+      * label : node2
       node21
       node21
+        * label : node21
         * xxx : 1
         * xxx : 1
+
     """
     """
 
 
     def __init__(self, nodeClass):
     def __init__(self, nodeClass):
@@ -60,23 +67,21 @@ class TreeModel(object):
 
 
         :param nodeClass: class which is used for creating nodes
         :param nodeClass: class which is used for creating nodes
         """
         """
-        self._root = nodeClass('root')
+        self._root = nodeClass()
         self.nodeClass = nodeClass
         self.nodeClass = nodeClass
 
 
     @property
     @property
     def root(self):
     def root(self):
         return self._root
         return self._root
 
 
-    def AppendNode(self, parent, label, data=None):
+    def AppendNode(self, parent, **kwargs):
         """Create node and append it to parent node.
         """Create node and append it to parent node.
 
 
         :param parent: parent node of the new node
         :param parent: parent node of the new node
-        :param label: node label
-        :param data: optional node data
 
 
         :return: new node
         :return: new node
         """
         """
-        node = self.nodeClass(label=label, data=data)
+        node = self.nodeClass(**kwargs)
         # useful for debugging deleting nodes
         # useful for debugging deleting nodes
         # weakref.finalize(node, print, "Deleted node {}".format(label))
         # weakref.finalize(node, print, "Deleted node {}".format(label))
         parent.children.append(node)
         parent.children.append(node)
@@ -157,22 +162,23 @@ class TreeModel(object):
 class DictNode(object):
 class DictNode(object):
     """Node which has data in a form of dictionary."""
     """Node which has data in a form of dictionary."""
 
 
-    def __init__(self, label, data=None):
+    def __init__(self, data=None):
         """Create node.
         """Create node.
 
 
-        :param label: node label (displayed in GUI)
         :param data: data as dictionary or None
         :param data: data as dictionary or None
         """
         """
-
-        self.label = label
-        if data is None:
-            self.data = dict()
+        if not data:
+            self.data = {"label": ""}
         else:
         else:
             self.data = data
             self.data = data
         self._children = []
         self._children = []
         self.parent = None
         self.parent = None
 
 
     @property
     @property
+    def label(self):
+        return self.data["label"]
+
+    @property
     def children(self):
     def children(self):
         return self._children
         return self._children
 
 
@@ -202,8 +208,15 @@ class DictNode(object):
 class ModuleNode(DictNode):
 class ModuleNode(DictNode):
     """Node representing module."""
     """Node representing module."""
 
 
-    def __init__(self, label, data=None):
-        super(ModuleNode, self).__init__(label=label, data=data)
+    def __init__(self, label=None, data=None):
+        super(ModuleNode, self).__init__(data=data)
+        self._label = label if label else ''
+        if not data:
+            self.data = {}
+
+    @property
+    def label(self):
+        return self._label
 
 
     def match(self, key, value, case_sensitive=False):
     def match(self, key, value, case_sensitive=False):
         """Method used for searching according to command,
         """Method used for searching according to command,

+ 12 - 10
gui/wxpython/datacatalog/tree.py

@@ -229,8 +229,12 @@ class NameEntryDialog(TextEntryDialog):
 class DataCatalogNode(DictNode):
 class DataCatalogNode(DictNode):
     """Node representing item in datacatalog."""
     """Node representing item in datacatalog."""
 
 
-    def __init__(self, label, data=None):
-        super(DataCatalogNode, self).__init__(label=label, data=data)
+    def __init__(self, data=None):
+        super(DataCatalogNode, self).__init__(data=data)
+
+    @property
+    def label(self):
+        return self.data["name"]
 
 
     def match(self, **kwargs):
     def match(self, **kwargs):
         """Method used for searching according to given parameters.
         """Method used for searching according to given parameters.
@@ -328,12 +332,11 @@ class DataCatalogTree(TreeView):
             nlocations = len(locations)
             nlocations = len(locations)
             grassdata_node = self._model.AppendNode(
             grassdata_node = self._model.AppendNode(
                 parent=self._model.root,
                 parent=self._model.root,
-                label=grassdatabase,
                 data=dict(type='grassdb', name=grassdatabase))
                 data=dict(type='grassdb', name=grassdatabase))
             for location in locations:
             for location in locations:
                 results[location] = dict()
                 results[location] = dict()
                 varloc = self._model.AppendNode(
                 varloc = self._model.AppendNode(
-                    parent=grassdata_node, label=location, data=dict(
+                    parent=grassdata_node, data=dict(
                         type='location', name=location))
                         type='location', name=location))
                 location_nodes.append(varloc)
                 location_nodes.append(varloc)
                 loc_count += 1
                 loc_count += 1
@@ -363,8 +366,7 @@ class DataCatalogTree(TreeView):
                         for key in sorted(maps.keys()):
                         for key in sorted(maps.keys()):
                             mapset_node = self._model.AppendNode(
                             mapset_node = self._model.AppendNode(
                                 parent=location_nodes[i],
                                 parent=location_nodes[i],
-                                label=key, data=dict(
-                                    type='mapset', name=key))
+                                data=dict(type='mapset', name=key))
                             self._populateMapsetItem(mapset_node, maps[key])
                             self._populateMapsetItem(mapset_node, maps[key])
 
 
                     proc_count = 0
                     proc_count = 0
@@ -432,7 +434,7 @@ class DataCatalogTree(TreeView):
         for elem in data:
         for elem in data:
             if data[elem]:
             if data[elem]:
                 for layer in data[elem]:
                 for layer in data[elem]:
-                    self._model.AppendNode(parent=mapset_node, label=layer,
+                    self._model.AppendNode(parent=mapset_node,
                                            data=dict(type=elem, name=layer))
                                            data=dict(type=elem, name=layer))
         self._model.SortChildren(mapset_node)
         self._model.SortChildren(mapset_node)
 
 
@@ -883,14 +885,14 @@ class DataCatalogTree(TreeView):
 
 
     def InsertLayer(self, name, mapset_node, element_name):
     def InsertLayer(self, name, mapset_node, element_name):
         """Insert layer into model and refresh tree"""
         """Insert layer into model and refresh tree"""
-        self._model.AppendNode(parent=mapset_node, label=name,
+        self._model.AppendNode(parent=mapset_node,
                                data=dict(type=element_name, name=name))
                                data=dict(type=element_name, name=name))
         self._model.SortChildren(mapset_node)
         self._model.SortChildren(mapset_node)
         self.RefreshNode(mapset_node, recursive=True)
         self.RefreshNode(mapset_node, recursive=True)
 
 
     def InsertMapset(self, name, location_node):
     def InsertMapset(self, name, location_node):
         """Insert mapset into model and refresh tree"""
         """Insert mapset into model and refresh tree"""
-        self._model.AppendNode(parent=location_node, label=name,
+        self._model.AppendNode(parent=location_node,
                                data=dict(type="mapset", name=name))
                                data=dict(type="mapset", name=name))
         self._model.SortChildren(location_node)
         self._model.SortChildren(location_node)
         self.RefreshNode(location_node, recursive=True)
         self.RefreshNode(location_node, recursive=True)
@@ -898,7 +900,7 @@ class DataCatalogTree(TreeView):
     def InsertGrassDb(self, name):
     def InsertGrassDb(self, name):
         """Insert grass db into model and refresh tree"""
         """Insert grass db into model and refresh tree"""
         self.grassdatabases.append(name)
         self.grassdatabases.append(name)
-        self._model.AppendNode(parent=self._model.root, label=name,
+        self._model.AppendNode(parent=self._model.root,
                                data=dict(type="grassdb", name=name))
                                data=dict(type="grassdb", name=name))
         self._model.SortChildren(self._model.root)
         self._model.SortChildren(self._model.root)
         self.ReloadTreeItems()
         self.ReloadTreeItems()

+ 3 - 3
gui/wxpython/gui_core/query.py

@@ -220,13 +220,13 @@ def QueryTreeBuilder(data, column):
     def addNode(parent, data, model):
     def addNode(parent, data, model):
         for k, v in six.iteritems(data):
         for k, v in six.iteritems(data):
             if isinstance(v, dict):
             if isinstance(v, dict):
-                node = model.AppendNode(parent=parent, label=k)
+                node = model.AppendNode(parent=parent, data={"label": k})
                 addNode(parent=node, data=v, model=model)
                 addNode(parent=node, data=v, model=model)
             else:
             else:
                 if not isinstance(v, six.string_types):
                 if not isinstance(v, six.string_types):
                     v = str(v)
                     v = str(v)
-                node = model.AppendNode(parent=parent, label=k,
-                                        data={column: v})
+                node = model.AppendNode(parent=parent,
+                                        data={"label": k, column: v})
 
 
     model = TreeModel(DictNode)
     model = TreeModel(DictNode)
     for part in data:
     for part in data:

+ 7 - 10
gui/wxpython/gui_core/treeview.py

@@ -274,19 +274,16 @@ class TreeFrame(wx.Frame):
 def main():
 def main():
     tree = TreeModel(DictNode)
     tree = TreeModel(DictNode)
     root = tree.root
     root = tree.root
-    n1 = tree.AppendNode(parent=root, label='node1')
-    n2 = tree.AppendNode(parent=root, label='node2')
-    n3 = tree.AppendNode(parent=root, label='node3')  # pylint: disable=W0612
-    n11 = tree.AppendNode(parent=n1, label='node11', data={'xxx': 'A'})
+    n1 = tree.AppendNode(parent=root, data={"label": "node1"})
+    n2 = tree.AppendNode(parent=root, data={"label": "node2"})
+    n3 = tree.AppendNode(parent=root, data={"label": "node3"})  # pylint: disable=W0612
+    n11 = tree.AppendNode(parent=n1, data={"label": "node11", "xxx": "A"})
     n12 = tree.AppendNode(
     n12 = tree.AppendNode(
-        parent=n1, label='node12', data={
-            'xxx': 'B'})  # pylint: disable=W0612
+        parent=n1, data={"label": "node12", "xxx": "B"})  # pylint: disable=W0612
     n21 = tree.AppendNode(
     n21 = tree.AppendNode(
-        parent=n2, label='node21', data={
-            'xxx': 'A'})  # pylint: disable=W0612
+        parent=n2, data={"label": "node21", "xxx": "A"})  # pylint: disable=W0612
     n111 = tree.AppendNode(
     n111 = tree.AppendNode(
-        parent=n11, label='node111', data={
-            'xxx': 'A'})  # pylint: disable=W0612
+        parent=n11, data={"label": "node111", "xxx": "A"})  # pylint: disable=W0612
 
 
     app = wx.App()
     app = wx.App()
     frame = TreeFrame(model=tree)
     frame = TreeFrame(model=tree)