]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/ColourDB.py
apparently the check for too small rect is needed not only with wxNB_MULTILINE (see...
[wxWidgets.git] / wxPython / demo / ColourDB.py
1
2 import wx
3 import wx.lib.colourdb
4
5 import images
6
7
8 #----------------------------------------------------------------------
9
10 class TestWindow(wx.ScrolledWindow):
11 def __init__(self, parent):
12 wx.ScrolledWindow.__init__(self, parent, -1)
13
14 # Populate our color list
15 self.clrList = wx.lib.colourdb.getColourList()
16
17 # Just for style points, we'll use this as a background image.
18 #self.clrList.sort()
19 self.bg_bmp = images.getGridBGBitmap()
20
21 # This could also be done by getting the window's default font;
22 # either way, we need to have a font loaded for later on.
23 #self.SetBackgroundColour("WHITE")
24 self.font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL)
25
26 # Create drawing area and set its font
27 dc = wx.ClientDC(self)
28 dc.SetFont(self.font)
29
30 # Using GetFullTextExtent(), we calculate a basic 'building block'
31 # that will be used to draw a depiction of the color list. We're
32 # using 'Wy' as the model becuase 'W' is a wide character and 'y'
33 # has a descender. This constitutes a 'worst case' scenario, which means
34 # that no matter what we draw later, text-wise, we'll have room for it
35 w,h,d,e = dc.GetFullTextExtent("Wy")
36
37 # Height plus descender
38 self.textHeight = h + d
39
40 # Pad a little bit
41 self.lineHeight = self.textHeight + 5
42
43 # ... and this is the basic width.
44 self.cellWidth = w
45
46 # jmg 11/8/03: why 24?
47 numCells = 24
48
49 # 'prep' our scroll bars.
50 self.SetScrollbars(
51 self.cellWidth, self.lineHeight, numCells, len(self.clrList) + 2
52 )
53
54 # Event handlers - moved here so events won't fire before init is
55 # finished.
56 self.Bind(wx.EVT_PAINT, self.OnPaint)
57 self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
58
59
60 # tile the background bitmap loaded in __init__()
61 def TileBackground(self, dc):
62 sz = self.GetClientSize()
63 w = self.bg_bmp.GetWidth()
64 h = self.bg_bmp.GetHeight()
65
66 # adjust for scrolled position
67 spx, spy = self.GetScrollPixelsPerUnit()
68 vsx, vsy = self.GetViewStart()
69 dx, dy = (spx * vsx) % w, (spy * vsy) % h
70
71 x = -dx
72
73 while x < sz.width:
74 y = -dy
75 while y < sz.height:
76 dc.DrawBitmap(self.bg_bmp, x, y)
77 y = y + h
78
79 x = x + w
80
81 # Redraw the background over a 'damaged' area.
82 def OnEraseBackground(self, evt):
83 dc = evt.GetDC()
84
85 if not dc:
86 dc = wx.ClientDC(self)
87 rect = self.GetUpdateRegion().GetBox()
88 dc.SetClippingRect(rect)
89
90 self.TileBackground(dc)
91
92
93 def OnPaint(self, evt):
94 dc = wx.PaintDC(self)
95 self.PrepareDC(dc)
96 self.Draw(dc, self.GetUpdateRegion(), self.GetViewStart())
97
98
99 def Draw(self, dc, rgn=None, vs=None):
100 dc.BeginDrawing()
101 dc.SetTextForeground("BLACK")
102 dc.SetPen(wx.Pen("BLACK", 1, wx.SOLID))
103 dc.SetFont(self.font)
104 colours = self.clrList
105 numColours = len(colours)
106
107 if rgn:
108 # determine the subset of the color list that has been exposed
109 # and needs drawn. This is based on all the precalculation we
110 # did in __init__()
111 rect = rgn.GetBox()
112 pixStart = vs[1]*self.lineHeight + rect.y
113 pixStop = pixStart + rect.height
114 start = pixStart / self.lineHeight - 1
115 stop = pixStop / self.lineHeight
116 else:
117 start = 0
118 stop = numColours
119
120 for line in range(max(0,start), min(stop,numColours)):
121 clr = colours[line]
122 y = (line+1) * self.lineHeight + 2
123
124 dc.DrawText(clr, self.cellWidth, y)
125
126 brush = wx.Brush(clr, wx.SOLID)
127 dc.SetBrush(brush)
128 dc.DrawRectangle(12 * self.cellWidth, y,
129 6 * self.cellWidth, self.textHeight)
130
131 dc.EndDrawing()
132
133
134 # On wxGTK there needs to be a panel under wx.ScrolledWindows if they are
135 # going to be in a wxNotebook. And, in this demo, we are.
136 class TestPanel(wx.Panel):
137 def __init__(self, parent):
138 wx.Panel.__init__(self, parent, -1)
139 self.win = TestWindow(self)
140 self.Bind(wx.EVT_SIZE, self.OnSize)
141
142
143 def OnSize(self, evt):
144 self.win.SetSize(evt.GetSize())
145
146
147
148 #----------------------------------------------------------------------
149
150
151 def runTest(frame, nb, log):
152 # This loads a whole bunch of new color names and values
153 # into TheColourDatabase
154 #
155 # Note 11/24/03 - jg - I moved this into runTest() because
156 # there must be a wx.App existing before this function
157 # can be called - this is a change from 2.4 -> 2.5.
158 wx.lib.colourdb.updateColourDB()
159
160 win = TestPanel(nb)
161
162 return win
163
164 #----------------------------------------------------------------------
165
166 overview = """
167 <html>
168 <body>
169 <B><font size=+2>ColourDB</font></b>
170
171 <p>wxWindows maintains a database of standard RGB colours for a predefined
172 set of named colours (such as "BLACK'', "LIGHT GREY''). The application
173 may add to this set if desired by using Append. There is only one instance
174 of this class: <b>TheColourDatabase</b>.
175
176 <p>The <code>colourdb</code> library is a lightweight API that pre-defines
177 a multitude of colors for you to use 'out of the box', and this demo serves
178 to show you these colors (it also serves as a handy reference).
179
180 <p>A secondary benefit of this demo is the use of the <b>ScrolledWindow</b> class
181 and the use of various *DC() classes, including background tiling and the use of
182 font data to generate a "building block" type of construct for repetitive use.
183
184 <p>
185 <B><font size=+2>Important note</font></b>
186
187 <p>
188 With implementation of V2.5 and later, it is required to have a wx.App already
189 initialized before <b><code>wx.updateColourDB()</code></b> can be called.
190 Trying to do otherwise will cause an exception to be raised.
191 </body>
192 </html>
193 """
194
195
196 if __name__ == '__main__':
197 import sys,os
198 import run
199 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
200