]>
Commit | Line | Data |
---|---|---|
1 | #---------------------------------------------------------------------------- | |
2 | # Name: ColourSelect.py | |
3 | # Purpose: Colour Box Selection Control | |
4 | # | |
5 | # Author: Lorne White, Lorne.White@telusplanet.net | |
6 | # | |
7 | # Created: Feb 25, 2001 | |
8 | # Licence: wxWindows license | |
9 | #---------------------------------------------------------------------------- | |
10 | ||
11 | # creates a colour wxButton with selectable color | |
12 | # button click provides a colour selection box | |
13 | # button colour will change to new colour | |
14 | # GetColour method to get the selected colour | |
15 | ||
16 | # Updates: | |
17 | # call back to function if changes made | |
18 | ||
19 | # Cliff Wells, logiplexsoftware@earthlink.net: | |
20 | # - Made ColourSelect into "is a button" rather than "has a button" | |
21 | # - Added label parameter and logic to adjust the label colour according to the background | |
22 | # colour | |
23 | # - Added id argument | |
24 | # - Rearranged arguments to more closely follow wx conventions | |
25 | # - Simplified some of the code | |
26 | ||
27 | # Cliff Wells, 2002/02/07 | |
28 | # - Added ColourSelect Event | |
29 | ||
30 | # 12/01/2003 - Jeff Grimmett (grimmtooth@softhome.net) | |
31 | # | |
32 | # o Updated for 2.5 compatability. | |
33 | # | |
34 | ||
35 | """ | |
36 | Provides a `ColourSelect` button that, when clicked, will display a | |
37 | colour selection dialog. The selected colour is displayed on the | |
38 | button itself. | |
39 | """ | |
40 | ||
41 | #---------------------------------------------------------------------------- | |
42 | ||
43 | import wx | |
44 | ||
45 | #---------------------------------------------------------------------------- | |
46 | ||
47 | wxEVT_COMMAND_COLOURSELECT = wx.NewEventType() | |
48 | ||
49 | class ColourSelectEvent(wx.PyCommandEvent): | |
50 | def __init__(self, id, value): | |
51 | wx.PyCommandEvent.__init__(self, id = id) | |
52 | self.SetEventType(wxEVT_COMMAND_COLOURSELECT) | |
53 | self.value = value | |
54 | ||
55 | def GetValue(self): | |
56 | return self.value | |
57 | ||
58 | EVT_COLOURSELECT = wx.PyEventBinder(wxEVT_COMMAND_COLOURSELECT, 1) | |
59 | ||
60 | #---------------------------------------------------------------------------- | |
61 | ||
62 | class ColourSelect(wx.BitmapButton): | |
63 | def __init__(self, parent, id, label="", colour=wx.BLACK, | |
64 | pos=wx.DefaultPosition, size=wx.DefaultSize, | |
65 | callback=None, style=0): | |
66 | if label: | |
67 | w, h = parent.GetTextExtent(label) | |
68 | w += 6 | |
69 | h += 6 | |
70 | else: | |
71 | w, h = 20, 20 | |
72 | wx.BitmapButton.__init__(self, parent, id, wx.EmptyBitmap(w,h), | |
73 | pos=pos, size=size, style=style|wx.BU_AUTODRAW) | |
74 | ||
75 | if type(colour) == type( () ): | |
76 | colour = wx.Colour(*colour) | |
77 | self.colour = colour | |
78 | self.SetLabel(label) | |
79 | self.callback = callback | |
80 | bmp = self.MakeBitmap() | |
81 | self.SetBitmap(bmp) | |
82 | parent.Bind(wx.EVT_BUTTON, self.OnClick, self) | |
83 | ||
84 | ||
85 | def GetColour(self): | |
86 | return self.colour | |
87 | ||
88 | def GetValue(self): | |
89 | return self.colour | |
90 | ||
91 | def SetValue(self, colour): | |
92 | self.SetColour(colour) | |
93 | ||
94 | def SetColour(self, colour): | |
95 | if type(colour) == tuple: | |
96 | colour = wx.Colour(*colour) | |
97 | if type(colour) == str: | |
98 | colour = wx.NamedColour(colour) | |
99 | ||
100 | self.colour = colour | |
101 | bmp = self.MakeBitmap() | |
102 | self.SetBitmap(bmp) | |
103 | ||
104 | ||
105 | def SetLabel(self, label): | |
106 | self.label = label | |
107 | ||
108 | def GetLabel(self): | |
109 | return self.label | |
110 | ||
111 | ||
112 | def MakeBitmap(self): | |
113 | bdr = 8 | |
114 | width, height = self.GetSize() | |
115 | ||
116 | # yes, this is weird, but it appears to work around a bug in wxMac | |
117 | if "wxMac" in wx.PlatformInfo and width == height: | |
118 | height -= 1 | |
119 | ||
120 | bmp = wx.EmptyBitmap(width-bdr, height-bdr) | |
121 | dc = wx.MemoryDC() | |
122 | dc.SelectObject(bmp) | |
123 | dc.SetFont(self.GetFont()) | |
124 | label = self.GetLabel() | |
125 | # Just make a little colored bitmap | |
126 | dc.SetBackground(wx.Brush(self.colour)) | |
127 | dc.Clear() | |
128 | ||
129 | if label: | |
130 | # Add a label to it | |
131 | avg = reduce(lambda a, b: a + b, self.colour.Get()) / 3 | |
132 | fcolour = avg > 128 and wx.BLACK or wx.WHITE | |
133 | dc.SetTextForeground(fcolour) | |
134 | dc.DrawLabel(label, (0,0, width-bdr, height-bdr), | |
135 | wx.ALIGN_CENTER) | |
136 | ||
137 | dc.SelectObject(wx.NullBitmap) | |
138 | return bmp | |
139 | ||
140 | ||
141 | def SetBitmap(self, bmp): | |
142 | self.SetBitmapLabel(bmp) | |
143 | self.SetBitmapSelected(bmp) | |
144 | self.SetBitmapDisabled(bmp) | |
145 | self.SetBitmapFocus(bmp) | |
146 | self.SetBitmapSelected(bmp) | |
147 | self.Refresh() | |
148 | ||
149 | ||
150 | def OnChange(self): | |
151 | wx.PostEvent(self, ColourSelectEvent(self.GetId(), self.GetValue())) | |
152 | if self.callback is not None: | |
153 | self.callback() | |
154 | ||
155 | def OnClick(self, event): | |
156 | data = wx.ColourData() | |
157 | data.SetChooseFull(True) | |
158 | data.SetColour(self.colour) | |
159 | dlg = wx.ColourDialog(wx.GetTopLevelParent(self), data) | |
160 | changed = dlg.ShowModal() == wx.ID_OK | |
161 | ||
162 | if changed: | |
163 | data = dlg.GetColourData() | |
164 | self.SetColour(data.GetColour()) | |
165 | dlg.Destroy() | |
166 | ||
167 | # moved after dlg.Destroy, since who knows what the callback will do... | |
168 | if changed: | |
169 | self.OnChange() | |
170 |