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, 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...