]> git.saurik.com Git - wxWidgets.git/blob - wxPython/wx/lib/colourselect.py
added support for drop down toolbar buttons (patch 1713470)
[wxWidgets.git] / wxPython / wx / lib / colourselect.py
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=wx.ID_ANY, 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