#!/usr/bin/env python
#
# WidgetsDemo.py demonstrates the usage Widgets.py
# Copyright (C) 2003 Michael Leonhard
# http://tamale.net/
#
# version 1.0 RC1 (2003/07/06 00:42)

import pygame, pygame.display, pygame.event, pygame.time, pygame.font, pygame.draw
from pygame.locals import *
import math, string
from widgets import *

class WidgetsDemo( WidgetWindow ):
	def __init__( self ):
		"""Initialize Demo Class"""
		# instead of pygame.init(), initialize modules manually to 
		# avoid initing pygame.sound
		pygame.display.init()
		pygame.font.init()
		
		# setup screen
		screen = pygame.display.set_mode( (640, 480), DOUBLEBUF )
		pygame.display.set_caption( 'WidgetsDemo' )
		
		# request regular event for updating animation
		self.DRAWEVENT = USEREVENT + 1
		pygame.time.set_timer( self.DRAWEVENT, 33 ) #33 == 30fps
		
		# filter events
		badevents = [NOEVENT, ACTIVEEVENT, JOYAXISMOTION, JOYBALLMOTION, JOYHATMOTION, JOYBUTTONDOWN ,JOYBUTTONUP, VIDEORESIZE, SYSWMEVENT, NUMEVENTS]
		goodevents = [self.DRAWEVENT, KEYDOWN, KEYUP, MOUSEMOTION, MOUSEBUTTONDOWN, MOUSEBUTTONUP, QUIT ]
		pygame.event.set_blocked( badevents )
		
		# initialize the WidgetWindow base class
		WidgetWindow.__init__( self, screen )
		
		# create special widgets
		edit = EditClass( self, self.editaction, (325, 300, 265, 25), "text" )
		self.page = PageClass( self, (325, 25, 265, 275), GRAY )
		
		# put the widgets in the window
		self.addwidget( MultiLineTextClass( self, (25, 25, 250, 145), "MultiLineTextClass\n(transparent)\nHas automatic word wrapping.", 36 ) )
		self.addwidget( MultiLineTextClass( self, (25, 195, 250, 145), "MultiLineTextClass\n(with background)\nHas automatic word wrapping.", 36, WHITE, BLACK ) )
		self.addwidget( EditClass( self, self.editaction, (25, 350, 150, 30), "second edit box" ), TABTARGET )
		self.addwidget( TextClass( self, (25, 400, 590, 19), "TextClass (transparent)", 20 ) )
		self.addwidget( TextClass( self, (25, 440, 590, 19), "TextClass (with background)", 20, WHITE, BLACK ) )
		self.addwidget( self.page )
		self.addwidget( edit, TABTARGET )
		self.addwidget( ButtonClass( self, self.buttonaction, (205, 110, 200, 105), "This button overlaps" ) )
		
		# set keyboard focus to the edit widget
		edit.focus()
		
		# initial screen draw
		self.eventproc( pygame.event.Event( NOEVENT, {} ) )
		
		# animation data
		self.animrect = Rect( (325, 350, 265, 50) )
		self.animline = Rect( self.animrect )
		self.animline.width = 5
		self.animline.left = self.animrect.left
	
	def loop( self ):
		"""Program loop"""
		while 1:
			# get the next event
			event = pygame.event.wait()
			# Redraw the animation
			if event.type == self.DRAWEVENT:
				# get all pending DRAWEVENTs
				pending = pygame.event.get( self.DRAWEVENT )
				# number of events we are doing
				num = len( pending ) + 1
				
				# reset the clipping region
				self.screen.set_clip()
				# erase the animation
				self.screen.fill( self.background, self.animline )
				
				# update the animation
				self.animline.left += 1 * num
				# line is outside the region
				while not self.animline.colliderect( self.animrect ):
					# move it back to the left
					self.animline.left -= self.animrect.width
				# draw the animation
				self.screen.fill( RED, self.animline )
				# flip the display
				pygame.display.update()

			# user pressed the X button to close the window
			elif event.type == QUIT: break
			# pass the even to the widgets
			else: self.eventproc( event )
		
		#clean up
		pygame.time.set_timer( self.DRAWEVENT, 0 )
		pygame.quit()
	
	def editaction( self, widget ):
		"""Function called when enter key is pressed"""
		self.page.append( widget.text )
		widget.settext( "" )
		
	def buttonaction( self ):
		"""Function called when button is pressed"""
		self.page.append( "ACTION" )

demo = WidgetsDemo()
demo.loop()
