Browse Source

wxGUI/gmodeler: avoid recursive deletion when undefining module parameters

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@68201 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 9 years ago
parent
commit
e608609b1c
2 changed files with 18 additions and 10 deletions
  1. 1 1
      gui/wxpython/gmodeler/frame.py
  2. 17 9
      gui/wxpython/gmodeler/model.py

+ 1 - 1
gui/wxpython/gmodeler/frame.py

@@ -838,7 +838,7 @@ class ModelFrame(wx.Frame):
                 if not p.get('value', ''):
                     data = layer.FindData(p.get('name', ''))
                     if data:
-                        remList, upList = self.model.RemoveItem(data)
+                        remList, upList = self.model.RemoveItem(data, layer)
                         for item in remList:
                             self.canvas.diagram.RemoveShape(item)
                             item.__del__()

+ 17 - 9
gui/wxpython/gmodeler/model.py

@@ -192,17 +192,18 @@ class Model(object):
         """Reset model"""
         self.items = list()
 
-    def RemoveItem(self, item):
+    def RemoveItem(self, item, reference=None):
         """Remove item from model
         
+        :item: item to be removed
+        :reference: reference item valid for deletion
+
         :return: list of related items to remove/update
         """
         relList = list()
         upList = list()
+        doRemove = True
 
-        if item in self.items:
-            self.items.remove(item)
-        
         if isinstance(item, ModelAction):
             for rel in item.GetRelations():
                 relList.append(rel)
@@ -214,17 +215,24 @@ class Model(object):
             
         elif isinstance(item, ModelData):
             for rel in item.GetRelations():
+                otherItem = rel.GetTo() if rel.GetFrom() == item else rel.GetFrom()
+                if reference and reference != otherItem:
+                    doRemove = False
+                    continue # avoid recursive deletion
                 relList.append(rel)
-                if rel.GetFrom() == self:
-                    relList.append(rel.GetTo())
-                else:
-                    relList.append(rel.GetFrom())
-        
+                if reference and reference != otherItem:
+                    relList.append(otherItem)
+            if not doRemove:
+                upList.append(item)
+
         elif isinstance(item, ModelLoop):
             for rel in item.GetRelations():
                 relList.append(rel)
             for action in self.GetItems():
                 action.UnSetBlock(item)
+
+        if doRemove and item in self.items:
+            self.items.remove(item)
         
         return relList, upList