]> git.saurik.com Git - wxWidgets.git/blame - wxPython/wx/lib/colourselect.py
Don't need to adjust the position for HitTest any longer
[wxWidgets.git] / wxPython / wx / lib / colourselect.py
CommitLineData
d14a1e28
RD
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#----------------------------------------------------------------------------
1fded56b 10
d14a1e28
RD
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
b881fc78
RD
30# 12/01/2003 - Jeff Grimmett (grimmtooth@softhome.net)
31#
32# o Updated for 2.5 compatability.
33#
34
35#----------------------------------------------------------------------------
36
37import wx
d14a1e28 38
b881fc78
RD
39#----------------------------------------------------------------------------
40
41wxEVT_COMMAND_COLOURSELECT = wx.NewEventType()
42
43class ColourSelectEvent(wx.PyCommandEvent):
7722248d 44 def __init__(self, id, value):
b881fc78
RD
45 wx.PyCommandEvent.__init__(self, id = id)
46 self.SetEventType(wxEVT_COMMAND_COLOURSELECT)
7722248d 47 self.value = value
d14a1e28 48
7722248d
RD
49 def GetValue(self):
50 return self.value
d14a1e28 51
b881fc78 52EVT_COLOURSELECT = wx.PyEventBinder(wxEVT_COMMAND_COLOURSELECT, 1)
7722248d 53
b881fc78 54#----------------------------------------------------------------------------
7722248d 55
b881fc78
RD
56class ColourSelect(wx.BitmapButton):
57 def __init__(self, parent, id, label="", colour=wx.BLACK,
58 pos=wx.DefaultPosition, size=wx.DefaultSize,
7722248d
RD
59 callback=None, style=0):
60 if label:
61 w, h = parent.GetTextExtent(label)
62 w += 6
63 h += 6
64 else:
65 w, h = 20, 20
b881fc78
RD
66 wx.BitmapButton.__init__(self, parent, id, wx.EmptyBitmap(w,h),
67 pos=pos, size=size, style=style|wx.BU_AUTODRAW)
68
7722248d 69 if type(colour) == type( () ):
b881fc78 70 colour = wx.Colour(*colour)
7722248d
RD
71 self.colour = colour
72 self.SetLabel(label)
d14a1e28 73 self.callback = callback
7722248d
RD
74 bmp = self.MakeBitmap()
75 self.SetBitmap(bmp)
b881fc78 76 parent.Bind(wx.EVT_BUTTON, self.OnClick, self)
d14a1e28 77
7722248d 78
d14a1e28 79 def GetColour(self):
7722248d 80 return self.colour
d14a1e28 81
7722248d
RD
82 def GetValue(self):
83 return self.colour
84
7722248d
RD
85 def SetValue(self, colour):
86 self.SetColour(colour)
87
7722248d 88 def SetColour(self, colour):
a27d1f42
RD
89 if type(colour) == tuple:
90 colour = wx.Colour(*colour)
91 if type(colour) == str:
92 colour = wx.NamedColour(colour)
b881fc78 93
7722248d
RD
94 self.colour = colour
95 bmp = self.MakeBitmap()
96 self.SetBitmap(bmp)
97
98
edf3b4dc
RD
99 def SetLabel(self, label):
100 self.label = label
101
102 def GetLabel(self):
103 return self.label
104
105
7722248d
RD
106 def MakeBitmap(self):
107 bdr = 10
b881fc78
RD
108 width, height = self.GetSize()
109 bmp = wx.EmptyBitmap(width-bdr, height-bdr)
110 dc = wx.MemoryDC()
7722248d 111 dc.SelectObject(bmp)
6dfb13b1 112 dc.SetFont(self.GetFont())
7722248d
RD
113 label = self.GetLabel()
114 # Just make a little colored bitmap
b881fc78 115 dc.SetBackground(wx.Brush(self.colour))
7722248d 116 dc.Clear()
b881fc78 117
7722248d
RD
118 if label:
119 # Add a label to it
120 avg = reduce(lambda a, b: a + b, self.colour.Get()) / 3
b881fc78 121 fcolour = avg > 128 and wx.BLACK or wx.WHITE
7722248d 122 dc.SetTextForeground(fcolour)
b881fc78
RD
123 dc.DrawLabel(label, (0,0, width-bdr, height-bdr),
124 wx.ALIGN_CENTER)
7722248d 125
b881fc78 126 dc.SelectObject(wx.NullBitmap)
7722248d
RD
127 return bmp
128
129
130 def SetBitmap(self, bmp):
131 self.SetBitmapLabel(bmp)
132 self.SetBitmapSelected(bmp)
133 self.SetBitmapDisabled(bmp)
134 self.SetBitmapFocus(bmp)
135 self.SetBitmapSelected(bmp)
4e4a10ba
RD
136 self.Refresh()
137
d14a1e28
RD
138
139 def OnChange(self):
b881fc78 140 wx.PostEvent(self, ColourSelectEvent(self.GetId(), self.GetValue()))
d14a1e28
RD
141 if self.callback is not None:
142 self.callback()
143
144 def OnClick(self, event):
b881fc78 145 data = wx.ColourData()
d14a1e28 146 data.SetChooseFull(True)
7722248d 147 data.SetColour(self.colour)
bbc5a006 148 dlg = wx.ColourDialog(wx.GetTopLevelParent(self), data)
b881fc78
RD
149 changed = dlg.ShowModal() == wx.ID_OK
150
d14a1e28
RD
151 if changed:
152 data = dlg.GetColourData()
7722248d 153 self.SetColour(data.GetColour())
d14a1e28
RD
154 dlg.Destroy()
155
b881fc78 156 # moved after dlg.Destroy, since who knows what the callback will do...
d14a1e28 157 if changed:
b881fc78 158 self.OnChange()
1fded56b 159