editors/Viewer.py
branch1.1 Korean release
changeset 1384 02fe382c4511
parent 1366 3756ae754713
child 1377 cc8f9177d41c
--- a/editors/Viewer.py	Wed Jul 31 10:45:07 2013 +0900
+++ b/editors/Viewer.py	Mon Nov 18 12:12:31 2013 +0900
@@ -84,36 +84,38 @@
 def GetVariableCreationFunction(variable_type):
     def variableCreationFunction(viewer, id, specific_values):
         return FBD_Variable(viewer, variable_type, 
-                                    specific_values["name"], 
-                                    specific_values["value_type"], 
+                                    specific_values.name, 
+                                    specific_values.value_type, 
                                     id,
-                                    specific_values["executionOrder"])
+                                    specific_values.execution_order)
     return variableCreationFunction
 
 def GetConnectorCreationFunction(connector_type):
     def connectorCreationFunction(viewer, id, specific_values):
         return FBD_Connector(viewer, connector_type, 
-                                     specific_values["name"], id)
+                                     specific_values.name, id)
     return connectorCreationFunction
 
 def commentCreationFunction(viewer, id, specific_values):
-    return Comment(viewer, specific_values["content"], id)
+    return Comment(viewer, specific_values.content, id)
 
 def GetPowerRailCreationFunction(powerrail_type):
     def powerRailCreationFunction(viewer, id, specific_values):
         return LD_PowerRail(viewer, powerrail_type, id, 
-                                    specific_values["connectors"])
+                                    specific_values.connectors)
     return powerRailCreationFunction
 
+MODIFIER_VALUE = lambda x: x if x is not None else 'none'
+
 CONTACT_TYPES = {(True, "none"): CONTACT_REVERSE,
                  (False, "rising"): CONTACT_RISING,
                  (False, "falling"): CONTACT_FALLING}
 
 def contactCreationFunction(viewer, id, specific_values):
