]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/wx/lib/colourchooser/canvas.py
3 Copyright (C) 2002 Michael Gilfix <mgilfix@eecs.tufts.edu>
5 This file is part of PyColourChooser.
7 This version of PyColourChooser is open source; you can redistribute it
8 and/or modify it under the licensed terms.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 # 12/14/2003 - Jeff Grimmett (grimmtooth@softhome.net)
17 # o 2.5 compatability update.
19 # 12/21/2003 - Jeff Grimmett (grimmtooth@softhome.net)
21 # o wxPyColorChooser -> PyColorChooser
22 # o wxPyColourChooser -> PyColourChooser
27 class BitmapBuffer(wx
.MemoryDC
):
28 """A screen buffer class.
30 This class implements a screen output buffer. Data is meant to
31 be drawn in the buffer class and then blitted directly to the
32 output device, or on-screen window.
34 def __init__(self
, width
, height
, colour
):
35 """Initialize the empty buffer object."""
36 wx
.MemoryDC
.__init
__(self
)
42 self
.bitmap
= wx
.EmptyBitmap(self
.width
, self
.height
)
43 self
.SelectObject(self
.bitmap
)
45 # Initialize the buffer to the background colour
46 self
.SetBackground(wx
.Brush(self
.colour
, wx
.SOLID
))
49 # Make each logical unit of the buffer equal to 1 pixel
50 self
.SetMapMode(wx
.MM_TEXT
)
53 """Returns the internal bitmap for direct drawing."""
56 class Canvas(wx
.Window
):
57 """A canvas class for arbitrary drawing.
59 The Canvas class implements a window that allows for drawing
60 arbitrary graphics. It implements a double buffer scheme and
61 blits the off-screen buffer to the window during paint calls
62 by the windowing system for speed.
64 Some other methods for determining the canvas colour and size
67 def __init__(self
, parent
, id,
68 pos
=wx
.DefaultPosition
,
70 style
=wx
.SIMPLE_BORDER
):
71 """Creates a canvas instance and initializes the off-screen
72 buffer. Also sets the handler for rendering the canvas
73 automatically via size and paint calls from the windowing
75 wx
.Window
.__init
__(self
, parent
, id, pos
, size
, style
)
77 # Perform an intial sizing
80 # Register event handlers
81 self
.Bind(wx
.EVT_SIZE
, self
.onSize
)
82 self
.Bind(wx
.EVT_PAINT
, self
.onPaint
)
84 def MakeNewBuffer(self
):
86 self
.buffer = BitmapBuffer(size
[0], size
[1],
87 self
.GetBackgroundColour())
89 def onSize(self
, event
):
90 """Perform actual redraw to off-screen buffer only when the
91 size of the canvas has changed. This saves a lot of computation
92 since the same image can be re-used, provided the canvas size
99 """Explicitly tells the canvas to redraw it's contents."""
103 """Re-draws the buffer contents on-screen."""
104 dc
= wx
.ClientDC(self
)
107 def onPaint(self
, event
):
108 """Renders the off-screen buffer on-screen."""
109 dc
= wx
.PaintDC(self
)
113 """Performs the blit of the buffer contents on-screen."""
114 width
, height
= self
.buffer.GetSize()
116 dc
.Blit((0, 0), (width
, height
), self
.buffer, (0, 0))
119 def GetBoundingRect(self
):
120 """Returns a tuple that contains the co-ordinates of the
121 top-left and bottom-right corners of the canvas."""
122 x
, y
= self
.GetPosition()
123 w
, h
= self
.GetSize()
124 return(x
, y
+ h
, x
+ w
, y
)
126 def DrawBuffer(self
):
127 """Actual drawing function for drawing into the off-screen
128 buffer. To be overrideen in the implementing class. Do nothing