colourselect.py 2.21 KB
# AnalogClock's colour selector for setup dialog
#   E. A. Tacao <e.a.tacao |at| estadao.com.br>
#   http://j.domaindlx.com/elements28/wxpython/
#   15 Fev 2006, 22:00 GMT-03:00
# Distributed under the wxWidgets license.

import wx
from wx.lib.newevent import NewEvent
from wx.lib.buttons import GenBitmapButton

#----------------------------------------------------------------------------

(ColourSelectEvent, EVT_COLOURSELECT) = NewEvent()

#----------------------------------------------------------------------------

class ColourSelect(GenBitmapButton):
    def __init__(self, parent, size=(21, 21), value=wx.BLACK):
        w, h = size[0] - 5, size[1] - 5
        GenBitmapButton.__init__(self, parent, wx.ID_ANY, wx.EmptyBitmap(w, h),
                                 size=size)
        self.SetBezelWidth(1)

        self.parent = parent
        self.SetValue(value)

        self.parent.Bind(wx.EVT_BUTTON, self.OnClick, self)


    def _makeBitmap(self):
        bdr = 8; w, h = self.GetSize()
        bmp = wx.EmptyBitmap(w - bdr, h - bdr)

        dc = wx.MemoryDC()
        dc.SelectObject(bmp)
        dc.SetBackground(wx.Brush(self.value, wx.SOLID))
        dc.Clear()
        dc.SelectObject(wx.NullBitmap)

        self.SetBitmapLabel(bmp)
        self.Refresh()


    def GetValue(self):
        return self.value


    def SetValue(self, value):
        self.value = value
        self._makeBitmap()


    def OnClick(self, event):
        win = wx.GetTopLevelParent(self)

        data = wx.ColourData()
        data.SetChooseFull(True)
        data.SetColour(self.value)
        [data.SetCustomColour(colour_index, win.customcolours[colour_index])
         for colour_index in range(0, 16)]

        dlg = wx.ColourDialog(win, data)
        dlg.SetTitle("Select Colour")
        changed = dlg.ShowModal() == wx.ID_OK

        if changed:
            data = dlg.GetColourData()
            self.SetValue(data.GetColour())
            win.customcolours = [data.GetCustomColour(colour_index) \
                                 for colour_index in range(0, 16)]
        dlg.Destroy()

        if changed:
            nevt = ColourSelectEvent(id=self.GetId(), obj=self, val=self.value)
            wx.PostEvent(self.parent, nevt)


#
##
### eof