# pastriang.py - (c) Goetz Schwandtner
# schwandtner@googlemail.com
# 18-01-2008
# V1.0 with class structure

import appuifw
from graphics import *
import e32
from key_codes import *

STDCOLORS=((255,0,0),(0,0,255),(0,255,0),(255,255,0))
def getcolor(i):
    if i<4:
        return STDCOLORS[i]
    return 10*i,10*i,10*i

class Pascal(object):
    def __init__(self,n,mod=1):
        self.BORDER=4
        self.vals=[]
        self.mod=mod
        self.setsize(n)
        self.labels=0
        self.nums=0
        
    def setsize(self,n):
        self.n=n
        if n>9:
            self.nums=0
        st=len(self.vals)
        for i in range(st,n):
            self.vals.append([1])
            for j in range(1,i+1):
                self.vals[-1].append(self.vals[-2][j-1]+self.vals[-2][j])
            self.vals[-1].append(1)
        self.setcolmod()
    
    def setcolmod(self,mod=None):
        if mod:
            self.mod=mod
        self.cols=[]
        for r in self.vals:
           self.cols.append([])
           for c in r:
               self.cols[-1].append(c%self.mod)
             
    def printme(self):
       for r in self.vals:
           print
           for c in r:
               print c,

    def draw(self,image):
        w,h=image.size
        image.clear()
        if self.labels:
            image.text((0,20),u"n:"+str(self.n)+" mod:"+str(self.mod))
        cw,ch=w//(self.n+1),h//self.n
        for y in range(self.n):
            for x in range(y+2):
                c=getcolor(self.cols[y][x])
                image.rectangle(((w-(y+2)*cw)//2+x*cw,y*ch,(w-(y+2)*cw)//2+(x+1)*cw-self.BORDER,(y+1)*ch-self.BORDER),outline=c,fill=c)
                if self.nums:
                    tx=unicode(self.vals[y][x])
                    tm= image.measure_text(tx)[0]
                    image.text(((w-(y+1)*cw-tm[2])//2+x*cw,(y+1)*ch-(ch+tm[1]-self.BORDER)//2),tx)

class Main(object):
    def __init__(self):
        self.running=1
        self.tr=Pascal(15)
        appuifw.app.exit_key_handler=self.quit
        appuifw.app.menu=[(u"Help",self.help),(u"About",self.about),(u"Exit",self.quit)]
        appuifw.app.screen='full'
        self.img=None
        self.canvas=appuifw.app.body=appuifw.Canvas(event_callback=self.handle_event,redraw_callback=self.handle_redraw)
        self.img=Image.new(self.canvas.size)

    def quit(self):
        self.running=0
    
    def mainLoop(self):
        self.redraw()
        while self.running:
            e32.ao_yield()

    def redraw(self):
        self.tr.draw(self.img)
        self.handle_redraw(())

    def handle_event(self,event):
        if event['type'] == appuifw.EEventKeyUp:
            key=event['scancode']
            if key==EScancodeUpArrow:
                self.tr.setcolmod(self.tr.mod+1)
                self.redraw()
            if key==EScancodeDownArrow:
                self.tr.setcolmod(max(self.tr.mod-1,1))
                self.redraw()
            if key==EScancodeLeftArrow:
                self.tr.setsize(max(1,self.tr.n-1))
                self.redraw()
            if key==EScancodeRightArrow:
                self.tr.setsize(self.tr.n+1)
                self.redraw()
            if key==EScancodeHash:
                self.tr.labels=1-self.tr.labels
                self.redraw()
            if key==EScancode0:
                self.tr.nums=1-self.tr.nums
                self.redraw()            

    def handle_redraw(self,rect):
        if self.img:
            self.canvas.blit(self.img)

    def about(self):
        appuifw.note(u'Pascal triangle demo \n (c) 01-2008 Goetz schwandtner@googlemail.com')

    def help(self):
        appuifw.note(u'Help (keys):\n<,> size\n^,v color (mod)\nshow: # par, 0 vals')
m=Main()
m.mainLoop()