📄 _composit.py
字号:
return None
def ContainsDivision(self, division):
"""Returns TRUE if division is a descendant of this container."""
if division in self._divisions:
return True
for child in self._children:
if isinstance(child, CompositeShape):
return child.ContainsDivision(division)
return False
def GetDivisions(self):
"""Return the list of divisions."""
return self._divisions
def GetConstraints(self):
"""Return the list of constraints."""
return self._constraints
# A division object is a composite with special properties,
# to be used for containment. It's a subdivision of a container.
# A containing node image consists of a composite with a main child shape
# such as rounded rectangle, plus a list of division objects.
# It needs to be a composite because a division contains pieces
# of diagram.
# NOTE a container has at least one wxDivisionShape for consistency.
# This can be subdivided, so it turns into two objects, then each of
# these can be subdivided, etc.
DIVISION_SIDE_NONE =0
DIVISION_SIDE_LEFT =1
DIVISION_SIDE_TOP =2
DIVISION_SIDE_RIGHT =3
DIVISION_SIDE_BOTTOM =4
originalX = 0.0
originalY = 0.0
originalW = 0.0
originalH = 0.0
class DivisionControlPoint(ControlPoint):
def __init__(self, the_canvas, object, size, the_xoffset, the_yoffset, the_type):
ControlPoint.__init__(self, the_canvas, object, size, the_xoffset, the_yoffset, the_type)
self.SetEraseObject(False)
# Implement resizing of canvas object
def OnDragLeft(self, draw, x, y, keys = 0, attachment = 0):
ControlPoint.OnDragLeft(self, draw, x, y, keys, attachment)
def OnBeginDragLeft(self, x, y, keys = 0, attachment = 0):
global originalX, originalY, originalW, originalH
originalX = self._shape.GetX()
originalY = self._shape.GetY()
originalW = self._shape.GetWidth()
originalH = self._shape.GetHeight()
ControlPoint.OnBeginDragLeft(self, x, y, keys, attachment)
def OnEndDragLeft(self, x, y, keys = 0, attachment = 0):
ControlPoint.OnEndDragLeft(self, x, y, keys, attachment)
dc = wx.ClientDC(self.GetCanvas())
self.GetCanvas().PrepareDC(dc)
division = self._shape
divisionParent = division.GetParent()
# Need to check it's within the bounds of the parent composite
x1 = divisionParent.GetX() - divisionParent.GetWidth() / 2.0
y1 = divisionParent.GetY() - divisionParent.GetHeight() / 2.0
x2 = divisionParent.GetX() + divisionParent.GetWidth() / 2.0
y2 = divisionParent.GetY() + divisionParent.GetHeight() / 2.0
# Need to check it has not made the division zero or negative
# width / height
dx1 = division.GetX() - division.GetWidth() / 2.0
dy1 = division.GetY() - division.GetHeight() / 2.0
dx2 = division.GetX() + division.GetWidth() / 2.0
dy2 = division.GetY() + division.GetHeight() / 2.0
success = True
if division.GetHandleSide() == DIVISION_SIDE_LEFT:
if x <= x1 or x >= x2 or x >= dx2:
success = False
# Try it out first...
elif not division.ResizeAdjoining(DIVISION_SIDE_LEFT, x, True):
success = False
else:
division.ResizeAdjoining(DIVISION_SIDE_LEFT, x, False)
elif division.GetHandleSide() == DIVISION_SIDE_TOP:
if y <= y1 or y >= y2 or y >= dy2:
success = False
elif not division.ResizeAdjoining(DIVISION_SIDE_TOP, y, True):
success = False
else:
division.ResizingAdjoining(DIVISION_SIDE_TOP, y, False)
elif division.GetHandleSide() == DIVISION_SIDE_RIGHT:
if x <= x1 or x >= x2 or x <= dx1:
success = False
elif not division.ResizeAdjoining(DIVISION_SIDE_RIGHT, x, True):
success = False
else:
division.ResizeAdjoining(DIVISION_SIDE_RIGHT, x, False)
elif division.GetHandleSide() == DIVISION_SIDE_BOTTOM:
if y <= y1 or y >= y2 or y <= dy1:
success = False
elif not division.ResizeAdjoining(DIVISION_SIDE_BOTTOM, y, True):
success = False
else:
division.ResizeAdjoining(DIVISION_SIDE_BOTTOM, y, False)
if not success:
division.SetSize(originalW, originalH)
division.Move(dc, originalX, originalY)
divisionParent.Draw(dc)
division.GetEventHandler().OnDrawControlPoints(dc)
DIVISION_MENU_SPLIT_HORIZONTALLY =1
DIVISION_MENU_SPLIT_VERTICALLY =2
DIVISION_MENU_EDIT_LEFT_EDGE =3
DIVISION_MENU_EDIT_TOP_EDGE =4
DIVISION_MENU_EDIT_RIGHT_EDGE =5
DIVISION_MENU_EDIT_BOTTOM_EDGE =6
DIVISION_MENU_DELETE_ALL =7
class PopupDivisionMenu(wx.Menu):
def __init__(self):
wx.Menu.__init__(self)
self.Append(DIVISION_MENU_SPLIT_HORIZONTALLY,"Split horizontally")
self.Append(DIVISION_MENU_SPLIT_VERTICALLY,"Split vertically")
self.AppendSeparator()
self.Append(DIVISION_MENU_EDIT_LEFT_EDGE,"Edit left edge")
self.Append(DIVISION_MENU_EDIT_TOP_EDGE,"Edit top edge")
wx.EVT_MENU_RANGE(self, DIVISION_MENU_SPLIT_HORIZONTALLY, DIVISION_MENU_EDIT_BOTTOM_EDGE, self.OnMenu)
def SetClientData(self, data):
self._clientData = data
def GetClientData(self):
return self._clientData
def OnMenu(self, event):
division = self.GetClientData()
if event.GetId() == DIVISION_MENU_SPLIT_HORIZONTALLY:
division.Divide(wx.HORIZONTAL)
elif event.GetId() == DIVISION_MENU_SPLIT_VERTICALLY:
division.Divide(wx.VERTICAL)
elif event.GetId() == DIVISION_MENU_EDIT_LEFT_EDGE:
division.EditEdge(DIVISION_SIDE_LEFT)
elif event.GetId() == DIVISION_MENU_EDIT_TOP_EDGE:
division.EditEdge(DIVISION_SIDE_TOP)
class DivisionShape(CompositeShape):
"""A division shape is like a composite in that it can contain further
objects, but is used exclusively to divide another shape into regions,
or divisions. A wxDivisionShape is never free-standing.
Derived from:
wxCompositeShape
"""
def __init__(self):
CompositeShape.__init__(self)
self.SetSensitivityFilter(OP_CLICK_LEFT | OP_CLICK_RIGHT | OP_DRAG_RIGHT)
self.SetCentreResize(False)
self.SetAttachmentMode(True)
self._leftSide = None
self._rightSide = None
self._topSide = None
self._bottomSide = None
self._handleSide = DIVISION_SIDE_NONE
self._leftSidePen = wx.BLACK_PEN
self._topSidePen = wx.BLACK_PEN
self._leftSideColour = "BLACK"
self._topSideColour = "BLACK"
self._leftSideStyle = "Solid"
self._topSideStyle = "Solid"
self.ClearRegions()
def SetLeftSide(self, shape):
"""Set the the division on the left side of this division."""
self._leftSide = shape
def SetTopSide(self, shape):
"""Set the the division on the top side of this division."""
self._topSide = shape
def SetRightSide(self, shape):
"""Set the the division on the right side of this division."""
self._rightSide = shape
def SetBottomSide(self, shape):
"""Set the the division on the bottom side of this division."""
self._bottomSide = shape
def GetLeftSide(self):
"""Return the division on the left side of this division."""
return self._leftSide
def GetTopSide(self):
"""Return the division on the top side of this division."""
return self._topSide
def GetRightSide(self):
"""Return the division on the right side of this division."""
return self._rightSide
def GetBottomSide(self):
"""Return the division on the bottom side of this division."""
return self._bottomSide
def SetHandleSide(self, side):
"""Sets the side which the handle appears on.
Either DIVISION_SIDE_LEFT or DIVISION_SIDE_TOP.
"""
self._handleSide = side
def GetHandleSide(self):
"""Return the side which the handle appears on."""
return self._handleSide
def SetLeftSidePen(self, pen):
"""Set the colour for drawing the left side of the division."""
self._leftSidePen = pen
def SetTopSidePen(self, pen):
"""Set the colour for drawing the top side of the division."""
self._topSidePen = pen
def GetLeftSidePen(self):
"""Return the pen used for drawing the left side of the division."""
return self._leftSidePen
def GetTopSidePen(self):
"""Return the pen used for drawing the top side of the division."""
return self._topSidePen
def GetLeftSideColour(self):
"""Return the colour used for drawing the left side of the division."""
return self._leftSideColour
def GetTopSideColour(self):
"""Return the colour used for drawing the top side of the division."""
return self._topSideColour
def SetLeftSideColour(self, colour):
"""Set the colour for drawing the left side of the division."""
self._leftSideColour = colour
def SetTopSideColour(self, colour):
"""Set the colour for drawing the top side of the division."""
self._topSideColour = colour
def GetLeftSideStyle(self):
"""Return the style used for the left side of the division."""
return self._leftSideStyle
def GetTopSideStyle(self):
"""Return the style used for the top side of the division."""
return self._topSideStyle
def SetLeftSideStyle(self, style):
self._leftSideStyle = style
def SetTopSideStyle(self, style):
self._lefttopStyle = style
def OnDraw(self, dc):
dc.SetBrush(wx.TRANSPARENT_BRUSH)
dc.SetBackgroundMode(wx.TRANSPARENT)
x1 = self.GetX() - self.GetWidth() / 2.0
y1 = self.GetY() - self.GetHeight() / 2.0
x2 = self.GetX() + self.GetWidth() / 2.0
y2 = self.GetY() + self.GetHeight() / 2.0
# Should subtract 1 pixel if drawing under Windows
if sys.platform[:3] == "win":
y2 -= 1
if self._leftSide:
dc.SetPen(self._leftSidePen)
dc.DrawLine(x1, y2, x1, y1)
if self._topSide:
dc.SetPen(self._topSidePen)
dc.DrawLine(x1, y1, x2, y1)
# For testing purposes, draw a rectangle so we know
# how big the division is.
#dc.SetBrush(wx.RED_BRUSH)
#dc.DrawRectangle(x1, y1, self.GetWidth(), self.GetHeight())
def OnDrawContents(self, dc):
CompositeShape.OnDrawContents(self, dc)
def OnMovePre(self, dc, x, y, oldx, oldy, display = True):
diffX = x - oldx
diffY = y - oldy
for object in self._children:
object.Erase(dc)
object.Move(dc, object.GetX() + diffX, object.GetY() + diffY, display)
return True
def OnDragLeft(self, draw, x, y, keys = 0, attachment = 0):
if self._sensitivity & OP_DRAG_LEFT != OP_DRAG_LEFT:
if self._parent:
hit = self._parent.HitTest(x, y)
if hit:
attachment, dist = hit
self._parent.GetEventHandler().OnDragLeft(draw, x, y, keys, attachment)
return
Shape.OnDragLeft(self, draw, x, y, keys, attachment)
def OnBeginDragLeft(self, x, y, keys = 0, attachment = 0):
if self._sensitivity & OP_DRAG_LEFT != OP_DRAG_LEFT:
if self._parent:
hit = self._parent.HitTest(x, y)
if hit:
attachment, dist = hit
self._parent.GetEventHandler().OnBeginDragLeft(x, y, keys, attachment)
return
Shape.OnBeginDragLeft(x, y, keys, attachment)
def OnEndDragLeft(self, x, y, keys = 0, attachment = 0):
if self._canvas.HasCapture():
self._canvas.ReleaseMouse()
if self._sensitivity & OP_DRAG_LEFT != OP_DRAG_LEFT:
if self._parent:
hit = self._parent.HitTest(x, y)
if hit:
attachment, dist = hit
self._parent.GetEventHandler().OnEndDragLeft(x, y, keys, attachment)
return
dc = wx.ClientDC(self.GetCanvas())
self.GetCanvas().PrepareDC(dc)
dc.SetLogicalFunction(wx.COPY)
self._xpos, self._ypos = self._canvas.Snap(self._xpos, self._ypos)
self.GetEventHandler().OnMovePre(dc, x, y, self._oldX, self._oldY)
self.ResetControlPoints()
self.Draw(dc)
self.MoveLinks(dc)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -