]> git.saurik.com Git - wxWidgets.git/blob - wxPython/wx/lib/colourselect.py
Set the DC font before drawing the label
[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
37 import wx
38
39 #----------------------------------------------------------------------------
40
41 wxEVT_COMMAND_COLOURSELECT = wx.NewEventType()
42
43 class ColourSelectEvent(wx.PyCommandEvent):
44 def __init__(self, id, value):
45 wx.PyCommandEvent.__init__(self, id = id)
46 self.SetEventType(wxEVT_COMMAND_COLOURSELECT)
47 self.value = value
48
49 def GetValue(self):
50 return self.value
51
52 EVT_COLOURSELECT = wx.PyEventBinder(wxEVT_COMMAND_COLOURSELECT, 1)
53
54 #----------------------------------------------------------------------------
55
56 class ColourSelect(wx.BitmapButton):
57 def __init__(self, parent, id, label="", colour=wx.BLACK,
58 pos=wx.DefaultPosition, size=wx.DefaultSize,
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
66 wx.BitmapButton.__init__(self, parent, id, wx.EmptyBitmap(w,h),
67 pos=pos, size=size, style=style|wx.BU_AUTODRAW)
68
69 if type(colour) == type( () ):
70 colour = wx.Colour(*colour)
71 self.colour = colour
72 self.SetLabel(label)
73 self.callback = callback
74 bmp = self.MakeBitmap()
75 self.SetBitmap(bmp)
76 parent.Bind(wx.EVT_BUTTON, self.OnClick, self)
77
78
79 def GetColour(self):
80 return self.colour
81
82 def GetValue(self):
83 return self.colour
84
85 def SetValue(self, colour):
86 self.SetColour(colour)
87
88 def SetColour(self, colour):
89 if type(colour) == type( () ):
90 colour = wxColour(*colour)
91
92 self.colour = colour
93 bmp = self.MakeBitmap()
94 self.SetBitmap(bmp)
95
96
97 def MakeBitmap(self):
98 bdr = 10
99 width, height = self.GetSize()
100 bmp = wx.EmptyBitmap(width-bdr, height-bdr)
101 dc = wx.MemoryDC()
102 dc.SelectObject(bmp)
103 dc.SetFont(self.GetFont())
104 label = self.GetLabel()
105 # Just make a little colored bitmap
106 dc.SetBackground(wx.Brush(self.colour))
107 dc.Clear()
108
109 if label:
110 # Add a label to it
111 avg = reduce(lambda a, b: a + b, self.colour.Get()) / 3
112 fcolour = avg > 128 and wx.BLACK or wx.WHITE
113 dc.SetTextForeground(fcolour)
114 dc.DrawLabel(label, (0,0, width-bdr, height-bdr),
115 wx.ALIGN_CENTER)
116
117 dc.SelectObject(wx.NullBitmap)
118 return bmp
119
120
121 def SetBitmap(self, bmp):
122 self.SetBitmapLabel(bmp)
123 self.SetBitmapSelected(bmp)
124 self.SetBitmapDisabled(bmp)
125 self.SetBitmapFocus(bmp)
126 self.SetBitmapSelected(bmp)
127
128
129 def OnChange(self):
130 wx.PostEvent(self, ColourSelectEvent(self.GetId(), self.GetValue()))
131 if self.callback is not None:
132 self.callback()
133
134 def OnClick(self, event):
135 data = wx.ColourData()
136 data.SetChooseFull(True)
137 data.SetColour(self.colour)
138 dlg = wx.ColourDialog(self.GetParent(), data)
139 changed = dlg.ShowModal() == wx.ID_OK
140
141 if changed:
142 data = dlg.GetColourData()
143 self.SetColour(data.GetColour())
144
145 dlg.Destroy()
146
147 # moved after dlg.Destroy, since who knows what the callback will do...
148 if changed:
149 self.OnChange()
150