2f90df854e
2. the C++ versions of wxSizer and firends, Python versions are 'depreciated' 3. wxPyEvent and wxPyCommandEvent, event classes that can carry some python objects through the event system and safely come back out again. 4. wxGridSizer and wxFlexGridSizer 5. wxValidator 6. wxPyOnDemandOutputWindow 7. several tweaks, fixes and additions of missing methods, etc. 8. and probably several other things I am forgetting since CVS was down so long... git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3758 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
213 lines
6.2 KiB
Python
213 lines
6.2 KiB
Python
|
|
from wxPython.wx import *
|
|
from wxPython.ogl import *
|
|
|
|
#----------------------------------------------------------------------
|
|
# This creates some pens and brushes that the OGL library uses.
|
|
|
|
wxOGLInitialize()
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
class DiamondShape(wxPolygonShape):
|
|
def __init__(self, w=0.0, h=0.0):
|
|
wxPolygonShape.__init__(self)
|
|
if w == 0.0:
|
|
w = 60.0
|
|
if h == 0.0:
|
|
h = 60.0
|
|
|
|
## Either wxRealPoints or 2-tuples of floats works.
|
|
|
|
#points = [ wxRealPoint(0.0, -h/2.0),
|
|
# wxRealPoint(w/2.0, 0.0),
|
|
# wxRealPoint(0.0, h/2.0),
|
|
# wxRealPoint(-w/2.0, 0.0),
|
|
# ]
|
|
points = [ (0.0, -h/2.0),
|
|
(w/2.0, 0.0),
|
|
(0.0, h/2.0),
|
|
(-w/2.0, 0.0),
|
|
]
|
|
|
|
self.Create(points)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
class RoundedRectangleShape(wxRectangleShape):
|
|
def __init__(self, w=0.0, h=0.0):
|
|
wxRectangleShape.__init__(self, w, h)
|
|
self.SetCornerRadius(-0.3)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
class MyEvtHandler(wxShapeEvtHandler):
|
|
def __init__(self, log, frame):
|
|
wxShapeEvtHandler.__init__(self)
|
|
self.log = log
|
|
self.statbarFrame = frame
|
|
|
|
|
|
def UpdateStatusBar(self, shape):
|
|
x,y = shape.GetX(), shape.GetY()
|
|
width, height = shape.GetBoundingBoxMax()
|
|
self.statbarFrame.SetStatusText("Pos: (%d,%d) Size: (%d, %d)" %
|
|
(x, y, width, height))
|
|
|
|
|
|
def OnLeftClick(self, x, y, keys = 0, attachment = 0):
|
|
shape = self.GetShape()
|
|
canvas = shape.GetCanvas()
|
|
dc = wxClientDC(canvas)
|
|
canvas.PrepareDC(dc)
|
|
|
|
if shape.Selected():
|
|
shape.Select(false, dc)
|
|
canvas.Redraw(dc)
|
|
else:
|
|
redraw = false
|
|
shapeList = canvas.GetDiagram().GetShapeList()
|
|
toUnselect = []
|
|
for s in shapeList:
|
|
if s.Selected():
|
|
# If we unselect it now then some of the objects in
|
|
# shapeList will become invalid (the control points are
|
|
# shapes too!) and bad things will happen...
|
|
toUnselect.append(s)
|
|
|
|
shape.Select(true, dc)
|
|
|
|
if toUnselect:
|
|
for s in toUnselect:
|
|
s.Select(false, dc)
|
|
canvas.Redraw(dc)
|
|
|
|
self.UpdateStatusBar(shape)
|
|
|
|
|
|
def OnEndDragLeft(self, x, y, keys = 0, attachment = 0):
|
|
shape = self.GetShape()
|
|
self.base_OnEndDragLeft(x, y, keys, attachment)
|
|
if not shape.Selected():
|
|
self.OnLeftClick(x, y, keys, attachment)
|
|
self.UpdateStatusBar(shape)
|
|
|
|
|
|
def OnSize(self, x, y):
|
|
self.base_OnSize(x, y)
|
|
self.UpdateStatusBar(self.GetShape())
|
|
|
|
|
|
# def OnMovePost(self, dc, x, y, oldX, oldY, display):
|
|
# self.base_OnMovePost(dc, x, y, oldX, oldY, display)
|
|
# self.UpdateStatusBar(self.GetShape())
|
|
|
|
|
|
def OnRightClick(self, *dontcare):
|
|
self.log.WriteText("%s\n" % self.GetShape())
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
class TestWindow(wxShapeCanvas):
|
|
def __init__(self, parent, log, frame):
|
|
wxShapeCanvas.__init__(self, parent)
|
|
|
|
self.log = log
|
|
self.frame = frame
|
|
self.SetBackgroundColour(wxWHITE)
|
|
self.diagram = wxDiagram()
|
|
self.SetDiagram(self.diagram)
|
|
self.diagram.SetCanvas(self)
|
|
self.shapes = []
|
|
|
|
rRectBrush = wxBrush(wxNamedColour("MEDIUM TURQUOISE"), wxSOLID)
|
|
|
|
self.MyAddShape(wxCircleShape(80), 100, 100, wxPen(wxBLUE, 3), wxGREEN_BRUSH, "Circle")
|
|
self.MyAddShape(wxRectangleShape(85, 50), 305, 60, wxBLACK_PEN, wxLIGHT_GREY_BRUSH, "Rectangle")
|
|
self.MyAddShape(DiamondShape(90, 90), 345, 235, wxPen(wxBLUE, 3, wxDOT), wxRED_BRUSH, "Polygon")
|
|
self.MyAddShape(RoundedRectangleShape(95,70), 140, 255, wxPen(wxRED, 1), rRectBrush, "Rounded Rect")
|
|
|
|
dc = wxClientDC(self)
|
|
self.PrepareDC(dc)
|
|
for x in range(len(self.shapes)):
|
|
fromShape = self.shapes[x]
|
|
if x+1 == len(self.shapes):
|
|
toShape = self.shapes[0]
|
|
else:
|
|
toShape = self.shapes[x+1]
|
|
line = wxLineShape()
|
|
line.SetCanvas(self)
|
|
line.SetPen(wxBLACK_PEN)
|
|
line.SetBrush(wxBLACK_BRUSH)
|
|
line.AddArrow(ARROW_ARROW)
|
|
line.MakeLineControlPoints(2)
|
|
fromShape.AddLine(line, toShape)
|
|
self.diagram.AddShape(line)
|
|
line.Show(true)
|
|
|
|
# for some reason, the shapes have to be moved for the line to show up...
|
|
fromShape.Move(dc, fromShape.GetX(), fromShape.GetY())
|
|
|
|
|
|
|
|
def MyAddShape(self, shape, x, y, pen, brush, text):
|
|
shape.SetDraggable(true)
|
|
shape.SetCanvas(self)
|
|
shape.SetX(x)
|
|
shape.SetY(y)
|
|
shape.SetPen(pen)
|
|
shape.SetBrush(brush)
|
|
shape.AddText(text)
|
|
#shape.SetShadowMode(SHADOW_RIGHT)
|
|
self.diagram.AddShape(shape)
|
|
shape.Show(true)
|
|
|
|
evthandler = MyEvtHandler(self.log, self.frame)
|
|
evthandler.SetShape(shape)
|
|
evthandler.SetPreviousHandler(shape.GetEventHandler())
|
|
shape.SetEventHandler(evthandler)
|
|
|
|
self.shapes.append(shape)
|
|
|
|
|
|
def __del__(self):
|
|
for shape in self.diagram.GetShapeList():
|
|
if shape.GetParent() == None:
|
|
shape.SetCanvas(None)
|
|
shape.Destroy()
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
def runTest(frame, nb, log):
|
|
win = TestWindow(nb, log, frame)
|
|
return win
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
class __Cleanup:
|
|
cleanup = wxOGLCleanUp
|
|
def __del__(self):
|
|
self.cleanup()
|
|
|
|
# when this module gets cleaned up then wxOGLCleanUp() will get called
|
|
__cu = __Cleanup()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
overview = """\
|
|
The Object Graphics Library is a library supporting the creation and
|
|
manipulation of simple and complex graphic images on a canvas.
|
|
|
|
"""
|
|
|
|
|