diff -r d4222bad4841 -r 374238039643 editors/Viewer.py --- a/editors/Viewer.py Wed Jun 11 16:42:27 2014 +0200 +++ b/editors/Viewer.py Wed Jun 11 19:01:17 2014 +0200 @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor -#based on the plcopen standard. +#based on the plcopen standard. # #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD # @@ -47,7 +47,7 @@ def ResetCursors(): global CURSORS if CURSORS == None: - CURSORS = [wx.NullCursor, + CURSORS = [wx.NullCursor, wx.StockCursor(wx.CURSOR_HAND), wx.StockCursor(wx.CURSOR_SIZENWSE), wx.StockCursor(wx.CURSOR_SIZENESW), @@ -83,16 +83,16 @@ def GetVariableCreationFunction(variable_type): def variableCreationFunction(viewer, id, specific_values): - return FBD_Variable(viewer, variable_type, - specific_values.name, - specific_values.value_type, + return FBD_Variable(viewer, variable_type, + specific_values.name, + specific_values.value_type, id, specific_values.execution_order) return variableCreationFunction def GetConnectorCreationFunction(connector_type): def connectorCreationFunction(viewer, id, specific_values): - return FBD_Connector(viewer, connector_type, + return FBD_Connector(viewer, connector_type, specific_values.name, id) return connectorCreationFunction @@ -101,7 +101,7 @@ def GetPowerRailCreationFunction(powerrail_type): def powerRailCreationFunction(viewer, id, specific_values): - return LD_PowerRail(viewer, powerrail_type, id, + return LD_PowerRail(viewer, powerrail_type, id, specific_values.connectors) return powerRailCreationFunction @@ -113,7 +113,7 @@ (False, "falling"): CONTACT_FALLING} def contactCreationFunction(viewer, id, specific_values): - contact_type = CONTACT_TYPES.get((NEGATED_VALUE(specific_values.negated), + contact_type = CONTACT_TYPES.get((NEGATED_VALUE(specific_values.negated), MODIFIER_VALUE(specific_values.edge)), CONTACT_NORMAL) return LD_Contact(viewer, contact_type, specific_values.name, id) @@ -125,14 +125,14 @@ (False, "falling", "none"): COIL_FALLING} def coilCreationFunction(viewer, id, specific_values): - coil_type = COIL_TYPES.get((NEGATED_VALUE(specific_values.negated), + coil_type = COIL_TYPES.get((NEGATED_VALUE(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) def stepCreationFunction(viewer, id, specific_values): - step = SFC_Step(viewer, specific_values.name, + step = SFC_Step(viewer, specific_values.name, specific_values.initial, id) if specific_values.action is not None: step.AddAction() @@ -141,14 +141,14 @@ return step def transitionCreationFunction(viewer, id, specific_values): - transition = SFC_Transition(viewer, specific_values.condition_type, - specific_values.condition, + 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, + return SFC_Divergence(viewer, divergence_type, specific_values.connectors, id) return divergenceCreationFunction @@ -169,12 +169,12 @@ "rightPowerRail": GetPowerRailCreationFunction(RIGHTRAIL), "contact": contactCreationFunction, "coil": coilCreationFunction, - "step": stepCreationFunction, + "step": stepCreationFunction, "transition": transitionCreationFunction, - "selectionDivergence": GetDivergenceCreationFunction(SELECTION_DIVERGENCE), - "selectionConvergence": GetDivergenceCreationFunction(SELECTION_CONVERGENCE), - "simultaneousDivergence": GetDivergenceCreationFunction(SIMULTANEOUS_DIVERGENCE), - "simultaneousConvergence": GetDivergenceCreationFunction(SIMULTANEOUS_CONVERGENCE), + "selectionDivergence": GetDivergenceCreationFunction(SELECTION_DIVERGENCE), + "selectionConvergence": GetDivergenceCreationFunction(SELECTION_CONVERGENCE), + "simultaneousDivergence": GetDivergenceCreationFunction(SIMULTANEOUS_DIVERGENCE), + "simultaneousConvergence": GetDivergenceCreationFunction(SIMULTANEOUS_CONVERGENCE), "jump": jumpCreationFunction, "actionBlock": actionBlockCreationFunction, } @@ -209,11 +209,11 @@ class ViewerDropTarget(wx.TextDropTarget): - + def __init__(self, parent): wx.TextDropTarget.__init__(self) self.ParentWindow = parent - + def OnDropText(self, x, y, data): self.ParentWindow.Select() tagname = self.ParentWindow.GetTagName() @@ -280,9 +280,9 @@ if pou_type == "program": location = values[0] if not location.startswith("%"): - dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow, - _("Select a variable class:"), _("Variable class"), - ["Input", "Output", "Memory"], + dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow, + _("Select a variable class:"), _("Variable class"), + ["Input", "Output", "Memory"], wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL) if dialog.ShowModal() == wx.ID_OK: selected = dialog.GetSelection() @@ -298,9 +298,18 @@ else: location = "%M" + location var_name = values[3] - if var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]: + dlg = wx.TextEntryDialog( + self.ParentWindow.ParentWindow, + _("Confirm or change variable name"), + 'Variable Drop', var_name) + dlg.SetValue(var_name) + var_name = dlg.GetValue() if dlg.ShowModal() == wx.ID_OK else None + dlg.Destroy() + if var_name is None: + return + elif var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]: message = _("\"%s\" pou already exists!")%var_name - else: + elif not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: if location[1] == "Q": var_class = OUTPUT else: @@ -309,35 +318,56 @@ var_type = values[2] else: var_type = LOCATIONDATATYPES.get(location[2], ["BOOL"])[0] - if not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: - self.ParentWindow.Controler.AddEditedElementPouVar(tagname, var_type, var_name, location=location, description=values[4]) - self.ParentWindow.RefreshVariablePanel() - self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel() + self.ParentWindow.Controler.AddEditedElementPouVar(tagname, var_type, var_name, location=location, description=values[4]) + self.ParentWindow.RefreshVariablePanel() + self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel() self.ParentWindow.AddVariableBlock(x, y, scaling, var_class, var_name, var_type) + else: + message = _("\"%s\" element for this pou already exists!")%var_name elif values[1] == "NamedConstant": if pou_type == "program": initval = values[0] var_name = values[3] - if var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]: + dlg = wx.TextEntryDialog( + self.ParentWindow.ParentWindow, + _("Confirm or change variable name"), + 'Variable Drop', var_name) + dlg.SetValue(var_name) + var_name = dlg.GetValue() if dlg.ShowModal() == wx.ID_OK else None + dlg.Destroy() + if var_name is None: + return + elif var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]: message = _("\"%s\" pou already exists!")%var_name - else: + elif not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: var_class = INPUT var_type = values[2] - if not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: - self.ParentWindow.Controler.AddEditedElementPouVar(tagname, var_type, var_name, description=values[4], initval=initval) - self.ParentWindow.RefreshVariablePanel() - self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel() + self.ParentWindow.Controler.AddEditedElementPouVar(tagname, var_type, var_name, description=values[4], initval=initval) + self.ParentWindow.RefreshVariablePanel() + self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel() self.ParentWindow.AddVariableBlock(x, y, scaling, var_class, var_name, var_type) + else: + message = _("\"%s\" element for this pou already exists!")%var_name elif values[1] == "Global": var_name = values[0] - if var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]: + dlg = wx.TextEntryDialog( + self.ParentWindow.ParentWindow, + _("Confirm or change variable name"), + 'Variable Drop', var_name) + dlg.SetValue(var_name) + var_name = dlg.GetValue() if dlg.ShowModal() == wx.ID_OK else None + dlg.Destroy() + if var_name is None: + return + elif var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]: message = _("\"%s\" pou already exists!")%var_name + elif not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: + self.ParentWindow.Controler.AddEditedElementPouExternalVar(tagname, values[2], var_name) + self.ParentWindow.RefreshVariablePanel() + self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel() + self.ParentWindow.AddVariableBlock(x, y, scaling, INPUT, var_name, values[2]) else: - if not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]: - self.ParentWindow.Controler.AddEditedElementPouExternalVar(tagname, values[2], var_name) - self.ParentWindow.RefreshVariablePanel() - self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel() - self.ParentWindow.AddVariableBlock(x, y, scaling, INPUT, var_name, values[2]) + message = _("\"%s\" element for this pou already exists!")%var_name elif values[1] == "Constant": self.ParentWindow.AddVariableBlock(x, y, scaling, INPUT, values[0], None) elif values[3] == tagname: @@ -379,31 +409,31 @@ child_menu = wx.Menu(title='') self.GenerateTreeMenu(x, y, scaling, child_menu, child_path, var_class, child_tree) menu.AppendMenu(new_id, "%s." % child_name, child_menu) - + def GetAddVariableBlockFunction(self, x, y, scaling, var_class, var_name, var_type): def AddVariableFunction(event): self.ParentWindow.AddVariableBlock(x, y, scaling, var_class, var_name, var_type) return AddVariableFunction - + def ShowMessage(self, message): message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR) message.ShowModal() message.Destroy() """ -Class that implements a Viewer based on a wx.ScrolledWindow for drawing and +Class that implements a Viewer based on a wx.ScrolledWindow for drawing and manipulating graphic elements """ class Viewer(EditorPanel, DebugViewer): - + if wx.VERSION < (2, 6, 0): def Bind(self, event, function, id = None): if id is not None: event(self, id, function) else: event(self, function) - + # Add list of menu items to the given menu def AddMenuItems(self, menu, items): for item in items: @@ -414,23 +444,23 @@ AppendMenu(menu, help=help, id=id, kind=kind, text=text) # Link menu event to corresponding called functions self.Bind(wx.EVT_MENU, callback, id=id) - + # Add Block Pin Menu items to the given menu def AddBlockPinMenuItems(self, menu, connector): - [ID_NO_MODIFIER, ID_NEGATED, ID_RISING_EDGE, + [ID_NO_MODIFIER, ID_NEGATED, ID_RISING_EDGE, ID_FALLING_EDGE] = [wx.NewId() for i in xrange(4)] - + # Create menu items self.AddMenuItems(menu, [ (ID_NO_MODIFIER, wx.ITEM_RADIO, _(u'No Modifier'), '', self.OnNoModifierMenu), (ID_NEGATED, wx.ITEM_RADIO, _(u'Negated'), '', self.OnNegatedMenu), (ID_RISING_EDGE, wx.ITEM_RADIO, _(u'Rising Edge'), '', self.OnRisingEdgeMenu), (ID_FALLING_EDGE, wx.ITEM_RADIO, _(u'Falling Edge'), '', self.OnFallingEdgeMenu)]) - + type = self.Controler.GetEditedElementType(self.TagName, self.Debug) menu.Enable(ID_RISING_EDGE, type != "function") menu.Enable(ID_FALLING_EDGE, type != "function") - + if connector.IsNegated(): menu.Check(ID_NEGATED, True) elif connector.GetEdge() == "rising": @@ -439,80 +469,80 @@ menu.Check(ID_FALLING_EDGE, True) else: menu.Check(ID_NO_MODIFIER, True) - + # Add Alignment Menu items to the given menu def AddAlignmentMenuItems(self, menu): [ID_ALIGN_LEFT, ID_ALIGN_CENTER, ID_ALIGN_RIGHT, ID_ALIGN_TOP, ID_ALIGN_MIDDLE, ID_ALIGN_BOTTOM, ] = [wx.NewId() for i in xrange(6)] - + # Create menu items self.AddMenuItems(menu, [ (ID_ALIGN_LEFT, wx.ITEM_NORMAL, _(u'Left'), '', self.OnAlignLeftMenu), - (ID_ALIGN_CENTER, wx.ITEM_NORMAL, _(u'Center'), '', self.OnAlignCenterMenu), + (ID_ALIGN_CENTER, wx.ITEM_NORMAL, _(u'Center'), '', self.OnAlignCenterMenu), (ID_ALIGN_RIGHT, wx.ITEM_NORMAL, _(u'Right'), '', self.OnAlignRightMenu), None, - (ID_ALIGN_TOP, wx.ITEM_NORMAL, _(u'Top'), '', self.OnAlignTopMenu), + (ID_ALIGN_TOP, wx.ITEM_NORMAL, _(u'Top'), '', self.OnAlignTopMenu), (ID_ALIGN_MIDDLE, wx.ITEM_NORMAL, _(u'Middle'), '', self.OnAlignMiddleMenu), (ID_ALIGN_BOTTOM, wx.ITEM_NORMAL, _(u'Bottom'), '', self.OnAlignBottomMenu)]) - + # Add Wire Menu items to the given menu def AddWireMenuItems(self, menu, delete=False, replace=False): [ID_ADD_SEGMENT, ID_DELETE_SEGMENT, ID_REPLACE_WIRE, ] = [wx.NewId() for i in xrange(3)] - + # Create menu items self.AddMenuItems(menu, [ (ID_ADD_SEGMENT, wx.ITEM_NORMAL, _(u'Add Wire Segment'), '', self.OnAddSegmentMenu), (ID_DELETE_SEGMENT, wx.ITEM_NORMAL, _(u'Delete Wire Segment'), '', self.OnDeleteSegmentMenu), (ID_REPLACE_WIRE, wx.ITEM_NORMAL, _(u'Replace Wire by connections'), '', self.OnReplaceWireMenu)]) - + menu.Enable(ID_DELETE_SEGMENT, delete) menu.Enable(ID_REPLACE_WIRE, replace) - + # Add Divergence Menu items to the given menu def AddDivergenceMenuItems(self, menu, delete=False): [ID_ADD_BRANCH, ID_DELETE_BRANCH] = [wx.NewId() for i in xrange(2)] - + # Create menu items self.AddMenuItems(menu, [ (ID_ADD_BRANCH, wx.ITEM_NORMAL, _(u'Add Divergence Branch'), '', self.OnAddBranchMenu), (ID_DELETE_BRANCH, wx.ITEM_NORMAL, _(u'Delete Divergence Branch'), '', self.OnDeleteBranchMenu)]) - + menu.Enable(ID_DELETE_BRANCH, delete) - + # Add Add Menu items to the given menu def AddAddMenuItems(self, menu): [ID_ADD_BLOCK, ID_ADD_VARIABLE, ID_ADD_CONNECTION, ID_ADD_COMMENT] = [wx.NewId() for i in xrange(4)] - + # Create menu items self.AddMenuItems(menu, [ (ID_ADD_BLOCK, wx.ITEM_NORMAL, _(u'Block'), '', self.GetAddMenuCallBack(self.AddNewBlock)), (ID_ADD_VARIABLE, wx.ITEM_NORMAL, _(u'Variable'), '', self.GetAddMenuCallBack(self.AddNewVariable)), (ID_ADD_CONNECTION, wx.ITEM_NORMAL, _(u'Connection'), '', self.GetAddMenuCallBack(self.AddNewConnection)), None]) - + if self.CurrentLanguage != "FBD": [ID_ADD_POWER_RAIL, ID_ADD_CONTACT, ID_ADD_COIL, ] = [wx.NewId() for i in xrange(3)] - + # Create menu items self.AddMenuItems(menu, [ (ID_ADD_POWER_RAIL, wx.ITEM_NORMAL, _(u'Power Rail'), '', self.GetAddMenuCallBack(self.AddNewPowerRail)), (ID_ADD_CONTACT, wx.ITEM_NORMAL, _(u'Contact'), '', self.GetAddMenuCallBack(self.AddNewContact))]) - + if self.CurrentLanguage != "SFC": self.AddMenuItems(menu, [ (ID_ADD_COIL, wx.ITEM_NORMAL, _(u'Coil'), '', self.GetAddMenuCallBack(self.AddNewCoil))]) - + menu.AppendSeparator() - + if self.CurrentLanguage == "SFC": - [ID_ADD_INITIAL_STEP, ID_ADD_STEP, ID_ADD_TRANSITION, + [ID_ADD_INITIAL_STEP, ID_ADD_STEP, ID_ADD_TRANSITION, ID_ADD_ACTION_BLOCK, ID_ADD_DIVERGENCE, ID_ADD_JUMP, ] = [wx.NewId() for i in xrange(6)] - + # Create menu items self.AddMenuItems(menu, [ (ID_ADD_INITIAL_STEP, wx.ITEM_NORMAL, _(u'Initial Step'), '', self.GetAddMenuCallBack(self.AddNewStep, True)), @@ -522,64 +552,64 @@ (ID_ADD_DIVERGENCE, wx.ITEM_NORMAL, _(u'Divergence'), '', self.GetAddMenuCallBack(self.AddNewDivergence)), (ID_ADD_JUMP, wx.ITEM_NORMAL, _(u'Jump'), '', self.GetAddMenuCallBack(self.AddNewJump)), None]) - + self.AddMenuItems(menu, [ (ID_ADD_COMMENT, wx.ITEM_NORMAL, _(u'Comment'), '', self.GetAddMenuCallBack(self.AddNewComment))]) - + # Add Default Menu items to the given menu def AddDefaultMenuItems(self, menu, edit=False, block=False): if block: [ID_EDIT_BLOCK, ID_DELETE, ID_ADJUST_BLOCK_SIZE] = [wx.NewId() for i in xrange(3)] - + # Create menu items self.AddMenuItems(menu, [ (ID_EDIT_BLOCK, wx.ITEM_NORMAL, _(u'Edit Block'), '', self.OnEditBlockMenu), (ID_ADJUST_BLOCK_SIZE, wx.ITEM_NORMAL, _(u'Adjust Block Size'), '', self.OnAdjustBlockSizeMenu), (ID_DELETE, wx.ITEM_NORMAL, _(u'Delete'), '', self.OnDeleteMenu)]) - + menu.Enable(ID_EDIT_BLOCK, edit) - + else: [ID_CLEAR_EXEC_ORDER, ID_RESET_EXEC_ORDER] = [wx.NewId() for i in xrange(2)] - + # Create menu items self.AddMenuItems(menu, [ (ID_CLEAR_EXEC_ORDER, wx.ITEM_NORMAL, _(u'Clear Execution Order'), '', self.OnClearExecutionOrderMenu), (ID_RESET_EXEC_ORDER, wx.ITEM_NORMAL, _(u'Reset Execution Order'), '', self.OnResetExecutionOrderMenu)]) - + menu.AppendSeparator() - + add_menu = wx.Menu(title='') self.AddAddMenuItems(add_menu) menu.AppendMenu(-1, _(u'Add'), add_menu) - + menu.AppendSeparator() - + [ID_CUT, ID_COPY, ID_PASTE] = [wx.NewId() for i in xrange(3)] - + # Create menu items self.AddMenuItems(menu, [ (ID_CUT, wx.ITEM_NORMAL, _(u'Cut'), '', self.GetClipboardCallBack(self.Cut)), (ID_COPY, wx.ITEM_NORMAL, _(u'Copy'), '', self.GetClipboardCallBack(self.Copy)), (ID_PASTE, wx.ITEM_NORMAL, _(u'Paste'), '', self.GetAddMenuCallBack(self.Paste))]) - + menu.Enable(ID_CUT, block) menu.Enable(ID_COPY, block) menu.Enable(ID_PASTE, self.ParentWindow.GetCopyBuffer() is not None) - + def _init_Editor(self, prnt): - self.Editor = wx.ScrolledWindow(prnt, name="Viewer", - pos=wx.Point(0, 0), size=wx.Size(0, 0), + self.Editor = wx.ScrolledWindow(prnt, name="Viewer", + pos=wx.Point(0, 0), size=wx.Size(0, 0), style=wx.HSCROLL | wx.VSCROLL | wx.ALWAYS_SHOW_SB) self.Editor.ParentWindow = self - + # Create a new Viewer def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""): self.VARIABLE_PANEL_TYPE = controler.GetPouType(tagname.split("::")[1]) - + EditorPanel.__init__(self, parent, tagname, window, controler, debug) DebugViewer.__init__(self, controler, debug) - + # Adding a rubberband to Viewer self.rubberBand = RubberBand(viewer=self) self.Editor.SetBackgroundColour(wx.Colour(255,255,255)) @@ -601,32 +631,32 @@ self.InstancePath = instancepath self.StartMousePos = None self.StartScreenPos = None - + # Prevent search for highlighted element to be called too often self.LastHighlightCheckTime = gettime() # Prevent search for element producing tooltip to be called too often self.LastToolTipCheckTime = gettime() - + self.Buffering = False - + # Initialize Cursors ResetCursors() self.CurrentCursor = 0 - + # Initialize Block, Wire and Comment numbers self.wire_id = 0 - + # Initialize Viewer mode to Selection mode self.Mode = MODE_SELECTION self.SavedMode = False self.CurrentLanguage = "FBD" - + if not self.Debug: self.Editor.SetDropTarget(ViewerDropTarget(self)) - + self.ElementRefreshList = [] self.ElementRefreshList_lock = Lock() - + dc = wx.ClientDC(self.Editor) font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"]) dc.SetFont(font) @@ -639,15 +669,15 @@ self.SetFont(font) self.MiniTextDC = wx.MemoryDC() self.MiniTextDC.SetFont(wx.Font(faces["size"] * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"])) - + self.CurrentScale = None self.SetScale(ZOOM_FACTORS.index(1.0), False) - + self.RefreshHighlightsTimer = wx.Timer(self, -1) self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer) - + self.ResetView() - + # Link Viewer event to corresponding methods self.Editor.Bind(wx.EVT_PAINT, self.OnPaint) self.Editor.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown) @@ -665,55 +695,55 @@ self.Editor.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheelWindow) self.Editor.Bind(wx.EVT_SIZE, self.OnMoveWindow) self.Editor.Bind(wx.EVT_MOUSE_EVENTS, self.OnViewerMouseEvent) - + # Destructor def __del__(self): DebugViewer.__del__(self) self.Flush() self.ResetView() self.RefreshHighlightsTimer.Stop() - + def SetCurrentCursor(self, cursor): if self.Mode != MODE_MOTION: global CURSORS if self.CurrentCursor != cursor: self.CurrentCursor = cursor self.Editor.SetCursor(CURSORS[cursor]) - + def GetScrolledRect(self, rect): - rect.x, rect.y = self.Editor.CalcScrolledPosition(int(rect.x * self.ViewScale[0]), + rect.x, rect.y = self.Editor.CalcScrolledPosition(int(rect.x * self.ViewScale[0]), int(rect.y * self.ViewScale[1])) rect.width = int(rect.width * self.ViewScale[0]) + 2 rect.height = int(rect.height * self.ViewScale[1]) + 2 return rect - + def GetTitle(self): if self.Debug: if len(self.InstancePath) > 15: return "..." + self.InstancePath[-12:] return self.InstancePath return EditorPanel.GetTitle(self) - + def GetScaling(self): return self.Scaling - + def GetInstancePath(self, variable_base=False): if variable_base: words = self.TagName.split("::") if words[0] in ["A", "T"]: return ".".join(self.InstancePath.split(".")[:-1]) return self.InstancePath - + def IsViewing(self, tagname): if self.Debug: return self.InstancePath == tagname return EditorPanel.IsViewing(self, tagname) - + # Returns a new id def GetNewId(self): self.current_id += 1 return self.current_id - + def SetScale(self, scale_number, refresh=True, mouse_event=None): new_scale = max(0, min(scale_number, len(ZOOM_FACTORS) - 1)) if self.CurrentScale != new_scale: @@ -744,7 +774,7 @@ self.RefreshScrollBars() self.RefreshScaling(refresh) self.Editor.Thaw() - + def GetScale(self): return self.CurrentScale @@ -764,10 +794,10 @@ self.Editor.PrepareDC(dc) dc.SetUserScale(self.ViewScale[0], self.ViewScale[1]) return dc - + def RefreshRect(self, rect, eraseBackground=True): self.Editor.RefreshRect(rect, eraseBackground) - + def Scroll(self, x, y): if self.Debug and wx.Platform == '__WXMSW__': self.Editor.Freeze() @@ -777,45 +807,45 @@ self.Editor.Thaw() else: self.Editor.Refresh() - + def GetScrollPos(self, orientation): return self.Editor.GetScrollPos(orientation) - + def GetScrollRange(self, orientation): return self.Editor.GetScrollRange(orientation) - + def GetScrollThumb(self, orientation): return self.Editor.GetScrollThumb(orientation) - + def CalcUnscrolledPosition(self, x, y): return self.Editor.CalcUnscrolledPosition(x, y) - + def GetViewStart(self): return self.Editor.GetViewStart() - + def GetTextExtent(self, text): return self.Editor.GetTextExtent(text) - + def GetFont(self): return self.Editor.GetFont() - + def GetMiniTextExtent(self, text): return self.MiniTextDC.GetTextExtent(text) - + def GetMiniFont(self): return self.MiniTextDC.GetFont() - + #------------------------------------------------------------------------------- # Element management functions #------------------------------------------------------------------------------- def AddBlock(self, block): self.Blocks[block.GetId()] = block - + def AddWire(self, wire): self.wire_id += 1 self.Wires[wire] = self.wire_id - + def AddComment(self, comment): self.Comments[comment.GetId()] = comment @@ -823,10 +853,10 @@ if block is not None: return self.Blocks.get(block.GetId(), False) return False - + def IsWire(self, wire): return self.Wires.get(wire, False) - + def IsComment(self, comment): if comment is not None: return self.Comments.get(comment.GetId(), False) @@ -834,10 +864,10 @@ def RemoveBlock(self, block): self.Blocks.pop(block.GetId()) - + def RemoveWire(self, wire): self.Wires.pop(wire) - + def RemoveComment(self, comment): self.Comments.pop(comment.GetId()) @@ -860,7 +890,7 @@ block.GetName() == name: return block return None - + def RefreshVisibleElements(self, xp = None, yp = None): x, y = self.Editor.CalcUnscrolledPosition(0, 0) if xp is not None: @@ -876,7 +906,7 @@ wire.TestVisible(screen) for block in self.Blocks.itervalues(): block.TestVisible(screen) - + def GetElementIECPath(self, element): iec_path = None instance_path = self.GetInstancePath(True) @@ -912,7 +942,7 @@ next_steps = self.GetNextSteps(connectors["outputs"]) iec_path = "%s.%s->%s"%(instance_path, ",".join(previous_steps), ",".join(next_steps)) return iec_path - + def GetWireModifier(self, wire): connector = wire.EndConnected block = connector.GetParentBlock() @@ -928,7 +958,7 @@ else: return connector.GetEdge() return "none" - + #------------------------------------------------------------------------------- # Reset functions #------------------------------------------------------------------------------- @@ -942,21 +972,21 @@ self.SelectedElement = None self.HighlightedElement = None self.ToolTipElement = None - + def Flush(self): self.UnsubscribeAllDataConsumers(tick=False) for block in self.Blocks.itervalues(): block.Flush() - + # Remove all elements def CleanView(self): for block in self.Blocks.itervalues(): block.Clean() self.ResetView() - + # Changes Viewer mode def SetMode(self, mode): - if self.Mode != mode or mode == MODE_SELECTION: + if self.Mode != mode or mode == MODE_SELECTION: if self.Mode == MODE_MOTION: wx.CallAfter(self.Editor.SetCursor, wx.NullCursor) self.Mode = mode @@ -970,11 +1000,11 @@ if self.Mode == MODE_MOTION: wx.CallAfter(self.Editor.SetCursor, wx.StockCursor(wx.CURSOR_HAND)) self.SavedMode = True - + # Return current drawing mode def GetDrawingMode(self): return self.ParentWindow.GetDrawingMode() - + # Buffer the last model state def RefreshBuffer(self): self.Controler.BufferProject() @@ -982,7 +1012,7 @@ self.ParentWindow.RefreshTitle() self.ParentWindow.RefreshFileMenu() self.ParentWindow.RefreshEditMenu() - + def StartBuffering(self): if not self.Buffering: self.Buffering = True @@ -991,32 +1021,32 @@ self.ParentWindow.RefreshTitle() self.ParentWindow.RefreshFileMenu() self.ParentWindow.RefreshEditMenu() - + def ResetBuffer(self): if self.Buffering: self.Controler.EndBuffering() self.Buffering = False - + def GetBufferState(self): if not self.Debug: return self.Controler.GetBufferState() return False, False - + def Undo(self): if not self.Debug: self.Controler.LoadPrevious() self.ParentWindow.CloseTabsWithoutModel() - + def Redo(self): if not self.Debug: self.Controler.LoadNext() self.ParentWindow.CloseTabsWithoutModel() - + def HasNoModel(self): if not self.Debug: return self.Controler.GetEditedElement(self.TagName) is None return False - + # Refresh the current scaling def RefreshScaling(self, refresh=True): properties = self.Controler.GetProjectProperties(self.Debug) @@ -1048,27 +1078,27 @@ if refresh: self.RefreshVisibleElements() self.Editor.Refresh(False) - - + + #------------------------------------------------------------------------------- # Refresh functions #------------------------------------------------------------------------------- - + VALUE_TRANSLATION = {True: _("Active"), False: _("Inactive")} def SetValue(self, value): if self.Value != value: self.Value = value - + xstart, ystart = self.GetViewStart() window_size = self.Editor.GetClientSize() refresh_rect = self.GetRedrawRect() - if (xstart * SCROLLBAR_UNIT <= refresh_rect.x + refresh_rect.width and + if (xstart * SCROLLBAR_UNIT <= refresh_rect.x + refresh_rect.width and xstart * SCROLLBAR_UNIT + window_size[0] >= refresh_rect.x and - ystart * SCROLLBAR_UNIT <= refresh_rect.y + refresh_rect.height and + ystart * SCROLLBAR_UNIT <= refresh_rect.y + refresh_rect.height and ystart * SCROLLBAR_UNIT + window_size[1] >= refresh_rect.y): self.ElementNeedRefresh(self) - + def GetRedrawRect(self): dc = self.GetLogicalDC() ipw, iph = dc.GetTextExtent(_("Debug: %s") % self.InstancePath) @@ -1078,12 +1108,12 @@ vw = max(vw, w) vh = max(vh, h) return wx.Rect(ipw + 4, 2, vw, vh) - + def ElementNeedRefresh(self, element): self.ElementRefreshList_lock.acquire() self.ElementRefreshList.append(element) self.ElementRefreshList_lock.release() - + def NewDataAvailable(self, ticks, *args, **kwargs): if self.IsShown(): refresh_rect = None @@ -1095,25 +1125,25 @@ 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) - + # Refresh Viewer elements def RefreshView(self, variablepanel=True, selection=None): EditorPanel.RefreshView(self, variablepanel) - + if self.TagName.split("::")[0] == "A" and self.Debug: self.AddDataConsumer("%s.Q" % self.InstancePath.upper(), self) - + if self.ToolTipElement is not None: self.ToolTipElement.DestroyToolTip() self.ToolTipElement = None - + self.Inhibit(True) self.current_id = 0 # Start by reseting Viewer @@ -1126,14 +1156,14 @@ # Load Blocks until they are all loaded while len(instances) > 0: self.loadInstance(instances.popitem(0)[1], instances, selection) - - if (selection is not None and + + if (selection is not None and isinstance(self.SelectedElement, Graphic_Group)): self.SelectedElement.RefreshWireExclusion() self.SelectedElement.RefreshBoundingBox() - + self.RefreshScrollBars() - + for wire in self.Wires: if not wire.IsConnectedCompatible(): wire.SetValid(False) @@ -1166,7 +1196,7 @@ self.RefreshVisibleElements() self.ShowHighlights() self.Editor.Refresh(False) - + def GetPreviousSteps(self, connectors): steps = [] for connector in connectors: @@ -1178,7 +1208,7 @@ connectors = previous.GetConnectors() steps.extend(self.GetPreviousSteps(connectors["inputs"])) return steps - + def GetNextSteps(self, connectors): steps = [] for connector in connectors: @@ -1192,7 +1222,7 @@ connectors = next.GetConnectors() steps.extend(self.GetNextSteps(connectors["outputs"])) return steps - + def GetMaxSize(self): maxx = maxy = 0 for element in self.GetElements(): @@ -1200,7 +1230,7 @@ maxx = max(maxx, bbox.x + bbox.width) maxy = max(maxy, bbox.y + bbox.height) return maxx, maxy - + def RefreshScrollBars(self, width_incr=0, height_incr=0): xstart, ystart = self.GetViewStart() window_size = self.Editor.GetClientSize() @@ -1213,22 +1243,22 @@ maxy = max(maxy, extent.y + extent.height) maxx = int(maxx * self.ViewScale[0]) maxy = int(maxy * self.ViewScale[1]) - self.Editor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, - round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr, + self.Editor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, + round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr, xstart, ystart, True) - + def EnsureVisible(self, block): xstart, ystart = self.GetViewStart() window_size = self.Editor.GetClientSize() block_bbx = block.GetBoundingBox() - + screen_minx, screen_miny = xstart * SCROLLBAR_UNIT, ystart * SCROLLBAR_UNIT screen_maxx, screen_maxy = screen_minx + window_size[0], screen_miny + window_size[1] - block_minx = int(block_bbx.x * self.ViewScale[0]) + block_minx = int(block_bbx.x * self.ViewScale[0]) block_miny = int(block_bbx.y * self.ViewScale[1]) block_maxx = int(round((block_bbx.x + block_bbx.width) * self.ViewScale[0])) block_maxy = int(round((block_bbx.y + block_bbx.height) * self.ViewScale[1])) - + xpos, ypos = xstart, ystart if block_minx < screen_minx and block_maxx < screen_maxx: xpos -= (screen_minx - block_minx) / SCROLLBAR_UNIT + 1 @@ -1239,7 +1269,7 @@ elif block_maxy > screen_maxy and block_miny > screen_miny: ypos += (block_maxy - screen_maxy) / SCROLLBAR_UNIT + 1 self.Scroll(xpos, ypos) - + def SelectInGroup(self, element): element.SetSelected(True) if self.SelectedElement is None: @@ -1251,7 +1281,7 @@ group.AddElement(self.SelectedElement) group.AddElement(element) self.SelectedElement = group - + # Load instance from given informations def loadInstance(self, instance, remaining_instances, selection): self.current_id = max(self.current_id, instance.id) @@ -1295,9 +1325,9 @@ connectors["outputs"].pop(0) executionControl = True 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, + element = FBD_Block(self, instance.type, block_name, + instance.id, len(connectors["inputs"]), + connectors=connectors, executionControl=executionControl, executionOrder=specific_values.execution_order) if isinstance(element, Comment): self.AddComment(element) @@ -1351,20 +1381,20 @@ if refLocalId is None: links_connected = False continue - + 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].x, points[-1].y) - if len(points) > 0 else wx.Point(0, 0), + if len(points) > 0 else wx.Point(0, 0), link.formalParameter) if end_connector is not None: if len(points) > 0: @@ -1372,7 +1402,7 @@ wire.SetPoints(points) else: wire = Wire(self, - [wx.Point(*start_connector.GetPosition()), + [wx.Point(*start_connector.GetPosition()), start_connector.GetDirection()], [wx.Point(*end_connector.GetPosition()), end_connector.GetDirection()]) @@ -1388,12 +1418,12 @@ self.SelectInGroup(wire) else: links_connected = False - + return links_connected - + def IsOfType(self, type, reference): return self.Controler.IsOfType(type, reference, self.Debug) - + def IsEndType(self, type): return self.Controler.IsEndType(type) @@ -1411,7 +1441,7 @@ if block.HitTest(pos) or block.TestHandle(event) != (0, 0): return block return None - + def FindWire(self, event): dc = self.GetLogicalDC() pos = event.GetLogicalPosition(dc) @@ -1419,7 +1449,7 @@ if wire.HitTest(pos) or wire.TestHandle(event) != (0, 0): return wire return None - + def FindElement(self, event, exclude_group = False, connectors = True): dc = self.GetLogicalDC() pos = event.GetLogicalPosition(dc) @@ -1430,14 +1460,14 @@ if element.HitTest(pos, connectors) or element.TestHandle(event) != (0, 0): return element return None - + def FindBlockConnector(self, pos, direction = None, exclude = None): for block in self.Blocks.itervalues(): result = block.TestConnector(pos, direction, exclude) if result: return result return None - + def FindElementById(self, id): block = self.Blocks.get(id, None) if block is not None: @@ -1446,7 +1476,7 @@ if comment is not None: return comment return None - + def SearchElements(self, bbox): elements = [] for element in self.GetElements(): @@ -1460,7 +1490,7 @@ self.SelectedElement = Graphic_Group(self) self.SelectedElement.SetElements(self.GetElements()) self.SelectedElement.SetSelected(True) - + #------------------------------------------------------------------------------- # Popup menu functions #------------------------------------------------------------------------------- @@ -1516,7 +1546,7 @@ self.AddDefaultMenuItems(menu, block=True, edit=edit) self.Editor.PopupMenu(menu) menu.Destroy() - + def PopupVariableMenu(self): menu = wx.Menu(title='') variable_type = self.SelectedElement.GetType() @@ -1532,7 +1562,7 @@ self.AddDefaultMenuItems(menu, block=True) self.Editor.PopupMenu(menu) menu.Destroy() - + def PopupConnectionMenu(self): menu = wx.Menu(title='') connection_type = self.SelectedElement.GetType() @@ -1547,26 +1577,26 @@ self.AddDefaultMenuItems(menu, block=True) self.Editor.PopupMenu(menu) menu.Destroy() - + def PopupWireMenu(self, delete=True): menu = wx.Menu(title='') - + # If Check that wire can be replace by connections or abort connected = self.SelectedElement.GetConnected() start_connector = ( self.SelectedElement.GetEndConnected() if self.SelectedElement.GetStartConnected() in connected else self.SelectedElement.GetStartConnected()) - + self.AddWireMenuItems(menu, delete, - start_connector.GetDirection() == EAST and + start_connector.GetDirection() == EAST and not isinstance(start_connector.GetParentBlock(), SFC_Step)) - + menu.AppendSeparator() self.AddDefaultMenuItems(menu, block=True) self.Editor.PopupMenu(menu) menu.Destroy() - + def PopupDivergenceMenu(self, connector): menu = wx.Menu(title='') self.AddDivergenceMenuItems(menu, connector) @@ -1574,7 +1604,7 @@ self.AddDefaultMenuItems(menu, block=True) self.Editor.PopupMenu(menu) menu.Destroy() - + def PopupGroupMenu(self): menu = wx.Menu(title='') align_menu = wx.Menu(title='') @@ -1584,7 +1614,7 @@ self.AddDefaultMenuItems(menu, block=True) self.Editor.PopupMenu(menu) menu.Destroy() - + def PopupDefaultMenu(self, block=True): menu = wx.Menu(title='') self.AddDefaultMenuItems(menu, block=block) @@ -1600,43 +1630,43 @@ self.SelectedElement.AlignElements(ALIGN_LEFT, None) self.RefreshBuffer() self.Editor.Refresh(False) - + def OnAlignCenterMenu(self, event): if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group): self.SelectedElement.AlignElements(ALIGN_CENTER, None) self.RefreshBuffer() self.Editor.Refresh(False) - + def OnAlignRightMenu(self, event): if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group): self.SelectedElement.AlignElements(ALIGN_RIGHT, None) self.RefreshBuffer() self.Editor.Refresh(False) - + def OnAlignTopMenu(self, event): if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group): self.SelectedElement.AlignElements(None, ALIGN_TOP) self.RefreshBuffer() self.Editor.Refresh(False) - + def OnAlignMiddleMenu(self, event): if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group): self.SelectedElement.AlignElements(None, ALIGN_MIDDLE) self.RefreshBuffer() self.Editor.Refresh(False) - + def OnAlignBottomMenu(self, event): if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group): self.SelectedElement.AlignElements(None, ALIGN_BOTTOM) self.RefreshBuffer() self.Editor.Refresh(False) - + def OnNoModifierMenu(self, event): if self.SelectedElement is not None and self.IsBlock(self.SelectedElement): self.SelectedElement.SetConnectorNegated(False) self.SelectedElement.Refresh() self.RefreshBuffer() - + def OnNegatedMenu(self, event): if self.SelectedElement is not None and self.IsBlock(self.SelectedElement): self.SelectedElement.SetConnectorNegated(True) @@ -1664,16 +1694,16 @@ if self.SelectedElement is not None and self.IsWire(self.SelectedElement): self.SelectedElement.DeleteSegment() self.SelectedElement.Refresh() - + def OnReplaceWireMenu(self, event): # Check that selected element is a wire before applying replace - if (self.SelectedElement is not None and + if (self.SelectedElement is not None and self.IsWire(self.SelectedElement)): - + # Get wire redraw bbox to erase it from screen wire = self.SelectedElement redraw_rect = wire.GetRedrawRect() - + # Get connector at both ends of wire connected = wire.GetConnected() if wire.GetStartConnected() in connected: @@ -1686,25 +1716,25 @@ end_connector = wire.GetEndConnected() wire.UnConnectEndPoint() point_to_connect = -1 - + # Get a new default connection name connection_name = self.Controler.GenerateNewName( self.TagName, None, "Connection%d", 0) - + # Create a connector to connect to wire id = self.GetNewId() connection = FBD_Connector(self, CONNECTOR, connection_name, id) connection.SetSize(*self.GetScaledSize(*connection.GetMinSize())) - - # Calculate position of connector at the right of start connector + + # Calculate position of connector at the right of start connector connector = connection.GetConnectors()["inputs"][0] rel_pos = connector.GetRelPosition() direction = connector.GetDirection() start_point = start_connector.GetPosition(False) end_point = (start_point[0] + LD_WIRE_SIZE, start_point[1]) - connection.SetPosition(end_point[0] - rel_pos[0], + connection.SetPosition(end_point[0] - rel_pos[0], end_point[1] - rel_pos[1]) - + # Connect connector to wire connector.Connect((wire, point_to_connect)) if point_to_connect == 0: @@ -1714,33 +1744,33 @@ # Update redraw bbox with new wire trace so that it will be redraw # on screen redraw_rect.Union(wire.GetRedrawRect()) - + # Add connector to Viewer and model self.AddBlock(connection) - self.Controler.AddEditedElementConnection(self.TagName, id, + self.Controler.AddEditedElementConnection(self.TagName, id, CONNECTOR) connection.RefreshModel() # Update redraw bbox with new connector bbox so that it will be # drawn on screen redraw_rect.Union(connection.GetRedrawRect()) - + # Add new continuation id = self.GetNewId() connection = FBD_Connector(self, CONTINUATION, connection_name, id) connection.SetSize(*self.GetScaledSize(*connection.GetMinSize())) - + # Calculate position of connection at the left of end connector connector = connection.GetConnectors()["outputs"][0] rel_pos = connector.GetRelPosition() direction = connector.GetDirection() end_point = end_connector.GetPosition(False) start_point = (end_point[0] - LD_WIRE_SIZE, end_point[1]) - connection.SetPosition(start_point[0] - rel_pos[0], + connection.SetPosition(start_point[0] - rel_pos[0], start_point[1] - rel_pos[1]) - + # Add Wire to Viewer and connect it to blocks - new_wire = Wire(self, - [wx.Point(*start_point), connector.GetDirection()], + new_wire = Wire(self, + [wx.Point(*start_point), connector.GetDirection()], [wx.Point(*end_point), end_connector.GetDirection()]) self.AddWire(new_wire) connector.Connect((new_wire, 0), False) @@ -1750,25 +1780,25 @@ # Update redraw bbox with new wire bbox so that it will be drawn on # screen redraw_rect.Union(new_wire.GetRedrawRect()) - + # Add connection to Viewer and model self.AddBlock(connection) - self.Controler.AddEditedElementConnection(self.TagName, id, + self.Controler.AddEditedElementConnection(self.TagName, id, CONTINUATION) connection.RefreshModel() # Update redraw bbox with new connection bbox so that it will be # drawn on screen redraw_rect.Union(connection.GetRedrawRect()) - + # Refresh model for new wire end_connector.RefreshParentBlock() - - # Redraw + + # Redraw self.RefreshBuffer() self.RefreshScrollBars() self.RefreshVisibleElements() self.RefreshRect(self.GetScrolledRect(redraw_rect), False) - + def OnAddBranchMenu(self, event): if self.SelectedElement is not None and self.IsBlock(self.SelectedElement): self.AddDivergenceBranch(self.SelectedElement) @@ -1799,7 +1829,7 @@ self.Controler.ClearEditedElementExecutionOrder(self.TagName) self.RefreshBuffer() self.RefreshView() - + def OnResetExecutionOrderMenu(self, event): self.Controler.ResetEditedElementExecutionOrder(self.TagName) self.RefreshBuffer() @@ -1848,7 +1878,7 @@ tooltip_pos.y += 10 self.ToolTipElement.DisplayToolTip(tooltip_pos) event.Skip() - + def OnViewerLeftDown(self, event): self.Editor.CaptureMouse() self.StartMousePos = event.GetPosition() @@ -1911,7 +1941,7 @@ NORTH: [NORTH, SOUTH], SOUTH: [SOUTH, NORTH]}[connector.GetDirection()] wire = Wire(self, *map(list, zip( - [wx.Point(pos.x, pos.y), + [wx.Point(pos.x, pos.y), wx.Point(scaled_pos.x, scaled_pos.y)], directions))) wire.oldPos = scaled_pos @@ -1942,8 +1972,8 @@ 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, + 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) @@ -1974,7 +2004,7 @@ self.SelectedElement.SetSelected(True) else: bbox = self.rubberBand.GetCurrentExtent() - self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) + self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) if self.Mode == MODE_BLOCK: wx.CallAfter(self.AddNewBlock, bbox) elif self.Mode == MODE_VARIABLE: @@ -2020,9 +2050,9 @@ elif connector is None or self.SelectedElement.GetDragging(): start_connector = self.SelectedElement.GetStartConnected() start_direction = start_connector.GetDirection() - + items = [] - + if self.CurrentLanguage == "SFC" and start_direction == SOUTH: items.extend([ (_(u'Initial Step'), self.GetAddToWireMenuCallBack(self.AddNewStep, True)), @@ -2031,9 +2061,9 @@ (_(u'Divergence'), self.GetAddToWireMenuCallBack(self.AddNewDivergence)), (_(u'Jump'), self.GetAddToWireMenuCallBack(self.AddNewJump)), ]) - + elif start_direction == EAST: - + if isinstance(start_connector.GetParentBlock(), SFC_Step): items.append( (_(u'Action Block'), self.GetAddToWireMenuCallBack(self.AddNewActionBlock)) @@ -2044,7 +2074,7 @@ (_(u'Variable'), self.GetAddToWireMenuCallBack(self.AddNewVariable, True)), (_(u'Connection'), self.GetAddToWireMenuCallBack(self.AddNewConnection)), ]) - + if self.CurrentLanguage != "FBD": items.append( (_(u'Contact'), self.GetAddToWireMenuCallBack(self.AddNewContact)) @@ -2058,18 +2088,18 @@ items.append( (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, True)) ) - + if len(items) > 0: if self.Editor.HasCapture(): self.Editor.ReleaseMouse() - + # Popup contextual menu menu = wx.Menu() - self.AddMenuItems(menu, + self.AddMenuItems(menu, [(wx.NewId(), wx.ITEM_NORMAL, text, '', callback) for text, callback in items]) self.PopupMenu(menu) - + self.SelectedElement.StartConnected.HighlightParentBlock(False) if self.DrawingWire: self.DrawingWire = False @@ -2097,20 +2127,20 @@ if self.Editor.HasCapture(): self.Editor.ReleaseMouse() event.Skip() - + def OnViewerMiddleDown(self, event): self.Editor.CaptureMouse() self.StartMousePos = event.GetPosition() self.StartScreenPos = self.GetScrollPos(wx.HORIZONTAL), self.GetScrollPos(wx.VERTICAL) event.Skip() - + def OnViewerMiddleUp(self, event): self.StartMousePos = None self.StartScreenPos = None if self.Editor.HasCapture(): self.Editor.ReleaseMouse() event.Skip() - + def OnViewerRightDown(self, event): self.Editor.CaptureMouse() if self.Mode == MODE_SELECTION: @@ -2126,7 +2156,7 @@ self.SelectedElement.OnRightDown(event, self.GetLogicalDC(), self.Scaling) self.SelectedElement.Refresh() event.Skip() - + def OnViewerRightUp(self, event): dc = self.GetLogicalDC() self.rubberBand.Reset() @@ -2143,7 +2173,7 @@ if self.Editor.HasCapture(): self.Editor.ReleaseMouse() event.Skip() - + def OnViewerLeftDClick(self, event): element = self.FindElement(event) if self.Mode == MODE_SELECTION and element is not None: @@ -2151,11 +2181,11 @@ self.SelectedElement.SetSelected(False) if self.HighlightedElement is not None and self.HighlightedElement != element: self.HighlightedElement.SetHighlighted(False) - + self.SelectedElement = element self.HighlightedElement = element self.SelectedElement.SetHighlighted(True) - + if self.Debug: if isinstance(self.SelectedElement, FBD_Block): dc = self.GetLogicalDC() @@ -2173,7 +2203,7 @@ "functionBlock": ITEM_FUNCTIONBLOCK, }.get(self.Controler.GetPouType(instance_type)) if pou_type is not None and instance_type in self.Controler.GetProjectPouNames(self.Debug): - self.ParentWindow.OpenDebugViewer(pou_type, + self.ParentWindow.OpenDebugViewer(pou_type, "%s.%s"%(self.GetInstancePath(True), self.SelectedElement.GetName()), self.Controler.ComputePouName(instance_type)) else: @@ -2181,7 +2211,7 @@ if iec_path is not None: if isinstance(self.SelectedElement, Wire): if self.SelectedElement.EndConnected is not None: - self.ParentWindow.OpenDebugViewer(ITEM_VAR_LOCAL, iec_path, + self.ParentWindow.OpenDebugViewer(ITEM_VAR_LOCAL, iec_path, self.SelectedElement.EndConnected.GetType()) else: self.ParentWindow.OpenDebugViewer(ITEM_VAR_LOCAL, iec_path, "BOOL") @@ -2192,7 +2222,7 @@ else: instance_type = None if instance_type in self.Controler.GetProjectPouNames(self.Debug): - self.ParentWindow.EditProjectElement(ITEM_POU, + self.ParentWindow.EditProjectElement(ITEM_POU, self.Controler.ComputePouName(instance_type)) else: self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling) @@ -2204,7 +2234,7 @@ else: self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling) event.Skip() - + def OnViewerMotion(self, event): if self.Editor.HasCapture() and not event.Dragging(): return @@ -2229,7 +2259,7 @@ if (not event.Dragging() and gettime() - self.LastHighlightCheckTime > REFRESH_PERIOD): self.LastHighlightCheckTime = gettime() - highlighted = self.FindElement(event, connectors=False) + highlighted = self.FindElement(event, connectors=False) if self.HighlightedElement is not None and self.HighlightedElement != highlighted: self.HighlightedElement.SetHighlighted(False) self.HighlightedElement = None @@ -2263,7 +2293,7 @@ if isinstance(self.SelectedElement, FBD_Block): dc = self.GetLogicalDC() connector = self.SelectedElement.TestConnector( - wx.Point(dc.DeviceToLogicalX(self.StartMousePos.x), + wx.Point(dc.DeviceToLogicalX(self.StartMousePos.x), dc.DeviceToLogicalY(self.StartMousePos.y))) if connector is not None: element = connector @@ -2354,7 +2384,7 @@ movex, movey = move if not event.AltDown() or event.ShiftDown(): movex *= scaling[0] - movey *= scaling[1] + movey *= scaling[1] if event.ShiftDown() and not event.AltDown(): movex *= 10 movey *= 10 @@ -2420,7 +2450,7 @@ width = round(float(width) / float(self.Scaling[0]) + 0.4) * self.Scaling[0] height = round(float(height) / float(self.Scaling[1]) + 0.4) * self.Scaling[1] return width, height - + def AddNewElement(self, element, bbox, wire=None, connector=None): min_width, min_height = (element.GetMinSize(True) if isinstance(element, (LD_PowerRail, @@ -2449,7 +2479,7 @@ self.RefreshScrollBars() self.RefreshVisibleElements() element.Refresh() - + def AddNewBlock(self, bbox, wire=None): dialog = FBDBlockDialog(self.ParentWindow, self.Controler, self.TagName) dialog.SetPreviewFont(self.GetFont()) @@ -2458,8 +2488,8 @@ id = self.GetNewId() values = dialog.GetValues() values.setdefault("name", "") - block = FBD_Block(self, values["type"], values["name"], id, - values["extension"], values["inputs"], + block = FBD_Block(self, values["type"], values["name"], id, + values["extension"], values["inputs"], executionControl = values["executionControl"], executionOrder = values["executionOrder"]) self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None)) @@ -2472,7 +2502,7 @@ break self.AddNewElement(block, bbox, wire, connector) dialog.Destroy() - + def AddNewVariable(self, bbox, exclude_input=False, wire=None): dialog = FBDVariableDialog(self.ParentWindow, self.Controler, self.TagName, exclude_input) dialog.SetPreviewFont(self.GetFont()) @@ -2505,11 +2535,11 @@ connection = FBD_Connector(self, values["type"], values["name"], id) self.Controler.AddEditedElementConnection(self.TagName, id, values["type"]) self.AddNewElement(connection, bbox, wire) - + def AddNewComment(self, bbox): - dialog = wx.TextEntryDialog(self.ParentWindow, - _("Edit comment"), - _("Please enter comment text"), + dialog = wx.TextEntryDialog(self.ParentWindow, + _("Edit comment"), + _("Please enter comment text"), "", wx.OK|wx.CANCEL|wx.TE_MULTILINE) dialog.SetClientSize(wx.Size(400, 200)) if dialog.ShowModal() == wx.ID_OK: @@ -2592,11 +2622,11 @@ step = SFC_Step(self, values["name"], initial, id) self.Controler.AddEditedElementStep(self.TagName, id) for connector in ["input", "output", "action"]: - getattr(step, ("Add" - if values[connector] + getattr(step, ("Add" + if values[connector] else "Remove") + connector.capitalize())() self.AddNewElement(step, bbox, wire) - + def AddNewTransition(self, bbox, connection=False, wire=None): if wire is not None and connection: values = { @@ -2620,7 +2650,7 @@ else: connector = transition.GetConnectors()["inputs"][0] self.AddNewElement(transition, bbox, wire, connector) - + def AddNewDivergence(self, bbox, wire=None): dialog = SFCDivergenceDialog(self.ParentWindow, self.Controler, self.TagName) dialog.SetPreviewFont(self.GetFont()) @@ -2638,8 +2668,8 @@ for block in self.Blocks.itervalues(): if isinstance(block, SFC_Step): choices.append(block.GetName()) - dialog = wx.SingleChoiceDialog(self.ParentWindow, - _("Add a new jump"), _("Please choose a target"), + dialog = wx.SingleChoiceDialog(self.ParentWindow, + _("Add a new jump"), _("Please choose a target"), choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL) if dialog.ShowModal() == wx.ID_OK: id = self.GetNewId() @@ -2668,11 +2698,11 @@ dialog = FBDBlockDialog(self.ParentWindow, self.Controler, self.TagName) dialog.SetPreviewFont(self.GetFont()) dialog.SetMinElementSize(block.GetSize()) - old_values = {"name" : block.GetName(), - "type" : block.GetType(), - "extension" : block.GetExtension(), - "inputs" : block.GetInputTypes(), - "executionControl" : block.GetExecutionControl(), + old_values = {"name" : block.GetName(), + "type" : block.GetType(), + "extension" : block.GetExtension(), + "inputs" : block.GetInputTypes(), + "executionControl" : block.GetExecutionControl(), "executionOrder" : block.GetExecutionOrder()} dialog.SetValues(old_values) if dialog.ShowModal() == wx.ID_OK: @@ -2702,7 +2732,7 @@ dialog = FBDVariableDialog(self.ParentWindow, self.Controler, self.TagName) dialog.SetPreviewFont(self.GetFont()) dialog.SetMinElementSize(variable.GetSize()) - old_values = {"expression" : variable.GetName(), "class" : variable.GetType(), + old_values = {"expression" : variable.GetName(), "class" : variable.GetType(), "executionOrder" : variable.GetExecutionOrder()} dialog.SetValues(old_values) if dialog.ShowModal() == wx.ID_OK: @@ -2758,12 +2788,12 @@ self.RefreshScrollBars() self.RefreshVisibleElements() connection.Refresh(rect) - + def EditContactContent(self, contact): dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "contact") dialog.SetPreviewFont(self.GetFont()) dialog.SetMinElementSize(contact.GetSize()) - dialog.SetValues({"variable" : contact.GetName(), + dialog.SetValues({"variable" : contact.GetName(), "modifier" : contact.GetType()}) if dialog.ShowModal() == wx.ID_OK: values = dialog.GetValues() @@ -2783,7 +2813,7 @@ dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "coil") dialog.SetPreviewFont(self.GetFont()) dialog.SetMinElementSize(coil.GetSize()) - dialog.SetValues({"variable" : coil.GetName(), + dialog.SetValues({"variable" : coil.GetName(), "modifier" : coil.GetType()}) if dialog.ShowModal() == wx.ID_OK: values = dialog.GetValues() @@ -2848,7 +2878,7 @@ else: step.RemoveOutput() if values["action"]: - step.AddAction() + step.AddAction() else: step.RemoveAction() step.UpdateSize(*self.GetScaledSize(values["width"], values["height"])) @@ -2858,7 +2888,7 @@ self.RefreshScrollBars() self.RefreshVisibleElements() step.Refresh(rect) - + def EditTransitionContent(self, transition): dialog = SFCTransitionDialog(self.ParentWindow, self.Controler, self.TagName, self.GetDrawingMode() == FREEDRAWING_MODE) dialog.SetPreviewFont(self.GetFont()) @@ -2882,8 +2912,8 @@ for block in self.Blocks.itervalues(): if isinstance(block, SFC_Step): choices.append(block.GetName()) - dialog = wx.SingleChoiceDialog(self.ParentWindow, - _("Edit jump target"), _("Please choose a target"), + dialog = wx.SingleChoiceDialog(self.ParentWindow, + _("Edit jump target"), _("Please choose a target"), choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL) dialog.SetSelection(choices.index(jump.GetTarget())) if dialog.ShowModal() == wx.ID_OK: @@ -2918,10 +2948,10 @@ dialog.Destroy() def EditCommentContent(self, comment): - dialog = wx.TextEntryDialog(self.ParentWindow, - _("Edit comment"), - _("Please enter comment text"), - comment.GetContent(), + dialog = wx.TextEntryDialog(self.ParentWindow, + _("Edit comment"), + _("Please enter comment text"), + comment.GetContent(), wx.OK|wx.CANCEL|wx.TE_MULTILINE) dialog.SetClientSize(wx.Size(400, 200)) if dialog.ShowModal() == wx.ID_OK: @@ -2952,7 +2982,7 @@ infos["width"], infos["height"] = block.GetSize() infos["connectors"] = block.GetConnectors() self.Controler.SetEditedElementBlockInfos(self.TagName, blockid, infos) - + def ChangeVariableType(self, variable, new_type): old_type = variable.GetType() rect = variable.GetRedrawRect(1, 1) @@ -2966,7 +2996,7 @@ self.RefreshVisibleElements() self.RefreshScrollBars() variable.Refresh(rect.Union(variable.GetRedrawRect())) - + def RefreshVariableModel(self, variable): variableid = variable.GetId() infos = {} @@ -3105,7 +3135,7 @@ element.RefreshModel() wx.CallAfter(self.RefreshVariablePanel) wx.CallAfter(self.ParentWindow.RefreshPouInstanceVariablesPanel) - + def DeleteVariable(self, variable): connectors = variable.GetConnectors() if len(connectors["outputs"]) > 0: @@ -3190,7 +3220,7 @@ self.Controler.RemoveEditedElementInstance(self.TagName, step.GetId()) for element in elements: element.RefreshModel() - + def DeleteTransition(self, transition): elements = [] connectors = transition.GetConnectors() @@ -3215,12 +3245,12 @@ self.Controler.RemoveEditedElementInstance(self.TagName, divergence.GetId()) for element in elements: element.RefreshModel() - + def DeleteJump(self, jump): jump.Clean() self.RemoveBlock(jump) self.Controler.RemoveEditedElementInstance(self.TagName, jump.GetId()) - + def DeleteActionBlock(self, actionblock): actionblock.Clean() self.RemoveBlock(actionblock) @@ -3230,7 +3260,7 @@ #------------------------------------------------------------------------------- # Editing functions #------------------------------------------------------------------------------- - + def Cut(self): if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement) or isinstance(self.SelectedElement, Graphic_Group)): blocks, wires = self.SelectedElement.GetDefinition() @@ -3244,13 +3274,13 @@ self.RefreshVariablePanel() self.ParentWindow.RefreshPouInstanceVariablesPanel() self.RefreshRect(self.GetScrolledRect(rect), False) - + def Copy(self): if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement) or isinstance(self.SelectedElement, Graphic_Group)): blocks, wires = self.SelectedElement.GetDefinition() text = self.Controler.GetEditedElementInstancesCopy(self.TagName, blocks, wires, self.Debug) self.ParentWindow.SetCopyBuffer(text) - + def Paste(self, bbx=None): if not self.Debug: element = self.ParentWindow.GetCopyBuffer() @@ -3296,10 +3326,10 @@ if blocktype is None: blocktype = "Block" format = "%s%%d" % blocktype - return self.Controler.GenerateNewName(self.TagName, - None, - format, - exclude=exclude, + return self.Controler.GenerateNewName(self.TagName, + None, + format, + exclude=exclude, debug=self.Debug) def IsNamedElement(self, element): @@ -3318,7 +3348,7 @@ block = element.Clone(self, new_id, pos=pos) self.AddBlockInModel(block) return block - + def AddBlockInModel(self, block): if isinstance(block, Comment): self.AddComment(block) @@ -3346,16 +3376,16 @@ self.RefreshPowerRailModel(block) elif isinstance(block, SFC_Step): self.Controler.AddEditedElementStep(self.TagName, block.GetId()) - self.RefreshStepModel(block) + self.RefreshStepModel(block) elif isinstance(block, SFC_Transition): self.Controler.AddEditedElementTransition(self.TagName, block.GetId()) - self.RefreshTransitionModel(block) + self.RefreshTransitionModel(block) elif isinstance(block, SFC_Divergence): self.Controler.AddEditedElementDivergence(self.TagName, block.GetId(), block.GetType()) self.RefreshDivergenceModel(block) elif isinstance(block, SFC_Jump): self.Controler.AddEditedElementJump(self.TagName, block.GetId()) - self.RefreshJumpModel(block) + self.RefreshJumpModel(block) elif isinstance(block, SFC_ActionBlock): self.Controler.AddEditedElementActionBlock(self.TagName, block.GetId()) self.RefreshActionBlockModel(block) @@ -3367,15 +3397,15 @@ def Find(self, direction, search_params): if self.SearchParams != search_params: self.ClearHighlights(SEARCH_RESULT_HIGHLIGHT) - + self.SearchParams = search_params criteria = { - "raw_pattern": search_params["find_pattern"], + "raw_pattern": search_params["find_pattern"], "pattern": re.compile(search_params["find_pattern"]), "case_sensitive": search_params["case_sensitive"], "regular_expression": search_params["regular_expression"], "filter": "all"} - + self.SearchResults = [] blocks = [] for infos, start, end, text in self.Controler.SearchInPou(self.TagName, criteria, self.Debug): @@ -3388,7 +3418,7 @@ blocks.sort(sort_blocks) self.SearchResults.extend([infos for block, infos in blocks]) self.CurrentFindHighlight = None - + if len(self.SearchResults) > 0: if self.CurrentFindHighlight is not None: old_idx = self.SearchResults.index(self.CurrentFindHighlight) @@ -3403,12 +3433,12 @@ else: self.CurrentFindHighlight = self.SearchResults[0] self.AddHighlight(*self.CurrentFindHighlight) - + else: if self.CurrentFindHighlight is not None: self.RemoveHighlight(*self.CurrentFindHighlight) self.CurrentFindHighlight = None - + #------------------------------------------------------------------------------- # Highlights showing functions #------------------------------------------------------------------------------- @@ -3419,7 +3449,7 @@ def ClearHighlights(self, highlight_type=None): EditorPanel.ClearHighlights(self, highlight_type) - + if highlight_type is None: self.Highlights = [] else: @@ -3428,28 +3458,28 @@ def AddHighlight(self, infos, start, end, highlight_type): EditorPanel.AddHighlight(self, infos, start, end, highlight_type) - + self.Highlights.append((infos, start, end, highlight_type)) if infos[0] not in ["var_local", "var_input", "var_output", "var_inout"]: block = self.Blocks.get(infos[1]) if block is not None: self.EnsureVisible(block) self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True) - + def RemoveHighlight(self, infos, start, end, highlight_type): EditorPanel.RemoveHighlight(self, infos, start, end, highlight_type) - + if (infos, start, end, highlight_type) in self.Highlights: self.Highlights.remove((infos, start, end, highlight_type)) self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True) - + def ShowHighlights(self): for infos, start, end, highlight_type in self.Highlights: if infos[0] in ["comment", "io_variable", "block", "connector", "coil", "contact", "step", "transition", "jump", "action_block"]: block = self.FindElementById(infos[1]) if block is not None: block.AddHighlight(infos[2:], start, end, highlight_type) - + #------------------------------------------------------------------------------- # Drawing functions #------------------------------------------------------------------------------- @@ -3465,7 +3495,7 @@ self.RefreshVisibleElements(xp = event.GetPosition()) else: self.RefreshVisibleElements(yp = event.GetPosition()) - + # Handle scroll in debug to fully redraw area and ensuring # instance path is fully draw without flickering if self.Debug and wx.Platform != '__WXMSW__': @@ -3498,7 +3528,7 @@ yp = max(0, min(y - rotation * 3, self.Editor.GetVirtualSize()[1] / self.Editor.GetScrollPixelsPerUnit()[1])) self.RefreshVisibleElements(yp = yp) self.Scroll(x, yp) - + def OnMoveWindow(self, event): client_size = self.GetClientSize() if self.LastClientSize != client_size: @@ -3532,12 +3562,12 @@ xstart, ystart = self.GetViewStart() window_size = self.Editor.GetClientSize() for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]): - dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]), + dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]), xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0])) for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]): - dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, + dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1) - + # Draw all elements for comment in self.Comments.itervalues(): if comment != self.SelectedElement and (comment.IsVisible() or printing): @@ -3553,15 +3583,15 @@ for block in self.Blocks.itervalues(): if block != self.SelectedElement and (block.IsVisible() or printing): block.Draw(dc) - + if self.SelectedElement is not None and (self.SelectedElement.IsVisible() or printing): self.SelectedElement.Draw(dc) - + if not printing: if self.Debug: scalex, scaley = dc.GetUserScale() dc.SetUserScale(1, 1) - + is_action = self.TagName.split("::")[0] == "A" text = _("Debug: %s") % self.InstancePath if is_action and self.Value is not None: @@ -3578,9 +3608,9 @@ dc.SetTextForeground(wx.BLACK) vw, vh = dc.GetTextExtent(value_text) dc.DrawText(")", text_offset_x + tw + vw + 2, text_offset_y) - + dc.SetUserScale(scalex, scaley) - + if self.rubberBand.IsShown(): self.rubberBand.Draw(dc) dc.EndDrawing()