📄 abstracteditor.py
字号:
self._canvas.Refresh() break def GetShape(self, model): for shape in self._diagram.GetShapeList(): if hasattr(shape, "GetModel") and shape.GetModel() == model: return shape return None def GetShapeCount(self): return self._diagram.GetCount() def GetSelection(self): return filter(lambda shape: shape.Selected(), self._diagram.GetShapeList()) def SetSelection(self, models, extendSelect = False): dc = wx.ClientDC(self._canvas) self._canvas.PrepareDC(dc) update = False if not isinstance(models, type([])) and not isinstance(models, type(())): models = [models] for shape in self._diagram.GetShapeList(): if hasattr(shape, "GetModel"): if shape.Selected() and not shape.GetModel() in models: # was selected, but not in new list, so deselect, unless extend select if not extendSelect: shape.Select(False, dc) update = True elif not shape.Selected() and shape.GetModel() in models: # was not selected and in new list, so select shape.Select(True, dc) update = True elif extendSelect and shape.Selected() and shape.GetModel() in models: # was selected, but extend select means to deselect shape.Select(False, dc) update = True if update: self._canvas.Redraw(dc) def BringToFront(self, shape): if shape.GetParent() and isinstance(shape.GetParent(), ogl.CompositeShape): self._diagram.RemoveShape(shape.GetParent()) self._diagram.AddShape(shape.GetParent()) else: self._diagram.RemoveShape(shape) self._diagram.AddShape(shape) def SendToBack(self, shape): if shape.GetParent() and isinstance(shape.GetParent(), ogl.CompositeShape): self._diagram.RemoveShape(shape.GetParent()) self._diagram.InsertShape(shape.GetParent()) else: self._diagram.RemoveShape(shape) self._diagram.InsertShape(shape) def ScrollVisible(self, shape): if not shape: return xUnit, yUnit = self._canvas.GetScrollPixelsPerUnit() scrollX, scrollY = self._canvas.GetViewStart() # in scroll units scrollW, scrollH = self._canvas.GetSize() # in pixels w, h = shape.GetBoundingBoxMax() # in pixels x = shape.GetX() - w/2 # convert to upper left coordinate from center y = shape.GetY() - h/2 # convert to upper left coordinate from center if x >= scrollX*xUnit and x <= scrollX*xUnit + scrollW: # don't scroll if already visible x = -1 else: x = x/xUnit if y >= scrollY*yUnit and y <= scrollY*yUnit + scrollH: # don't scroll if already visible y = -1 else: y = y/yUnit self._canvas.Scroll(x, y) # in scroll units def SetPropertyShape(self, shape): # no need to highlight if no PropertyService is running propertyService = wx.GetApp().GetService(PropertyService.PropertyService) if not propertyService: return if shape == self._propShape: return if hasattr(shape, "GetPropertyShape"): shape = shape.GetPropertyShape() dc = wx.ClientDC(self._canvas) self._canvas.PrepareDC(dc) dc.BeginDrawing() # erase old selection if it still exists if self._propShape and self._propShape in self._diagram.GetShapeList(): if hasattr(self._propShape, "DEFAULT_BRUSH"): self._propShape.SetBrush(self._propShape.DEFAULT_BRUSH) else: self._propShape.SetBrush(self._brush) if (self._propShape._textColourName in ["BLACK", "WHITE"]): # Would use GetTextColour() but it is broken self._propShape.SetTextColour("BLACK", 0) self._propShape.Draw(dc) # set new selection self._propShape = shape # draw new selection if self._propShape and self._propShape in self._diagram.GetShapeList(): if self.HasFocus(): self._propShape.SetBrush(SELECT_BRUSH) else: self._propShape.SetBrush(INACTIVE_SELECT_BRUSH) if (self._propShape._textColourName in ["BLACK", "WHITE"]): # Would use GetTextColour() but it is broken self._propShape.SetTextColour("WHITE", 0) self._propShape.Draw(dc) dc.EndDrawing() def FocusColorPropertyShape(self, gotFocus=False): # no need to change highlight if no PropertyService is running propertyService = wx.GetApp().GetService(PropertyService.PropertyService) if not propertyService: return if not self._propShape: return dc = wx.ClientDC(self._canvas) self._canvas.PrepareDC(dc) dc.BeginDrawing() # draw deactivated selection if self._propShape and self._propShape in self._diagram.GetShapeList(): if gotFocus: self._propShape.SetBrush(SELECT_BRUSH) else: self._propShape.SetBrush(INACTIVE_SELECT_BRUSH) if (self._propShape._textColourName in ["BLACK", "WHITE"]): # Would use GetTextColour() but it is broken self._propShape.SetTextColour("WHITE", 0) self._propShape.Draw(dc) if hasattr(self._propShape, FORCE_REDRAW_METHOD): self._propShape.ForceRedraw() dc.EndDrawing() #---------------------------------------------------------------------------- # Property Service methods #---------------------------------------------------------------------------- def GetPropertyModel(self): if hasattr(self, "_propModel"): return self._propModel return None def SetPropertyModel(self, model): # no need to set the model if no PropertyService is running propertyService = wx.GetApp().GetService(PropertyService.PropertyService) if not propertyService: return if hasattr(self, "_propModel") and model == self._propModel: return self._propModel = model propertyService.LoadProperties(self._propModel, self.GetDocument())class EditorCanvasShapeMixin: def GetModel(self): return self._model def SetModel(self, model): self._model = modelclass EditorCanvasShapeEvtHandler(ogl.ShapeEvtHandler): """ wxBug: Bug in OLG package. With wxShape.SetShadowMode() turned on, when we set the size, the width/height is larger by 6 pixels. Need to subtract this value from width and height when we resize the object. """ SHIFT_KEY = 1 CONTROL_KEY = 2 def __init__(self, view): ogl.ShapeEvtHandler.__init__(self) self._view = view def OnLeftClick(self, x, y, keys = 0, attachment = 0): shape = self.GetShape() if hasattr(shape, "GetModel"): # Workaround, on drag, we should deselect all other objects and select the clicked on object model = shape.GetModel() else: shape = shape.GetParent() if shape: model = shape.GetModel() if model: self._view.SetSelection(model, keys == self.SHIFT_KEY or keys == self.CONTROL_KEY) self._view.SetPropertyShape(shape) self._view.SetPropertyModel(model) def OnEndDragLeft(self, x, y, keys = 0, attachment = 0): ogl.ShapeEvtHandler.OnEndDragLeft(self, x, y, keys, attachment) shape = self.GetShape() if hasattr(shape, "GetModel"): # Workaround, on drag, we should deselect all other objects and select the clicked on object model = shape.GetModel() else: parentShape = shape.GetParent() if parentShape: model = parentShape.GetModel() self._view.SetSelection(model, keys == self.SHIFT_KEY or keys == self.CONTROL_KEY) def OnMovePre(self, dc, x, y, oldX, oldY, display): """ Prevent objects from being dragged outside of viewable area """ if (x < 0) or (y < 0) or (x > self._view._maxWidth) or (y > self._view._maxHeight): return False return ogl.ShapeEvtHandler.OnMovePre(self, dc, x, y, oldX, oldY, display) def OnMovePost(self, dc, x, y, oldX, oldY, display): """ Update the model's record of where the shape should be. Also enable redo/undo. """ if x == oldX and y == oldY: return if not self._view.GetDocument(): return shape = self.GetShape() if isinstance(shape, EditorCanvasShapeMixin) and shape.Draggable(): model = shape.GetModel() if hasattr(model, "getEditorBounds") and model.getEditorBounds(): x, y, w, h = model.getEditorBounds() newX = shape.GetX() - shape.GetBoundingBoxMax()[0] / 2 newY = shape.GetY() - shape.GetBoundingBoxMax()[1] / 2 newWidth = shape.GetBoundingBoxMax()[0] newHeight = shape.GetBoundingBoxMax()[1] if shape._shadowMode != ogl.SHADOW_NONE: newWidth -= shape._shadowOffsetX newHeight -= shape._shadowOffsetY newbounds = (newX, newY, newWidth, newHeight) if x != newX or y != newY or w != newWidth or h != newHeight: self._view.GetDocument().GetCommandProcessor().Submit(EditorCanvasUpdateShapeBoundariesCommand(self._view.GetDocument(), model, newbounds)) def Draw(self, dc): passclass EditorCanvasUpdateShapeBoundariesCommand(wx.lib.docview.Command): def __init__(self, canvasDocument, model, newbounds): wx.lib.docview.Command.__init__(self, canUndo = True) self._canvasDocument = canvasDocument self._model = model self._oldbounds = model.getEditorBounds() self._newbounds = newbounds def GetName(self): name = self._canvasDocument.GetNameForObject(self._model) if not name: name = "" print "ERROR: AbstractEditor.EditorCanvasUpdateShapeBoundariesCommand.GetName: unable to get name for ", self._model return _("Move/Resize %s") % name def Do(self): return self._canvasDocument.UpdateEditorBoundaries(self._model, self._newbounds) def Undo(self): return self._canvasDocument.UpdateEditorBoundaries(self._model, self._oldbounds)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -