]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/wxOGL.py
1 # 11/20/2003 - Jeff Grimmett (grimmtooth@softhome.net)
3 # o Updated for wx namespace
5 # 11/30/2003 - Jeff Grimmett (grimmtooth@softhome.net)
7 # o OGL's busted bigtime. Can't even use OGLInitialize() without a
8 # program error on w2k.
18 #----------------------------------------------------------------------
19 # This creates some pens and brushes that the OGL library uses.
23 #----------------------------------------------------------------------
25 class DiamondShape(ogl
.PolygonShape
):
26 def __init__(self
, w
=0.0, h
=0.0):
27 ogl
.PolygonShape
.__init
__(self
)
33 # Either ogl.RealPoints or 2-tuples of floats works.
35 #points = [ ogl.RealPoint(0.0, -h/2.0),
36 # ogl.RealPoint(w/2.0, 0.0),
37 # ogl.RealPoint(0.0, h/2.0),
38 # ogl.RealPoint(-w/2.0, 0.0),
40 points
= [ (0.0, -h
/2.0),
49 #----------------------------------------------------------------------
51 class RoundedRectangleShape(ogl
.RectangleShape
):
52 def __init__(self
, w
=0.0, h
=0.0):
53 ogl
.RectangleShape
.__init
__(self
, w
, h
)
54 self
.SetCornerRadius(-0.3)
57 #----------------------------------------------------------------------
59 class DividedShape(ogl
.DividedShape
):
60 def __init__(self
, width
, height
, canvas
):
61 ogl
.DividedShape
.__init
__(self
, width
, height
)
63 region1
= ogl
.ShapeRegion()
64 region1
.SetText('DividedShape')
65 region1
.SetProportions(0.0, 0.2)
66 region1
.SetFormatMode(ogl
.FORMAT_CENTRE_HORIZ
)
67 self
.AddRegion(region1
)
69 region2
= ogl
.ShapeRegion()
70 region2
.SetText('This is Region number two.')
71 region2
.SetProportions(0.0, 0.3)
72 region2
.SetFormatMode(ogl
.FORMAT_CENTRE_HORIZ|ogl
.FORMAT_CENTRE_VERT
)
73 self
.AddRegion(region2
)
75 region3
= ogl
.ShapeRegion()
76 region3
.SetText('Region 3\nwith embedded\nline breaks')
77 region3
.SetProportions(0.0, 0.5)
78 region3
.SetFormatMode(ogl
.FORMAT_NONE
)
79 self
.AddRegion(region3
)
82 self
.ReformatRegions(canvas
)
85 def ReformatRegions(self
, canvas
=None):
89 canvas
= self
.GetCanvas()
91 dc
= wx
.ClientDC(canvas
) # used for measuring
93 for region
in self
.GetRegions():
94 text
= region
.GetText()
95 self
.FormatText(dc
, text
, rnum
)
99 def OnSizingEndDragLeft(self
, pt
, x
, y
, keys
, attch
):
101 self
.base_OnSizingEndDragLeft(pt
, x
, y
, keys
, attch
)
102 self
.SetRegionSizes()
103 self
.ReformatRegions()
104 self
.GetCanvas().Refresh()
107 #----------------------------------------------------------------------
109 class MyEvtHandler(ogl
.ShapeEvtHandler
):
110 def __init__(self
, log
, frame
):
111 ogl
.ShapeEvtHandler
.__init
__(self
)
113 self
.statbarFrame
= frame
115 def UpdateStatusBar(self
, shape
):
116 x
,y
= shape
.GetX(), shape
.GetY()
117 width
, height
= shape
.GetBoundingBoxMax()
118 self
.statbarFrame
.SetStatusText("Pos: (%d,%d) Size: (%d, %d)" %
119 (x
, y
, width
, height
))
122 def OnLeftClick(self
, x
, y
, keys
= 0, attachment
= 0):
123 shape
= self
.GetShape()
124 print shape
.__class
__, shape
.GetClassName()
125 canvas
= shape
.GetCanvas()
126 dc
= wx
.ClientDC(canvas
)
130 shape
.Select(False, dc
)
134 shapeList
= canvas
.GetDiagram().GetShapeList()
139 # If we unselect it now then some of the objects in
140 # shapeList will become invalid (the control points are
141 # shapes too!) and bad things will happen...
144 shape
.Select(True, dc
)
152 self
.UpdateStatusBar(shape
)
155 def OnEndDragLeft(self
, x
, y
, keys
= 0, attachment
= 0):
156 shape
= self
.GetShape()
157 self
.base_OnEndDragLeft(x
, y
, keys
, attachment
)
159 if not shape
.Selected():
160 self
.OnLeftClick(x
, y
, keys
, attachment
)
162 self
.UpdateStatusBar(shape
)
165 def OnSizingEndDragLeft(self
, pt
, x
, y
, keys
, attch
):
166 self
.base_OnSizingEndDragLeft(pt
, x
, y
, keys
, attch
)
167 self
.UpdateStatusBar(self
.GetShape())
170 def OnMovePost(self
, dc
, x
, y
, oldX
, oldY
, display
):
171 self
.base_OnMovePost(dc
, x
, y
, oldX
, oldY
, display
)
172 self
.UpdateStatusBar(self
.GetShape())
175 def OnRightClick(self
, *dontcare
):
176 self
.log
.WriteText("%s\n" % self
.GetShape())
179 #----------------------------------------------------------------------
181 class TestWindow(ogl
.ShapeCanvas
):
182 def __init__(self
, parent
, log
, frame
):
183 ogl
.ShapeCanvas
.__init
__(self
, parent
)
187 self
.SetScrollbars(20, 20, maxWidth
/20, maxHeight
/20)
191 self
.SetBackgroundColour("LIGHT BLUE") #wx.WHITE)
192 self
.diagram
= ogl
.Diagram()
193 self
.SetDiagram(self
.diagram
)
194 self
.diagram
.SetCanvas(self
)
198 rRectBrush
= wx
.Brush("MEDIUM TURQUOISE", wx
.SOLID
)
199 dsBrush
= wx
.Brush("WHEAT", wx
.SOLID
)
203 100, 100, wx
.Pen(wx
.BLUE
, 3), wx
.GREEN_BRUSH
, "Circle"
207 ogl
.RectangleShape(85, 50),
208 305, 60, wx
.BLACK_PEN
, wx
.LIGHT_GREY_BRUSH
, "Rectangle"
211 ds
= self
.MyAddShape(
212 DividedShape(140, 150, self
),
213 495, 145, wx
.BLACK_PEN
, dsBrush
, ''
217 DiamondShape(90, 90),
218 345, 235, wx
.Pen(wx
.BLUE
, 3, wx
.DOT
), wx
.RED_BRUSH
, "Polygon"
222 RoundedRectangleShape(95,70),
223 140, 255, wx
.Pen(wx
.RED
, 2), rRectBrush
, "Rounded Rect"
226 bmp
= images
.getTest2Bitmap()
227 mask
= wx
.MaskColour(bmp
, wx
.BLUE
)
230 s
= ogl
.BitmapShape()
232 self
.MyAddShape(s
, 225, 150, None, None, "Bitmap")
234 dc
= wx
.ClientDC(self
)
237 for x
in range(len(self
.shapes
)):
238 fromShape
= self
.shapes
[x
]
239 if x
+1 == len(self
.shapes
):
240 toShape
= self
.shapes
[0]
242 toShape
= self
.shapes
[x
+1]
244 line
= ogl
.LineShape()
246 line
.SetPen(wx
.BLACK_PEN
)
247 line
.SetBrush(wx
.BLACK_BRUSH
)
248 line
.AddArrow(ogl
.ARROW_ARROW
)
249 line
.MakeLineControlPoints(2)
250 fromShape
.AddLine(line
, toShape
)
251 self
.diagram
.AddShape(line
)
254 # for some reason, the shapes have to be moved for the line to show up...
255 fromShape
.Move(dc
, fromShape
.GetX(), fromShape
.GetY())
257 wx
.EVT_WINDOW_DESTROY(self
, self
.OnDestroy
)
260 def MyAddShape(self
, shape
, x
, y
, pen
, brush
, text
):
261 shape
.SetDraggable(True, True)
262 shape
.SetCanvas(self
)
265 if pen
: shape
.SetPen(pen
)
266 if brush
: shape
.SetBrush(brush
)
267 if text
: shape
.AddText(text
)
268 #shape.SetShadowMode(ogl.SHADOW_RIGHT)
269 self
.diagram
.AddShape(shape
)
272 evthandler
= MyEvtHandler(self
.log
, self
.frame
)
273 evthandler
.SetShape(shape
)
274 evthandler
.SetPreviousHandler(shape
.GetEventHandler())
275 shape
.SetEventHandler(evthandler
)
277 self
.shapes
.append(shape
)
281 def OnDestroy(self
, evt
):
283 for shape
in self
.diagram
.GetShapeList():
284 if shape
.GetParent() == None:
285 shape
.SetCanvas(None)
288 self
.diagram
.Destroy()
291 def OnBeginDragLeft(self
, x
, y
, keys
):
292 self
.log
.write("OnBeginDragLeft: %s, %s, %s\n" % (x
, y
, keys
))
294 def OnEndDragLeft(self
, x
, y
, keys
):
295 self
.log
.write("OnEndDragLeft: %s, %s, %s\n" % (x
, y
, keys
))
298 #----------------------------------------------------------------------
300 def runTest(frame
, nb
, log
):
301 # This creates some pens and brushes that the OGL library uses.
302 # It should be called after the app object has been created, but
303 # before OGL is used.
306 win
= TestWindow(nb
, log
, frame
)
309 #----------------------------------------------------------------------
312 cleanup
= ogl
.OGLCleanUp
316 # when this module gets cleaned up then wxOGLCleanUp() will get called
321 The Object Graphics Library is a library supporting the creation and
322 manipulation of simple and complex graphic images on a canvas.
326 if __name__
== '__main__':
329 run
.main(['', os
.path
.basename(sys
.argv
[0])])