1 #----------------------------------------------------------------------------
2 # Name: ColourSelect.py
3 # Purpose: Colour Box Selection Control
5 # Author: Lorne White, Lorne.White@telusplanet.net
7 # Created: Feb 25, 2001
8 # Licence: wxWindows license
9 #----------------------------------------------------------------------------
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
17 # call back to function if changes made
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
24 # - Rearranged arguments to more closely follow wx conventions
25 # - Simplified some of the code
27 # Cliff Wells, 2002/02/07
28 # - Added ColourSelect Event
30 # 12/01/2003 - Jeff Grimmett (grimmtooth@softhome.net)
32 # o Updated for 2.5 compatability.
36 Provides a `ColourSelect` button that, when clicked, will display a
37 colour selection dialog. The selected colour is displayed on the
41 #----------------------------------------------------------------------------
45 #----------------------------------------------------------------------------
47 wxEVT_COMMAND_COLOURSELECT
= wx
.NewEventType()
49 class ColourSelectEvent(wx
.PyCommandEvent
):
50 def __init__(self
, id, value
):
51 wx
.PyCommandEvent
.__init
__(self
, id = id)
52 self
.SetEventType(wxEVT_COMMAND_COLOURSELECT
)
58 EVT_COLOURSELECT
= wx
.PyEventBinder(wxEVT_COMMAND_COLOURSELECT
, 1)
60 #----------------------------------------------------------------------------
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):
67 w
, h
= parent
.GetTextExtent(label
)
72 wx
.BitmapButton
.__init
__(self
, parent
, id, wx
.EmptyBitmap(w
,h
),
73 pos
=pos
, size
=size
, style
=style|wx
.BU_AUTODRAW
)
75 if type(colour
) == type( () ):
76 colour
= wx
.Colour(*colour
)
79 self
.callback
= callback
80 bmp
= self
.MakeBitmap()
82 parent
.Bind(wx
.EVT_BUTTON
, self
.OnClick
, self
)
91 def SetValue(self
, colour
):
92 self
.SetColour(colour
)
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
)
101 bmp
= self
.MakeBitmap()
105 def SetLabel(self
, label
):
112 def MakeBitmap(self
):
114 width
, height
= self
.GetSize()
116 # yes, this is weird, but it appears to work around a bug in wxMac
117 if "wxMac" in wx
.PlatformInfo
and width
== height
:
120 bmp
= wx
.EmptyBitmap(width
-bdr
, height
-bdr
)
123 dc
.SetFont(self
.GetFont())
124 label
= self
.GetLabel()
125 # Just make a little colored bitmap
126 dc
.SetBackground(wx
.Brush(self
.colour
))
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
),
137 dc
.SelectObject(wx
.NullBitmap
)
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
)
151 wx
.PostEvent(self
, ColourSelectEvent(self
.GetId(), self
.GetValue()))
152 if self
.callback
is not None:
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
163 data
= dlg
.GetColourData()
164 self
.SetColour(data
.GetColour())
167 # moved after dlg.Destroy, since who knows what the callback will do...