"""MultiStateButton class@copyright: Copyright (c) 2006 Open Source Applications Foundation@license: http://osafoundation.org/Chandler_0.1_license_terms.htm"""import osimport wxfrom wx.lib.buttons import GenBitmapButtonclass MultiStateButton(GenBitmapButton): """ A bitmap button that has more than one possible bitmap in its default state. These bitmaps are passed in as a list of names, which are also the names of the PNG bitmaps. foo = MultiStateButton(view, 100, multibitmaps=["MailState", "NoMailState"]) will create a button """ kBitmapFileExtensions = ["png", "gif", "jpg", "tiff", "psd"] def __init__(self, parent, ID, label="", pos = wx.DefaultPosition, size = wx.DefaultSize, style = 0, validator = wx.DefaultValidator, name = "multistatebutton", multibitmaps = ()): self.bits = {} firstBitmapName, firstBitmap = self.AddStates(multibitmaps) self.stateName = firstBitmap ##rae - Should really assert firstBitmap is not None somehow here #self.Bind(wx.EVT_ENTER_WINDOW, self.RolloverStart) #self.Bind(wx.EVT_LEAVE_WINDOW, self.RolloverFinish) super(MultiStateButton, self).__init__(parent, ID, firstBitmap, pos, size, style, validator, name) def RolloverStart(self, event): print "Got rolled into while in state %s" % self.GetState() pass def RolloverFinish(self, event): print "Got rolled out of while in state %s" % self.GetState() pass def AddStates(self, multibitmaps): firstFound = None firstNameFound = None for name in multibitmaps: found = False for ext in MultiStateButton.kBitmapFileExtensions: try: img = wx.Image(('%s.%s' % (os.path.join('/Users/rae/work/osaf/rae-button/', name), ext))) self.bits[name] = img.ConvertToBitmap() if not found: firstFound = self.bits[name] firstNameFound = name found = True break except IOError: pass if not found: ##Reid # should raise an error here somehow pass return firstNameFound, firstFound def SetState(self, state): bitmap = self.bits.get(state) if bitmap != None: self.SetBitmapLabel(bitmap) self.stateName = state def GetState(self): return self.stateNametheWindow = wx.Frame(parent=None, id=-1, title="MultiButton testing")b = MultiStateButton(theWindow, 1010, multibitmaps=['button1', 'button2', 'button3', 'button4'])box = wx.BoxSizer(wx.HORIZONTAL)box.Add(b)theWindow.SetSizer(box)theWindow.Show()box.Add(MultiStateButton(theWindow, 1010, multibitmaps=['button1', 'button2']))box.Add(MultiStateButton(theWindow, 1010, multibitmaps=['button3', 'button4']))box.Add(MultiStateButton(theWindow, 1010, multibitmaps=['button1', 'button2', 'button3', 'button4', 'button5']))