[GRASS-SVN] r42713 - grass/trunk/gui/wxpython/gui_modules

svn_grass at osgeo.org svn_grass at osgeo.org
Wed Jul 7 19:25:22 EDT 2010


Author: martinl
Date: 2010-07-07 23:25:22 +0000 (Wed, 07 Jul 2010)
New Revision: 42713

Modified:
   grass/trunk/gui/wxpython/gui_modules/gmodeler.py
Log:
wxGUI/modeler: redesign Model class


Modified: grass/trunk/gui/wxpython/gui_modules/gmodeler.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/gmodeler.py	2010-07-07 18:35:03 UTC (rev 42712)
+++ grass/trunk/gui/wxpython/gui_modules/gmodeler.py	2010-07-07 23:25:22 UTC (rev 42713)
@@ -78,9 +78,7 @@
 class Model(object):
     """!Class representing the model"""
     def __init__(self, canvas = None):
-        self.actions    = list()    # list of recorded actions
-        self.data       = list()    # list of recorded data items
-        self.loops      = list()    # list of recorded loops
+        self.items      = list() # list of actions/loops/...
         
         # model properties
         self.properties = { 'name'        : _("model"),
@@ -96,10 +94,28 @@
         """!Get canvas or None"""
         return self.canvas
     
+    def GetItems(self):
+        """!Get list of model items"""
+        return self.items
+    
     def GetActions(self):
-        """!Return list of actions"""
-        return self.actions
-    
+        """!Get list of model actions"""
+        result = list()
+        for item in self.items:
+            if isinstance(item, ModelAction):
+                result.append(item)
+        
+        return result
+
+    def GetLoops(self):
+        """!Get list of model loops"""
+        result = list()
+        for item in self.items:
+            if isinstance(item, ModelLoop):
+                result.append(item)
+        
+        return result
+
     def GetAction(self, aId):
         """!Get action of given id
 
@@ -108,16 +124,13 @@
         @return ModelAction instance
         @return None if no action found
         """
-        for action in self.actions:
+        alist = self.GetActions()
+        for action in alist:
             if action.GetId() == aId:
                 return action
         
         return None
     
-    def GetLoops(self):
-        """!Return list of loops"""
-        return self.loops
-    
     def GetProperties(self):
         """!Get model properties"""
         return self.properties
@@ -133,23 +146,10 @@
         """!Set model variables"""
         self.variables = data
     
-    def GetData(self):
-        """!Return list of data"""
-        return self.data
-
     def Reset(self):
         """!Reset model"""
-        self.actions = list()
-        self.data    = list()
+        self.items = list()
         
-    def AddAction(self, item):
-        """!Add action to the model"""
-        self.actions.append(item)
-        
-    def AddData(self, item):
-        """!Add data to the model"""
-        self.data.append(item)
-        
     def RemoveItem(self, item):
         """!Remove item from model
 
@@ -169,23 +169,15 @@
         
         return relList
     
-    def FindAction(self, id):
+    def FindAction(self, aId):
         """!Find action by id"""
-        for action in self.actions:
-            if action.GetId() == id:
+        alist = self.GetActions()
+        for action in alist:
+            if action.GetId() == aId:
                 return action
         
         return None
 
-    def FindData(self, value, prompt):
-        """!Find data by value, and prompt"""
-        for data in self.data:
-            if data.GetValue() == value and \
-                    data.GetPrompt() == prompt:
-                return data
-        
-        return None
-    
     def LoadModel(self, filename):
         """!Load model definition stored in GRASS Model XML file (gxm)
         
@@ -225,7 +217,7 @@
             if action['disabled']:
                 actionItem.Enable(False)
             
-            self.actions.append(actionItem)
+            self.AddItem(actionItem)
             
             task = actionItem.GetTask()
             parameterized = False
@@ -264,26 +256,41 @@
                 else:
                     relation = ModelRelation(actionItem, dataItem, rel['name'])
                 relation.SetControlPoints(rel['points'])
-                dataItem.AddRelation(relation, direction = rel['dir'])
+                dataItem.AddRelation(relation)
+                actionItem.AddRelation(relation)
             
             dataItem.Update()
-            self.data.append(dataItem)
-            
-            actionItem.AddData(dataItem)
-        
+                   
         # load loops
         for loop in gxmXml.loops:
+            alist = list()
+            for aId in loop['actions']:
+                alist.append(self.GetAction(aId))
+            
             loopItem = ModelLoop(parent = self, 
                                  x = loop['pos'][0],
                                  y = loop['pos'][1],
                                  width = loop['size'][0],
                                  height = loop['size'][1],
                                  text = loop['text'],
-                                 actions = loop['actions'],
+                                 actions = alist,
                                  id = loop['id'])
             
-            self.loops.append(loopItem)
-            
+            self.AddItem(loopItem)
+        
+    def AddItem(self, newItem):
+        """!Add item to the list"""
+        iId = newItem.GetId()
+        
+        i   = 0
+        for item in self.items:
+            if item.GetId() > iId:
+                self.items.insert(i, newItem)
+                return
+            i += 1
+        
+        self.items.append(newItem)
+        
     def IsValid(self):
         """Return True if model is valid"""
         if self.Validate():
@@ -295,7 +302,7 @@
         """!Validate model, return None if model is valid otherwise
         error string"""
         errList = list()
-        for action in self.actions:
+        for action in self.GetActions():
             task = menuform.GUI().ParseCommand(cmd = action.GetLog(string = False),
                                                show = None)
             errList += task.getCmdError()
@@ -411,7 +418,7 @@
             
             idx += 1
         
-        for action in self.actions:
+        for action in self.GetActions():
             if not action.IsEnabled():
                 continue
             name   = action.GetName()
@@ -490,7 +497,7 @@
         
         self.actionPanel = ActionPanel(parent = self)
         
-        self.goutput = goutput.GMConsole(parent = self, pageid = 2,
+        self.goutput = goutput.GMConsole(parent = self, pageid = 3,
                                          notebook = self.notebook)
         
         self.notebook.AddPage(self.canvas, text=_('Model'))
@@ -833,24 +840,34 @@
                 return
         
         self.goutput.cmdThread.SetId(-1)
-        for action in self.model.GetActions():
-            if not action.IsEnabled():
+        for item in self.model.GetItems():
+            print item
+            if not item.IsEnabled():
                 continue
-            name = action.GetName()
-            if params.has_key(name):
-                paramsOrig = action.GetParams(dcopy = True)
-                action.MergeParams(params[name])
-            
-            self.SetStatusText(_('Running model...'), 0) 
-            self.goutput.RunCmd(command = action.GetLog(string = False),
-                                onDone = self.OnDone)
-            
-            if params.has_key(name):
-                action.SetParams(paramsOrig)
+            if isinstance(item, ModelAction):
+                self._runAction(item, params)
+            elif isinstance(item, ModelLoop):
+                print item.GetText()
+                for action in item.GetActions():
+                    self._runAction(action, params)
         
         if params:
             dlg.Destroy()
         
+    def _runAction(self, item, params):
+        """!Run given action"""
+        name = item.GetName()
+        if params.has_key(name):
+            paramsOrig = item.GetParams(dcopy = True)
+            item.MergeParams(params[name])
+            
+        self.SetStatusText(_('Running model...'), 0) 
+        self.goutput.RunCmd(command = item.GetLog(string = False),
+                            onDone = self.OnDone)
+            
+        if params.has_key(name):
+            item.SetParams(paramsOrig)
+        
     def OnDone(self, returncode):
         """!Computation finished"""
         self.SetStatusText('', 0)
@@ -1096,14 +1113,13 @@
     def OnDefineLoop(self, event):
         """!Define new loop in the model"""
         self.ModelChanged()
-
+        
         width, height = self.canvas.GetSize()
         loop = ModelLoop(self, x = width/2, y = height/2)
         self.canvas.diagram.AddShape(loop)
         loop.Show(True)
-
+        
         self._addEvent(loop)
-        # self.model.AddAction(action)
         
         self.canvas.Refresh()
 
@@ -1136,7 +1152,7 @@
         action.Show(True)
 
         self._addEvent(action)
-        self.model.AddAction(action)
+        self.model.AddItem(action)
         
         self.canvas.Refresh()
         time.sleep(.1)
@@ -1321,29 +1337,30 @@
         self.SetStatusText(_("Please wait, loading model..."), 0)
         
         # load actions
-        for action in self.model.GetActions():
-            self._addEvent(action)
-            self.canvas.diagram.AddShape(action)
-            action.Show(True)
-        
-        # load data & relations
-        for data in self.model.GetData():
-            self._addEvent(data)
-            self.canvas.diagram.AddShape(data)
-            data.Show(True)
-
-            for rel in data.GetRelations():
+        for item in self.model.GetActions():
+            self._addEvent(item)
+            self.canvas.diagram.AddShape(item)
+            item.Show(True)
+            # relations/data
+            for rel in item.GetRelations():
+                if rel.GetFrom() == item:
+                    dataItem = rel.GetTo()
+                else:
+                    dataItem = rel.GetFrom()
+                self._addEvent(dataItem)
+                self.canvas.diagram.AddShape(dataItem)
                 self.AddLine(rel)
+                dataItem.Show(True)
         
         # load loops
-        for loop in self.model.GetLoops():
-            self._addEvent(loop)
-            self.canvas.diagram.AddShape(loop)
-            loop.Show(True)
+        for item in self.model.GetLoops():
+            self._addEvent(item)
+            self.canvas.diagram.AddShape(item)
+            item.Show(True)
+            
+            # connect actions in the loop
+            self.DefineLoop(item)
         
-            # connect action in the loop
-            self.DefineLoop(loop)
-        
         # load variables
         self.variablePanel.Update()
         self.actionPanel.Update()
@@ -1389,29 +1406,13 @@
         if not actions:
             return
         
-        minId = None
-        for action in self.model.GetActions():
-            aId = action.GetId()
-            if aId not in actions:
-                continue
-            if aId < minId or minId is None:
-                minId = aId
+        for action in loop.GetActions():
             rel = ModelRelation(parent, action)
             self.AddLine(rel)
             parent = action
         
-        loop.SetId(minId)
-        for action in self.model.GetActions():
-            aId = action.GetId()
-            if aId >= minId:
-                action.SetId(aId + 1)
-                try:
-                    idx = actions.index(aId)
-                    actions[idx] = aId + 1
-                except ValueError:
-                    pass
-        
         # close loop
+        action = loop.GetActions()[-1]
         rel = ModelRelation(action, loop)
         self.AddLine(rel)
         dx = loop.GetWidth() / 2 + 50
@@ -1467,11 +1468,61 @@
         
         self.Refresh()
         
-class ModelAction(ogl.RectangleShape):
+class ModelObject:
+    def __init__(self, id = -1):
+        self.id   = id
+        self.rels = list() # list of ModelRelations
+        
+        self.isEnabled = True
+                
+    def GetId(self):
+        """!Get id"""
+        return self.id
+    
+    def AddRelation(self, rel):
+        """!Record new relation
+        """
+        self.rels.append(rel)
+
+    def GetRelations(self, fdir = None):
+        """!Get list of relations
+
+        @param fdir True for 'from'
+        """
+        if fdir is None:
+            return self.rels
+        
+        result = list()
+        for rel in self.rels:
+            if fdir == 'from':
+                if rel.GetFrom() == self:
+                    result.append(rel)
+            else:
+                if rel.GetTo() == self:
+                    result.append(rel)
+        
+        return result
+    
+    def IsEnabled(self):
+        """!Get True if action is enabled, otherwise False"""
+        return self.isEnabled
+    
+    def Enable(self, enabled = True):
+        """!Enable/disable action"""
+        self.isEnabled = enabled
+        self.Update()
+
+    def Update(self):
+        pass
+    
+class ModelAction(ModelObject, ogl.RectangleShape):
     """!Action class (GRASS module)"""
     def __init__(self, parent, x, y, id = -1, cmd = None, task = None, width = None, height = None):
+        ModelObject.__init__(self, id)
+        
         self.parent  = parent
         self.task    = task
+        
         if not width:
             width = UserSettings.Get(group='modeler', key='action', subkey=('size', 'width'))
         if not height:
@@ -1487,13 +1538,11 @@
                 self.task = None
         
         self.propWin = None
-        self.id      = id
         
         self.data = list()   # list of connected data items
         
         self.isValid = False
         self.isParameterized = False
-        self.isEnabled = True
         
         if self.parent.GetCanvas():
             ogl.RectangleShape.__init__(self, width, height)
@@ -1536,19 +1585,6 @@
         pen.SetWidth(width)
         self.SetPen(pen)
 
-    def Enable(self, enabled = True):
-        """!Enable/disable action"""
-        self.isEnabled = enabled
-        self.Update()
-
-    def IsEnabled(self):
-        """!Get True if action is enabled, otherwise False"""
-        return self.isEnabled
-    
-    def GetId(self):
-        """!Get id"""
-        return self.id
-
     def SetId(self, id):
         """!Set id"""
         self.id = id
@@ -1657,11 +1693,6 @@
         """!Check if action is parameterized"""
         return self.isParameterized
     
-    def AddData(self, item):
-        """!Register new data item"""
-        if item not in self.data:
-            self.data.append(item)
-        
     def FindData(self, name):
         """!Find data item by name"""
         for d in self.data:
@@ -1684,7 +1715,7 @@
         self._setPen()
         ogl.RectangleShape.OnDraw(self, dc)
     
-class ModelData(ogl.EllipseShape):
+class ModelData(ModelObject, ogl.EllipseShape):
     def __init__(self, parent, x, y, value = '', prompt = '', width = None, height = None):
         """Data item class
 
@@ -1695,6 +1726,8 @@
         @param prompt type of GIS element
         @param width, height dimension of the shape
         """
+        ModelObject.__init__(self)
+        
         self.parent  = parent
         self.value   = value
         self.prompt  = prompt
@@ -1705,8 +1738,6 @@
         if not height:
             height = UserSettings.Get(group='modeler', key='data', subkey=('size', 'height'))
         
-        self.rels = { 'from' : list(), 'to' : list() } # list of recorded relations
-
         if self.parent.GetCanvas():
             ogl.EllipseShape.__init__(self, width, height)
             
@@ -1740,7 +1771,7 @@
     def GetLog(self, string = True):
         """!Get logging info"""
         name = list()
-        for rel in self.rels['from'] + self.rels['to']:
+        for rel in self.GetRelations():
             name.append(rel.GetName())
         if name:
             return '/'.join(name) + '=' + self.value + ' (' + self.prompt + ')'
@@ -1750,7 +1781,7 @@
     def GetName(self):
         """!Get list of names"""
         name = list()
-        for rel in self.rels['from'] + self.rels['to']:
+        for rel in self.GetRelations():
             name.append(rel.GetName())
         
         return name
@@ -1768,7 +1799,7 @@
         self.value = value
         self._setText()
         for direction in ('from', 'to'):
-            for rel in self.rels[direction]:
+            for rel in self.GetRelations(direction):
                 if direction == 'from':
                     action = rel.GetTo()
                 else:
@@ -1779,20 +1810,6 @@
                 task.set_param(rel.GetName(), self.value)
                 action.SetParams(params = task.get_options())
         
-    def GetRelations(self, direction = None):
-        """!Get relations from/to"""
-        if not direction:
-            return self.rels['from'] + self.rels['to']
-        
-        return self.rels[direction]
-        
-    def AddRelation(self, rel, direction):
-        """!Record new relation
-
-        @param direction direction - 'from' or 'to'
-        """
-        self.rels[direction].append(rel)
-        
     def AddName(self, name, direction):
         """!Record new name (parameter)
 
@@ -1828,12 +1845,12 @@
     def _setPen(self):
         """!Set pen"""
         isParameterized = False
-        for rel in self.rels['from']:
+        for rel in self.GetRelations('from'):
             if rel.GetTo().IsParameterized():
                 isParameterized = True
                 break
         if not isParameterized:
-            for rel in self.rels['to']:
+            for rel in self.GetRelations('to'):
                 if rel.GetFrom().IsParameterized():
                     isParameterized = True
                     break
@@ -1852,7 +1869,7 @@
         """!Update text"""
         self.ClearText()
         name = []
-        for rel in self.rels['to'] + self.rels['from']:
+        for rel in self.GetRelations():
             name.append(rel.GetName())
         self.AddText('/'.join(name))
         self.AddText(self.value)
@@ -2517,11 +2534,9 @@
     def __init__(self, fd, model):
         self.fd         = fd
         self.model      = model
-        self.actions    = model.GetActions()
-        self.data       = model.GetData()
         self.properties = model.GetProperties()
         self.variables  = model.GetVariables()
-        self.loops      = model.GetLoops()
+        self.items      = model.GetItems()
         
         self.indent = 0
         
@@ -2530,10 +2545,19 @@
         self._window()
         self._properties()
         self._variables()
-        self._actions()
-        self._data()
-        self._loops()
+        self._items()
         
+        dataList = list()
+        for action in model.GetActions():
+            for rel in action.GetRelations():
+                if rel.GetFrom() == action:
+                    dataItem = rel.GetTo()
+                else:
+                    dataItem = rel.GetFrom()
+                if dataItem not in dataList:
+                    dataList.append(dataItem)
+        self._data(dataList)
+                
         self._footer()
 
     def _filterValue(self, value):
@@ -2602,58 +2626,62 @@
         self.indent -= 4
         self.fd.write('%s</variables>\n' % (' ' * self.indent))
         
-    def _actions(self):
+    def _items(self):
+        """!Write actions/loops"""
+        self.indent += 4
+        for item in self.items:
+            if isinstance(item, ModelAction):
+                self._action(item)
+            elif isinstance(item, ModelLoop):
+                self._loop(item)
+        self.indent -= 4
+
+    def _action(self, action):
         """!Write actions"""
-        id = 1
-        for action in self.actions:
-            action.SetId(id)
-            self.fd.write('%s<action id="%d" name="%s" pos="%d,%d" size="%d,%d">\n' % \
-                              (' ' * self.indent, id, action.GetName(), action.GetX(), action.GetY(),
-                               action.GetWidth(), action.GetHeight()))
-            self.indent += 4
-            self.fd.write('%s<task name="%s">\n' % (' ' * self.indent, action.GetLog(string = False)[0]))
-            self.indent += 4
-            if not action.IsEnabled():
-                self.fd.write('%s<disabled />\n' % (' ' * self.indent))
-            for key, val in action.GetParams().iteritems():
-                if key == 'flags':
-                    for f in val:
-                        if f.get('value', False) or f.get('parameterized', False):
-                            if f.get('parameterized', False):
-                                if f.get('value', False) == False:
-                                    self.fd.write('%s<flag name="%s" value="0" parameterized="1" />\n' %
-                                                  (' ' * self.indent, f.get('name', '')))
-                                else:
-                                    self.fd.write('%s<flag name="%s" parameterized="1" />\n' %
-                                                  (' ' * self.indent, f.get('name', '')))
+        self.fd.write('%s<action id="%d" name="%s" pos="%d,%d" size="%d,%d">\n' % \
+                          (' ' * self.indent, action.GetId(), action.GetName(), action.GetX(), action.GetY(),
+                           action.GetWidth(), action.GetHeight()))
+        self.indent += 4
+        self.fd.write('%s<task name="%s">\n' % (' ' * self.indent, action.GetLog(string = False)[0]))
+        self.indent += 4
+        if not action.IsEnabled():
+            self.fd.write('%s<disabled />\n' % (' ' * self.indent))
+        for key, val in action.GetParams().iteritems():
+            if key == 'flags':
+                for f in val:
+                    if f.get('value', False) or f.get('parameterized', False):
+                        if f.get('parameterized', False):
+                            if f.get('value', False) == False:
+                                self.fd.write('%s<flag name="%s" value="0" parameterized="1" />\n' %
+                                              (' ' * self.indent, f.get('name', '')))
                             else:
-                                self.fd.write('%s<flag name="%s" />\n' %
+                                self.fd.write('%s<flag name="%s" parameterized="1" />\n' %
                                               (' ' * self.indent, f.get('name', '')))
-                else: # parameter
-                    for p in val:
-                        if not p.get('value', ''):
-                            continue
-                        self.fd.write('%s<parameter name="%s">\n' %
-                                      (' ' * self.indent, p.get('name', '')))
-                        self.indent += 4
-                        if p.get('parameterized', False):
-                            self.fd.write('%s<parameterized />\n' % (' ' * self.indent))
-                        self.fd.write('%s<value>%s</value>\n' %
-                                      (' ' * self.indent, self._filterValue(p.get('value', ''))))
-                        self.indent -= 4
-                        self.fd.write('%s</parameter>\n' % (' ' * self.indent))
-            self.indent -= 4
-            self.fd.write('%s</task>\n' % (' ' * self.indent))
-            self.indent -= 4
-            self.fd.write('%s</action>\n' % (' ' * self.indent))
-            id += 1
-        
+                        else:
+                            self.fd.write('%s<flag name="%s" />\n' %
+                                          (' ' * self.indent, f.get('name', '')))
+            else: # parameter
+                for p in val:
+                    if not p.get('value', ''):
+                        continue
+                    self.fd.write('%s<parameter name="%s">\n' %
+                                  (' ' * self.indent, p.get('name', '')))
+                    self.indent += 4
+                    if p.get('parameterized', False):
+                        self.fd.write('%s<parameterized />\n' % (' ' * self.indent))
+                    self.fd.write('%s<value>%s</value>\n' %
+                                  (' ' * self.indent, self._filterValue(p.get('value', ''))))
+                    self.indent -= 4
+                    self.fd.write('%s</parameter>\n' % (' ' * self.indent))
         self.indent -= 4
-        
-    def _data(self):
+        self.fd.write('%s</task>\n' % (' ' * self.indent))
+        self.indent -= 4
+        self.fd.write('%s</action>\n' % (' ' * self.indent))
+                
+    def _data(self, dataList):
         """!Write data"""
         self.indent += 4
-        for data in self.data:
+        for data in dataList:
             self.fd.write('%s<data pos="%d,%d" size="%d,%d">\n' % \
                               (' ' * self.indent, data.GetX(), data.GetY(),
                                data.GetWidth(), data.GetHeight()))
@@ -2671,7 +2699,7 @@
 
             # relations
             for ft in ('from', 'to'):
-                for rel in data.GetRelations(direction = ft):
+                for rel in data.GetRelations(ft):
                     if ft == 'from':
                         aid = rel.GetTo().GetId()
                     else:
@@ -2693,24 +2721,23 @@
             self.indent -= 4
             self.fd.write('%s</data>\n' % (' ' * self.indent))
 
-    def _loops(self):
+    def _loop(self, loop):
         """!Write loops"""
-        for loop in self.loops:
-            self.fd.write('%s<loop id="%d" pos="%d,%d" size="%d,%d">\n' % \
-                              (' ' * self.indent, loop.GetId(), loop.GetX(), loop.GetY(),
-                               loop.GetWidth(), loop.GetHeight()))
-            text = loop.GetText()
-            self.indent += 4
-            if text:
-                self.fd.write('%s<condition>%s</condition>\n' %
-                              (' ' * self.indent, self._filterValue(text)))
-            for action in loop.GetActions():
-                self.fd.write('%s<loop-action>%d</loop-action>\n' %
-                              (' ' * self.indent, action))
-            self.indent -= 4
+        self.fd.write('%s<loop id="%d" pos="%d,%d" size="%d,%d">\n' % \
+                          (' ' * self.indent, loop.GetId(), loop.GetX(), loop.GetY(),
+                           loop.GetWidth(), loop.GetHeight()))
+        text = loop.GetText()
+        self.indent += 4
+        if text:
+            self.fd.write('%s<condition>%s</condition>\n' %
+                          (' ' * self.indent, self._filterValue(text)))
+        for action in loop.GetActions():
+            self.fd.write('%s<loop-action>%d</loop-action>\n' %
+                          (' ' * self.indent, action))
+        self.indent -= 4
+        
+        self.fd.write('%s</loop>\n' % (' ' * self.indent))
             
-            self.fd.write('%s</loop>\n' % (' ' * self.indent))
-            
 class PreferencesDialog(PreferencesBaseDialog):
     """!User preferences dialog"""
     def __init__(self, parent, settings = UserSettings,
@@ -3127,7 +3154,7 @@
                                             FN.FNB_NO_X_BUTTON)
         else:
             self.notebook = FN.FlatNotebook(self, id = wx.ID_ANY,
-                                            agwStyle = FN.FNB_FANCY_TABS |
+                                            style = FN.FNB_FANCY_TABS |
                                             FN.FNB_BOTTOM |
                                             FN.FNB_NO_NAV_BUTTONS |
                                             FN.FNB_NO_X_BUTTON)
@@ -3207,8 +3234,11 @@
                  wx.LC_VRULES, **kwargs):
         """!List of model variables"""
         self.parent = parent
-        self.frame  = parent.parent
-                
+        try:
+            self.frame  = parent.parent
+        except AttributeError:
+            self.frame = None
+        
         wx.ListCtrl.__init__(self, parent, id = id, style = style, **kwargs)
         listmix.ListCtrlAutoWidthMixin.__init__(self)
         listmix.TextEditMixin.__init__(self)
@@ -3503,17 +3533,18 @@
         self.PopupMenu(menu)
         menu.Destroy()
         
-class ModelLoop(ogl.RectangleShape):
+class ModelLoop(ModelObject, ogl.RectangleShape):
     def __init__(self, parent, x, y, id = -1, width = None, height = None, text = None, actions = []):
         """!Defines a loop"""
+        ModelObject.__init__(self, id)
+        
         self.parent  = parent
         self.text    = text
         if not width:
             width = UserSettings.Get(group='modeler', key='loop', subkey=('size', 'width'))
         if not height:
             height = UserSettings.Get(group='modeler', key='loop', subkey=('size', 'height'))
-        self.actions = actions
-        self.id      = id
+        self.actions = actions # list of actions in the loop
         
         if self.parent.GetCanvas():
             ogl.RectangleShape.__init__(self, width, height)
@@ -3525,10 +3556,6 @@
             self.SetCornerRadius(100)
             self.AddText('(' + str(self.id) + ') ' + text)
         
-    def GetId(self):
-        """!Get loop id"""
-        return self.id
-    
     def GetText(self):
         """!Get loop text"""
         return self.text
@@ -3630,7 +3657,7 @@
         
         self.list = ActionListCtrl(parent = self,
                                    columns = [_("ID"), _("Name"),
-                                              _("Type"), _("Command")])
+                                              _("Command")])
         
         self._layout()
 
@@ -3671,38 +3698,22 @@
         self.itemDataMap = dict()
         i = 0
         for action in data:
-            if self.GetColumnCount() == 4:
-                self.itemDataMap[i] = [str(action.GetId()),
-                                       action.GetName(),
-                                       "module",
-                                       action.GetLog()]
-            else:
-                self.itemDataMap[i] = [str(action.GetId()),
-                                       action.GetName(),
-                                       action.GetLog()]
-                
+            self.itemDataMap[i] = [str(action.GetId()),
+                                   action.GetName(),
+                                   action.GetLog()]
+            
             i += 1
         
         self.itemCount = len(self.itemDataMap.keys())
         self.DeleteAllItems()
         i = 0
-        if self.GetColumnCount() == 4:
-            for aid, name, atype, desc in self.itemDataMap.itervalues():
-                index = self.InsertStringItem(sys.maxint, aid)
-                self.SetStringItem(index, 0, aid)
-                self.SetStringItem(index, 1, name)
-                self.SetStringItem(index, 2, atype)
-                self.SetStringItem(index, 3, desc)
-                self.SetItemData(index, i)
-                i += 1
-        else:
-            for aid, name, desc in self.itemDataMap.itervalues():
-                index = self.InsertStringItem(sys.maxint, aid)
-                self.SetStringItem(index, 0, aid)
-                self.SetStringItem(index, 1, name)
-                self.SetStringItem(index, 2, desc)
-                self.SetItemData(index, i)
-                i += 1
+        for aid, name, desc in self.itemDataMap.itervalues():
+            index = self.InsertStringItem(sys.maxint, aid)
+            self.SetStringItem(index, 0, aid)
+            self.SetStringItem(index, 1, name)
+            self.SetStringItem(index, 2, desc)
+            self.SetItemData(index, i)
+            i += 1
         
     def OnRemove(self, event):
         """!Remove selected action(s) from the model"""
@@ -3719,7 +3730,7 @@
             if not action:
                 item = self.GetFirstSelected()
                 continue
-            print aId, action
+            
             model.RemoveItem(action)
             canvas.GetDiagram().RemoveShape(action)
             self.frame.ModelChanged()
@@ -3798,8 +3809,9 @@
         model = self.frame.GetModel()
         
         aId = 1
-        for action in model.GetActions():
-            action.SetId(aId)
+        for item in model.GetItems():
+            print item
+            item.SetId(aId)
             aId += 1
         
         self.OnReload(None)



More information about the grass-commit mailing list