X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b166c70307f14952b3844837c98602425020e1c5..c5a8bc105c9325fd4a8d9b8897f59a1527385bc8:/wxPython/demo/ColourDB.py diff --git a/wxPython/demo/ColourDB.py b/wxPython/demo/ColourDB.py index 9187807513..a13d7e13b6 100644 --- a/wxPython/demo/ColourDB.py +++ b/wxPython/demo/ColourDB.py @@ -1,43 +1,64 @@ -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.getColourInfoList() - self.clrList = colourdb.getColourList() + # Just for style points, we'll use this as a background image. self.bg_bmp = images.getGridBGBitmap() - EVT_PAINT(self, self.OnPaint) - EVT_ERASE_BACKGROUND(self, 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 + ) + + # Event handlers - moved here so events won't fire before init is + # finished. + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + + + # 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,39 +69,44 @@ 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) 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.SetClippingRegion(rect.x, rect.y, rect.width, rect.height) + 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()) 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 @@ -91,24 +117,28 @@ class TestWindow(wxScrolledWindow): stop = numColours for line in range(max(0,start), min(stop,numColours)): - clr = colours[line] + clr = colours[line][0] y = (line+1) * self.lineHeight + 2 + dc.DrawText(clr, self.cellWidth, y) - brush = wxBrush(clr, wxSOLID) + brush = wx.Brush(clr, wx.SOLID) dc.SetBrush(brush) - dc.DrawRectangle(12 * self.cellWidth, y, 6 * self.cellWidth, self.textHeight) + dc.DrawRectangle(10 * self.cellWidth, y, + 6 * self.cellWidth, self.textHeight) + + dc.DrawText(str(tuple(colours[line][1:])), + 18 * self.cellWidth, y) - dc.EndDrawing() - -# On wxGTK there needs to be a panel under wxScrolledWindows if they are -# going to be in a wxNotebook... -class TestPanel(wxPanel): +# 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): - wxPanel.__init__(self, parent, -1) + wx.Panel.__init__(self, parent, -1) self.win = TestWindow(self) - EVT_SIZE(self, self.OnSize) + self.Bind(wx.EVT_SIZE, self.OnSize) + def OnSize(self, evt): self.win.SetSize(evt.GetSize()) @@ -119,10 +149,52 @@ class TestPanel(wxPanel): def runTest(frame, nb, log): + # 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:]) +