-    contact_type = CONTACT_TYPES.get((specific_values.get("negated", False), 
-                                      specific_values.get("edge", "none")),
+    contact_type = CONTACT_TYPES.get((specific_values.negated, 
+                                      MODIFIER_VALUE(specific_values.edge)),
                                      CONTACT_NORMAL)
-    return LD_Contact(viewer, contact_type, specific_values["name"], id)
+    return LD_Contact(viewer, contact_type, specific_values.name, id)
 
 COIL_TYPES = {(True, "none", "none"): COIL_REVERSE,
               (False, "none", "set"): COIL_SET,
@@ -122,38 +124,38 @@
               (False, "falling", "none"): COIL_FALLING}
 
 def coilCreationFunction(viewer, id, specific_values):
-    coil_type = COIL_TYPES.get((specific_values.get("negated", False), 
-                                specific_values.get("edge", "none"),
-                                specific_values.get("storage", "none")),
+    coil_type = COIL_TYPES.get((specific_values.negated, 
+                                MODIFIER_VALUE(specific_values.edge),
+                                MODIFIER_VALUE(specific_values.storage)),
                                COIL_NORMAL)
-    return LD_Coil(viewer, coil_type, specific_values["name"], id)
+    return LD_Coil(viewer, coil_type, specific_values.name, id)
 
 def stepCreationFunction(viewer, id, specific_values):
-    step = SFC_Step(viewer, specific_values["name"], 
-                            specific_values.get("initial", False), id)
-    if specific_values.get("action", None):
+    step = SFC_Step(viewer, specific_values.name, 
+                            specific_values.initial, id)
+    if specific_values.action is not None:
         step.AddAction()
         connector = step.GetActionConnector()
-        connector.SetPosition(wx.Point(*specific_values["action"]["position"]))
+        connector.SetPosition(wx.Point(*specific_values.action.position))
     return step
 
 def transitionCreationFunction(viewer, id, specific_values):
-    transition = SFC_Transition(viewer, specific_values["condition_type"], 
-                                        specific_values.get("condition", None), 
-                                        specific_values["priority"], id)
+    transition = SFC_Transition(viewer, specific_values.condition_type, 
+                                        specific_values.condition, 
+                                        specific_values.priority, id)
     return transition
 
 def GetDivergenceCreationFunction(divergence_type):
     def divergenceCreationFunction(viewer, id, specific_values):
         return SFC_Divergence(viewer, divergence_type, 
-                                      specific_values["connectors"], id)
+                                      specific_values.connectors, id)
     return divergenceCreationFunction
 
 def jumpCreationFunction(viewer, id, specific_values):
-    return SFC_Jump(viewer, specific_values["target"], id)
+    return SFC_Jump(viewer, specific_values.target, id)
 
 def actionBlockCreationFunction(viewer, id, specific_values):
-    return SFC_ActionBlock(viewer, specific_values["actions"], id)
+    return SFC_ActionBlock(viewer, specific_values.actions, id)
 
 ElementCreationFunctions = {
     "input": GetVariableCreationFunction(INPUT),
@@ -330,7 +332,7 @@
                     var_class = INPUT
                 else:
                     var_class = INPUT
-                tree = dict([(var["Name"], var["Tree"]) for var in self.ParentWindow.Controler.GetEditedElementInterfaceVars(tagname, self.ParentWindow.Debug)]).get(values[0], None)
+                tree = dict([(var.Name, var.Tree) for var in self.ParentWindow.Controler.GetEditedElementInterfaceVars(tagname, True, self.ParentWindow.Debug)]).get(values[0], None)
                 if tree is not None:
                     if len(tree[0]) > 0:
                         menu = wx.Menu(title='')
@@ -568,6 +570,7 @@
         self.Editor.SetBackgroundColour(wx.Colour(255,255,255))
         self.Editor.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
         self.ResetView()
+        self.LastClientSize = None
         self.Scaling = None
         self.DrawGrid = True
         self.GridBrush = wx.TRANSPARENT_BRUSH
@@ -1050,22 +1053,21 @@
         self.ElementRefreshList.append(element)
         self.ElementRefreshList_lock.release()
         
-    def RefreshNewData(self):
-        refresh_rect = None
-        self.ElementRefreshList_lock.acquire()
-        for element in self.ElementRefreshList:
-            if refresh_rect is None:
-                refresh_rect = element.GetRedrawRect()
-            else:
-                refresh_rect.Union(element.GetRedrawRect())
-        self.ElementRefreshList = []
-        self.ElementRefreshList_lock.release()
-        
-        if refresh_rect is not None:
-            self.RefreshRect(self.GetScrolledRect(refresh_rect), False)
-        else:
-            DebugViewer.RefreshNewData(self)
-    
+    def NewDataAvailable(self, ticks, *args, **kwargs):
+        if self.IsShown():
+            refresh_rect = None
+            self.ElementRefreshList_lock.acquire()
+            for element in self.ElementRefreshList:
+                if refresh_rect is None:
+                    refresh_rect = element.GetRedrawRect()
+                else:
+                    refresh_rect.Union(element.GetRedrawRect())
+            self.ElementRefreshList = []
+            self.ElementRefreshList_lock.release()
+            
+            if refresh_rect is not None:
+                self.RefreshRect(self.GetScrolledRect(refresh_rect), False)
+        
     def SubscribeAllDataConsumers(self):
         self.RefreshView()
         DebugViewer.SubscribeAllDataConsumers(self)
@@ -1074,7 +1076,7 @@
     def RefreshView(self, variablepanel=True, selection=None):
         EditorPanel.RefreshView(self, variablepanel)
         
-        if self.TagName.split("::")[0] == "A":
+        if self.TagName.split("::")[0] == "A" and self.Debug:
             self.AddDataConsumer("%s.Q" % self.InstancePath.upper(), self)
         
         if self.ToolTipElement is not None:
@@ -1089,12 +1091,10 @@
         self.ResetBuffer()
         instance = {}
         # List of ids of already loaded blocks
-        ids = []
+        instances = self.Controler.GetEditedElementInstancesInfos(self.TagName, debug = self.Debug)
         # Load Blocks until they are all loaded
-        while instance is not None:
-            instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, exclude = ids, debug = self.Debug)
-            if instance is not None:
-                self.loadInstance(instance, ids, selection)
+        while len(instances) > 0:
+            self.loadInstance(instances.popitem(0)[1], instances, selection)
         
         if (selection is not None and 
             isinstance(self.SelectedElement, Graphic_Group)):
@@ -1220,124 +1220,133 @@
             self.SelectedElement = group
         
     # Load instance from given informations
-    def loadInstance(self, instance, ids, selection):
-        ids.append(instance["id"])
-        self.current_id = max(self.current_id, instance["id"])
-        creation_function = ElementCreationFunctions.get(instance["type"], None)
+    def loadInstance(self, instance, remaining_instances, selection):
+        self.current_id = max(self.current_id, instance.id)
+        creation_function = ElementCreationFunctions.get(instance.type, None)
         connectors = {"inputs" : [], "outputs" : []}
-        specific_values = instance["specific_values"]
+        specific_values = instance.specific_values
         if creation_function is not None:
-            element = creation_function(self, instance["id"], specific_values)
+            element = creation_function(self, instance.id, specific_values)
             if isinstance(element, SFC_Step):
-                if len(instance["inputs"]) > 0:
+                if len(instance.inputs) > 0:
                     element.AddInput()
                 else:
                     element.RemoveInput()
-                if len(instance["outputs"]) > 0:
+                if len(instance.outputs) > 0:
                     element.AddOutput()
-            if isinstance(element, SFC_Transition) and specific_values["condition_type"] == "connection":
+            if isinstance(element, SFC_Transition) and specific_values.condition_type == "connection":
                 connector = element.GetConditionConnector()
-                self.CreateWires(connector, instance["id"], specific_values["connection"]["links"], ids, selection)
+                self.CreateWires(connector, instance.id, specific_values.connection.links, remaining_instances, selection)
         else:
             executionControl = False
-            for input in instance["inputs"]:
-                if input["negated"]:
-                    connectors["inputs"].append((input["name"], None, "negated"))
-                elif input["edge"]:
-                    connectors["inputs"].append((input["name"], None, input["edge"]))
+            for input in instance.inputs:
+                input_edge = MODIFIER_VALUE(input.edge)
+                if input.negated:
+                    connectors["inputs"].append((input.name, None, "negated"))
+                elif input_edge:
+                    connectors["inputs"].append((input.name, None, input_edge))
                 else:
-                    connectors["inputs"].append((input["name"], None, "none"))
-            for output in instance["outputs"]:
-                if output["negated"]:
-                    connectors["outputs"].append((output["name"], None, "negated"))
-                elif output["edge"]:
-                    connectors["outputs"].append((output["name"], None, output["edge"]))
+                    connectors["inputs"].append((input.name, None, "none"))
+            for output in instance.outputs:
+                output_edge = MODIFIER_VALUE(output.edge)
+                if output.negated:
+                    connectors["outputs"].append((output.name, None, "negated"))
+                elif output_edge:
+                    connectors["outputs"].append((output.name, None, output_edge))
                 else:
-                    connectors["outputs"].append((output["name"], None, "none"))
+                    connectors["outputs"].append((output.name, None, "none"))
             if len(connectors["inputs"]) > 0 and connectors["inputs"][0][0] == "EN":
                 connectors["inputs"].pop(0)
                 executionControl = True
             if len(connectors["outputs"]) > 0 and connectors["outputs"][0][0] == "ENO":
                 connectors["outputs"].pop(0)
                 executionControl = True
-            if specific_values["name"] is None:
-                specific_values["name"] = ""
-            element = FBD_Block(self, instance["type"], specific_values["name"], 
-                      instance["id"], len(connectors["inputs"]), 
+            block_name = specific_values.name if specific_values.name is not None else ""
+            element = FBD_Block(self, instance.type, block_name, 
+                      instance.id, len(connectors["inputs"]), 
                       connectors=connectors, executionControl=executionControl, 
-                      executionOrder=specific_values["executionOrder"])
+                      executionOrder=specific_values.execution_order)
         if isinstance(element, Comment):
             self.AddComment(element)
         else:
             self.AddBlock(element)
             connectors = element.GetConnectors()
-        element.SetPosition(instance["x"], instance["y"])
-        element.SetSize(instance["width"], instance["height"])
-        for i, output_connector in enumerate(instance["outputs"]):
+        element.SetPosition(instance.x, instance.y)
+        element.SetSize(instance.width, instance.height)
+        for i, output_connector in enumerate(instance.outputs):
+            connector_pos = wx.Point(*output_connector.position)
             if isinstance(element, FBD_Block):
-                connector = element.GetConnector(
-                    wx.Point(*output_connector["position"]),
-                    output_name = output_connector["name"])
+                connector = element.GetConnector(connector_pos,
+                    output_name = output_connector.name)
             elif i < len(connectors["outputs"]):
                 connector = connectors["outputs"][i]
             else:
                 connector = None
             if connector is not None:
-                if output_connector.get("negated", False):
+                if output_connector.negated:
                     connector.SetNegated(True)
-                if output_connector.get("edge", "none") != "none":
-                    connector.SetEdge(output_connector["edge"])
+                if output_connector.edge is not None:
+                    connector.SetEdge(output_connector.edge)
                 if connectors["outputs"].index(connector) == i:
-                    connector.SetPosition(wx.Point(*output_connector["position"]))
-        for i, input_connector in enumerate(instance["inputs"]):
+                    connector.SetPosition(connector_pos)
+        for i, input_connector in enumerate(instance.inputs):
+            connector_pos = wx.Point(*input_connector.position)
             if isinstance(element, FBD_Block):
-                connector = element.GetConnector(
-                    wx.Point(*input_connector["position"]),
-                    input_name = input_connector["name"])
+                connector = element.GetConnector(connector_pos,
+                    input_name = input_connector.name)
             elif i < len(connectors["inputs"]):
                 connector = connectors["inputs"][i]
             else:
                 connector = None
             if connector is not None:
                 if connectors["inputs"].index(connector) == i:
-                    connector.SetPosition(wx.Point(*input_connector["position"]))
-                if input_connector.get("negated", False):
+                    connector.SetPosition(connector_pos)
+                if input_connector.negated:
                     connector.SetNegated(True)
-                if input_connector.get("edge", "none") != "none":
-                    connector.SetEdge(input_connector["edge"])
-                if not self.CreateWires(connector, instance["id"], input_connector["links"], ids, selection):
+                if input_connector.edge is not None:
+                    connector.SetEdge(input_connector.edge)
+                if not self.CreateWires(connector, instance.id, input_connector.links, remaining_instances, selection):
                     element.RefreshModel()
         element.RefreshConnectors()
-        if selection is not None and selection[0].get(instance["id"], False):
+        if selection is not None and selection[0].get(instance.id, False):
             self.SelectInGroup(element)
 
-    def CreateWires(self, start_connector, id, links, ids, selection=None):
+    def CreateWires(self, start_connector, id, links, remaining_instances, selection=None):
         links_connected = True
         for link in links:
-            refLocalId = link["refLocalId"]
+            refLocalId = link.refLocalId
             if refLocalId is None:
                 links_connected = False
                 continue
             
-            if refLocalId not in ids:
-                new_instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, refLocalId, debug = self.Debug)
-                if new_instance is not None:
-                    self.loadInstance(new_instance, ids, selection)
+            new_instance = remaining_instances.pop(refLocalId, None)
+            if new_instance is not None:
+                self.loadInstance(new_instance, remaining_instances, selection)
             
             connected = self.FindElementById(refLocalId)
             if connected is None:
                 links_connected = False
                 continue
             
