]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/ColourDB.py
extend GetAsBitmap with an optional subrect
[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.getColourInfoList()
16
17 # Just for style points, we'll use this as a background image.
18 self.bg_bmp = images.getGridBGBitmap()
19
20 # This could also be done by getting the window's default font;
21 # either way, we need to have a font loaded for later on.
22 #self.SetBackgroundColour("WHITE")
23 self.font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL)
24
25 # Create drawing area and set its font
26 dc = wx.ClientDC(self)
27 dc.SetFont(self.font)
28
29 # Using GetFullTextExtent(), we calculate a basic 'building block'
30 # that will be used to draw a depiction of the color list. We're
31 # using 'Wy' as the model becuase 'W' is a wide character and 'y'
32 # has a descender. This constitutes a 'worst case' scenario, which means
33 # that no matter what we draw later, text-wise, we'll have room for it
34 w,h,d,e = dc.GetFullTextExtent("Wy")
35
36 # Height plus descender
37 self.textHeight = h + d
38
39 # Pad a little bit
40 self.lineHeight = self.textHeight + 5
41
42 # ... and this is the basic width.
43 self.cellWidth = w
44
45 # jmg 11/8/03: why 24?
46 numCells = 24
47
48 # 'prep' our scroll bars.
49 self.SetScrollbars(
50 self.cellWidth, self.lineHeight, numCells, len(self.clrList) + 2
51 )
52
53 # Event handlers - moved here so events won't fire before init is
54 # finished.
55 self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
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.SetTextForeground("BLACK")
101 dc.SetPen(wx.Pen("BLACK", 1, wx.SOLID))
102 dc.SetFont(self.font)
103 colours = self.clrList
104 numColours = len(colours)
105
106 if rgn:
107 # determine the subset of the color list that has been exposed
108 # and needs drawn. This is based on all the precalculation we
109 # did in __init__()
110 rect = rgn.GetBox()
111 pixStart = vs[1]*self.lineHeight + rect.y
112 pixStop = pixStart + rect.height
113 start = pixStart / self.lineHeight - 1
114 stop = pixStop / self.lineHeight
115 else:
116 start = 0
117 stop = numColours
118
119 for line in range(max(0,start), min(stop,numColours)):
120 clr = colours[line][0]
121 y = (line+1) * self.lineHeight + 2
122
123 dc.DrawText(clr, self.cellWidth, y)
124
125 brush = wx.Brush(clr, wx.SOLID)
126 dc.SetBrush(brush)
127 dc.DrawRectangle(10 * self.cellWidth, y,
128 6 * self.cellWidth, self.textHeight)
129
130 dc.DrawText(str(tuple(colours[line][1:])),
131 18 * self.cellWidth, y)
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