import appuifw,e32
from key_codes import*
appuifw.app.screen='full'
c=appuifw.Canvas()
appuifw.app.body=c
f=appuifw.Form([(u'Servers','text'\
,u'[,]'),(u'Clients','text',u'[,]')],appuifw.FFormDoubleSpaced)
f.execute()
e32.ao_yield()
ls,lc=eval(f[0][2]),eval(f[1][2])
ss=reduce(lambda i,j:i+j,ls)
sc=reduce(lambda i,j:i+j,lc)
ads=adc=0
if ss-sc>0:
lc.append(ss-sc)
adc=1
if sc-ss>0:
ls.append(sc-ss)
ads=1
ms,nc=len(ls),len(lc)
m,n=max(ms,nc),min(ms,nc)
hl,hw=280/m,200/n
class K:
def __init__(self,x,y):
self.x,self.y=x,y
self.hl,self.hw=hl,hw
self.c,self.tc,self.tcr=c,u'',u''
self.tl,self.tr=u'',u''
def dron(self):
self.c.rectangle((self.x,self.y,\
self.x+self.hw,self.y+self.hl),\
0x000000,width=3)
self.c.text((self.x+self.hw/4,\
self.y+15),self.tc)
self.c.text((self.x+.7*self.hw,\
self.y+15),self.tcr)
self.c.text((self.x+7,\
self.y+self.hl-5),self.tl)
self.c.text((self.x+self.hw-25,\
self.y+0.75*self.hl),self.tr)
def sign(self):
self.c.rectangle((self.x,self.y,\
self.x+self.hw,self.y+self.hl),\
0xff0000,width=3)
lk,l=[],[]
for i in range(m+1):
for j in range(n+1):
l.append(K(j*hw,i*hl))
lk.append(l)
l=[]
if m==ms and m>n:
for i in range(m):
lk[i][n].tl=unicode(ls[i])
if ads:
lk[m-1][n].tc=u'+'
for j in range(n):
lk[m][j].tc=unicode(lc[j])
if adc:
lk[m][n-1].tcr=u'+'
if m==nc and m>n:
for i in range(m):
lk[i][n].tl=unicode(lc[i])
if adc:
lk[m-1][n].tc=u'+'
for j in range(n):
lk[m][j].tc=unicode(ls[j])
if ads:
lk[m][n-1].tcr=u'+'
if m==n:
for i in range(m):
lk[i][n].tl=unicode(lc[i])
if adc:
lk[m-1][n].tc=u'+'
for j in range(n):
lk[m][j].tc=unicode(ls[j])
if ads:
lk[m][n-1].tcr=u'+'
i=j=0
def move(x,y):
global i,j
i+=x;j+=y
if i<0:
i=0
if j<0:
j=0
if i>m:
i=m
if j>n:
j=n
lk[i][j].sign()
e32.ao_sleep(0.1)
lk[i][j].dron()
def enter1():
u=appuifw.query(u'Trans\
port','text',u'0')
e32.ao_yield()
if lk[i][j].tc:
if eval(lk[i][j].tc)+eval(u):
lk[i][j].tc=unicode(\
eval(lk[i][j].tc)+eval(u))
else:
lk[i][j].tc=u''
else:
lk[i][j].tc=u
lk[i][n].tl=unicode(eval(lk[i][n].tl)\
-eval(u))
lk[m][j].tc=unicode(eval(lk[m][j].\
tc)-eval(u))
for a in range(m+1):
for b in range(n+1):
if b!=n:
lk[a][b].tl=u''
lk[a][b].dron()
def enter2():
u=appuifw.query(u'Cost','text',u'0')
e32.ao_yield()
lk[i][j].tr=u
for a in range(m+1):
for b in range(n+1):
lk[a][b].dron()
def enter3():
counter=0
account=0
U,V=[0],[]
for p in range(1,m):
U.append(u'')
for q in range(n):
V.append(u'')
lt=[(i,j,lk[i][j].tr) for i in range(m)\
for j in range(n) if lk[i][j].tc!=u'']
while True:
for a in lt:
if U[a[0]]!=u'':
V[a[1]]=eval(a[2])-U[a[0]]
del lt[lt.index(a)]
continue
if V[a[1]]!=u'':
U[a[0]]=eval(a[2])-V[a[1]]
del lt[lt.index(a)]
continue
if u'' in U or u'' in V:
print 'U=',U, '\nV=',V
continue
else:
print 'U=',U, '\nV=',V
break
for i in range(m):
for j in range(n):
if lk[i][j].tc:
account+=eval(lk[i][j].tc)*\
eval(lk[i][j].tr)
if eval(lk[i][j].tr)-U[i]-V[j]<0:
counter+=1
lk[i][j].tl=\
unicode(eval(lk[i][j].tr)-U[i]-V[j])
lk[i][j].dron()
if counter:
appuifw.note(u'Transports\
failed','error')
else:
appuifw.note(u'Transports\
optimal','conf')
e32.ao_yield()
print 'Amount=',account
c.bind(EKeyRightArrow, lambda: move(0,1))
c.bind(EKeyUpArrow, lambda: move(-1,0))
c.bind(EKeyLeftArrow, lambda: move(0,-1))
c.bind(EKeyDownArrow, lambda:move(1,0))
c.bind(EKeySelect,enter1)
c.bind(EKeyBackspace,enter2)
c.bind(EKeyStar and \
EKey1,enter3)
def exit():
app_lock.signal()
appuifw.app.exit_key_handler=\
exit
app_lock=e32.Ao_lock()
app_lock.wait()