X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/25832b3f2bd566e5b68f066d97e0e79d2bbbd17f..66394199cf03f0e9a3a675fe9829d31463ad38bb:/wxPython/demo/ColourDB.py diff --git a/wxPython/demo/ColourDB.py b/wxPython/demo/ColourDB.py index 1f0978818d..b3b08ce878 100644 --- a/wxPython/demo/ColourDB.py +++ b/wxPython/demo/ColourDB.py @@ -1,43 +1,63 @@ -from wxPython.wx import * -from wxPython.lib import colourdb +import wx +import wx.lib.colourdb import images -# This loads a whole bunch of new color names and values -# into wxTheColourDatabase - -colourdb.updateColourDB() - #---------------------------------------------------------------------- -class TestWindow(wxScrolledWindow): +class TestWindow(wx.ScrolledWindow): def __init__(self, parent): - wxScrolledWindow.__init__(self, parent, -1) + wx.ScrolledWindow.__init__(self, parent, -1) + + # Populate our color list + self.clrList = wx.lib.colourdb.getColourList() - self.clrList = colourdb.getColourList() + # Just for style points, we'll use this as a background image. + #self.clrList.sort() self.bg_bmp = images.getGridBGBitmap() - EVT_PAINT(self, self.OnPaint) - EVT_ERASE_BACKGROUND(self, self.OnEraseBackground) + # Event handlers + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + + # This could also be done by getting the window's default font; + # either way, we need to have a font loaded for later on. #self.SetBackgroundColour("WHITE") + self.font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL) - self.font = wxFont(10, wxSWISS, wxNORMAL, wxNORMAL) - dc = wxClientDC(self) + # Create drawing area and set its font + dc = wx.ClientDC(self) dc.SetFont(self.font) - w,h,d,e = dc.GetFullTextExtent("Wy") # a wide character and one that decends + # Using GetFullTextExtent(), we calculate a basic 'building block' + # that will be used to draw a depiction of the color list. We're + # using 'Wy' as the model becuase 'W' is a wide character and 'y' + # has a descender. This constitutes a 'worst case' scenario, which means + # that no matter what we draw later, text-wise, we'll have room for it + w,h,d,e = dc.GetFullTextExtent("Wy") + + # Height plus descender self.textHeight = h + d + + # Pad a little bit self.lineHeight = self.textHeight + 5 + + # ... and this is the basic width. self.cellWidth = w + # jmg 11/8/03: why 24? numCells = 24 - self.SetScrollbars(self.cellWidth, self.lineHeight, numCells, len(self.clrList) + 2) + + # 'prep' our scroll bars. + self.SetScrollbars( + self.cellWidth, self.lineHeight, numCells, len(self.clrList) + 2 + ) + # tile the background bitmap loaded in __init__() def TileBackground(self, dc): - # tile the background bitmap sz = self.GetClientSize() w = self.bg_bmp.GetWidth() h = self.bg_bmp.GetHeight() @@ -48,23 +68,29 @@ class TestWindow(wxScrolledWindow): dx, dy = (spx * vsx) % w, (spy * vsy) % h x = -dx + while x < sz.width: y = -dy while y < sz.height: - dc.DrawBitmap(self.bg_bmp, x, y) + dc.DrawBitmap(self.bg_bmp, (x, y)) y = y + h - x = x + w + x = x + w + # Redraw the background over a 'damaged' area. def OnEraseBackground(self, evt): dc = evt.GetDC() + if not dc: - dc = wxClientDC(self) + dc = wx.ClientDC(self) + rect = self.GetUpdateRegion().GetBox() + dc.SetClippingRect(rect) + self.TileBackground(dc) def OnPaint(self, evt): - dc = wxPaintDC(self) + dc = wx.PaintDC(self) self.PrepareDC(dc) self.Draw(dc, self.GetUpdateRegion(), self.GetViewStart()) @@ -72,13 +98,15 @@ class TestWindow(wxScrolledWindow): def Draw(self, dc, rgn=None, vs=None): dc.BeginDrawing() dc.SetTextForeground("BLACK") - dc.SetPen(wxPen("BLACK", 1, wxSOLID)) + dc.SetPen(wx.Pen("BLACK", 1, wx.SOLID)) dc.SetFont(self.font) colours = self.clrList numColours = len(colours) if rgn: - # determine the subset that has been exposed and needs drawn + # determine the subset of the color list that has been exposed + # and needs drawn. This is based on all the precalculation we + # did in __init__() rect = rgn.GetBox() pixStart = vs[1]*self.lineHeight + rect.y pixStop = pixStart + rect.height @@ -86,29 +114,87 @@ class TestWindow(wxScrolledWindow): stop = pixStop / self.lineHeight else: start = 0 - stop = len(numColours) + stop = numColours for line in range(max(0,start), min(stop,numColours)): clr = colours[line] y = (line+1) * self.lineHeight + 2 - dc.DrawText(clr, self.cellWidth, y) - brush = wxBrush(clr, wxSOLID) + # Updated for 2.5 - now takes tuple for pos + dc.DrawText(clr, (self.cellWidth, y)) + + brush = wx.Brush(clr, wx.SOLID) dc.SetBrush(brush) - dc.DrawRectangle(12 * self.cellWidth, y, 6 * self.cellWidth, self.textHeight) + dc.DrawRectangle((12 * self.cellWidth, y), + (6 * self.cellWidth, self.textHeight)) dc.EndDrawing() +# On wxGTK there needs to be a panel under wx.ScrolledWindows if they are +# going to be in a wxNotebook. And, in this demo, we are. +class TestPanel(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent, -1) + self.win = TestWindow(self) + self.Bind(wx.EVT_SIZE, self.OnSize) + + + def OnSize(self, evt): + self.win.SetSize(evt.GetSize()) + + #---------------------------------------------------------------------- def runTest(frame, nb, log): - win = TestWindow(nb) + # This loads a whole bunch of new color names and values + # into TheColourDatabase + # + # Note 11/24/03 - jg - I moved this into runTest() because + # there must be a wx.App existing before this function + # can be called - this is a change from 2.4 -> 2.5. + wx.lib.colourdb.updateColourDB() + + win = TestPanel(nb) + return win #---------------------------------------------------------------------- overview = """ + + +ColourDB + +

wxWindows maintains a database of standard RGB colours for a predefined +set of named colours (such as "BLACK'', "LIGHT GREY''). The application +may add to this set if desired by using Append. There is only one instance +of this class: TheColourDatabase. + +

The colourdb library is a lightweight API that pre-defines +a multitude of colors for you to use 'out of the box', and this demo serves +to show you these colors (it also serves as a handy reference). + +

A secondary benefit of this demo is the use of the ScrolledWindow class +and the use of various *DC() classes, including background tiling and the use of +font data to generate a "building block" type of construct for repetitive use. + +

+Important note + +

+With implementation of V2.5 and later, it is required to have a wx.App already +initialized before wx.updateColourDB() can be called. +Trying to do otherwise will cause an exception to be raised. + + """ + + +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) +