X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1fded56b375bf7a4687af1cdb182899614c1b2a8..25b3661bd4cb44304418b93c0dee1d0dfb99765c:/wxPython/wx/lib/colourchooser/canvas.py diff --git a/wxPython/wx/lib/colourchooser/canvas.py b/wxPython/wx/lib/colourchooser/canvas.py index 829909b48e..d505ac344b 100644 --- a/wxPython/wx/lib/colourchooser/canvas.py +++ b/wxPython/wx/lib/colourchooser/canvas.py @@ -1,11 +1,130 @@ +""" +PyColourChooser +Copyright (C) 2002 Michael Gilfix -"""Renamer stub: provides a way to drop the wx prefix from wxPython objects.""" +This file is part of PyColourChooser. -__cvsid__ = "$Id$" -__revision__ = "$Revision$"[11:-2] +This version of PyColourChooser is open source; you can redistribute it +and/or modify it under the licensed terms. -from wx import _rename -from wxPython.lib.colourchooser import canvas -_rename(globals(), canvas.__dict__, modulename='lib.colourchooser.canvas') -del canvas -del _rename +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +""" + +# 12/14/2003 - Jeff Grimmett (grimmtooth@softhome.net) +# +# o 2.5 compatability update. +# +# 12/21/2003 - Jeff Grimmett (grimmtooth@softhome.net) +# +# o wxPyColorChooser -> PyColorChooser +# o wxPyColourChooser -> PyColourChooser +# + +import wx + +class BitmapBuffer(wx.MemoryDC): + """A screen buffer class. + + This class implements a screen output buffer. Data is meant to + be drawn in the buffer class and then blitted directly to the + output device, or on-screen window. + """ + def __init__(self, width, height, colour): + """Initialize the empty buffer object.""" + wx.MemoryDC.__init__(self) + + self.width = width + self.height = height + self.colour = colour + + self.bitmap = wx.EmptyBitmap(self.width, self.height) + self.SelectObject(self.bitmap) + + # Initialize the buffer to the background colour + self.SetBackground(wx.Brush(self.colour, wx.SOLID)) + self.Clear() + + # Make each logical unit of the buffer equal to 1 pixel + self.SetMapMode(wx.MM_TEXT) + + def GetBitmap(self): + """Returns the internal bitmap for direct drawing.""" + return self.bitmap + +class Canvas(wx.Window): + """A canvas class for arbitrary drawing. + + The Canvas class implements a window that allows for drawing + arbitrary graphics. It implements a double buffer scheme and + blits the off-screen buffer to the window during paint calls + by the windowing system for speed. + + Some other methods for determining the canvas colour and size + are also provided. + """ + def __init__(self, parent, id, + pos=wx.DefaultPosition, + size=wx.DefaultSize, + style=wx.SIMPLE_BORDER): + """Creates a canvas instance and initializes the off-screen + buffer. Also sets the handler for rendering the canvas + automatically via size and paint calls from the windowing + system.""" + wx.Window.__init__(self, parent, id, pos, size, style) + + # Perform an intial sizing + self.ReDraw() + + # Register event handlers + self.Bind(wx.EVT_SIZE, self.onSize) + self.Bind(wx.EVT_PAINT, self.onPaint) + + def MakeNewBuffer(self): + size = self.GetSize() + self.buffer = BitmapBuffer(size[0], size[1], + self.GetBackgroundColour()) + + def onSize(self, event): + """Perform actual redraw to off-screen buffer only when the + size of the canvas has changed. This saves a lot of computation + since the same image can be re-used, provided the canvas size + hasn't changed.""" + self.MakeNewBuffer() + self.DrawBuffer() + self.Refresh() + + def ReDraw(self): + """Explicitly tells the canvas to redraw it's contents.""" + self.onSize(None) + + def Refresh(self): + """Re-draws the buffer contents on-screen.""" + dc = wx.ClientDC(self) + self.Blit(dc) + + def onPaint(self, event): + """Renders the off-screen buffer on-screen.""" + dc = wx.PaintDC(self) + self.Blit(dc) + + def Blit(self, dc): + """Performs the blit of the buffer contents on-screen.""" + width, height = self.buffer.GetSize() + dc.BeginDrawing() + dc.Blit(0, 0, width, height, self.buffer, 0, 0) + dc.EndDrawing() + + def GetBoundingRect(self): + """Returns a tuple that contains the co-ordinates of the + top-left and bottom-right corners of the canvas.""" + x, y = self.GetPosition() + w, h = self.GetSize() + return(x, y + h, x + w, y) + + def DrawBuffer(self): + """Actual drawing function for drawing into the off-screen + buffer. To be overrideen in the implementing class. Do nothing + by default.""" + pass