editors/Viewer.py
changeset 1259 8350222a81c3
parent 1252 18cd1357e8d3
child 1260 11903e79ce66
equal deleted inserted replaced
1258:441f31474b50 1259:8350222a81c3
  1648     def GetAddMenuCallBack(self, func, *args):
  1648     def GetAddMenuCallBack(self, func, *args):
  1649         def AddMenuCallBack(event):
  1649         def AddMenuCallBack(event):
  1650             wx.CallAfter(func, self.rubberBand.GetCurrentExtent(), *args)
  1650             wx.CallAfter(func, self.rubberBand.GetCurrentExtent(), *args)
  1651         return AddMenuCallBack
  1651         return AddMenuCallBack
  1652 
  1652 
       
  1653     def GetAddToWireMenuCallBack(self, func, *args):
       
  1654         args += (self.SelectedElement,)
       
  1655         def AddToWireMenuCallBack(event):
       
  1656             func(wx.Rect(0, 0, 0, 0), *args)
       
  1657         return AddToWireMenuCallBack
       
  1658 
  1653     def GetClipboardCallBack(self, func):
  1659     def GetClipboardCallBack(self, func):
  1654         def ClipboardCallback(event):
  1660         def ClipboardCallback(event):
  1655             wx.CallAfter(func)
  1661             wx.CallAfter(func)
  1656         return ClipboardCallback
  1662         return ClipboardCallback
  1657 
  1663 
  1736                             element = None
  1742                             element = None
  1737                             self.RefreshRect(self.GetScrolledRect(rect), False)
  1743                             self.RefreshRect(self.GetScrolledRect(rect), False)
  1738                 elif not self.Debug and connector is not None and not event.ControlDown():
  1744                 elif not self.Debug and connector is not None and not event.ControlDown():
  1739                     self.DrawingWire = True
  1745                     self.DrawingWire = True
  1740                     scaled_pos = GetScaledEventPosition(event, dc, self.Scaling)
  1746                     scaled_pos = GetScaledEventPosition(event, dc, self.Scaling)
  1741                     if (connector.GetDirection() == EAST):
  1747                     directions = {
  1742                         wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(scaled_pos.x, scaled_pos.y), WEST])
  1748                         EAST: [EAST, WEST],
  1743                     else:
  1749                         WEST: [WEST, EAST],
  1744                         wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(scaled_pos.x, scaled_pos.y), EAST])
  1750                         NORTH: [NORTH, SOUTH],
       
  1751                         SOUTH: [SOUTH, NORTH]}[connector.GetDirection()]
       
  1752                     wire = Wire(self, *map(list, zip(
       
  1753                                            [wx.Point(pos.x, pos.y), 
       
  1754                                             wx.Point(scaled_pos.x, scaled_pos.y)],
       
  1755                                            directions)))
  1745                     wire.oldPos = scaled_pos
  1756                     wire.oldPos = scaled_pos
  1746                     wire.Handle = (HANDLE_POINT, 0)
  1757                     wire.Handle = (HANDLE_POINT, 0)
  1747                     wire.ProcessDragging(0, 0, event, None)
  1758                     wire.ProcessDragging(0, 0, event, None)
  1748                     wire.Handle = (HANDLE_POINT, 1)
  1759                     wire.Handle = (HANDLE_POINT, 1)
  1749                     self.AddWire(wire)
  1760                     self.AddWire(wire)
  1753                     if self.HighlightedElement is not None:
  1764                     if self.HighlightedElement is not None:
  1754                         self.HighlightedElement.SetHighlighted(False)
  1765                         self.HighlightedElement.SetHighlighted(False)
  1755                     self.HighlightedElement = wire
  1766                     self.HighlightedElement = wire
  1756                     self.RefreshVisibleElements()
  1767                     self.RefreshVisibleElements()
  1757                     self.SelectedElement.SetHighlighted(True)
  1768                     self.SelectedElement.SetHighlighted(True)
       
  1769                     self.SelectedElement.StartConnected.HighlightParentBlock(True)
  1758                 else:
  1770                 else:
  1759                     if self.SelectedElement is not None and self.SelectedElement != element:
  1771                     if self.SelectedElement is not None and self.SelectedElement != element:
  1760                         self.SelectedElement.SetSelected(False)
  1772                         self.SelectedElement.SetSelected(False)
  1761                         self.SelectedElement = None
  1773                         self.SelectedElement = None
  1762                     if element is not None:
  1774                     if element is not None:
  1845                     self.SelectedElement.RefreshModel()
  1857                     self.SelectedElement.RefreshModel()
  1846                     self.SelectedElement.SetSelected(True)
  1858                     self.SelectedElement.SetSelected(True)
  1847                     self.SelectedElement.HighlightPoint(pos)
  1859                     self.SelectedElement.HighlightPoint(pos)
  1848                     self.RefreshBuffer()
  1860                     self.RefreshBuffer()
  1849                 elif connector is None or self.SelectedElement.GetDragging():
  1861                 elif connector is None or self.SelectedElement.GetDragging():
  1850                     self.DrawingWire = False
  1862                     start_connector = self.SelectedElement.GetStartConnected()
  1851                     rect = self.SelectedElement.GetRedrawRect()
  1863                     start_direction = start_connector.GetDirection()
  1852                     wire = self.SelectedElement
  1864                     
  1853                     self.SelectedElement = self.SelectedElement.StartConnected.GetParentBlock()
  1865                     items = []
  1854                     self.SelectedElement.SetSelected(True)
  1866                     
  1855                     rect.Union(self.SelectedElement.GetRedrawRect())
  1867                     if self.CurrentLanguage == "SFC" and start_direction == SOUTH:
  1856                     wire.Delete()
  1868                         items.extend([
  1857                     self.RefreshRect(self.GetScrolledRect(rect), False)
  1869                             (_(u'Initial Step'), self.GetAddToWireMenuCallBack(self.AddNewStep, True)),
       
  1870                             (_(u'Step'), self.GetAddToWireMenuCallBack(self.AddNewStep, False)),
       
  1871                             (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, False)),
       
  1872                             (_(u'Divergence'), self.GetAddToWireMenuCallBack(self.AddNewDivergence)),
       
  1873                             (_(u'Jump'), self.GetAddToWireMenuCallBack(self.AddNewJump)),
       
  1874                         ])
       
  1875                     
       
  1876                     elif start_direction == EAST:
       
  1877                         
       
  1878                         if isinstance(start_connector.GetParentBlock(), SFC_Step):
       
  1879                             items.append(
       
  1880                                 (_(u'Action Block'), self.GetAddToWireMenuCallBack(self.AddNewActionBlock))
       
  1881                             )
       
  1882                         else:
       
  1883                             items.extend([
       
  1884                                 (_(u'Block'), self.GetAddToWireMenuCallBack(self.AddNewBlock)),
       
  1885                                 (_(u'Variable'), self.GetAddToWireMenuCallBack(self.AddNewVariable, True)),
       
  1886                                 (_(u'Connection'), self.GetAddToWireMenuCallBack(self.AddNewConnection)),
       
  1887                             ])
       
  1888                             
       
  1889                             if self.CurrentLanguage != "FBD":
       
  1890                                 items.append(
       
  1891                                     (_(u'Contact'), self.GetAddToWireMenuCallBack(self.AddNewContact))
       
  1892                                 )
       
  1893                             if self.CurrentLanguage == "LD":
       
  1894                                 items.extend([
       
  1895                                     (_(u'Coil'), self.GetAddToWireMenuCallBack(self.AddNewCoil)),
       
  1896                                     (_(u'Power Rail'), self.GetAddToWireMenuCallBack(self.AddNewPowerRail)),
       
  1897                                 ])
       
  1898                             if self.CurrentLanguage == "SFC":
       
  1899                                 items.append(
       
  1900                                     (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, True))
       
  1901                                 )
       
  1902                                 
       
  1903                     if len(items) > 0:
       
  1904                         if self.Editor.HasCapture():
       
  1905                             self.Editor.ReleaseMouse()
       
  1906                         
       
  1907                         # Popup contextual menu
       
  1908                         menu = wx.Menu()
       
  1909                         self.AddMenuItems(menu, 
       
  1910                             [(wx.NewId(), wx.ITEM_NORMAL, text, '', callback)
       
  1911                              for text, callback in items])
       
  1912                         self.PopupMenu(menu)
       
  1913                     
       
  1914                     self.SelectedElement.StartConnected.HighlightParentBlock(False)
       
  1915                     if self.DrawingWire:
       
  1916                         self.DrawingWire = False
       
  1917                         rect = self.SelectedElement.GetRedrawRect()
       
  1918                         wire = self.SelectedElement
       
  1919                         self.SelectedElement = self.SelectedElement.StartConnected.GetParentBlock()
       
  1920                         self.SelectedElement.SetSelected(True)
       
  1921                         rect.Union(self.SelectedElement.GetRedrawRect())
       
  1922                         wire.Delete()
       
  1923                         self.RefreshRect(self.GetScrolledRect(rect), False)
       
  1924                     else:
       
  1925                         self.SelectedElement.SetSelected(True)
  1858             else:
  1926             else:
  1859                 if self.Debug:
  1927                 if self.Debug:
  1860                     Graphic_Element.OnLeftUp(self.SelectedElement, event, dc, self.Scaling)
  1928                     Graphic_Element.OnLeftUp(self.SelectedElement, event, dc, self.Scaling)
  1861                 else:
  1929                 else:
  1862                     self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
  1930                     self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
  2194         if self.Scaling is not None:
  2262         if self.Scaling is not None:
  2195             width = round(float(width) / float(self.Scaling[0]) + 0.4) * self.Scaling[0]
  2263             width = round(float(width) / float(self.Scaling[0]) + 0.4) * self.Scaling[0]
  2196             height = round(float(height) / float(self.Scaling[1]) + 0.4) * self.Scaling[1]
  2264             height = round(float(height) / float(self.Scaling[1]) + 0.4) * self.Scaling[1]
  2197         return width, height
  2265         return width, height
  2198     
  2266     
  2199     def AddNewBlock(self, bbox):
  2267     def AddNewElement(self, element, bbox, wire=None, connector=None):
       
  2268         min_width, min_height = (element.GetMinSize(True)
       
  2269                                  if isinstance(element, (LD_PowerRail,
       
  2270                                                          SFC_Divergence))
       
  2271                                  else element.GetMinSize())
       
  2272         element.SetSize(*self.GetScaledSize(
       
  2273             max(bbox.width, min_width), max(bbox.height, min_height)))
       
  2274         if wire is not None:
       
  2275             if connector is None:
       
  2276                 connector = element.GetConnectors()["inputs"][0]
       
  2277             point = wire.GetPoint(-1)
       
  2278             rel_pos = connector.GetRelPosition()
       
  2279             direction = connector.GetDirection()
       
  2280             element.SetPosition(
       
  2281                 point[0] - rel_pos[0] - direction[0] * CONNECTOR_SIZE,
       
  2282                 point[1] - rel_pos[1] - direction[1] * CONNECTOR_SIZE,
       
  2283             )
       
  2284             connector.Connect((wire, -1))
       
  2285             wire.Refresh()
       
  2286             self.DrawingWire = False
       
  2287         else:
       
  2288             element.SetPosition(bbox.x, bbox.y)
       
  2289         self.AddBlock(element)
       
  2290         element.RefreshModel()
       
  2291         self.RefreshBuffer()
       
  2292         self.RefreshScrollBars()
       
  2293         self.RefreshVisibleElements()
       
  2294         element.Refresh()
       
  2295     
       
  2296     def AddNewBlock(self, bbox, wire=None):
  2200         dialog = FBDBlockDialog(self.ParentWindow, self.Controler, self.TagName)
  2297         dialog = FBDBlockDialog(self.ParentWindow, self.Controler, self.TagName)
  2201         dialog.SetPreviewFont(self.GetFont())
  2298         dialog.SetPreviewFont(self.GetFont())
  2202         dialog.SetMinElementSize((bbox.width, bbox.height))
  2299         dialog.SetMinElementSize((bbox.width, bbox.height))
  2203         if dialog.ShowModal() == wx.ID_OK:
  2300         if dialog.ShowModal() == wx.ID_OK:
  2204             id = self.GetNewId()
  2301             id = self.GetNewId()
  2206             values.setdefault("name", "")
  2303             values.setdefault("name", "")
  2207             block = FBD_Block(self, values["type"], values["name"], id, 
  2304             block = FBD_Block(self, values["type"], values["name"], id, 
  2208                     values["extension"], values["inputs"], 
  2305                     values["extension"], values["inputs"], 
  2209                     executionControl = values["executionControl"],
  2306                     executionControl = values["executionControl"],
  2210                     executionOrder = values["executionOrder"])
  2307                     executionOrder = values["executionOrder"])
  2211             block.SetPosition(bbox.x, bbox.y)
  2308             connector = None
  2212             block.SetSize(*self.GetScaledSize(values["width"], values["height"]))
  2309             for input_connector in block.GetConnectors()["inputs"]:
  2213             self.AddBlock(block)
  2310                 if input_connector.IsCompatible(
  2214             self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
  2311                         wire.GetStartConnectedType()):
  2215             self.RefreshBlockModel(block)
  2312                     connector = input_connector
  2216             self.RefreshBuffer()
  2313                     break
  2217             self.RefreshScrollBars()
  2314             self.AddNewElement(block, bbox, wire, connector)
  2218             self.RefreshVisibleElements()
       
  2219             self.RefreshVariablePanel()
       
  2220             self.ParentWindow.RefreshPouInstanceVariablesPanel()
       
  2221             block.Refresh()
       
  2222         dialog.Destroy()
  2315         dialog.Destroy()
  2223     
  2316     
  2224     def AddNewVariable(self, bbox):
  2317     def AddNewVariable(self, bbox, exclude_input=False, wire=None):
  2225         dialog = FBDVariableDialog(self.ParentWindow, self.Controler, self.TagName)
  2318         dialog = FBDVariableDialog(self.ParentWindow, self.Controler, self.TagName, exclude_input)
  2226         dialog.SetPreviewFont(self.GetFont())
  2319         dialog.SetPreviewFont(self.GetFont())
  2227         dialog.SetMinElementSize((bbox.width, bbox.height))
  2320         dialog.SetMinElementSize((bbox.width, bbox.height))
  2228         if dialog.ShowModal() == wx.ID_OK:
  2321         if dialog.ShowModal() == wx.ID_OK:
  2229             id = self.GetNewId()
  2322             id = self.GetNewId()
  2230             values = dialog.GetValues()
  2323             values = dialog.GetValues()
  2231             variable = FBD_Variable(self, values["class"], values["expression"], values["var_type"], id)
  2324             variable = FBD_Variable(self, values["class"], values["expression"], values["var_type"], id)
  2232             variable.SetExecutionOrder(values["executionOrder"])
  2325             variable.SetExecutionOrder(values["executionOrder"])
  2233             variable.SetPosition(bbox.x, bbox.y)
       
  2234             variable.SetSize(*self.GetScaledSize(values["width"], values["height"]))
       
  2235             self.AddBlock(variable)
       
  2236             self.Controler.AddEditedElementVariable(self.TagName, id, values["class"])
  2326             self.Controler.AddEditedElementVariable(self.TagName, id, values["class"])
  2237             self.RefreshVariableModel(variable)
  2327             self.AddNewElement(variable, bbox, wire)
  2238             self.RefreshBuffer()
       
  2239             self.RefreshScrollBars()
       
  2240             self.RefreshVisibleElements()
       
  2241             variable.Refresh()
       
  2242         dialog.Destroy()
  2328         dialog.Destroy()
  2243 
  2329 
  2244     def AddNewConnection(self, bbox):
  2330     def AddNewConnection(self, bbox, wire=None):
  2245         dialog = ConnectionDialog(self.ParentWindow, self.Controler, self.TagName)
  2331         if wire is not None:
  2246         dialog.SetPreviewFont(self.GetFont())
  2332             values = {
  2247         dialog.SetMinElementSize((bbox.width, bbox.height))
  2333                 "type": CONNECTOR,
  2248         if dialog.ShowModal() == wx.ID_OK:
  2334                 "name": self.Controler.GenerateNewName(
       
  2335                     self.TagName, None, "Connection%d", 0)}
       
  2336         else:
       
  2337             dialog = ConnectionDialog(self.ParentWindow, self.Controler, self.TagName)
       
  2338             dialog.SetPreviewFont(self.GetFont())
       
  2339             dialog.SetMinElementSize((bbox.width, bbox.height))
       
  2340             values = (dialog.GetValues()
       
  2341                       if dialog.ShowModal() == wx.ID_OK
       
  2342                       else None)
       
  2343             dialog.Destroy()
       
  2344         if values is not None:
  2249             id = self.GetNewId()
  2345             id = self.GetNewId()
  2250             values = dialog.GetValues()
       
  2251             connection = FBD_Connector(self, values["type"], values["name"], id)
  2346             connection = FBD_Connector(self, values["type"], values["name"], id)
  2252             connection.SetPosition(bbox.x, bbox.y)
       
  2253             connection.SetSize(*self.GetScaledSize(values["width"], values["height"]))
       
  2254             self.AddBlock(connection)
       
  2255             self.Controler.AddEditedElementConnection(self.TagName, id, values["type"])
  2347             self.Controler.AddEditedElementConnection(self.TagName, id, values["type"])
  2256             self.RefreshConnectionModel(connection)
  2348             self.AddNewElement(connection, bbox, wire)
  2257             self.RefreshBuffer()
  2349     
  2258             self.RefreshScrollBars()
       
  2259             self.RefreshVisibleElements()
       
  2260             connection.Refresh()
       
  2261         dialog.Destroy()
       
  2262 
       
  2263     def AddNewComment(self, bbox):
  2350     def AddNewComment(self, bbox):
  2264         dialog = wx.TextEntryDialog(self.ParentWindow, 
  2351         dialog = wx.TextEntryDialog(self.ParentWindow, 
  2265                                     _("Edit comment"), 
  2352                                     _("Edit comment"), 
  2266                                     _("Please enter comment text"), 
  2353                                     _("Please enter comment text"), 
  2267                                     "", wx.OK|wx.CANCEL|wx.TE_MULTILINE)
  2354                                     "", wx.OK|wx.CANCEL|wx.TE_MULTILINE)
  2280             self.RefreshScrollBars()
  2367             self.RefreshScrollBars()
  2281             self.RefreshVisibleElements()
  2368             self.RefreshVisibleElements()
  2282             comment.Refresh()
  2369             comment.Refresh()
  2283         dialog.Destroy()
  2370         dialog.Destroy()
  2284 
  2371 
  2285     def AddNewContact(self, bbox):
  2372     def AddNewContact(self, bbox, wire=None):
  2286         dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "contact")
  2373         dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "contact")
  2287         dialog.SetPreviewFont(self.GetFont())
  2374         dialog.SetPreviewFont(self.GetFont())
  2288         dialog.SetMinElementSize((bbox.width, bbox.height))
  2375         dialog.SetMinElementSize((bbox.width, bbox.height))
  2289         if dialog.ShowModal() == wx.ID_OK:
  2376         if dialog.ShowModal() == wx.ID_OK:
  2290             id = self.GetNewId()
  2377             id = self.GetNewId()
  2291             values = dialog.GetValues()
  2378             values = dialog.GetValues()
  2292             contact = LD_Contact(self, values["modifier"], values["variable"], id)
  2379             contact = LD_Contact(self, values["modifier"], values["variable"], id)
  2293             contact.SetPosition(bbox.x, bbox.y)
       
  2294             contact.SetSize(*self.GetScaledSize(values["width"], values["height"]))
       
  2295             self.AddBlock(contact)
       
  2296             self.Controler.AddEditedElementContact(self.TagName, id)
  2380             self.Controler.AddEditedElementContact(self.TagName, id)
  2297             self.RefreshContactModel(contact)
  2381             self.AddNewElement(contact, bbox, wire)
  2298             self.RefreshBuffer()
       
  2299             self.RefreshScrollBars()
       
  2300             self.RefreshVisibleElements()
       
  2301             contact.Refresh()
       
  2302         dialog.Destroy()
  2382         dialog.Destroy()
  2303 
  2383 
  2304     def AddNewCoil(self, bbox):
  2384     def AddNewCoil(self, bbox, wire=None):
  2305         dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "coil")
  2385         dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "coil")
  2306         dialog.SetPreviewFont(self.GetFont())
  2386         dialog.SetPreviewFont(self.GetFont())
  2307         dialog.SetMinElementSize((bbox.width, bbox.height))
  2387         dialog.SetMinElementSize((bbox.width, bbox.height))
  2308         if dialog.ShowModal() == wx.ID_OK:
  2388         if dialog.ShowModal() == wx.ID_OK:
  2309             id = self.GetNewId()
  2389             id = self.GetNewId()
  2310             values = dialog.GetValues()
  2390             values = dialog.GetValues()
  2311             coil = LD_Coil(self, values["modifier"], values["variable"], id)
  2391             coil = LD_Coil(self, values["modifier"], values["variable"], id)
  2312             coil.SetPosition(bbox.x, bbox.y)
       
  2313             coil.SetSize(*self.GetScaledSize(values["width"], values["height"]))
       
  2314             self.AddBlock(coil)
       
  2315             self.Controler.AddEditedElementCoil(self.TagName, id)
  2392             self.Controler.AddEditedElementCoil(self.TagName, id)
  2316             self.RefreshCoilModel(coil)
  2393             self.AddNewElement(coil, bbox, wire)
  2317             self.RefreshBuffer()
       
  2318             self.RefreshScrollBars()
       
  2319             self.RefreshVisibleElements()
       
  2320             coil.Refresh()
       
  2321         dialog.Destroy()
  2394         dialog.Destroy()
  2322 
  2395 
  2323     def AddNewPowerRail(self, bbox):
  2396     def AddNewPowerRail(self, bbox, wire=None):
  2324         dialog = LDPowerRailDialog(self.ParentWindow, self.Controler, self.TagName)
  2397         if wire is not None:
  2325         dialog.SetPreviewFont(self.GetFont())
  2398             values = {
  2326         dialog.SetMinElementSize((bbox.width, bbox.height))
  2399                 "type": RIGHTRAIL,
  2327         if dialog.ShowModal() == wx.ID_OK:
  2400                 "pin_number": 1}
       
  2401         else:
       
  2402             dialog = LDPowerRailDialog(self.ParentWindow, self.Controler, self.TagName)
       
  2403             dialog.SetPreviewFont(self.GetFont())
       
  2404             dialog.SetMinElementSize((bbox.width, bbox.height))
       
  2405             values = (dialog.GetValues()
       
  2406                       if dialog.ShowModal() == wx.ID_OK
       
  2407                       else None)
       
  2408             dialog.Destroy()
       
  2409         if values is not None:
  2328             id = self.GetNewId()
  2410             id = self.GetNewId()
  2329             values = dialog.GetValues()
       
  2330             powerrail = LD_PowerRail(self, values["type"], id, values["pin_number"])
  2411             powerrail = LD_PowerRail(self, values["type"], id, values["pin_number"])
  2331             powerrail.SetPosition(bbox.x, bbox.y)
       
  2332             powerrail.SetSize(*self.GetScaledSize(values["width"], values["height"]))
       
  2333             self.AddBlock(powerrail)
       
  2334             self.Controler.AddEditedElementPowerRail(self.TagName, id, values["type"])
  2412             self.Controler.AddEditedElementPowerRail(self.TagName, id, values["type"])
  2335             self.RefreshPowerRailModel(powerrail)
  2413             self.AddNewElement(powerrail, bbox, wire)
  2336             self.RefreshBuffer()
  2414 
  2337             self.RefreshScrollBars()
  2415     def AddNewStep(self, bbox, initial=False, wire=None):
  2338             self.RefreshVisibleElements()
  2416         if wire is not None:
  2339             powerrail.Refresh()
  2417             values = {
  2340         dialog.Destroy()
  2418                 "name": self.Controler.GenerateNewName(
  2341 
  2419                     self.TagName, None, "Step%d", 0),
  2342     def AddNewStep(self, bbox, initial = False):
  2420                 "input": True,
  2343         dialog = SFCStepDialog(self.ParentWindow, self.Controler, self.TagName, initial)
  2421                 "output": False,
  2344         dialog.SetPreviewFont(self.GetFont())
  2422                 "action":False}
  2345         dialog.SetMinElementSize((bbox.width, bbox.height))
  2423         else:
  2346         if dialog.ShowModal() == wx.ID_OK:
  2424             dialog = SFCStepDialog(self.ParentWindow, self.Controler, self.TagName, initial)
       
  2425             dialog.SetPreviewFont(self.GetFont())
       
  2426             dialog.SetMinElementSize((bbox.width, bbox.height))
       
  2427             values = (dialog.GetValues()
       
  2428                       if dialog.ShowModal() == wx.ID_OK
       
  2429                       else None)
       
  2430             dialog.Destroy()
       
  2431         if values is not None:
  2347             id = self.GetNewId()
  2432             id = self.GetNewId()
  2348             values = dialog.GetValues()
       
  2349             step = SFC_Step(self, values["name"], initial, id)
  2433             step = SFC_Step(self, values["name"], initial, id)
  2350             if values["input"]:
  2434             self.Controler.AddEditedElementStep(self.TagName, id)
  2351                 step.AddInput()
  2435             for connector in ["input", "output", "action"]:
       
  2436                 getattr(step, ("Add" 
       
  2437                                if values[connector] 
       
  2438                                else "Remove") + connector.capitalize())()
       
  2439             self.AddNewElement(step, bbox, wire)
       
  2440     
       
  2441     def AddNewTransition(self, bbox, connection=False, wire=None):
       
  2442         if wire is not None and connection:
       
  2443             values = {
       
  2444                 "type": "connection",
       
  2445                 "value": None,
       
  2446                 "priority": 0}
       
  2447         else:
       
  2448             dialog = SFCTransitionDialog(self.ParentWindow, self.Controler, self.TagName, self.GetDrawingMode() == FREEDRAWING_MODE)
       
  2449             dialog.SetPreviewFont(self.GetFont())
       
  2450             dialog.SetMinElementSize((bbox.width, bbox.height))
       
  2451             values = (dialog.GetValues()
       
  2452                       if dialog.ShowModal() == wx.ID_OK
       
  2453                       else None)
       
  2454             dialog.Destroy()
       
  2455         if values is not None:
       
  2456             id = self.GetNewId()
       
  2457             transition = SFC_Transition(self, values["type"], values["value"], values["priority"], id)
       
  2458             self.Controler.AddEditedElementTransition(self.TagName, id)
       
  2459             if connection:
       
  2460                 connector = transition.GetConditionConnector()
  2352             else:
  2461             else:
  2353                 step.RemoveInput()
  2462                 connector = transition.GetConnectors()["inputs"][0]
  2354             if values["output"]:
  2463             self.AddNewElement(transition, bbox, wire, connector)
  2355                 step.AddOutput()
  2464     
  2356             else:
  2465     def AddNewDivergence(self, bbox, wire=None):
  2357                 step.RemoveOutput()
       
  2358             if values["action"]:
       
  2359                 step.AddAction()    
       
  2360             else:
       
  2361                 step.RemoveAction()
       
  2362             step.SetPosition(bbox.x, bbox.y)
       
  2363             min_width, min_height = step.GetMinSize()
       
  2364             step.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
       
  2365             self.AddBlock(step)
       
  2366             self.Controler.AddEditedElementStep(self.TagName, id)
       
  2367             self.RefreshStepModel(step)
       
  2368             self.RefreshBuffer()
       
  2369             self.RefreshScrollBars()
       
  2370             self.RefreshVisibleElements()
       
  2371             step.Refresh()
       
  2372         dialog.Destroy()
       
  2373 
       
  2374     def AddNewTransition(self, bbox):
       
  2375         dialog = SFCTransitionDialog(self.ParentWindow, self.Controler, self.TagName, self.GetDrawingMode() == FREEDRAWING_MODE)
       
  2376         dialog.SetPreviewFont(self.GetFont())
       
  2377         dialog.SetMinElementSize((bbox.width, bbox.height))
       
  2378         if dialog.ShowModal() == wx.ID_OK:
       
  2379             id = self.GetNewId()
       
  2380             values = dialog.GetValues()
       
  2381             transition = SFC_Transition(self, values["type"], values["value"], values["priority"], id)
       
  2382             transition.SetPosition(bbox.x, bbox.y)
       
  2383             min_width, min_height = transition.GetMinSize()
       
  2384             transition.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
       
  2385             self.AddBlock(transition)
       
  2386             self.Controler.AddEditedElementTransition(self.TagName, id)
       
  2387             self.RefreshTransitionModel(transition)
       
  2388             self.RefreshBuffer()
       
  2389             self.RefreshScrollBars()
       
  2390             self.RefreshVisibleElements()
       
  2391             transition.Refresh()
       
  2392         dialog.Destroy()
       
  2393 
       
  2394     def AddNewDivergence(self, bbox):
       
  2395         dialog = SFCDivergenceDialog(self.ParentWindow, self.Controler, self.TagName)
  2466         dialog = SFCDivergenceDialog(self.ParentWindow, self.Controler, self.TagName)
  2396         dialog.SetPreviewFont(self.GetFont())
  2467         dialog.SetPreviewFont(self.GetFont())
  2397         dialog.SetMinElementSize((bbox.width, bbox.height))
  2468         dialog.SetMinElementSize((bbox.width, bbox.height))
  2398         if dialog.ShowModal() == wx.ID_OK:
  2469         if dialog.ShowModal() == wx.ID_OK:
  2399             id = self.GetNewId()
  2470             id = self.GetNewId()
  2400             values = dialog.GetValues()
  2471             values = dialog.GetValues()
  2401             divergence = SFC_Divergence(self, values["type"], values["number"], id)
  2472             divergence = SFC_Divergence(self, values["type"], values["number"], id)
  2402             divergence.SetPosition(bbox.x, bbox.y)
       
  2403             min_width, min_height = divergence.GetMinSize(True)
       
  2404             divergence.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
       
  2405             self.AddBlock(divergence)
       
  2406             self.Controler.AddEditedElementDivergence(self.TagName, id, values["type"])
  2473             self.Controler.AddEditedElementDivergence(self.TagName, id, values["type"])
  2407             self.RefreshDivergenceModel(divergence)
  2474             self.AddNewElement(divergence, bbox, wire)
  2408             self.RefreshBuffer()
       
  2409             self.RefreshScrollBars()
       
  2410             self.RefreshVisibleElements()
       
  2411             divergence.Refresh()
       
  2412         dialog.Destroy()
  2475         dialog.Destroy()
  2413 
  2476 
  2414     def AddNewJump(self, bbox):
  2477     def AddNewJump(self, bbox, wire=None):
  2415         choices = []
  2478         choices = []
  2416         for block in self.Blocks.itervalues():
  2479         for block in self.Blocks.itervalues():
  2417             if isinstance(block, SFC_Step):
  2480             if isinstance(block, SFC_Step):
  2418                 choices.append(block.GetName())
  2481                 choices.append(block.GetName())
  2419         dialog = wx.SingleChoiceDialog(self.ParentWindow, 
  2482         dialog = wx.SingleChoiceDialog(self.ParentWindow, 
  2420               _("Add a new jump"), _("Please choose a target"), 
  2483               _("Add a new jump"), _("Please choose a target"), 
  2421               choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
  2484               choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
  2422         if dialog.ShowModal() == wx.ID_OK:
  2485         if dialog.ShowModal() == wx.ID_OK:
  2423             id = self.GetNewId()
  2486             id = self.GetNewId()
  2424             value = dialog.GetStringSelection()
  2487             jump = SFC_Jump(self, dialog.GetStringSelection(), id)
  2425             jump = SFC_Jump(self, value, id)
       
  2426             jump.SetPosition(bbox.x, bbox.y)
       
  2427             min_width, min_height = jump.GetMinSize()
       
  2428             jump.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
       
  2429             self.AddBlock(jump)
       
  2430             self.Controler.AddEditedElementJump(self.TagName, id)
  2488             self.Controler.AddEditedElementJump(self.TagName, id)
  2431             self.RefreshJumpModel(jump)
  2489             self.AddNewElement(jump, bbox, wire)
  2432             self.RefreshBuffer()
       
  2433             self.RefreshScrollBars()
       
  2434             self.RefreshVisibleElements()
       
  2435             jump.Refresh()
       
  2436         dialog.Destroy()
  2490         dialog.Destroy()
  2437 
  2491 
  2438     def AddNewActionBlock(self, bbox):
  2492     def AddNewActionBlock(self, bbox, wire=None):
  2439         dialog = ActionBlockDialog(self.ParentWindow)
  2493         dialog = ActionBlockDialog(self.ParentWindow)
  2440         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
  2494         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
  2441         dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug))
  2495         dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug))
  2442         dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  2496         dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  2443         if dialog.ShowModal() == wx.ID_OK:
  2497         if dialog.ShowModal() == wx.ID_OK:
  2444             actions = dialog.GetValues()
       
  2445             id = self.GetNewId()
  2498             id = self.GetNewId()
  2446             actionblock = SFC_ActionBlock(self, actions, id)
  2499             actionblock = SFC_ActionBlock(self, dialog.GetValues(), id)
  2447             actionblock.SetPosition(bbox.x, bbox.y)
       
  2448             min_width, min_height = actionblock.GetMinSize()
       
  2449             actionblock.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
       
  2450             self.AddBlock(actionblock)
       
  2451             self.Controler.AddEditedElementActionBlock(self.TagName, id)
  2500             self.Controler.AddEditedElementActionBlock(self.TagName, id)
  2452             self.RefreshActionBlockModel(actionblock)
  2501             self.AddNewElement(actionblock, bbox, wire)
  2453             self.RefreshBuffer()
       
  2454             self.RefreshScrollBars()
       
  2455             self.RefreshVisibleElements()
       
  2456             actionblock.Refresh()
       
  2457         dialog.Destroy()
  2502         dialog.Destroy()
  2458 
  2503 
  2459 #-------------------------------------------------------------------------------
  2504 #-------------------------------------------------------------------------------
  2460 #                          Edit element content functions
  2505 #                          Edit element content functions
  2461 #-------------------------------------------------------------------------------
  2506 #-------------------------------------------------------------------------------