#
# gui.py: GUI for 2D CA bike simulator
#         Called by bike.py
#         Exercise: Rewrite as a class, removing dummy assignments
#
"""GUI for 2D CA bike simulator"""

from Tkinter import *
import pygame
from cadisplay import SpDisplayState

# Dummy assignments to expose variables
tVert    = 0
tHoriz   = 0
tStepCnt = 0
ca       = 0

def step():
	"""	
		This is called each time the 'step' button is clicked.
		If the numbers in either the east-west or north-south 
		text fields are different, the CA will be reinitialized with
		those new numbers of bikes randomly distributed. 
		If the numbers are unchanged, the simulation will simply continue 
		the simulation with the current state of the CA.
	"""
	# Any change in number of bikes?
	try:
		if int(tVert.get()) != ca.vbikes or int(tHoriz.get()) != ca.hbikes:
			ca.__init__(ca.size, int(tVert.get()), int(tHoriz.get()))
	except ValueError:
		pass
		
	for i in xrange(int(tStepCnt.get())):
		ca.steph()	# step east-west bikes first
		ca.stepv()	# step north-south bikes second
		SpDisplayState(ca)
		for event in pygame.event.get():
			if event.type == pygame.QUIT: sys.exit()

	# Build the GUI
	#
def InitGUI(CA,numSteps):
	# Need to set these variables here and be accessible within step()
	global ca,tVert,tHoriz,tStepCnt
	ca   = CA
	root = Tk()
	root.title("Controller")

	# Text field for number of east-west bikes
	fVert = Frame(root, border=1)	#Frame
	tVarH=StringVar()	# used for default text entry
	tVarH.set(str(ca.hbikes))
	tVert = Entry(fVert, relief="sunken", textvariable=tVarH)	#Text entry
	lVert = Label(fVert, text="Number of E-W Bikes")	#Label
	lVert.pack(side="top", padx=0)
	fVert.pack(side="bottom", padx=5, pady=5)
	tVert.pack()

	# Text field for number of north-south bikes
	fHoriz = Frame(root, border=1)	#Frame
	tVarV=StringVar()	# used for default text entry
	tVarV.set(str(ca.vbikes))
	tHoriz = Entry(fHoriz, relief="sunken", textvariable=tVarV)	#Text entry
	lHoriz = Label(fHoriz, text="Number of N-S Bikes")	#Label
	lHoriz.pack(side="top", padx=0)
	fHoriz.pack(side="bottom", padx=5, pady=5)
	tHoriz.pack()

	# Create 'step' button
	bStep = Button(root,text='Run',command=step)
	bStep.pack(side="top", padx=5)

	# Text field for number of steps
	fStepCnt = Frame(root, border=1)	#Frame
	tVarSteps=StringVar()	# used for default text entry
	tVarSteps.set(str(numSteps))
	tStepCnt = Entry(fStepCnt, relief="sunken", textvariable=tVarSteps)
	lStepCnt = Label(fStepCnt, text="Steps")	#Label
	lStepCnt.pack(side="top", padx=0)
	fStepCnt.pack(side="right", padx=5, pady=5)
	tStepCnt.pack()

	return root
