wxWidgets/utils/wxPython/demo/wxOGL.py
Robin Dunn 2f90df854e 1. wxHtmlHelpController and related classes
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
1999-09-30 07:11:20 +00:00

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.
"""