import pygame, sys
from pygame.locals import *

class Button:
	def __init__(self, label, fgcolor=(255,255,255), bgcolor=None):
		self.label = label
		self.action = None
		self.font = pygame.font.Font(None, 80)
		self.fg = fgcolor
		self.bg = bgcolor
		self.onCreate()
	def _update_(self):
		if self.bg:
			self.image = self.font.render(self.label, 1, self.fg, self.bg)
		else:
			self.image = self.font.render(self.label, 1, self.fg)
		self.rect = self.image.get_rect()
	def onCreate(self):
		self._update_()
	def onChange(self):
		self._update_()
	def setLabel(self, label):
		self.label = label
		self.onChange()
	def setPosition(self, pos):
		deltaX = pos[0]-self.rect.left
		deltaY = pos[1]-self.rect.top
		self.rect = self.rect.move(deltaX, deltaY)
		self.onChange()
	def setAction(self, action):
		self.action = action
	def click(self):
		self.onClick()
	def onClick(self):
		if self.action:
			self.action()
	def paint(self, screen):
		screen.blit(self.image, self.rect)

class MultistateButton(Button):
	def __init__(self, states, order, fgcolor=(255,255,255),bgcolor=None):
		Button.__init__(self, '', fgcolor, bgcolor)
		self.states = states
		self.order = list(order)
		self.changeState(self.order[0])
	def changeState(self, state=None):
		if state:
			self.state = state
		else:
			actual = self.order.index(self.state)
			if actual == len(self.order)-1:
				self.state = self.order[0]
			else:
				self.state = self.order[actual+1]
		self.label = self.states[self.state][0]
		self.action = self.states[self.state][1]
		self.onChange()


def hello():
	print "Hola"
def goodbye():
	print "Adios"

def main():
	pygame.init()
	screen=pygame.display.set_mode((200,200))
	b = MultistateButton({"active":("Stop",hello),"inactive":("Play",goodbye)},
			     ("active","inactive"),(245,230,0),(0,0,255))
	while 1:
            for event in pygame.event.get():
                #Detects mouse click
                if event.type == MOUSEBUTTONDOWN:
                    pos = pygame.mouse.get_pos()
		    if b.rect.collidepoint(pos):
			    b.click()
			    b.changeState()
                #Detects window close
                elif event.type == QUIT:
                    sys.exit()
                elif event.type == KEYDOWN and event.key == K_ESCAPE:
                    sys.exit()
	    b.paint(screen)
	    pygame.display.flip()

if __name__ == '__main__':
	main()