-            points = link["points"]
-            end_connector = connected.GetConnector(wx.Point(points[-1][0], points[-1][1]), link["formalParameter"])
+            points = link.points
+            end_connector = connected.GetConnector(
+                wx.Point(points[-1].x, points[-1].y)
+                if len(points) > 0 else wx.Point(0, 0), 
+                link.formalParameter)
             if end_connector is not None:
-                wire = Wire(self)
-                wire.SetPoints(points)
-                start_connector.Connect((wire, 0), False)
-                end_connector.Connect((wire, -1), False)
-                wire.ConnectStartPoint(None, start_connector)
-                wire.ConnectEndPoint(None, end_connector)
+                if len(points) > 0:
+                    wire = Wire(self)
+                    wire.SetPoints(points)
+                else:
+                    wire = Wire(self,
+                        [wx.Point(*start_connector.GetPosition()), 
+                         start_connector.GetDirection()],
+                        [wx.Point(*end_connector.GetPosition()),
+                         end_connector.GetDirection()])
+                start_connector.Wires.append((wire, 0))
+                end_connector.Wires.append((wire, -1))
+                wire.StartConnected = start_connector
+                wire.EndConnected = end_connector
                 connected.RefreshConnectors()
                 self.AddWire(wire)
                 if selection is not None and (\
@@ -2214,7 +2223,6 @@
                     movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
                     if movex != 0 or movey != 0:
                         self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
-                    self.RefreshVisibleElements()
             elif self.Debug and self.StartMousePos is not None and event.Dragging():
                 pos = event.GetPosition()
                 if abs(self.StartMousePos.x - pos.x) > 5 or abs(self.StartMousePos.y - pos.y) > 5:
@@ -2423,11 +2431,12 @@
                     executionOrder = values["executionOrder"])
             self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
             connector = None
