# HG changeset patch # User lbessard # Date 1198683489 -3600 # Node ID 9c74d00ce93e497e8bad4109f25ead7822aa91fa # Parent fc7e0b8ed9d3beee4effbc133a15692838464c2f Last bugs on block and wire moving, resizing with cursor fixed Adding block alignment on graphical viewers diff -r fc7e0b8ed9d3 -r 9c74d00ce93e PLCOpenEditor.py --- a/PLCOpenEditor.py Mon Dec 10 15:52:49 2007 +0100 +++ b/PLCOpenEditor.py Wed Dec 26 16:38:09 2007 +0100 @@ -107,8 +107,7 @@ "FBD" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", "comment.png", "Create a new comment"), (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", "variable.png", "Create a new variable"), (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", "block.png", "Create a new block"), - (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", "connection.png", "Create a new connection"), - (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARWIRE, "OnWireTool", "wire.png", "Create a new wire")], + (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", "connection.png", "Create a new connection")], "LD" : [(True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", "comment.png", "Create a new comment"), (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", "powerrail.png", "Create a new power rail"), (False, DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARRUNG, "OnRungTool", "rung.png", "Create a new rung"), @@ -117,8 +116,7 @@ (False, DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARBRANCH, "OnBranchTool", "branch.png", "Create a new branch"), (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", "variable.png", "Create a new variable"), (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", "block.png", "Create a new block"), - (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", "connection.png", "Create a new connection"), - (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARWIRE, "OnWireTool", "wire.png", "Create a new wire")], + (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", "connection.png", "Create a new connection")], "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", "comment.png", "Create a new comment"), (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARINITIALSTEP, "OnInitialStepTool", "initial_step.png", "Create a new initial step"), (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, ID_PLCOPENEDITORTOOLBARSTEP, "OnStepTool", "step.png", "Create a new step"), @@ -130,8 +128,7 @@ (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", "block.png", "Create a new block"), (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", "connection.png", "Create a new connection"), (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", "powerrail.png", "Create a new power rail"), - (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", "contact.png", "Create a new contact"), - (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARWIRE, "OnWireTool", "wire.png", "Create a new wire")], + (True, FREEDRAWING_MODE, ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", "contact.png", "Create a new contact")], "ST" : [], "IL" : [] } @@ -856,13 +853,6 @@ self.GetPage(selected).SetMode(MODE_CONNECTION) event.Skip() - def OnWireTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARWIRE) - selected = self.GetPageSelection() - if selected != -1: - self.GetPage(selected).SetMode(MODE_WIRE) - event.Skip() - def OnPowerRailTool(self, event): self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARPOWERRAIL) selected = self.GetPageSelection() diff -r fc7e0b8ed9d3 -r 9c74d00ce93e Viewer.py --- a/Viewer.py Mon Dec 10 15:52:49 2007 +0100 +++ b/Viewer.py Wed Dec 26 16:38:09 2007 +0100 @@ -43,14 +43,21 @@ # Graphic elements Viewer base class #------------------------------------------------------------------------------- -# ID Constants for menu items -[ID_FBDVIEWERCONTEXTUALMENUITEMS0, ID_FBDVIEWERCONTEXTUALMENUITEMS1, - ID_FBDVIEWERCONTEXTUALMENUITEMS2, ID_FBDVIEWERCONTEXTUALMENUITEMS3, - ID_FBDVIEWERCONTEXTUALMENUITEMS5, ID_FBDVIEWERCONTEXTUALMENUITEMS6, - ID_FBDVIEWERCONTEXTUALMENUITEMS8, ID_FBDVIEWERCONTEXTUALMENUITEMS9, - ID_FBDVIEWERCONTEXTUALMENUITEMS11, ID_FBDVIEWERCONTEXTUALMENUITEMS12, - ID_FBDVIEWERCONTEXTUALMENUITEMS14, ID_FBDVIEWERCONTEXTUALMENUITEMS15, -] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(12)] +# ID Constants for alignment menu items +[ID_VIEWERALIGNMENTMENUITEMS0, ID_VIEWERALIGNMENTMENUITEMS1, + ID_VIEWERALIGNMENTMENUITEMS2, ID_VIEWERALIGNMENTMENUITEMS4, + ID_VIEWERALIGNMENTMENUITEMS5, ID_VIEWERALIGNMENTMENUITEMS6, +] = [wx.NewId() for _init_coll_AlignmentMenu_Items in range(6)] + +# ID Constants for contextual menu items +[ID_VIEWERCONTEXTUALMENUITEMS0, ID_VIEWERCONTEXTUALMENUITEMS1, + ID_VIEWERCONTEXTUALMENUITEMS2, ID_VIEWERCONTEXTUALMENUITEMS3, + ID_VIEWERCONTEXTUALMENUITEMS5, ID_VIEWERCONTEXTUALMENUITEMS6, + ID_VIEWERCONTEXTUALMENUITEMS8, ID_VIEWERCONTEXTUALMENUITEMS9, + ID_VIEWERCONTEXTUALMENUITEMS11, ID_VIEWERCONTEXTUALMENUITEMS12, + ID_VIEWERCONTEXTUALMENUITEMS14, ID_VIEWERCONTEXTUALMENUITEMS16, + ID_VIEWERCONTEXTUALMENUITEMS17, +] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(13)] class ViewerDropTarget(wx.TextDropTarget): @@ -155,67 +162,101 @@ else: event(self, function) + # Create Alignment Menu items + def _init_coll_AlignmentMenu_Items(self, parent): + # Create menu items + AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS0, + kind=wx.ITEM_NORMAL, text=u'Left') + AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS1, + kind=wx.ITEM_NORMAL, text=u'Center') + AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS2, + kind=wx.ITEM_NORMAL, text=u'Right') + parent.AppendSeparator() + AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS4, + kind=wx.ITEM_NORMAL, text=u'Top') + AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS5, + kind=wx.ITEM_NORMAL, text=u'Middle') + AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS6, + kind=wx.ITEM_NORMAL, text=u'Bottom') + # Link menu event to corresponding called functions + self.Bind(wx.EVT_MENU, self.OnAlignLeftMenu, + id=ID_VIEWERALIGNMENTMENUITEMS0) + self.Bind(wx.EVT_MENU, self.OnAlignCenterMenu, + id=ID_VIEWERALIGNMENTMENUITEMS1) + self.Bind(wx.EVT_MENU, self.OnAlignRightMenu, + id=ID_VIEWERALIGNMENTMENUITEMS2) + self.Bind(wx.EVT_MENU, self.OnAlignTopMenu, + id=ID_VIEWERALIGNMENTMENUITEMS4) + self.Bind(wx.EVT_MENU, self.OnAlignMiddleMenu, + id=ID_VIEWERALIGNMENTMENUITEMS5) + self.Bind(wx.EVT_MENU, self.OnAlignBottomMenu, + id=ID_VIEWERALIGNMENTMENUITEMS6) + # Create Contextual Menu items def _init_coll_ContextualMenu_Items(self, parent): # Create menu items - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS0, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS0, kind=wx.ITEM_RADIO, text=u'No Modifier') - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS1, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS1, kind=wx.ITEM_RADIO, text=u'Negated') - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS2, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS2, kind=wx.ITEM_RADIO, text=u'Rising Edge') - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS3, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS3, kind=wx.ITEM_RADIO, text=u'Falling Edge') parent.AppendSeparator() - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS5, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS5, kind=wx.ITEM_NORMAL, text=u'Add Wire Segment') - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS6, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS6, kind=wx.ITEM_NORMAL, text=u'Delete Wire Segment') parent.AppendSeparator() - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS8, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS8, kind=wx.ITEM_NORMAL, text=u'Add Divergence Branch') - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS9, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS9, kind=wx.ITEM_NORMAL, text=u'Delete Divergence Branch') parent.AppendSeparator() - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS11, kind=wx.ITEM_NORMAL, text=u'Clear Execution Order') - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS12, kind=wx.ITEM_NORMAL, text=u'Reset Execution Order') parent.AppendSeparator() - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS14, + parent.AppendMenu(ID_VIEWERCONTEXTUALMENUITEMS14, "Alignment", self.AlignmentMenu) + parent.AppendSeparator() + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS16, kind=wx.ITEM_NORMAL, text=u'Edit Block') - AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS15, + AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS17, kind=wx.ITEM_NORMAL, text=u'Delete') # Link menu event to corresponding called functions self.Bind(wx.EVT_MENU, self.OnNoModifierMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS0) + id=ID_VIEWERCONTEXTUALMENUITEMS0) self.Bind(wx.EVT_MENU, self.OnNegatedMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS1) + id=ID_VIEWERCONTEXTUALMENUITEMS1) self.Bind(wx.EVT_MENU, self.OnRisingEdgeMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS2) + id=ID_VIEWERCONTEXTUALMENUITEMS2) self.Bind(wx.EVT_MENU, self.OnFallingEdgeMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS3) + id=ID_VIEWERCONTEXTUALMENUITEMS3) self.Bind(wx.EVT_MENU, self.OnAddSegmentMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS5) + id=ID_VIEWERCONTEXTUALMENUITEMS5) self.Bind(wx.EVT_MENU, self.OnDeleteSegmentMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS6) + id=ID_VIEWERCONTEXTUALMENUITEMS6) self.Bind(wx.EVT_MENU, self.OnAddBranchMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS8) + id=ID_VIEWERCONTEXTUALMENUITEMS8) self.Bind(wx.EVT_MENU, self.OnDeleteBranchMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS9) + id=ID_VIEWERCONTEXTUALMENUITEMS9) self.Bind(wx.EVT_MENU, self.OnClearExecutionOrderMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS11) + id=ID_VIEWERCONTEXTUALMENUITEMS11) self.Bind(wx.EVT_MENU, self.OnResetExecutionOrderMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS12) + id=ID_VIEWERCONTEXTUALMENUITEMS12) self.Bind(wx.EVT_MENU, self.OnEditBlockMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS14) + id=ID_VIEWERCONTEXTUALMENUITEMS16) self.Bind(wx.EVT_MENU, self.OnDeleteMenu, - id=ID_FBDVIEWERCONTEXTUALMENUITEMS15) + id=ID_VIEWERCONTEXTUALMENUITEMS17) # Create and initialize Contextual Menu def _init_menus(self): + self.AlignmentMenu = wx.Menu(title='') self.ContextualMenu = wx.Menu(title='') + self._init_coll_AlignmentMenu_Items(self.AlignmentMenu) self._init_coll_ContextualMenu_Items(self.ContextualMenu) # Create a new Viewer @@ -230,6 +271,7 @@ self.Scaling = None #self.Scaling = (8, 8) self.DrawGrid = True + self.DrawingWire = False self.current_id = 0 self.TagName = tagname @@ -741,75 +783,129 @@ def PopupBlockMenu(self, connector = None): if connector is not None and connector.IsCompatible("BOOL"): type = self.Controler.GetEditedElementType(self.TagName) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, type != "function") - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, type != "function") + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, type != "function") + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, type != "function") else: - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames()) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames()) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True) if connector: if connector.IsNegated(): - self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True) + self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS1, True) elif connector.GetEdge() == "rising": - self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS2, True) + self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS2, True) elif connector.GetEdge() == "falling": - self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS3, True) - else: - self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True) + self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS3, True) + else: + self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS0, True) self.PopupMenu(self.ContextualMenu) def PopupWireMenu(self): - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, True) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, True) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True) self.PopupMenu(self.ContextualMenu) def PopupDivergenceMenu(self, connector): - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, True) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, connector) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, connector) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True) self.PopupMenu(self.ContextualMenu) + def PopupGroupMenu(self): + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, True) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True) + self.PopupMenu(self.ContextualMenu) + def PopupDefaultMenu(self, block = True): - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False) - self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, block) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False) + self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, block) self.PopupMenu(self.ContextualMenu) #------------------------------------------------------------------------------- # Menu items functions #------------------------------------------------------------------------------- + def OnAlignLeftMenu(self, event): + if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group): + self.SelectedElement.AlignElements(ALIGN_LEFT, None) + self.RefreshBuffer() + event.Skip() + + def OnAlignCenterMenu(self, event): + if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group): + self.SelectedElement.AlignElements(ALIGN_CENTER, None) + self.RefreshBuffer() + event.Skip() + + def OnAlignRightMenu(self, event): + if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group): + self.SelectedElement.AlignElements(ALIGN_RIGHT, None) + self.RefreshBuffer() + event.Skip() + + def OnAlignTopMenu(self, event): + if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group): + self.SelectedElement.AlignElements(None, ALIGN_TOP) + self.RefreshBuffer() + event.Skip() + + def OnAlignMiddleMenu(self, event): + if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group): + self.SelectedElement.AlignElements(None, ALIGN_MIDDLE) + self.RefreshBuffer() + event.Skip() + + def OnAlignBottomMenu(self, event): + if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group): + self.SelectedElement.AlignElements(None, ALIGN_BOTTOM) + self.RefreshBuffer() + event.Skip() + def OnNoModifierMenu(self, event): if self.SelectedElement and self.IsBlock(self.SelectedElement): self.SelectedElement.SetConnectorNegated(False) @@ -858,7 +954,7 @@ def OnEditBlockMenu(self, event): if self.SelectedElement: - self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType()) + self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s"%self.SelectedElement.GetType()) event.Skip() def OnDeleteMenu(self, event): @@ -905,42 +1001,55 @@ self.SelectedElement.SetSelected(True) else: element = self.FindElement(pos) - if self.SelectedElement and self.SelectedElement != element: - self.SelectedElement.SetSelected(False) - self.SelectedElement = None + connector = self.FindBlockConnector(pos) + if self.DrawingWire: + self.DrawingWire = False + if connector: + event.Dragging = lambda : True + self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling) + if self.SelectedElement.EndConnected is not None: + self.SelectedElement.ResetPoints() + self.SelectedElement.GeneratePoints() + self.SelectedElement.RefreshModel() + self.SelectedElement.SetSelected(True) + element = self.SelectedElement + self.RefreshBuffer() + else: + self.SelectedElement.Delete() + element = None self.Refresh(False) - if element: - self.SelectedElement = element - self.SelectedElement.OnLeftDown(event, dc, self.Scaling) - self.Refresh(False) + elif connector: + self.DrawingWire = True + pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling) + if (connector.GetDirection() == EAST): + wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(pos.x, pos.y), WEST]) + else: + wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(pos.x, pos.y), EAST]) + wire.oldPos = pos + wire.Handle = (HANDLE_POINT, 0) + wire.ProcessDragging(0, 0) + wire.Handle = (HANDLE_POINT, 1) + self.AddWire(wire) + if self.SelectedElement: + self.SelectedElement.SetSelected(False) + self.SelectedElement = wire else: - self.rubberBand.Reset() - self.rubberBand.OnLeftDown(event, dc, self.Scaling) + if self.SelectedElement and self.SelectedElement != element: + self.SelectedElement.SetSelected(False) + self.SelectedElement = None + self.Refresh(False) + if element: + self.SelectedElement = element + self.SelectedElement.OnLeftDown(event, dc, self.Scaling) + self.Refresh(False) + else: + self.rubberBand.Reset() + self.rubberBand.OnLeftDown(event, dc, self.Scaling) elif self.Mode in [MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, MODE_CONTACT, MODE_COIL, MODE_POWERRAIL, MODE_INITIALSTEP, MODE_STEP, MODE_TRANSITION, MODE_DIVERGENCE, MODE_JUMP, MODE_ACTION]: self.rubberBand.Reset() self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling) - elif self.Mode == MODE_WIRE: - pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling) - connector = self.FindBlockConnector(pos) - if connector: - if (connector.GetDirection() == EAST): - wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(pos.x, pos.y), WEST]) - else: - wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(pos.x, pos.y), EAST]) - wire.oldPos = pos - wire.Handle = (HANDLE_POINT, 0) - wire.ProcessDragging(0, 0) - wire.Handle = (HANDLE_POINT, 1) - self.AddWire(wire) - if self.SelectedElement: - self.SelectedElement.SetSelected(False) - self.SelectedElement = wire - elif self.SelectedElement: - self.SelectedElement.SetSelected(False) - self.SelectedElement = None - self.Refresh(False) event.Skip() def OnViewerLeftUp(self, event): @@ -987,21 +1096,27 @@ elif self.Mode == MODE_ACTION: wx.CallAfter(self.AddNewActionBlock, bbox) elif self.Mode == MODE_SELECTION and self.SelectedElement: - self.SelectedElement.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) - wx.CallAfter(self.SetCursor, wx.NullCursor) - self.Refresh(False) - elif self.Mode == MODE_WIRE and self.SelectedElement: - if self.SelectedElement.EndConnected != None: - self.SelectedElement.ResetPoints() - self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling) - self.SelectedElement.GeneratePoints() - self.SelectedElement.RefreshModel() - self.SelectedElement.SetSelected(True) - self.RefreshBuffer() - else: - self.SelectedElement.Delete() - self.SelectedElement = None - self.Refresh(False) + dc = self.GetLogicalDC() + if self.DrawingWire: + pos = event.GetLogicalPosition(dc) + connector = self.FindBlockConnector(pos) + if self.SelectedElement.EndConnected is not None: + self.DrawingWire = False + self.SelectedElement.ResetPoints() + self.SelectedElement.OnMotion(event, dc, self.Scaling) + self.SelectedElement.GeneratePoints() + self.SelectedElement.RefreshModel() + self.SelectedElement.SetSelected(True) + self.RefreshBuffer() + elif connector is None: + self.DrawingWire = False + self.SelectedElement.Delete() + self.SelectedElement = None + self.Refresh(False) + else: + self.SelectedElement.OnLeftUp(event, dc, self.Scaling) + wx.CallAfter(self.SetCursor, wx.NullCursor) + self.Refresh(False) if self.Mode != MODE_SELECTION and not self.SavedMode: wx.CallAfter(self.ParentWindow.ResetCurrentMode) event.Skip() @@ -1035,16 +1150,16 @@ if self.rubberBand.IsShown(): self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling) elif self.Mode == MODE_SELECTION and self.SelectedElement: - if self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling): - self.Refresh(False) - elif self.Mode == MODE_WIRE and self.SelectedElement: - dc = self.GetLogicalDC() - pos = GetScaledEventPosition(event, dc, self.Scaling) - connector = self.FindBlockConnector(pos, False) - if not connector or self.SelectedElement.EndConnected == None: - self.SelectedElement.ResetPoints() - self.SelectedElement.OnMotion(event, dc, self.Scaling) - self.SelectedElement.GeneratePoints() + if self.DrawingWire: + dc = self.GetLogicalDC() + pos = GetScaledEventPosition(event, dc, self.Scaling) + connector = self.FindBlockConnector(pos, False) + if not connector or self.SelectedElement.EndConnected == None: + self.SelectedElement.ResetPoints() + self.SelectedElement.OnMotion(event, dc, self.Scaling) + self.SelectedElement.GeneratePoints() + self.Refresh(False) + elif self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling): self.Refresh(False) self.UpdateScrollPos(event) event.Skip() @@ -1086,7 +1201,10 @@ self.SelectedElement = None self.RefreshBuffer() self.RefreshScrollBars() - self.Refresh(False) + self.SetCursor(wx.NullCursor) + self.Refresh(False) + elif keycode == wx.WXK_RETURN and self.SelectedElement: + self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling) elif keycode == wx.WXK_LEFT: if event.ControlDown() and event.ShiftDown(): self.Scroll(0, ypos) diff -r fc7e0b8ed9d3 -r 9c74d00ce93e graphics/GraphicCommons.py --- a/graphics/GraphicCommons.py Mon Dec 10 15:52:49 2007 +0100 +++ b/graphics/GraphicCommons.py Wed Dec 26 16:38:09 2007 +0100 @@ -78,9 +78,12 @@ [EAST, NORTH, WEST, SOUTH] = [(1,0), (0,-1), (-1,0), (0,1)] # Contants for defining which mode is selected for each view -[MODE_SELECTION, MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, MODE_WIRE, - MODE_COIL, MODE_CONTACT, MODE_POWERRAIL, MODE_INITIALSTEP, MODE_STEP, MODE_TRANSITION, - MODE_DIVERGENCE, MODE_JUMP, MODE_ACTION] = range(15) +[MODE_SELECTION, MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, + MODE_COIL, MODE_CONTACT, MODE_POWERRAIL, MODE_INITIALSTEP, MODE_STEP, + MODE_TRANSITION, MODE_DIVERGENCE, MODE_JUMP, MODE_ACTION] = range(14) + +# Contants for defining alignment types for graphic group +[ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT, ALIGN_TOP, ALIGN_MIDDLE, ALIGN_BOTTOM] = range(6) # Contants for defining which drawing mode is selected for app [FREEDRAWING_MODE, DRIVENDRAWING_MODE] = [1, 2] @@ -452,10 +455,8 @@ # If a dragging have been initiated, refreshes the element state if self.Dragging: dragx, dragy = self.ProcessDragging(movex, movey) - if dragx: - self.oldPos.x = pos.x - if dragy: - self.oldPos.y = pos.y + self.oldPos.x += dragx + self.oldPos.y += dragy return True # If cursor just pass over the element, changes the cursor if it is on a handle else: @@ -489,34 +490,37 @@ x = y = start_x = start_y = 0 width, height = start_width, start_height = self.GetSize() if handle[0] == 1: - x = movex + x = movex = max(-self.BoundingBox.x, movex) width -= movex elif handle[0] == 3: width += movex if handle[1] == 1: - y = movey + y = movey = max(-self.BoundingBox.y, movey) height -= movey elif handle[1] == 3: height += movey # Verify that new size is not lesser than minimum min_width, min_height = self.GetMinSize() - dragx = dragy = False if handle[0] != 2 and (width >= min_width or width > self.Size[0]): start_x = x start_width = width - dragx = True + else: + movex = 0 if handle[1] != 2 and (height >= min_height or height > self.Size[1]): start_y = y start_height = height - dragy = True - if dragx or dragy: + else: + movey = 0 + if movex != 0 or movey != 0: self.Resize(start_x, start_y, start_width, start_height) - return dragx, dragy + return movex, movey # If it is a move handle, Move this element elif handle_type == HANDLE_MOVE: + movex = max(-self.BoundingBox.x, movex) + movey = max(-self.BoundingBox.y, movey) self.Move(movex, movey) - return True, True - return False, False + return movex, movey + return 0, 0 # Override this method for defining the method to call for refreshing the model of this element def RefreshModel(self, move=True): @@ -618,6 +622,43 @@ def GetElements(self): return self.Elements + # Align the group elements + def AlignElements(self, horizontally, vertically): + minx = self.BoundingBox.x + self.BoundingBox.width + miny = self.BoundingBox.y + self.BoundingBox.height + maxx = self.BoundingBox.x + maxy = self.BoundingBox.y + for element in self.Elements: + if not isinstance(element, Wire): + posx, posy = element.GetPosition() + width, height = element.GetSize() + minx = min(minx, posx) + miny = min(miny, posy) + maxx = max(maxx, posx + width) + maxy = max(maxy, posy + height) + for element in self.Elements: + if not isinstance(element, Wire): + posx, posy = element.GetPosition() + width, height = element.GetSize() + movex = movey = 0 + if horizontally == ALIGN_LEFT: + movex = minx - posx + elif horizontally == ALIGN_CENTER: + movex = (maxx + minx - width) / 2 - posx + elif horizontally == ALIGN_RIGHT: + movex = maxx - width - posx + if vertically == ALIGN_TOP: + movey = miny - posy + elif vertically == ALIGN_MIDDLE: + movey = (maxy + miny - height) / 2 - posy + elif vertically == ALIGN_BOTTOM: + movey = maxy - height - posy + if movex != 0 or movey != 0: + element.Move(movex, movey) + element.RefreshModel() + self.RefreshWireExclusion() + self.RefreshBoundingBox() + # Remove or select the given element if it is or not in the group def SelectElement(self, element): if element in self.Elements: @@ -675,6 +716,11 @@ for element in self.Elements: element.SetSelected(selected) + # Method called when a RightUp event has been generated + def OnRightUp(self, event, dc, scaling): + # Popup the menu with special items for a group + self.Parent.PopupGroupMenu() + # Refreshes the model of all the elements of this group def RefreshModel(self): for element in self.Elements: @@ -1569,15 +1615,15 @@ self.Points[idx + 1].x += movex self.GeneratePoints() if start_x != self.Points[idx].x: - return True, False + return self.Points[idx].x - start_x, 0 elif self.Segments[idx] in (EAST, WEST): start_y = self.Points[idx].y self.Points[idx].y += movey self.Points[idx + 1].y += movey self.GeneratePoints() if start_y != self.Points[idx].y: - return False, True - return False, False + return 0, self.Points[idx].y - start_y + return 0, 0 # Adds two points in the middle of the handled segment def AddSegment(self): @@ -1644,10 +1690,42 @@ # Method called when a LeftDClick event has been generated def OnLeftDClick(self, event, dc, scaling): - self.ResetPoints() - self.GeneratePoints() - self.RefreshModel() - self.Parent.RefreshBuffer() + if event.ControlDown(): + direction = (self.StartPoint[1], self.EndPoint[1]) + if direction in [(EAST, WEST), (WEST, EAST)]: + avgy = (self.StartPoint[0].y + self.EndPoint[0].y) / 2 + if self.StartConnected is not None: + startblock = self.StartConnected.GetParentBlock() + startblock.Move(0, avgy - self.StartPoint[0].y) + startblock.RefreshModel() + else: + self.MoveStartPoint(wx.Point(self.StartPoint[0].x, avgy)) + if self.EndConnected is not None: + endblock = self.EndConnected.GetParentBlock() + endblock.Move(0, avgy - self.EndPoint[0].y) + endblock.RefreshModel() + else: + self.MoveEndPoint(wx.Point(self.EndPoint[0].x, avgy)) + elif direction in [(NORTH, SOUTH), (SOUTH, NORTH)]: + avgx = (self.StartPoint[0].x + self.EndPoint[0].x) / 2 + if self.StartConnected is not None: + startblock = self.StartConnected.GetParentBlock() + startblock.Move(avgx - self.StartPoint[0].x, 0) + startblock.RefreshModel() + else: + self.MoveStartPoint(wx.Point(avgx, self.StartPoint[0].y)) + if self.EndConnected is not None: + endblock = self.EndConnected.GetParentBlock() + endblock.Move(avgx - self.EndPoint[0].x, 0) + endblock.RefreshModel() + else: + self.MoveEndPoint(wx.Point(avgx, self.EndPoint[0].y)) + self.Parent.RefreshBuffer() + else: + self.ResetPoints() + self.GeneratePoints() + self.RefreshModel() + self.Parent.RefreshBuffer() # Method called when a Motion event has been generated def OnMotion(self, event, dc, scaling): @@ -1687,6 +1765,8 @@ handle_type, handle = self.Handle # A point has been handled if handle_type == HANDLE_POINT: + movex = max(-self.Points[handle].x + POINT_RADIUS, movex) + movey = max(-self.Points[handle].y + POINT_RADIUS, movey) # Try to connect point to a connector new_pos = wx.Point(self.Points[handle].x + movex, self.Points[handle].y + movey) connector = self.Parent.FindBlockConnector(new_pos) @@ -1695,13 +1775,17 @@ connector.Connect((self, handle)) self.SetStartPointDirection(connector.GetDirection()) self.ConnectStartPoint(connector.GetPosition(), connector) - self.oldPos = connector.GetPosition() + pos = connector.GetPosition() + movex = pos.x - self.oldPos.x + movey = pos.y - self.oldPos.y self.Dragging = False elif handle != 0 and self.StartConnected != connector and connector.IsCompatible(self.GetStartConnectedType()): connector.Connect((self, handle)) self.SetEndPointDirection(connector.GetDirection()) self.ConnectEndPoint(connector.GetPosition(), connector) - self.oldPos = connector.GetPosition() + pos = connector.GetPosition() + movex = pos.x - self.oldPos.x + movey = pos.y - self.oldPos.y self.Dragging = False elif handle == 0: self.MoveStartPoint(new_pos) @@ -1716,7 +1800,7 @@ if self.EndConnected: self.UnConnectEndPoint() self.MoveEndPoint(new_pos) - return True, True + return movex, movey # A segment has been handled, move a segment elif handle_type == HANDLE_SEGMENT: return self.MoveSegment(handle[0], movex, movey) diff -r fc7e0b8ed9d3 -r 9c74d00ce93e graphics/LD_Objects.py --- a/graphics/LD_Objects.py Mon Dec 10 15:52:49 2007 +0100 +++ b/graphics/LD_Objects.py Wed Dec 26 16:38:09 2007 +0100 @@ -295,8 +295,9 @@ handle_type, handle = self.Handle # A connector has been handled if handle_type == HANDLE_CONNECTOR: + movey = max(-self.BoundingBox.y, movey) self.MoveConnector(handle, movey) - return False, True + return 0, movey else: return Graphic_Element.ProcessDragging(self, movex, movey) diff -r fc7e0b8ed9d3 -r 9c74d00ce93e graphics/SFC_Objects.py --- a/graphics/SFC_Objects.py Mon Dec 10 15:52:49 2007 +0100 +++ b/graphics/SFC_Objects.py Wed Dec 26 16:38:09 2007 +0100 @@ -369,21 +369,24 @@ def ProcessDragging(self, movex, movey): handle_type, handle = self.Handle if handle_type == HANDLE_MOVE: + movex = max(-self.BoundingBox.x, movex) + movey = max(-self.BoundingBox.y, movey) action_block = None if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: self.Move(movex, movey) self.RefreshConnected() - return True, True + return movex, movey elif self.Initial: self.MoveActionBlock((movex, movey)) self.Move(movex, movey, self.Parent.Wires) self.RefreshOutputPosition((movex, movey)) + return movex, movey else: self.MoveActionBlock((movex, 0)) self.Move(movex, 0) self.RefreshInputPosition() self.RefreshOutputPosition() - return True, False + return movex, 0 else: return Graphic_Element.ProcessDragging(self, movex, movey) @@ -719,10 +722,11 @@ # Refreshes the transition state according to move defined and handle selected def ProcessDragging(self, movex, movey): if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: + movex = max(-self.BoundingBox.x, movex) self.Move(movex, 0) self.RefreshInputPosition() self.RefreshOutputPosition() - return True, False + return movex, 0 else: return Graphic_Element.ProcessDragging(self, movex, movey) @@ -1132,13 +1136,14 @@ handle_type, handle = self.Handle # A connector has been handled if handle_type == HANDLE_CONNECTOR: + movex = max(-self.BoundingBox.x, movex) self.MoveConnector(handle, movex) if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: self.RefreshConnectedPosition(handle) - return True, False + return movex, 0 elif self.Parent.GetDrawingMode() == FREEDRAWING_MODE: return Graphic_Element.ProcessDragging(self, movex, movey) - return False, False + return 0, 0 # Refresh output element model def RefreshOutputModel(self, move=False): @@ -1316,9 +1321,10 @@ # Refreshes the jump state according to move defined and handle selected def ProcessDragging(self, movex, movey): if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: + movex = max(-self.BoundingBox.x, movex) self.Move(movex, 0) self.RefreshInputPosition() - return True, False + return movex, 0 else: return Graphic_Element.ProcessDragging(self, movex, movey) @@ -1505,13 +1511,14 @@ if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: handle_type, handle = self.Handle if handle_type == HANDLE_MOVE: + movex = max(-self.BoundingBox.x, movex) wires = self.Input.GetWires() if len(wires) == 1: input_pos = wires[0][0].EndConnected.GetPosition(False) if self.Pos.x - input_pos.x + movex >= SFC_WIRE_MIN_SIZE: self.Move(movex, 0) - return True, False - return False, False + return movex, 0 + return 0, 0 else: return Graphic_Element.ProcessDragging(self, movex, movey) else: