]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/ColourDB.py
1 # 11/4/03 - grimmtooth@softhome.net (Jeff Grimmett)
3 # o Updated to use wx namespace
5 # 11/24/03 - grimmtooth@softhome.net (Jeff Grimmett)
7 # o Had to move the call to wx.updateColourDB()
8 # o Updated several places to change discrete pos and size parameters
13 import wx
.lib
.colourdb
as cdb
18 #----------------------------------------------------------------------
20 class TestWindow(wx
.ScrolledWindow
):
21 def __init__(self
, parent
):
22 wx
.ScrolledWindow
.__init
__(self
, parent
, -1)
24 # Populate our color list
25 self
.clrList
= cdb
.getColourList()
27 # Just for style points, we'll use this as a background image.
29 self
.bg_bmp
= images
.getGridBGBitmap()
32 self
.Bind(wx
.EVT_PAINT
, self
.OnPaint
)
33 self
.Bind(wx
.EVT_ERASE_BACKGROUND
, self
.OnEraseBackground
)
35 # This could also be done by getting the window's default font;
36 # either way, we need to have a font loaded for later on.
37 #self.SetBackgroundColour("WHITE")
38 self
.font
= wx
.Font(10, wx
.SWISS
, wx
.NORMAL
, wx
.NORMAL
)
40 # Create drawing area and set its font
41 dc
= wx
.ClientDC(self
)
44 # Using GetFullTextExtent(), we calculate a basic 'building block'
45 # that will be used to draw a depiction of the color list. We're
46 # using 'Wy' as the model becuase 'W' is a wide character and 'y'
47 # has a descender. This constitutes a 'worst case' scenario, which means
48 # that no matter what we draw later, text-wise, we'll have room for it
49 w
,h
,d
,e
= dc
.GetFullTextExtent("Wy")
51 # Height plus descender
52 self
.textHeight
= h
+ d
55 self
.lineHeight
= self
.textHeight
+ 5
57 # ... and this is the basic width.
60 # jmg 11/8/03: why 24?
63 # 'prep' our scroll bars.
65 self
.cellWidth
, self
.lineHeight
, numCells
, len(self
.clrList
) + 2
69 # tile the background bitmap loaded in __init__()
70 def TileBackground(self
, dc
):
71 sz
= self
.GetClientSize()
72 w
= self
.bg_bmp
.GetWidth()
73 h
= self
.bg_bmp
.GetHeight()
75 # adjust for scrolled position
76 spx
, spy
= self
.GetScrollPixelsPerUnit()
77 vsx
, vsy
= self
.GetViewStart()
78 dx
, dy
= (spx
* vsx
) % w
, (spy
* vsy
) % h
85 dc
.DrawBitmap(self
.bg_bmp
, (x
, y
))
90 # Redraw the background over a 'damaged' area.
91 def OnEraseBackground(self
, evt
):
95 dc
= wx
.ClientDC(self
)
96 rect
= self
.GetUpdateRegion().GetBox()
97 dc
.SetClippingRect(rect
)
99 self
.TileBackground(dc
)
102 def OnPaint(self
, evt
):
103 dc
= wx
.PaintDC(self
)
105 self
.Draw(dc
, self
.GetUpdateRegion(), self
.GetViewStart())
108 def Draw(self
, dc
, rgn
=None, vs
=None):
110 dc
.SetTextForeground("BLACK")
111 dc
.SetPen(wx
.Pen("BLACK", 1, wx
.SOLID
))
112 dc
.SetFont(self
.font
)
113 colours
= self
.clrList
114 numColours
= len(colours
)
117 # determine the subset of the color list that has been exposed
118 # and needs drawn. This is based on all the precalculation we
121 pixStart
= vs
[1]*self
.lineHeight
+ rect
.y
122 pixStop
= pixStart
+ rect
.height
123 start
= pixStart
/ self
.lineHeight
- 1
124 stop
= pixStop
/ self
.lineHeight
129 for line
in range(max(0,start
), min(stop
,numColours
)):
131 y
= (line
+1) * self
.lineHeight
+ 2
133 # Updated for 2.5 - now takes tuple for pos
134 dc
.DrawText(clr
, (self
.cellWidth
, y
))
136 brush
= wx
.Brush(clr
, wx
.SOLID
)
138 dc
.DrawRectangle((12 * self
.cellWidth
, y
),
139 (6 * self
.cellWidth
, self
.textHeight
))
144 # On wxGTK there needs to be a panel under wx.ScrolledWindows if they are
145 # going to be in a wxNotebook. And, in this demo, we are.
146 class TestPanel(wx
.Panel
):
147 def __init__(self
, parent
):
148 wx
.Panel
.__init
__(self
, parent
, -1)
149 self
.win
= TestWindow(self
)
150 self
.Bind(wx
.EVT_SIZE
, self
.OnSize
)
153 def OnSize(self
, evt
):
154 self
.win
.SetSize(evt
.GetSize())
158 #----------------------------------------------------------------------
161 def runTest(frame
, nb
, log
):
162 # This loads a whole bunch of new color names and values
163 # into TheColourDatabase
165 # Note 11/24/03 - jg - I moved this into runTest() because
166 # there must be a wx.App existing before this function
167 # can be called - this is a change from 2.4 -> 2.5.
174 #----------------------------------------------------------------------
179 <B><font size=+2>ColourDB</font></b>
181 <p>wxWindows maintains a database of standard RGB colours for a predefined
182 set of named colours (such as "BLACK'', "LIGHT GREY''). The application
183 may add to this set if desired by using Append. There is only one instance
184 of this class: <b>TheColourDatabase</b>.
186 <p>The <code>colourdb</code> library is a lightweight API that pre-defines
187 a multitude of colors for you to use 'out of the box', and this demo serves
188 to show you these colors (it also serves as a handy reference).
190 <p>A secondary benefit of this demo is the use of the <b>ScrolledWindow</b> class
191 and the use of various *DC() classes, including background tiling and the use of
192 font data to generate a "building block" type of construct for repetitive use.
195 <B><font size=+2>Important note</font></b>
198 With implementation of V2.5 and later, it is required to have a wx.App already
199 initialized before <b><code>wx.updateColourDB()</code></b> can be called.
200 Trying to do otherwise will cause an exception to be raised.
206 if __name__
== '__main__':
209 run
.main(['', os
.path
.basename(sys
.argv
[0])])