-            for input_connector in block.GetConnectors()["inputs"]:
-                if input_connector.IsCompatible(
-                        wire.GetStartConnectedType()):
-                    connector = input_connector
-                    break
+            if wire is not None:
+                for input_connector in block.GetConnectors()["inputs"]:
+                    if input_connector.IsCompatible(
+                            wire.GetStartConnectedType()):
+                        connector = input_connector
+                        break
             self.AddNewElement(block, bbox, wire, connector)
         dialog.Destroy()
     
@@ -2610,7 +2619,7 @@
         dialog = ActionBlockDialog(self.ParentWindow)
         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
         dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug))
-        dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
+        dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
         if dialog.ShowModal() == wx.ID_OK:
             id = self.GetNewId()
             actionblock = SFC_ActionBlock(self, dialog.GetValues(), id)
@@ -2860,7 +2869,7 @@
         dialog = ActionBlockDialog(self.ParentWindow)
         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
         dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug))
-        dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
+        dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
         dialog.SetValues(actionblock.GetActions())
         if dialog.ShowModal() == wx.ID_OK:
             actions = dialog.GetValues()
@@ -3458,8 +3467,11 @@
                 self.Scroll(x, yp)
             
     def OnMoveWindow(self, event):
-        self.RefreshScrollBars()
-        self.RefreshVisibleElements()
+        client_size = self.GetClientSize()
+        if self.LastClientSize != client_size:
+            self.LastClientSize = client_size
+            self.RefreshScrollBars()
+            self.RefreshVisibleElements()
         event.Skip()
 
     def DoDrawing(self, dc, printing = False):