Advertisement
here2share

### pys60demos.py ^ 2017.08

Aug 11th, 2017
1,218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ### pys60demos.py <<< updated 2017 Aug
  2.  
  3. import appuifw, e32, sensor, key_codes, os, sys, re, time, math, random, graphics, audio, urllib, urllib2, base64, copy, tempfile
  4.  
  5. lg_scr = 576
  6. yy2=lg_scr/9
  7.  
  8. img=None # temp reference
  9.  
  10. def scr(msg):
  11.     txt.set(unicode(msg))
  12.  
  13. z_Colors =  ((u'RGB_BLACK',(0,0,0)),
  14.             (u'RGB_WHITE',(255,255,255)),
  15.             (u'RGB_GRAYLIGHT',(211,211,211)),
  16.             (u'RGB_GRAY',(128,128,128)),
  17.             (u'RGB_GRAYDARK',(169,169,169)),
  18.             (u'RGB_RED',(255,0,0)),
  19.             (u'RGB_ORANGE',(255,165,0)),
  20.             (u'RGB_YELLOW',(255,255,0)),
  21.             (u'RGB_GREEN',(0,128,0)),
  22.             (u'RGB_BLUE',(0,0,255)),
  23.             (u'RGB_CYAN',(0,255,255)),
  24.             (u'RGB_PURPLE',(128,0,255)),
  25.             (u'RGB_VIOLET',(238, 130, 238)),
  26.  
  27.             (u'RGB_PINK',(255,148,238)),
  28.             (u'RGB_DARKBLUE',(0,0,139)),
  29.             (u'RGB_DARKGREEN',(0,100,0)),
  30.             (u'RGB_DEEPPINK',(255,20,147)),
  31.             (u'RGB_INDIGO',(75,0,130)),
  32.             (u'RGB_LIGHTBLUE',(173,216,230)),
  33.             (u'RGB_LIME',(0,255,0)),
  34.             (u'RGB_OLIVE',(107,142,35)),
  35.  
  36.             (u'RGB_BROWN',(128,64,0)),
  37.             (u'RGB_GOLD',(255,215,0)),
  38.             (u'RGB_SILVER',(192,192,192)))
  39. #
  40. rgb_menu="rgb_menu=["
  41. for rgb in z_Colors:
  42.     i,ii=rgb[0].replace('RGB_',''),str(rgb[1])
  43.     rgb_menu += "(u'"+i+"',c_"+i+"),"
  44.     exec 'def c_'+i+'(): cv.color='+ii
  45.     exec rgb[0]+'='+ii
  46. rgb_menu += ']'
  47. def z_bg():
  48.     cv.bg=cv.color
  49.     cv.t=time.time()+0.5
  50.     cv.color=RGB_WHITE
  51.     if (cv.bg[0] > 180 or cv.bg[1] > 148 or cv.bg[2] > 180) and sum(cv.bg) > 250: cv.color=RGB_BLACK
  52.     img.clear(cv.bg)
  53. rainbow=[]
  54. def z(r,g,b):
  55.     rainbow.append((r,g,b))
  56. r,g,b=255,0,0
  57. for g in range(256):
  58.     z(r,g,b)
  59. for r in range(254, -1, -1):
  60.     z(r,g,b)
  61. for b in range(256):
  62.     z(r,g,b)
  63. for g in range(254, -1, -1):
  64.     z(r,g,b)
  65. for r in range(256):
  66.     z(r,g,b)
  67. for b in range(254, -1, -1):
  68.     z(r,g,b)
  69. max_rgb=len(rainbow)-1
  70. #
  71. alnu=u'one two three four five'.split()
  72.  
  73. def dts(x=0):
  74.     import datetime
  75.     dt=datetime.datetime.now()
  76.     ampm=' am'
  77.     if dt.hour > 11 and dt.hour != 24: ampm=' pm'
  78.     d=dt.hour%12, dt.minute, dt.second
  79.     d="%02d:%02d:%02d" % (d)
  80.     if x:
  81.         d2= dt.strftime("%A %d %B %Y ")
  82.         if x is 2:
  83.             d2 += d+ampm
  84.         elif x is 3:
  85.             d2=d2.split()[:-1] + d.split(':') + [ampm]
  86.         return  d2
  87.     return  d+ampm
  88. #
  89.  
  90. mask_z="""
  91. def automask(im):
  92.     width, height=im.size
  93.     mask=Image.new(im.size, '1') # black and white
  94.     tran=im.getpixel((0,0))[0] # transparent top-left
  95.     for y in range(height):
  96.         line=im.getpixel([(x, y) for x in range(width)])
  97.         for x in range(width):
  98.             if line[x] == tran:
  99.                 mask.point((x,y), 0) # mask on the point
  100.     return mask
  101.  
  102. #Converts the specified "area" of the image into an image mask
  103. #Transparent color is the color found in the upper left pixel
  104. def automaskArea(im, area):
  105.     width=area[2]-area[0]
  106.     height=area[3]-area[1]
  107.     startX=area[0]
  108.     startY=area[1]
  109.  
  110.     mask=Image.new((width, height), '1') # black and white
  111.     tran=im.getpixel((startX,startY))[0] # transparent top-left
  112.        
  113.     for y in range(height):
  114.         for x in range(width):
  115.             if im.getpixel((startX+x, startY+y))[0] == tran:
  116.                 mask.point((x,y),0)
  117.     return mask
  118. """
  119.  
  120. def z_text():
  121.     msg=appuifw.query(u'Enter text','text' )
  122.     scr(msg)
  123. def z_number():
  124.     msg=appuifw.query(u'Enter number','number' )
  125.     scr(msg)
  126. def z_date():
  127.     msg=appuifw.query(u'Enter date','date' )
  128.     scr(msg)
  129. def z_time():
  130.     msg=appuifw.query(u'Enter time','time' )
  131.     scr(msg)
  132. def z_code():
  133.     msg=appuifw.query(u'Enter code','code' )
  134.     scr(msg)
  135. def z_multiquery(): # accept only 2 entries at a time
  136.     try:
  137.         first_name,last_name=appuifw.multi_query(u'Enter first name',u'Enter last name')
  138.         scr('Hello, %s %s.\nThis is a demo.' %(first_name,last_name))
  139.     except:
  140.         pass
  141. def z_query():
  142.     msg=appuifw.query(u'query','query' )
  143.     scr(msg)
  144. def z_popup():
  145.     items=[u'item 1',u'item 2',u'item 3',u'item 4',u'item 5',u'item 6',u'item 7',u'item 8',u'item 9']
  146.     index=appuifw.popup_menu(items,u'*** Select Item ***')
  147.     scr('popup '+items[index]+' was selected')
  148. def note_info(): # type: info
  149.     # create a pop-up note: appuifw.note(label,type)
  150.     appuifw.note(u'information note','info')
  151. def note_error(): # type: error  
  152.     appuifw.note(u'error note','error')
  153. def z_checkbox(): # note: when none is checked,the highlighted is then selected
  154.     items=[u'item 1',u'item 2',u'item 3',u'item 4',u'item 5']
  155.     chosen=appuifw.multi_selection_list(items,style='checkbox',search_field=0)
  156.     chosen=sorted(chosen)
  157.     z_selected(chosen,items)
  158. def z_checkmark(): # note: when none is checked, the highlighted is then selected
  159.     items=[u'item 1',u'item 2',u'item 3',u'item 4',u'item 5']
  160.     chosen=appuifw.multi_selection_list(items,style='checkmark',search_field=1)
  161.     chosen=sorted(chosen)
  162.     z_selected(chosen,items)
  163. def z_selected(chosen,items):
  164.     selected=u'Selected: --'
  165.     for i in chosen:
  166.         selected=selected+'\n\t\t'+items[i]
  167.     txt.set(selected)
  168. def z_regex():
  169.     print
  170.     print
  171.     print "\nCommon image references--"
  172.     imgReg = '''["']([a-zA-Z0-9_$]+\.(?:jpe?g|gif|png|bmp))["']'''
  173.     print imgReg
  174.     print
  175.  
  176.     def okay(test):
  177.         print test, '=',
  178.         print re.findall(imgReg, test, re.IGNORECASE)
  179.     okay('''abc="jpg''')
  180.     okay('''abc=".jpg"''')
  181.     okay('''abc="2.jpg"''')
  182.     okay('''abc="_.jpg"''')
  183.     okay('''abc="$.jpg"''')
  184.     okay('''abc="*.jpg"''')
  185.     okay('''abc="+.jpg"''')
  186.     okay('''abc="/.jpg"''')
  187.     okay('''abc='test.test.png"''')
  188.     okay('''abc="test.jpg"''')
  189.     okay('''abc="test.jpeg"''')
  190.     okay('''abc="test.JPEG"''')
  191.     okay('''abc="TEST.gif"''')
  192.     okay('''abc="test.png"''')
  193.     okay('''abc="test.xjpg"''')
  194.     okay('''abc="test.jpgx"''')
  195.     okay('''abc="test..jpg"''')
  196. def z_dl():
  197.     URL = "http://www.python.org/images/python-logo.gif"
  198.    
  199.     if appuifw.query(u'Might take quite a long while to download the 2.48kb image','query' ): ### ???
  200.         dest_file = u"E:\\Images\\python-logo.gif"
  201.         print
  202.         print "Downloading Image...",
  203.         urllib.urlretrieve(URL, dest_file)
  204.         appuifw.note(u'Opening Viewer To Showcase Image Downloaded','info')
  205.         print "Completed!"
  206.         viewer = appuifw.Content_handler()
  207.         viewer.open(dest_file)
  208. def z_savedata():
  209.     dir_x = u'E:\\'
  210.     folder = u'Python\\demos\\'
  211.     try: os.mkdir(dir_x+folder)
  212.     except: pass
  213.     filename = 'demofile.txt'
  214.     fullpath = dir_x + folder + filename
  215.  
  216.     print fullpath
  217.  
  218.     # Open the file for writing -- Note if to append the data... change the 'w' to 'a'
  219.     #if not os.path.isfile(fullpath):
  220.     f=open(fullpath,'wb')
  221.     f.write("Python is a great language!\n\n-- End of Demo --\n")
  222.     f.close
  223.  
  224.     # Open the file for reading
  225.     f = open(fullpath, 'rb')
  226.  
  227.     # Read the file
  228.     db_x = f.read()
  229.     print db_x
  230.  
  231.     # Close the output file... as for good measure
  232.     f.close()
  233. #
  234.  
  235. newtabs=alnu
  236. def z_tabexit():
  237.     app.set_tabs([],None)
  238.     z_mainmenu()
  239. def z_5tabs(): # Note: Substitute changes were made since the tabs did not work properly for the Nokia 500
  240.     # normalize screen
  241.     app.screen='normal'
  242.    
  243.     app.menu=[(u'End tab demo',z_tabexit)]
  244.     # create a function that handles switching between tabs
  245.     def tab_handler(i):
  246.         global newtabs
  247.         i=alnu.index(newtabs[i])
  248.         newtabs=alnu[i:]+[alnu[0]]
  249.         app.set_tabs(newtabs,tab_handler)
  250.         # set the tabs
  251.  
  252.         # switch to the tab according to index
  253.         if(i==0):
  254.             demo='This is tab #1'
  255.         elif(i==1):
  256.             demo='This is the second tab'
  257.         elif(i==2):
  258.             demo='Now tab #3'
  259.         elif(i==3):
  260.             demo='Showing fourth tab'
  261.         else:
  262.             demo='*** Finally, tab 5 ***'
  263.  
  264.         app.body=appuifw.Text(unicode(demo))
  265.     # open the first tab
  266.     tab_handler(0)
  267. #
  268. def z_submenu_demo():
  269.     # create the application menu including submenus
  270.     msg=[(u'item 1',z_item1),(u'item 2',z_item2),
  271.         (u'Submenu 1',((u'sub item 1',z_subitem1),(u'sub item 2',z_subitem2),(u'sub item 3',z_subitem3))),
  272.         g_menu]
  273.     scr('Submenu Demo')
  274.     app.menu=msg
  275.  
  276. def setTabs(self):
  277.     app.set_tabs([u'Main',u'Text',u'List',u'Canvas'],z_tabs)
  278.  
  279. def text_color(COLOR):
  280.     txt.color=COLOR
  281.  
  282. def text_hlight(COLOR):
  283.     txt.highlight_color=COLOR
  284.  
  285. def text_font():
  286.     txt.font=(u'Nokia Hindi S60',25,None)
  287.  
  288. def abc(demo):
  289.     if type(demo) is tuple: demo=demo[0]  
  290.     txt.add(u''+demo+' 0123456789 ABCDEFG\n')
  291.     txt.add(u'abcdefghijklmnopqrstuvwxy\n')
  292.    
  293. def z_text():
  294.     mem_style=txt.style
  295.     mem_color=txt.color
  296.     txt.clear()
  297.     txt.font=("annotation")
  298.     txt.color=(255,0,0)
  299.     abc(txt.font)
  300.     txt.font=("annotation",42,None)
  301.     txt.add(u'annotation @ 42\n')
  302.     txt.font="title"
  303.     txt.color=(0,255,255)
  304.     abc(txt.font)
  305.     txt.font="legend"
  306.     txt.color=(0,255,0)
  307.     abc(txt.font)
  308.     txt.font="dense"
  309.     txt.color=(0,0,255)
  310.     abc(txt.font)
  311.     txt.font="normal"
  312.     txt.color=(0,0,0)
  313.     abc(txt.font)
  314.  
  315.     txt.style=(STYLE_BOLD)
  316.     txt.add(u'STYLE_BOLD\n')
  317.     txt.style=(STYLE_ITALIC)
  318.     txt.add(u'STYLE_ITALIC\n')
  319.     txt.style=(STYLE_UNDERLINE)
  320.     txt.add(u'STYLE_UNDERLINE\n\n')
  321.     txt.style=(STYLE_BOLD|STYLE_ITALIC|STYLE_UNDERLINE)
  322.     txt.add(u'All 3 Styles\n')
  323.     txt.style=mem_style
  324.     txt.color=mem_color
  325.  
  326. styles=(    STYLE_BOLD, STYLE_ITALIC, STYLE_UNDERLINE, STYLE_STRIKETHROUGH,
  327.             HIGHLIGHT_STANDARD, HIGHLIGHT_SHADOW, HIGHLIGHT_ROUNDED )
  328. def style_toggle(a_style): ### ZZZ
  329.     ''' Toggle style (on/off) '''
  330.     if txt.style & a_style:
  331.         txt.style = txt.style ^ a_style
  332.     else:
  333.         txt.style = txt.style | a_style
  334. def no_style(a_style):
  335.     ''' Clear all text style attributes '''
  336.     txt.style = 0
  337.  
  338. '''
  339. set_pos(cursor_pos)
  340.  
  341. len()
  342.  
  343. set(text)
  344.  
  345. delete([pos=0,length=len()])
  346.  
  347. get_pos()
  348.  
  349. get([pos=0,length=len()])
  350. '''
  351.  
  352. def addtext(msg):
  353.     txt.add(unicode(msg))
  354.  
  355. # create the callback functions for the application menu and its submenus
  356. def z_item1():
  357.     scr('item one was selected')
  358. def z_item2():
  359.     scr('item two was selected')
  360. def z_subitem1():
  361.     scr('subitem one was selected')
  362. def z_subitem2():
  363.     scr('subitem two was selected')
  364. def z_subitem3():
  365.     scr('subitem three was selected')
  366.  
  367. def z_find(reverse=False,beginning=False):
  368.     '''find text within a document'''
  369.     string=appuifw.query(u'Find text:','text',unicode(last_find))
  370.     saved_string=string[:]
  371.     if (string != None):
  372.         try:
  373.             text=text.get()
  374.             if settings.config['casesensitive'][0] == 'no':
  375.                 text=text.lower()
  376.                 string=string.lower()
  377.             if beginning:
  378.                 if reverse:
  379.                     cur_pos=text.rindex(string)
  380.                 else:
  381.                     cur_pos=text.index(string)
  382.             else:
  383.                 if reverse:
  384.                     cur_pos=text.rindex(string,0,(text.get_pos() -1))
  385.                 else:
  386.                     cur_pos=text.index(string,(text.get_pos() +1))
  387.             text.set_pos(cur_pos)
  388.         except:
  389.             appuifw.note(u'Search string not found.','info')
  390.             last_find=saved_string
  391.  
  392. def z_replace():
  393.     '''find and replace all instances of a given string'''
  394.     replace=appuifw.multi_query(u'Replace :',u'with : ')
  395.     if replace != None:
  396.         text=text.get()
  397.         cur_pos=text.get_pos()
  398.         text.set(text.replace(replace[0],replace[1]))
  399.         text.set_pos(cur_pos+text[0:cur_pos].incr(replace[0])*(len(replace[1])-len(replace[0])))
  400.         appuifw.note(unicode(text.incr(replace[0]))+' instances replaced')
  401.  
  402. def _rename():
  403.     '''rename a file/folder'''
  404.     path=dir_iter.entry(browse.current())
  405.     filename=unicode(os.path.basename(path))
  406.     if appuifw.query(u'Rename '+filename+' ?','query'):
  407.         newname=appuifw.query(u'Rename '+filename,'text',filename)
  408.         if newname != None:
  409.             try:
  410.                 os.rename(path,os.path.dirname(path)+str(newname))
  411.                 appuifw.note(u'File renamed','info')
  412.             except:
  413.                 appuifw.note(u'Error renaming file!','error')
  414.  
  415. def screen():
  416.     '''change the screen size'''
  417.     current_screen=config['screen']
  418.     config['screen']=appuifw.popup_menu([\
  419.         u'Normal',\
  420.         u'Large',\
  421.         u'Fullscreen',\
  422.     ],u'Screen size:')
  423.     if (config['screen'] == 0):
  424.         app.screen='normal'
  425.         config['screen']='normal'
  426.     elif (config['screen'] == 1):
  427.         app.screen='large'
  428.         config['screen']='large'
  429.     elif (config['screen'] == 2):
  430.         app.screen=full
  431.         config['screen']=full
  432.     else:
  433.         config['screen']=current_screen
  434.  
  435. def z_speech(data):
  436.     if data !='':
  437.         e32.ao_sleep(0.2)
  438.         audio.say(data)
  439. #
  440.  
  441. def z_betw(x,y,betw):
  442.     if betw == int(betw):
  443.         if betw < 0:
  444.             l,r,t,b=betw,abs(betw),betw,abs(betw)
  445.         else:
  446.             l,r,t,b=0,betw,0,betw
  447.     elif len(betw) == 2:
  448.         l,r,t,b=0,betw[0],0,betw[1]
  449.     else:
  450.         l,r,t,b=betw
  451.     if x < l: x=l
  452.     elif x > r: x=r
  453.     if y < t: y=t
  454.     elif y > b: y=b
  455.     return x,y
  456. #
  457. xy_outline=(-5,5),(-5,-5),(5,-5),(5,5),(0,-5),(0,5),(-5,0),(5,0),(0,0)
  458. def z_outline(x,y, msg,fg=RGB_LIME,bg=RGB_BLACK):
  459.     color=bg
  460.     for xy in xy_outline:
  461.         if xy == (0,0): color=fg
  462.         img.text((x+xy[0],y+xy[1]), unicode(msg),fill=color,font=(u'Nokia Hindi S60',100,STYLE_BOLD))
  463. #
  464. def star_5pt(x,y,s):
  465.     a,b,c,d,e,f,g,h,j,k,m,n,p=0,180,192,250,308,500,340,294,402,476,357,96,157
  466.     plot_xy=[(a,b),(c,b),(d,a),(e,b),(f,b),(g,h),(j,k),(d,m),(n,k),(p,h)]
  467.     nova=[]
  468.     for xy in plot_xy:
  469.         xy=(xy[0]*0.002)*s+x,(xy[1]*0.002)*s+y
  470.         nova.append(xy)
  471.     return nova
  472. #
  473. def btns_med(x=4,y=7,xy=(0,0),sz=(90,90)):
  474.     code='if 1:\n'
  475.     i=0
  476.     if xy is 1: xy=(0,38)
  477.     for y2 in range(y):
  478.         for x2 in range(x):
  479.             xx=str(sz[0]*x2+xy[0])
  480.             yy=str(sz[1]*y2+xy[1])
  481.             n=str(i+1).zfill(2)
  482.             code += '\txy_'+n+'=(('+xx+','+yy+'), ('+xx+'+'+str(sz[0])+','+yy+'+'+str(sz[1])+'))\n'
  483.             code += '\tdef box_'+n+'(event):\n\t\tcv.xy,cv.btn=xy_'+n+','+str(i+1)
  484.             code += '\n\tcanvas.bind(key_codes.EDrag, box_'+n+', ((xy_'+n+')))\n'
  485.     return code
  486. #
  487. def mosaic(s=90):
  488.     for x in range(0,s*4,s):
  489.         for y in range(0,s*7,s):
  490.             img.rectangle((x,y,x+s,y+s),fill=(random.randint(80,255),random.randint(80,255),random.randint(80,255)))
  491. #
  492. def sCapture(scr):
  493.     z=graphics.screenshot()
  494.     if scr[-4:] not in ['.png','.jpg','.gif']: scr += '.png'
  495.     z.save(u"e:\\python\\"+scr)
  496.     z.save(u"e:\\python\\_.png") # should immediately unlock the saved image
  497.     appuifw.note(u'Screenshot Has Been Saved As: '+scr+'\n... Hopefully.','conf')
  498. #
  499. def z_loop():
  500.     for i in range(1, 23):
  501.         print 'for num in range(1, 23) >>> '+str(i)
  502.     print '*** time.sleep(10) # 10 seconds'
  503.     time.sleep(5)
  504.     for i in range(1, 10):
  505.         print 'scrolling...'
  506. def z_dts():
  507.     scr(dts()+'\n'+dts(1)+'\n'+dts(2)+'\n'+str(dts(3)))
  508. #
  509. def z_enum():
  510.     scr('for item in enumerate('+str(alnu)+')\n\n>>>\n')
  511.     for item in enumerate(alnu):
  512.         print(item)
  513. #
  514. def slidebar():
  515.     cv.sVy=cv.y/yy2
  516.     img.rectangle(((350,0,358,640)), fill=RGB_BLACK)
  517.     for sVyy in xrange(0,9,2):
  518.         yy=yy2*sVyy+2
  519.         img.rectangle(((350,yy,358,yy+yy2)), fill=RGB_WHITE)
  520. #
  521. def z_tools():
  522.     index=appuifw.popup_menu(tools,u'*** Select Tool ***')
  523.     cv.val=tool_val[index]
  524. #
  525. def pr_menu(z):
  526.     msg=''
  527.     for i in z:
  528.         msg+=str(i[0])+'\n'
  529.     scr(msg)
  530.     app.menu=z
  531. #
  532. def z_textmenu():
  533.     pr_menu(t_menu)
  534. #
  535. def z_textmenu2():
  536.     pr_menu(t2menu)
  537. #
  538. class cv():
  539.     go='+++'
  540.     color=RGB_WHITE
  541.     xyz=[0,0,0]
  542.     xy=[0,0]
  543.     x=0
  544.     y=0
  545.     light=0
  546.     evt=None
  547.     tmp=0
  548.     sw=0
  549.     padx,pady=0,0
  550.     up=-1
  551.     w=1
  552.     h=1
  553. cv=cv()
  554. arrow_points=[  ( 0.0, -6.0), ( 3.0,  0.0), ( 1.0,  0.0),
  555.                 ( 1.0,  6.0), (-1.0,  6.0), (-1.0,  0.0),
  556.                 (-3.0,  0.0)]
  557. #
  558. def draw(rect):
  559.     if img:
  560.         canvas.blit(img)
  561. #
  562. def e_callback(event):
  563.     x,y=event['pos']
  564.     try: timer.cancel()
  565.     except: pass
  566.     if cv.x > 270:
  567.         try: cv.incr=increment[int(cv.y/yy2)]
  568.         except: cv.incr=0
  569.         cv.down=[cv.incr]*10
  570.     if event['type'] == key_codes.EButton1Down:
  571.         if cv.sz == full:
  572.             cv.sz=large
  573.             cv_set()
  574.         cv.jot=(x, y, x+1, y+1)
  575.     elif event['type'] == key_codes.EDrag:
  576.         pass # see def line_plot()
  577.     elif event['type'] == key_codes.EButton1Up:
  578.         cv.down=None
  579.     cv.x=x
  580.     cv.y=y
  581.  
  582. def line_plot():
  583.     x1,y1,x2,y2=cv.jot
  584.     cv.jot=x2,y2,cv.x,cv.y
  585.  
  586. step=10 ### ZZZ
  587.  
  588. def pieplot():
  589.     exec ('cv.'+cv.val+'+='+str(pdeg[cv.deg]))
  590. def circle(x,y,radius,fill,outline=0,width=0):
  591.     img.ellipse((x-radius,y-radius,x+radius,y+radius),outline=outline,fill=fill,width=width)
  592. def square(loc,color):
  593.     x,y=loc
  594.     img.rectangle((x*step,y*step,x*step+step,y*step+step),fill=color)
  595. def radian(d):
  596.     return (float(d)*pi)/180.0
  597. def velo(objx,objy,xdir,ydir,speed=0.05): # velocity
  598.     xx = xdir * speed
  599.     yy = ydir * speed
  600.     return objx+xx,objy+yy,xdir-xx,ydir-yy
  601. def switch(): # boolean
  602.     cv.sw=(1,0)[cv.sw]
  603. def portal(direction,max,min=0):
  604.     if direction < min: direction += max
  605.     if direction > max: direction -= max
  606.     return direction
  607. def draw_score():
  608.     img.rectangle((0,0,360,20),fill=(0,0,0))
  609.     img.text((2,14),u"Score: %d   Speed: %d%s"%(score,1200-speed,'inches/hr'),(0,192,0))
  610. def draw_field():
  611.     img.rectangle((0,20,360,y_max*step),fill=fieldcolor)
  612. def xyzsens():
  613.     try:
  614.         cv.xyz=(sens.x,sens.y,sens.z)
  615.     except: pass
  616. full,large,normal='full large normal'.split()
  617. def cv_set(i=0):
  618.     global img
  619.     if i == 0:
  620.         cv.ttl='Pys60 Demos'
  621.         cv.sz=large # (full,normal)
  622.         cv.ori='portrait' # (landscape)
  623.         cv.dpad=False
  624.         cv.color=RGB_WHITE
  625.         cv.font='normal'
  626.         cv.padx,cv.pady=0,0
  627.        
  628.     forLight() # ??? ZZZ not working
  629.    
  630.     app.title=unicode(cv.ttl)
  631.     app.orientation=cv.ori
  632.     app.screen=cv.sz
  633.     app.directional_pad=cv.dpad
  634.     app.body=cv.mode
  635.     img=Image.new(canvas.size)
  636. #
  637. def forLight():
  638.     timer=appuifw.e32.Ao_timer()
  639.     appuifw.e32.reset_inactivity()
  640.     if cv.light:
  641.         timer.after(10,forLight)
  642. #
  643. def z_xyzircle():
  644.     cv.go='$xyzircle'
  645. #
  646. def z_360arrow():
  647.     cv.go='$360arrow'
  648. #
  649. def z_progress():
  650.     cv.go='$progress'
  651. #
  652. def z_SnakeGame():
  653.     cv.go='$SnakeGame'
  654. #
  655. def z_SpinCube():
  656.     cv_set()
  657.     cv.go='$SpinCube'
  658. #
  659. def z_3Dspin():
  660.     cv_set()
  661.     cv.go='$3Dspin'
  662. #
  663. def z_snowfall():
  664.     cv_set()
  665.     cv.go='$snowfall'
  666. #
  667. def z_bouncySq():
  668.     cv_set()
  669.     cv.go='$bouncySq'
  670. #
  671. def z_star_5pt():
  672.     cv_set()
  673.     cv.go='$star_5pt'
  674. #
  675. def z_captureDemo():
  676.     cv_set()
  677.     cv.go='$captureDemo'
  678. #
  679. def z_sqdance():
  680.     cv_set()
  681.     cv.go='$sqdance'
  682. #
  683. def z_btn_matrix():
  684.     cv_set()
  685.     cv.go='$btn_matrix'
  686. #
  687. def z_sketchpad():
  688.     cv_set()
  689.     cv.go='$sketchpad'
  690. #
  691. def z_slider():
  692.     cv_set()
  693.     cv.go='$slider'
  694. #
  695. def z_blend_colors():
  696.     cv_set()
  697.     cv.go='$blend_colors'
  698. #
  699. def z_pieslice():
  700.     cv_set()
  701.     cv.go='$pieslice'
  702. #
  703. def z_text2fit():
  704.     cv_set(1)
  705.     cv.go='$text2fit'
  706. #
  707. def z_velocity():
  708.     cv_set(1)
  709.     cv.go='$velocity'
  710. #
  711. def z_textscroll():
  712.     cv_set(1)
  713.     cv.go='$textscroll'
  714. #
  715. def z_ori():
  716.     if cv.ori is 'portrait': cv.ori='landscape'
  717.     else: cv.ori='portrait'
  718.     z_text2fit()
  719. def z_fit(a,b,c):
  720.     pl=canvas.measure_text(a,font=b)[1] # pixel length
  721.     cl=canvas.measure_text(a,font=b,maxwidth=c)[2] # chr length
  722.     ### note: maxwidth is not generic
  723.     return cl,pl
  724. def text2wrap(prev,new=None,gap=20,setfont=(u"dense",30)):
  725.     if type(prev) in [int,tuple]:
  726.         color=prev
  727.         if new:
  728.             if gap is not 20:
  729.                 setfont=gap
  730.             gap=new
  731.         y=40
  732.         for gen in wrapped:
  733.             img.text((gap,y),u''+gen,font=setfont,fill=color)
  734.             y += 36
  735.     else:
  736.         ww=canvas.size[0]-gap*2
  737.         if type(prev) != list: prev=[]
  738.         def wrap_gen(line):
  739.             tmp=''
  740.             if prev: tmp=prev.pop(-1)+' '
  741.             while 1:
  742.                 cl,pl=z_fit(tmp+line,setfont,ww)
  743.                 if pl > ww:
  744.                     if tmp:
  745.                         prev.append(tmp)
  746.                         tmp=''
  747.                     else:
  748.                         prev.append(line[:cl])
  749.                         line=line[cl:]
  750.                 else:
  751.                     break
  752.             prev.append(tmp+line)
  753.  
  754.         if ' ' in new: new=new.split()
  755.         else: new=[new]
  756.         for data in new: wrap_gen(u''+data)
  757.         _gv = globals()
  758.         _gv['wrapped']=prev[:]
  759. #
  760. animals=[u'dog', u'cat', u'cow']
  761. def z_rec2play():
  762.     scr('Record animal sounds')
  763.     for animal in animals:
  764.         fullpath='e:\\'+animal+'.wav'
  765.         try: os.remove(fullpath)
  766.         except: pass
  767.         rec="sound of a "+animal
  768.         z_record(fullpath,rec)
  769.     z_playaudio(animals)
  770.     for animal in animals:
  771.         fullpath='e:\\'+animal+'.wav'
  772.         try: os.remove(fullpath)
  773.         except: pass
  774.     print 'Done!'
  775. def z_record(fullpath,rec=''):
  776.         sounds=audio.Sound.open(fullpath)
  777.         if appuifw.query(u"Record "+rec, "query"):
  778.             sounds.record()
  779.             appuifw.query(u"Press OK to stop recording", "query")
  780.             sounds.stop()
  781.             sounds.close()
  782. def z_playaudio(menu):
  783.     while True:
  784.         index=appuifw.popup_menu(menu, u"Select sound...")
  785.         if index == None:
  786.             break #
  787.         else:
  788.             sound=u'e:\\'+menu[index]+'.wav'
  789.             sound=audio.Sound.open(sound)
  790.             sound.play()
  791. def z_readtext():
  792.     phrases=[u'Here is an All-In-One demo',u'Thank you very much',u'This PyLang is awesome!']
  793.     index=appuifw.popup_menu(phrases,u'*** Select Phrase ***')
  794.     data=phrases[index]
  795.     scr(data)
  796.     z_speech(data)
  797. #
  798. def menuX():
  799.     cv.go='+++'
  800.     cv_set()
  801.     full_bind()
  802.     cv.mode=txt
  803.     app.exit_key_handler=mainexit
  804. def z_mainmenu(null=''):
  805.     menuX()
  806.     scr('Main Menu --\nPress Options\n\n')
  807.     app.menu=mainmenu
  808. def z_gfxmenu():
  809.     menuX()
  810.     scr('Graphics Demo Menu --\nPress Options\n\n')
  811.     app.menu=g2menu
  812. def z_rgbmenu():
  813.     app.menu=[(u'<<<', z_pad_menu)]+rgb_menu
  814. def z_pad_menu():
  815.     pad__=pad_menu[:]
  816.     if cv.go not in ['$sketchpad']: pad__.pop(1)
  817.     app.menu=pad__
  818. def z_audiomenu(): ### ZZZ
  819.     cv_set()
  820.     scr('Audio Demo --\nPress Options\n\n')
  821.     app.menu=s_menu
  822. def z_exitmenu():
  823.     app.menu=[m_menu]
  824. #
  825. m_menu= u'*** Main Menu',z_mainmenu
  826. g_menu= u'*** GFX Menu',z_gfxmenu
  827. g2menu= [(u'XYZCircle',z_xyzircle),
  828.         (u'Snake Game',z_SnakeGame),
  829.         (u'Blend Colors',z_blend_colors),
  830.         (u'3D Spin',z_3Dspin),
  831.         (u'Spin Cube',z_SpinCube),
  832.         (u'Velocity',z_velocity),
  833.         (u'360arrow',z_360arrow),
  834.         (u'Basic Buttons',z_btn_matrix),
  835.         (u'Color Slider',z_slider),
  836.         (u'Sketchpad',z_sketchpad),
  837.         (u'Pie-Arc-Key',z_pieslice),
  838.         (u'5pt Star',z_star_5pt),
  839.         (u'Snowfall',z_snowfall),
  840.         (u'Bouncy Square',z_bouncySq),
  841.         (u'Capture Demo',z_captureDemo),
  842.         (u'Progress Bar',z_progress),
  843.         (u'Mosaic Dance',z_sqdance),
  844.         (u'Text Scroll',z_textscroll),
  845.         (u'Text Wrap',z_text2fit),
  846.         m_menu]
  847. s_menu= [(u'rec and play',z_rec2play),
  848.         (u'text-to-speech',z_readtext),
  849.         m_menu]
  850. t_menu= [(u'text',z_text),
  851.         (u'number',z_number),
  852.         (u'date',z_date),
  853.         (u'time',z_time),
  854.         (u'code',z_code),
  855.         (u'query',z_query),
  856.         (u'multi-query',z_multiquery),
  857.         (u'checkbox: multi-select',z_checkbox),
  858.         (u'checkmark: multi-select',z_checkmark),
  859.         (u'popup menu',z_popup),
  860.         (u'tabs (5)*',z_5tabs),
  861.         (u'Sub Menu',z_submenu_demo),
  862.         m_menu]
  863. t2menu= [(u'loop',z_loop),
  864.         (u'enumerate',z_enum),
  865.         (u'datetime',z_dts),
  866.         (u'basic image regex',z_regex),
  867.         (u'download image',z_dl),
  868.         (u'save text data',z_savedata),
  869.         m_menu]
  870.         #(u'textwrap*',z_textwrap),
  871. mainmenu=[(u'Text Demo',z_textmenu),
  872.         (u'Text Demo 2',z_textmenu2),
  873.         (u'Graphics Demo',z_gfxmenu),
  874.         (u'Audio Demo',z_audiomenu)]
  875. exec rgb_menu
  876. pad_menu=[(u'-- Color Selection',z_rgbmenu),(u"-- Set Background",(z_bg)),(g_menu)]
  877.  
  878.  
  879. img=None
  880. app.screen = 'large'
  881. app.orientation = 'portrait'
  882. app.directional_pad = False
  883. app.body = canvas = Canvas(redraw_callback=draw, event_callback=e_callback) #
  884. img = Image.new(canvas.size)
  885.  
  886. txt=appuifw.Text()
  887. x_scr=canvas.size[0]
  888. y_scr=canvas.size[1]
  889. x_mid=x_scr / 2
  890. y_mid=y_scr / 2
  891. cv.mode=txt
  892. cv.t=0
  893. app_lock=e32.Ao_lock()
  894.  
  895.  
  896. if 1: # b64_img
  897.     py_png_b64='''\
  898.     R0lGODlhQABAAPcAAAAAAAAPMwAXNwAaOAAYQwAbQQAdQQAbTwAeSwAWUQMmQgAjSwEnSwYuTwoo
  899.     SggtSAwrSAAlVAAgWQAmWAAqVgAuVwAuXQcuWAw1TQs5Xhk0SQAsYwAxZAA1YQA0bAA6bAA/dyw/
  900.     UAxAbgxGeh5BYRxHbRRKdBRNfi5IXC5OaCJQdCNUfzdTajlQYj1UaTJWdDZge0BXaUZZaE1dakJa
  901.     cEBffElhc0lieUlmfU9leQZJgBRVjB5bjypehzNXhzFbgTlchiZjljhkhzRplixtozNwozF1qzp4
  902.     q0BehERmhENli0dshUZvjktylk1wkE92kltvgVBwiVp1g1lyiVl1il95j1B3l1V3klh6lmB2iWt7
  903.     lUWDuUaIvEqCskmGul6Col2FqVSLtVONvVqMtl+NsWaInmmAlGyGnHOGlHGHmXGKnnqJk3mMm3uR
  904.     lX2Qn2SGpmqIoW+Pp2yOrGeRuXGLoneOoHaPo3STp3eSrXyRonWZuX2gvmOWwW2aw2meynOfwnGh
  905.     yXuhw3yly3iqz3ypz3Sl0HCp1pt+Ha6ED6SAE6yDGqeRF7OEBbqTCriTFr6fEKyJLaODMKWWJqWS
  906.     M7WTI7aWN62iJrqlKrekOJiOR5uRTKSTRqaXVa2bV7mZR7mdVKmeZ62da62ec7Cfd7ujRrCmXrGt
  907.     W7yoWq6jaqyicbWga7OpbbqpbbSrebmueMGXC8SaFcSZJcOcNcqjGtSoHc2pJ8yrOcG1P9iuKdG4
  908.     LdC5PtmwPNq5MN29PcurScqtWtG8S9uwS9G8X921Xsmvbc2yd9C9cN/AUNHAfeHKRePMUuDDYOTP
  909.     ZODFcubPdOLIfoKPmIGZq4qcrIGasYedsYOgs4eiv5euvoSjwIapx4KozYSrzI6wzoaw1Iux1Y+1
  910.     1oq12JSyz5K00Ji305i72qC706C92Z3B3JnA4aTC26vF3KXI5K/Q6s/CjtTOgdvGjtLHmtPNltTP
  911.     odTQreXRgunXk+nZp+/ki+zimu/lqQAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAABAAEAA
  912.     AAj/AP8JHEiwoEGB16qdiVMmzh1p1KhNi1bnzBk809Ic3MixI0czNKhUK5du3bl06cqpVGlOnTpz
  913.     5M60cOOxps2BaSDI+faNGzdx38B92zYunE+f4cQdNTdFg52bUA+mMTCHULdAe7JtA1SIkCBtgsIS
  914.     8hookLay274I0Bi17b8GFgqN+XFmWpQvgPj48ZNXr19Affj0yetHhQK3UeEs+CBGBbSBV4SImSyG
  915.     Dx/KYsLwGZN5cpcAZhDflENgAgG2AxEE2SJmi+stXMQc6UK7y5HbRwgcFl3zzYTfjwl2kLCDyBYj
  916.     Ro4kx32EyG0iQwoEyMPbo5XfE1ALnODBwwcdO8IH/9kRpHx5HkF6iCAQAEP1jlh+W4AR/N+ZCRs+
  917.     6Peuvz//Dx2Yxp577230hQUfnCACGNhY84YIGXwgggggiKBfB/oh6MEEFkRAwIcCEFigQW+ssEIQ
  918.     K4jgww8liGDiixNeiOAH+VGwwAIftjfiQXGUMEQRQwzxYnpDCCFkihd+YAEHHFhgwQQIgCjijgPF
  919.     QcILLwjxgwo9/PCCl1i+oIIJImA4o5MdQklAiFQWBA0ba8S5RhppoNEGGmiwkQYdU2DIJJpoYkfA
  920.     AFO2CVUaC8gHYAdocvDboIW6NcUUL6DQggssXMrCppyG6SmWKpSG4AQdMFoBBRQ8GcEC7qWCCies
  921.     oP8CCiquhOLRFBgIoIQe5KCUjjnnoIMOT910sw0hgCRr2RhkdDGECE9y4J2Tp1KwqgLucWIMPdzW
  922.     Q487nIDC0QsFMCAOOy+xRI43xnaDbF+XieHFbLiNwKGSS6JZwbXuZYJMPQADzO0pmxz0wod9oDPO
  923.     UdgEIgi8Y4xBG25FmMfDDiMw2eSSFjJqQQULYPuPJr9wazI9zjATCScFTVHaBoYM8kcgllnW2sRH
  924.     BHneCico2F8ESl4A4YQQZsDoBQ70SwozzjTdDDPLLGPLIZ0QtIAEEnhAWRiyKUcEEUHw0PMJI/gs
  925.     4YUZWJB2ixmUoIIIb0N4AQMP9CtJL8ooc8zex/T/Yksikww0xQQSJDBBcl+XdwIIIPynHwj6ES35
  926.     hCaU4LYKKrz4dgYN1P3PJos80svoyfDCSy+xIHLIKQJlQDjWG4S3A+MfQP444yOIcIIJCpL5NubA
  927.     Yw6DEEL44MMKJWSAAQZt/DOJI4/UYjouvMxCiyOMJML6FAUcAPsGHNB+du0jfMD7CS+mn/kKmP8g
  928.     BAwwLMGEE0og8ULyywuECSWzzFILLrjo3ywawQhFbI8AB8AP+G4nIRGMoEI9S58QekC8ClpQCE/I
  929.     IBawMIUaiIlzMPjHKSpxiVrUgha5oEX1ZvEKRiBiEqdw2W82wB/GiQ8EZTMRBS3IhB768AlNsIIV
  930.     /56wQSxcYQkwUAEJRKABgQiDEiasRS5wQQtc1GIWsIAFIiJxCiHM8D82tF3ZeqACIwkhiFbwYQ8z
  931.     aIUgGjGDTogC/FRQggtAQYSY8F8Ac8ELAPYvi46gxClOQMPu0C6M5jOBiYj3hCGq0YfEGwL9lJCE
  932.     JRBvS5gjAQ0EcgooApB6VOQFLWjBQkcYsHGGPGTtGOeiMl7wBTD4VJiA8AIayJIEJKiDQJAxCUyY
  933.     sI/ToyIps0iJYOyndo/rTwNfdEn44WAKVciCGbJATWpCAQpTgEIWpIBNLUhjIKzYxC+MIYwp9lGF
  934.     n4QFFh2xC2UqU3wiUGQPViCEF+CAGvVxyyk4cf8KetwDH87YBQCr+EkrYhEWtVCmd2ynTDKZSAVq
  935.     IIg84iGPilJUHvOoqEbj0Q55wMMVoHBFwOpxD2D0AoDBpGIWYeEIWVjIA+IbX39MYAISREMg8Qgn
  936.     rJDRDnf4lKPtQIZQh2qMbQlMYM7wBSj7+MlRZjEWuzjBMR23qAll4AwCMcUkYIiPfOQDH2ANaz3w
  937.     4a2TmZVbzjhGQakoTFK+AhaxCEYQ3ImhUi2qVC/IqiUsoYx70ANg+OCWX9FqMmegrBnOaEbUoHYM
  938.     gS51lG3FIiWG0Sd3fqB8F+rABaYgwklQ4hZMu0fTRsu0lDHjtFCL2jKOkbe99cKxbIXsQGnBUkj/
  939.     ULYCyIyRVDvWARIIZBMl1AVqUZu34jKjuKztW99Gd9JPnpOgTSVmJSgbIQmdr2e5gxBnT4GJS+Qi
  940.     GcVVRjLGC97xMve8vTAdU1MK3U/GgraviMUnWKeBDEwofSZSUAZigMdc8JG85k1Gek+X3gGrd3pM
  941.     pR46P7kLgb4XFq+gBDEEgoMMjABz7xPC+uooAxHewr+88K+I+RhilFLvwCjmhUB30ccGB+PFDa5F
  942.     LFgoSIFMwb4r6AEMmCCEJQDhB8izgYdHPGLTkZjA50Xy6HbB3Ab3IhjDUG0wdhGLLFaCICnAMAYz
  943.     qKUgi1AXulDviHHBRz6el29oPsZqlxGMNUet/xmKXa0tYhGLGguOBItsAhO4zKIbfLl0ySjygUeX
  944.     XGWodhlwfvOh4wxnxQ7DwZ8wyBRIAAQgCEEJPA5TDkQIDF0QedC6AK8yUDva0dIDsaOFc2IbLQxg
  945.     zLkSrJM0Cl5AS0+hoMOnCHOIRYziXgBDzY1umsme8Qx6PAPOxCZ2o43xC19UghSxPgg0X5ACLLEA
  946.     BSGYAac9zeteq9kYQw23uMVNjHKbmxjFiPZGJgWNdrv7Mbn+dIp38YtSrOLe+M53vlsxilbwuxWh
  947.     GIWt3hNvXgM6pb5YhaH0yW0Q86J06jWhLU7BioqzwhWsUIXFK+4KUYxi4ZwEsxR7bbpZ4OIYwv82
  948.     GcDeETB71OMdHwf5KTp95BQH8ORRUzOik31sYrNi4AsvuOkMPDpR/tGEo9OFL37BilOseRifALqh
  949.     cq0L9J6Xeib841OXgW9S2GIXwYiE1Ns08zQnd7m9iOIVZxHXaJ/CE3SGRNVkDoxfH/e0x0ita/2G
  950.     C1jQIhbNKAgx6FyJsVPpFOQ8bamdFucX2wIXdKZHQX5BiVh4Qt2GIoYwmHYyw6LMGTnfhQkp4Yto
  951.     t6ISlJAF5qduDGYYw/NmPXbObWGLWlTiGac4xSpIkXpPgLwgyNhWsY9tbGKjNee6oH0lfvELT1Ri
  952.     +auX+SmUzfNkN+PYwzgG7Xchi+57ghjR/70rCKfPc24pO87L8MUwfLH08It/ILkPqjEaTf9hFBX8
  953.     7n9/QXLP//73f0cBAQA7'''
  954.  
  955.     b64mask='''\
  956.     R0lGODlhQABAAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  957.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  958.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  959.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  960.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  961.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  962.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  963.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  964.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  965.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  966.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  967.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  968.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  969.     AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAABAAEAA
  970.     AAj/AP8JHEiwoEGBARIqXMhQ4cGHECNCbEixYkKJGDMOtMixosaPBzuKbAiyJMKRKAOYBEnyZEqG
  971.     KzXCJPhyZkyJNl3WvHgzYs5/Oxf29GkzqNChD42KRJpUKUemIZ1ahGpQ6lSqNK1SxLqy5lCtL4F6
  972.     JAo2pdixUcua7ZhWLcqzVze6DTsy69y3dXXeXfoW7l62eP/mDSwYcGGweg8r9avYaOLGXhlDNvtY
  973.     8M3JdieHlax5cOedlT8bFr2ZtFfTFwmLDg0TNWuhpjNPjS13dOeqtjW33bq6qcfPOH9DRhqZK8u7
  974.     xl8vTr43OWerzpszd1rb4XTHsqMvr65SO3a/zpUXEw+vNrzs7ea5j09fEDT74GyZBgQAOw=='''
  975.  
  976.     tf = tempfile.mktemp(".png", "tmp_x")
  977.     print tf
  978.  
  979.     g = open(tf, 'wb')
  980.     g.write(base64.decodestring(py_png_b64))
  981.     g.close()
  982.  
  983.     png = Image.open(tf)
  984.  
  985.     g = open(tf, 'wb')
  986.     g.write(base64.decodestring(b64mask))
  987.     g.close()
  988.  
  989.     png_mask = Image.open(tf)
  990.  
  991.     img_mask=Image.new(png_mask.size, mode='1')
  992.     img_mask.blit(png_mask)
  993.  
  994.  
  995. def mainexit():
  996.     z_tabexit()
  997.     app_lock.signal()
  998.     cv.go=False
  999. app.exit_key_handler=mainexit
  1000.  
  1001. timer=appuifw.e32.Ao_timer()
  1002. app_lock=appuifw.e32.Ao_lock()
  1003.  
  1004. import sensor
  1005. sens=sensor.AccelerometerXYZAxisData(data_filter=sensor.LowPassFilter())
  1006. sens.set_callback(data_callback=xyzsens)
  1007. sens.start_listening()
  1008.  
  1009. ### joypad
  1010. mv=0
  1011. jxa,jya=70,350 ### <<< jpad xy axis point
  1012. jxb,jyb=jxa+220,jya+220
  1013. jx1,jy1=jxa+70,jya+70
  1014. jx2,jy2=jxa+150,jya+150
  1015. def mL(event):
  1016.     global mv
  1017.     if mv <> 3:
  1018.         mv=2
  1019. def mR(event):
  1020.     global mv
  1021.     if mv <> 2:
  1022.         mv=3
  1023. def mU(event):
  1024.     global mv
  1025.     if mv <> 1:
  1026.         mv=0
  1027. def mD(event):
  1028.     global mv
  1029.     if mv <> 0:
  1030.         mv=1
  1031. def bind_jpad():
  1032.     canvas.bind(EButton1Down,mU,((jx1,jya),(jx2,jy1)))   # up
  1033.     canvas.bind(EButton1Down,mD,((jx1,jy2),(jx2,jyb)))   # down
  1034.     canvas.bind(EButton1Down,mL,((jxa,jy1),(jx1,jy2)))   # left
  1035.     canvas.bind(EButton1Down,mR,((jx2,jy1),(jxb,jy2)))   # right
  1036. def jpad():
  1037.     grey=(220,220,220)
  1038.     img.rectangle((jxa,jy1,jxb,jy2),fill=grey) # w
  1039.     img.rectangle((jx1,jya,jx2,jyb),fill=grey) # h
  1040. def jpad_key(): ### bonus feature!
  1041.     if   mv == 0:
  1042.         xy_=(jx1,jya,jx2,jy1) # U
  1043.     elif mv == 1:
  1044.         xy_=(jx1,jy2,jx2,jyb) # D
  1045.     elif mv == 2:
  1046.         xy_=(jxa,jy1,jx1,jy2) # L
  1047.     elif mv == 3:
  1048.         xy_=(jx2,jy1,jxb,jy2) # R
  1049.     else: return
  1050.     img.rectangle(xy_,fill=0xffff00)
  1051. #
  1052. if not appuifw.touch_enabled():
  1053.     appuifw.note(u"This application only works on devices that support touch input")
  1054. #
  1055. def up_event(event):
  1056.     cv.up=-1
  1057. def dn_event(event):
  1058.     cv.up=1
  1059. #
  1060. def mv_event(event):
  1061.     x=event[0]
  1062.     y=event[1]
  1063.     jx=x/cv.w
  1064.     jy=y/cv.h
  1065.     cv.btn99=jx+(jy*4)+1
  1066.     cv.xy=(cv.w*jx,cv.h*jy)
  1067.     cv.up=time.time()+1
  1068. #
  1069. def btn_pad(xx=4,yy=7):
  1070.     for y2 in range(yy):
  1071.         for x2 in range(xx):
  1072.             img.text((x2*cv.w+5,y2*cv.h+75+cv.pady), unicode(x2+(y2*4)+1), fill=RGB_GRAY,font=(u'Nokia Hindi S60',80,appuifw.STYLE_BOLD))
  1073. def btn_rpl(target,btn_99,sq=RGB_WHITE,btn_label=RGB_GRAY):
  1074.     a,b,c,d=target
  1075.     return (a,b+cv.pady,c,d+cv.pady), (a+cv.padx,b+cv.pady), sq, btn_label
  1076. #
  1077. def full_bind():
  1078.     canvas.bind(key_codes.EButton1Up, up_event, ((0,0), (x_scr,720)))
  1079.     canvas.bind(key_codes.EButton1Down, dn_event, ((0,0), (x_scr,720)))
  1080.     canvas.bind(key_codes.EDrag, mv_event, ((0,0), (x_scr,720)))
  1081. full_bind()
  1082. cv_set()
  1083. z_mainmenu()
  1084.  
  1085. jxa,jya=70,350 ### <<< jpad xy axis point
  1086. jxb,jyb=jxa+220,jya+220
  1087. jx1,jy1=jxa+70,jya+70
  1088. jx2,jy2=jxa+150,jya+150
  1089.  
  1090. mv=0
  1091. def mU(event):
  1092.     global mv
  1093.     if mv <> 1:
  1094.         mv=0
  1095. def mD(event):
  1096.     global mv
  1097.     if mv <> 0:
  1098.         mv=1
  1099. def mL(event):
  1100.     global mv
  1101.     if mv <> 3:
  1102.         mv=2
  1103. def mR(event):
  1104.     global mv
  1105.     if mv <> 2:
  1106.         mv=3
  1107. palref='''
  1108. cv.Lcolor = (hh(cv.Lcolor[0],1), cv.Lcolor[1], cv.Lcolor[2])
  1109. cv.Lcolor = (cv.Lcolor[0], hh(cv.Lcolor[1],1), cv.Lcolor[2])
  1110. cv.Lcolor = (cv.Lcolor[0], cv.Lcolor[1], hh(cv.Lcolor[2],1))
  1111. cv.Rcolor = (hh(cv.Rcolor[0],1), cv.Rcolor[1], cv.Rcolor[2])
  1112. cv.Rcolor = (cv.Rcolor[0], hh(cv.Rcolor[1],1), cv.Rcolor[2])
  1113. cv.Rcolor = (cv.Rcolor[0], cv.Rcolor[1], hh(cv.Rcolor[2],1))'''.split('\n')[1:]
  1114. cv.active_palette=palref[0]
  1115.  
  1116. if 1: # slider
  1117.     cv.incr=0
  1118.     cv.down=(0)
  1119.     increment=[100,50,10,1,0,-1,-10,-50,-100]
  1120. if 1: # blend_colors
  1121.  
  1122.     def rgb_btns(x,y,x2=360,y2=50):
  1123.         xx=x2/3+1
  1124.         rgb=RGB_RED,RGB_GREEN,RGB_BLUE
  1125.         for i in xrange(3):
  1126.             xy2=(x+xx*i,y,x+xx*(i+1),y+y2)
  1127.             if cv.x:
  1128.                 xv,yv=cv.x,cv.y
  1129.                 if yv > y and yv < y+y2:
  1130.                     if xv > xy2[0] and xv < xy2[2]:
  1131.                         cv.active_palette=palref[palette+i]
  1132.                         cv.RGB_mark=(x+xx*i,y,x+xx*i+10,y+10)
  1133.             img.rectangle((xy2), fill=rgb[i])
  1134.     #
  1135.     def mixColors(): ### ZZZ yellow + blue = (0,128,0)
  1136.         def rgbfix(R):
  1137.             aaa=(LC[R]*-1)+(RC[R])
  1138.             tmp=[0,1,2]; tmp.pop(R)
  1139.             bbb=LC[tmp[0]]+LC[tmp[1]]
  1140.             ccc=int((RC[tmp[0]]+RC[tmp[1]]))*-1
  1141.             tmp=abs(aaa+bbb+ccc)-637
  1142.             if tmp > 0: return tmp
  1143.             return 0
  1144.        
  1145.         LC,RC = cv.Lcolor,cv.Rcolor
  1146.         rgb = [(LC[0]+1)/2, (LC[1]+1)/2, (LC[2]+1)/2] # L
  1147.         rgb = [rgb[0]+((RC[0]+1)/2), rgb[1]+((RC[1]+1)/2), rgb[2]+((RC[2]+1)/2)] # R
  1148.        
  1149.         # color fix for mixing yellow and blue to correspondingly make green
  1150.         r,g,b = rgb[0]-rgbfix(2),rgb[1],rgb[2]-rgbfix(2)
  1151.         return ((hh(r),hh(g),hh(b)))
  1152.     #
  1153.     def rgb_box(box,x=10,y=210,w=60,h=60):
  1154.         i='LRM'.find(box)
  1155.         return ((x,y,350-x-w,y+h*3),(x+w,y+h,350-x,y+h*4),(x+w,y+h,350-x-w,y+h*3))[i]
  1156.     #
  1157.     def hh(limit,incr=0,min=None,max=None):
  1158.         if incr: limit+=cv.incr
  1159.         if not min:
  1160.             min,max=0,255
  1161.         elif not max:
  1162.             min,max=0,min
  1163.         if limit < min: limit=min
  1164.         if limit > max: limit=max
  1165.         return limit
  1166. #
  1167. cv.sVy=-1
  1168. go='-'
  1169. init=''
  1170. skip=0
  1171. while cv.go:
  1172.     go=cv.go
  1173.     if go and time.time() > skip:
  1174.         skip=time.time()+0.05
  1175.         if go[0] is '$': ### graphics mode
  1176.             try: sens.start_listening()
  1177.             except: pass
  1178.             if cv.mode is txt:
  1179.                 cv.mode=canvas
  1180.                 cv_set(1)
  1181.         else:
  1182.             try: sens.stop_listening()
  1183.             except: pass
  1184.             if cv.mode is canvas:
  1185.                 cv.mode=txt
  1186.                 cv_set()
  1187.         if go == '$SnakeGame':
  1188.             if init != go:
  1189.                 init=cv.go
  1190.                 step=10
  1191.                 _ww=360/step
  1192.                 bodycolor=(32,180,32)
  1193.                 headcolor=(0,128,0)
  1194.                 fieldcolor=(192,192,128)
  1195.                 foodcolor=(255,0,0)
  1196.                 padding=4
  1197.                 deltas=((0,-1),(0,1),(-1,0),(1,0)) # up down left right
  1198.                 y_max=(jya-2)/step
  1199.                 defaultloc=w,h=[_ww/2,y_max/2]
  1200.                 food_rnd=[]
  1201.                 for x in range(4,_ww-4,10):
  1202.                     for y in range(4,y_max-4,10):
  1203.                         food_rnd.append((x,y))
  1204.                 random.shuffle(food_rnd)
  1205.                 defaultsnake=12
  1206.                 arraydefault=[]
  1207.                 for i in range(defaultsnake,0,-1): # body (excluding the snake head)
  1208.                     arraydefault.append([w,h+i])
  1209.                 loc='init'
  1210.             if loc is 'init':
  1211.                 loc=w,h=defaultloc
  1212.                 score=0
  1213.                 mv=0
  1214.                 foodloc=[5,5]
  1215.                 sp=10000.00
  1216.                 speed=1200.00
  1217.                 snakelength=12
  1218.                 fillarray=arraydefault[:]
  1219.                 bind_jpad()
  1220.             p=0
  1221.             if loc == foodloc:
  1222.                 p=1
  1223.                 score+=1
  1224.                 for z in food_rnd:
  1225.                     a,b=food_rnd.pop()
  1226.                     food_rnd.insert(random.randrange(1,9)*-1,[a,b])
  1227.                     if a != loc[0] and b != loc[1]:
  1228.                         if foodloc not in fillarray+loc:
  1229.                             foodloc=[a,b]
  1230.                             p=0
  1231.                             break
  1232.             else:
  1233.                 fillarray.pop(0)
  1234.             fillarray.append(loc)
  1235.             try:
  1236.                 e32.ao_sleep(speed/sp)
  1237.                 speed-=0.9
  1238.             except: pass
  1239.             w+=deltas[mv][0]
  1240.             h+=deltas[mv][1]
  1241.             loc=[w,h]
  1242.             if loc in fillarray or w<0 or h<2 or w>_ww-1 or h>=y_max or p:
  1243.                 print 'end of game'
  1244.                 loc='init'
  1245.                 go=appuifw.query(u'Score: %d   Speed: %d\nPlay Again?'%(score,1200-speed),'query')
  1246.                 if not go:
  1247.                     z_gfxmenu()
  1248.             else:
  1249.                 if 1200-speed < 2: img.clear(RGB_BLACK)
  1250.                 img.rectangle((0,20,360,y_max*step),fill=fieldcolor)
  1251.                 square(foodloc,foodcolor)
  1252.                 for bloc in fillarray:
  1253.                     square(bloc,bodycolor)
  1254.                 square(loc,headcolor)
  1255.                 img.rectangle((0,0,360,20),fill=RGB_BLACK)
  1256.                 img.text((2,14),u"Score: %d   Speed: %d"%(score,1200-speed),(0,192,0))
  1257.                 jpad()
  1258.                 jpad_key()
  1259.         elif go in ['$3Dspin','$SpinCube']:
  1260.             if init != go:
  1261.                 init=cv.go
  1262.                 xm,ym,x2,y2=0,0,0,0
  1263.                 halfResX=x_mid
  1264.                 halfResY=y_mid
  1265.                 distance=180
  1266.                 PX=0
  1267.                 PY=0
  1268.                 PZ=200
  1269.                 Size=10
  1270.                 xyz=80
  1271.                 VX = [-xyz, -xyz, -xyz, -xyz,  xyz,  xyz,  xyz,  xyz]
  1272.                 VY = [-xyz,  xyz, -xyz,  xyz, -xyz,  xyz, -xyz,  xyz]
  1273.                 VZ = [-xyz, -xyz,  xyz,  xyz, -xyz, -xyz,  xyz,  xyz]
  1274.                 faces = [(0,1,3,2),(7,5,4,6),(0,2,6,4),(7,3,1,5),(7,3,2,6),(0,1,5,4)]
  1275.                 colors = RGB_RED, RGB_ORANGE, RGB_YELLOW, RGB_GREEN, RGB_BLUE, RGB_VIOLET
  1276.                 ANGLEX=0
  1277.                 ANGLEY=0
  1278.                 ANGLEZ=0
  1279.             xm,ym,zm=cv.xyz
  1280.             xm,ym=z_betw(xm,ym,(-20))
  1281.             ANGLEX+=ym
  1282.             ANGLEY+=xm
  1283.             rax=ANGLEX*math.pi/180
  1284.             ray=ANGLEY*math.pi/180
  1285.             raz=ANGLEZ*math.pi/180
  1286.  
  1287.             sinx=math.sin(rax)
  1288.             cosx=math.cos(rax)
  1289.             siny=math.sin(ray)
  1290.             cosy=math.cos(ray)
  1291.             sinz=math.sin(raz)
  1292.             cosz=math.cos(raz)
  1293.            
  1294.             """
  1295.             buf=graphics.Image.new((640,360)) ### not sure if this is the pythonic double buffer, but it works like a charm
  1296.             img=graphics.Image.new((640,360))
  1297.             """
  1298.            
  1299.             r1=[]
  1300.             r2=[]
  1301.             for n in range(8):
  1302.                 ZX=VX[n]*cosz - VY[n]*sinz - VX[n]
  1303.                 ZY=VX[n]*sinz + VY[n]*cosz - VY[n]
  1304.                 YX=(VX[n]+ZX)*cosy - VZ[n]*siny - (VX[n]+ZX)
  1305.                 YZ=(VX[n]+ZX)*siny + VZ[n]*cosy - VZ[n]
  1306.                 XY=(VY[n]+ZY)*cosx - (VZ[n]+YZ)*sinx - (VY[n]+ZY)
  1307.                 XZ=(VY[n]+ZY)*sinx + (VZ[n]+YZ)*cosx - (VZ[n]+YZ)
  1308.                 XR=YX+ZX
  1309.                 YR=ZY+XY
  1310.                 ZR=XZ+YZ
  1311.                 z=(VZ[n]+PZ+ZR)/distance
  1312.                 x=((VX[n]+PX+XR)/z)+halfResX
  1313.                 y=((VY[n]+PY+YR)/z)+halfResY
  1314.                 z=int(Size/z)
  1315.                 r1.append((x,y))
  1316.                 r2.append(z)
  1317.                 img.clear(RGB_LIGHTBLUE)
  1318.             if go == '$3Dspin':
  1319.                 circle(PX+halfResX,PY+halfResY,Size*6,0xff0000)
  1320.                 for n in range(len(r2)):
  1321.                     x,y=r1[n]
  1322.                     z=r2[n]
  1323.                     circle(x,y,z,0x0000ff)
  1324.             else:
  1325.                 t = []
  1326.                 c = 0
  1327.                 for f in faces:
  1328.                     z1 = [r1[z] for z in f]
  1329.                     z2 = [r2[z] for z in f]
  1330.                     t.append([sum(z2),z1,colors[c]])
  1331.                     c += 1
  1332.                 z = False
  1333.                 if time.time() % 2 > 1: z = True
  1334.                 t.sort(reverse=z)
  1335.                 for c,a,b in t:
  1336.                     img.polygon(a,fill=b)
  1337.             img.text((20,40),'X:'+unicode(xm),0)
  1338.             img.text((20,80),'Y:'+unicode(ym),0)
  1339.         elif go == '$bouncySq':
  1340.             if init != go:
  1341.                 init=cv.go
  1342.                 sq=100
  1343.                 dy=20
  1344.                 dx=20
  1345.             if time.time() > cv.t:
  1346.                 cv.x += dx
  1347.                 cv.y += dy
  1348.                 x,y=cv.x,cv.y
  1349.                 if (x < -50)or(x > x_scr - 50):
  1350.                     dx *= -1
  1351.                 if (y < -50)or(y > 560 - 50): # y_scr
  1352.                     dy *= -1
  1353.                 cv.color=random.randrange(0xffffff)
  1354.                 cv.t=time.time()+0.05
  1355.                 img.rectangle((x,y,x+sq,y+sq), fill=cv.color)
  1356.         elif go == '$blend_colors':
  1357.             if init != go:
  1358.                 init=cv.go
  1359.                 cv.RGB_mark=(10,140,20,150)
  1360.                 cv.x=1
  1361.                 cv.Lcolor = (0,0,255)
  1362.                 cv.Rcolor = (255,255,0)
  1363.                 cv.color = cv.prev_color = (0,0,0)
  1364.                 app.menu=[(u'<<<', z_pad_menu)]+rgb_menu
  1365.             if cv.prev_color <> cv.color:
  1366.                 exec (cv.active_palette[:9]+'='+str(cv.color))
  1367.                 cv.prev_color=cv.color
  1368.                 cv.x=1
  1369.             if cv.x:
  1370.                 img.clear(RGB_GRAY)
  1371.                 slidebar()
  1372.                 exec (cv.active_palette)
  1373.                 cv.subcolor = mixColors()
  1374.                 img.rectangle(((0,0,350,640)), fill=RGB_GRAY)
  1375.                 img.rectangle(((0,0,340,92)), fill=RGB_WHITE)
  1376.                 palette=0
  1377.                 rgb_btns(10,140,280)
  1378.                 palette=3
  1379.                 rgb_btns(10,500,280)
  1380.                 img.rectangle((cv.RGB_mark ), fill=RGB_WHITE)
  1381.                 img.rectangle((rgb_box('L')), fill=cv.Lcolor)
  1382.                 img.rectangle((rgb_box('R')), fill=cv.Rcolor)
  1383.                 img.rectangle((rgb_box('L')), width=3, outline=RGB_BLACK)
  1384.                 img.rectangle((rgb_box('R')), width=3, outline=RGB_BLACK)
  1385.                 img.rectangle((rgb_box('M')), fill=cv.subcolor)
  1386.                 img.text((10,36), u"RGB Result Of A And B:", fill = RGB_BLACK,font=(u'Nokia Hindi S60',29,STYLE_BOLD))
  1387.                 img.text((10,68), u""+str(cv.subcolor), fill = RGB_BLACK,font=(u'Nokia Hindi S60',29,STYLE_BOLD))
  1388.                 img.text((10,128), u"RGB Of A: "+str(cv.Lcolor), fill = RGB_BLACK,font=(u'Nokia Hindi S60',29,STYLE_BOLD))
  1389.                 img.text((10,488), u"RGB Of B: "+str(cv.Rcolor), fill = RGB_BLACK,font=(u'Nokia Hindi S60',29,STYLE_BOLD))
  1390.                 cv.x=0
  1391.         elif go == '$progress':
  1392.             if init != go:
  1393.                 init=cv.go
  1394.                 cv.bar=0
  1395.             if cv.bar < 1:
  1396.                 img.clear(RGB_BLACK)
  1397.                 ybarA=y_scr-60
  1398.                 ybarB=ybarA+20
  1399.             cv.bar+=1
  1400.             i=cv.bar
  1401.             c=int(((255.0*2)/x_scr)*i)
  1402.             if not c > 255:
  1403.                 # red marker
  1404.                 color=(255,c,0)
  1405.             else:
  1406.                 # green marker
  1407.                 c -= 255
  1408.                 color=(255-c,255,0)
  1409.             img.rectangle((i,ybarA,i+5,ybarB),fill=color)
  1410.             # frame
  1411.             img.rectangle((0,ybarA,x_scr,ybarB+2),0xffffff)
  1412.             if cv.bar > x_scr:
  1413.                 cv.bar=0
  1414.         elif go == '$captureDemo':
  1415.             if init != go:
  1416.                 init=cv.go
  1417.             cv.go='-'
  1418.             def saveImg():
  1419.                 sCapture('demoImage')
  1420.             id=unicode(random.randint(100000,999999))
  1421.             print id
  1422.             mosaic()
  1423.             img.text((148,60),id,font=('dense',60))
  1424.             app.menu=[(u'Save Image',saveImg), g_menu]
  1425.         elif go == '$btn_matrix':
  1426.             if init != go:
  1427.                 init=cv.go
  1428.                 cv.x=0
  1429.                 cv.y=0
  1430.                 cv.padx,cv.pady=0,38
  1431.                 cv.btn99=1
  1432.                 cv.w,cv.h=90,90
  1433.                 img.clear()
  1434.                 btn_pad()
  1435.                 draw(())
  1436.                 e32.ao_sleep(0.1) ###
  1437.                 bg=graphics.screenshot()
  1438.             a,b=cv.x,cv.y
  1439.             btn_=(a,b+cv.pady ,a+cv.w,b+cv.pady+cv.h)
  1440.             txt_=(a+cv.padx+5,b+cv.pady+75)
  1441.             sq_color, btn_label = RGB_GREEN, RGB_BLACK
  1442.             if cv.up < time.time():
  1443.                 sq_color, btn_label = RGB_RED, RGB_WHITE
  1444.             img.blit(bg,source=(0,0))
  1445.             img.rectangle((btn_), fill=sq_color)
  1446.             img.text((txt_), unicode(cv.btn99), fill=btn_label,font=(u'Nokia Hindi S60',80,STYLE_BOLD))
  1447.         elif go == '$sketchpad': # ZZZ
  1448.             if init != go:
  1449.                 init=cv.go
  1450.                 thickness=10
  1451.                 cv.color=RGB_RED
  1452.                 cv.bg=RGB_WHITE
  1453.                 img.clear(cv.bg)
  1454.                 z_pad_menu()
  1455.                 e32.ao_sleep(1)
  1456.                 cv.jot=-99,-99,-99,-99
  1457.                 cv.x,cv.y=-99,-99
  1458.             line_plot()
  1459.             img.line((cv.jot), cv.color, width=thickness)
  1460.         elif go == '$slider':
  1461.             if init != go:
  1462.                 init=cv.go
  1463.                 cv.tmp=max_rgb
  1464.             img.clear(RGB_GRAY)
  1465.             slidebar()
  1466.             if cv.down:
  1467.                 msg=cv.down.pop()
  1468.             else: msg=0
  1469.             if cv.t < time.time():
  1470.                 cv.tmp = portal(cv.tmp+msg, max_rgb)
  1471.                 cv.t=time.time()+0.4
  1472.             rgb=rainbow[cv.tmp]
  1473.             img.rectangle((120,2,348,50), fill=rgb)
  1474.             img.text((10,44), u"Color:", fill = RGB_BLACK,font=(u'Nokia Hindi S60',40,STYLE_BOLD))
  1475.             img.text((10,90), unicode(rgb), fill = RGB_BLACK,font=(u'Nokia Hindi S60',30,STYLE_BOLD))
  1476.             img.text((10,130), unicode(msg), fill = RGB_BLACK,font=(u'Nokia Hindi S60',30,STYLE_BOLD))
  1477.             z_outline(254,100, (cv.sVy-4)*-1)
  1478.         elif go == '$star_5pt':
  1479.             if init != go:
  1480.                 init=cv.go
  1481.                 wait=time.time()+2
  1482.             img.clear((0,128,255))
  1483.             star=star_5pt(30,60,300)
  1484.             img.polygon((star), outline=RGB_GREEN, width=10, fill=RGB_YELLOW)
  1485.             if wait < time.time():
  1486.                 wait=time.time()+1
  1487.                 switch()
  1488.             if cv.sw:
  1489.                 img.polygon((star), outline=RGB_PURPLE, width=9) # outline in pys60 does not round properly over 9 width
  1490.             img.blit(png, target=(100,120), mask=img_mask) ### b64_img
  1491.         elif go == '$pieslice':
  1492.             if init != go:
  1493.                 init=cv.go
  1494.                 tools=[u'x move',u'y move',u'x scale',u'y scale',u'x arm',u'y arm',u'x+y scale',u'seg rotate']
  1495.                 tool_val=u'xp yp x2 y2 rx ry xyt rxy'.split()
  1496.                 pdeg=[30,10,5,1,0,-1,-5,-10,-30]
  1497.                 cv.xp,cv.yp=20,60; cv.rx,cv.ry=90,180
  1498.                 cv.x2=cv.y2=300
  1499.                 cv.xyt=cv.rxy=0
  1500.                 cv.deg=4
  1501.                 cv.up=-1
  1502.                 cv.val='rx'
  1503.                 app.menu=[(u'Select Tool',z_tools), g_menu]
  1504.             cv.deg=cv.y/yy2
  1505.             if time.time() > cv.up and cv.x > 300:
  1506.                 pieplot()
  1507.                 cv.up=time.time()+0.5
  1508.             img.clear(RGB_GRAY)
  1509.             slidebar()
  1510.             plots=(cv.xp, cv.yp, cv.xp+cv.x2+cv.xyt, cv.yp+cv.y2+cv.xyt)
  1511.             img.pieslice(plots, radian(180-cv.rx+cv.rxy),radian(180-cv.ry+cv.rxy), outline=RGB_BLUE,fill=RGB_YELLOW,width=10)
  1512.             cv.x=0
  1513.             cv.rx=cv.rx%360
  1514.             cv.ry=cv.ry%360
  1515.             img.text((10,20),u''+str(plots),RGB_WHITE)
  1516.             img.text((10,40),u''+str((cv.rx+cv.rxy,cv.ry+cv.rxy)),RGB_WHITE)
  1517.         elif go == '$sqdance':
  1518.             mosaic()
  1519.         elif go == '$xyzircle':
  1520.             img.clear(RGB_BLACK)
  1521.             radius=(cv.xyz[2]*-2)+120
  1522.             point_x=(-cv.xyz[0]+60) * x_scr / 120
  1523.             point_y=(cv.xyz[1]+60) * y_scr / 120
  1524.             circle(point_x,point_y,radius,(255,0,0))
  1525.         elif go == '$360arrow':
  1526.             if init != go:
  1527.                 init=cv.go
  1528.                 wait=t=0
  1529.                 of_angles=600
  1530.                 cv.zoom=29.0
  1531.                 cv.angle=ang=0
  1532.                 cv.xy=True
  1533.                 cv.x=x_mid
  1534.                 cv.y=y_mid-1
  1535.                 pi2=math.pi*2
  1536.             img.clear(RGB_PURPLE)
  1537.             if cv.xy:
  1538.                 cv.xy=False
  1539.                 x,y=cv.x,cv.y
  1540.                 cv.angle=int((math.atan2(x_mid-x,y-y_mid)+math.pi)/pi2*of_angles)
  1541.                 wait=time.time()+0.8
  1542.             elif wait < time.time():
  1543.                 wait=time.time()+0.1
  1544.                 cv.angle=(cv.angle+3) % of_angles
  1545.             angle_rad=cv.angle * 2 * math.pi / of_angles
  1546.             rot_points=[]
  1547.             for point in arrow_points:
  1548.                 x,y=point
  1549.                 rot_x=math.cos(angle_rad) * x-math.sin(angle_rad) * y
  1550.                 rot_y=math.sin(angle_rad) * x+math.cos(angle_rad) * y
  1551.                 rot_x *= cv.zoom
  1552.                 rot_y *= cv.zoom
  1553.                 rot_x += x_mid
  1554.                 rot_y += y_mid
  1555.                 rot_points.append((rot_x, rot_y))
  1556.             if time.time() > t:
  1557.                 t=time.time()+0.5
  1558.                 ang=cv.angle
  1559.             img.polygon(rot_points, fill=RGB_YELLOW, width=2)
  1560.             img.text((10,50),u'%s'%(ang),fill=RGB_WHITE,font=(u'Nokia Hindi S60',50,STYLE_BOLD))
  1561.             img.text((10,560),u'%s'%('** Interactive **'),fill=RGB_WHITE,font=(u'Nokia Hindi S60',48,STYLE_BOLD))
  1562.         elif go == '$snowfall':
  1563.             if init != go:
  1564.                 init=cv.go
  1565.                 nflakes=120
  1566.                 imgSnow=8
  1567.                 moveX=range(nflakes)
  1568.                 moveY=range(nflakes)
  1569.                 XX=range(nflakes)
  1570.                 YY=range(nflakes)
  1571.                 for i in range(nflakes):
  1572.                     moveY[i]=random.randint(5,20)
  1573.                     dir=random.choice([-1,1])
  1574.                     moveX[i]=dir*random.randint(1,3)
  1575.                     XX[i]=random.randint(0,x_scr)
  1576.                     YY[i]=random.randint(0,640)
  1577.             img.clear(0x000080)
  1578.             for i in range(nflakes):
  1579.                 dir=random.choice([-1,1])
  1580.                 moveX[i]=dir*moveX[i]
  1581.                 XX[i]=XX[i]+moveX[i]
  1582.                 YY[i]=YY[i]+moveY[i]
  1583.                 if((XX[i]>x_scr)or(XX[i]<0)):
  1584.                     moveX[i]=-moveX[i]
  1585.                 if(YY[i]>640): # y_scr
  1586.                     YY[i]=moveY[i]=random.randint(1,10)
  1587.                 img.ellipse([(XX[i],YY[i]),(XX[i]+imgSnow,YY[i]+imgSnow)],RGB_WHITE,fill=RGB_WHITE)
  1588.         elif go == '$velocity':
  1589.             if init != go or max(cv.x,cv.y) < 0.6:
  1590.                 init=cv.go
  1591.                 oX = 30
  1592.                 oY = 20
  1593.                 cv.x=270
  1594.                 cv.y=500
  1595.             img.clear((225,225,0))
  1596.             oX,oY,cv.x,cv.y=velo(oX,oY,cv.x,cv.y)
  1597.             img.ellipse((oX,oY,oX+40,oY+40),fill=(128,0,128))
  1598.         elif go == '$textscroll':
  1599.             if init != go:
  1600.                 init=cv.go
  1601.                 W,G,Y=((255,255,255),(0,255,0),(255,255,0))
  1602.                 f1,f2=(u'Normal', 30), (u'Normal', 25)
  1603.                 t1=u'Programming PyS60'
  1604.                 t2=u'A Vertical Text Scroll Demo'
  1605.                 print img.measure_text(t1,f1)
  1606.                 print img.measure_text(t2,f2)
  1607.                 a=img.measure_text(t1,f1)[0][2]
  1608.                 b=img.measure_text(t2,f2)[0][2]
  1609.                 i=0
  1610.                 w,h=x_scr,y_scr
  1611.                 distance=h/2-30
  1612.             t2h=(h-25)-i*5
  1613.             color=int(255+i*2)
  1614.             Bg=(0,color,255)
  1615.             img.clear(Bg)
  1616.             img.text((5,20),u'* Length: %s'% [t2h,distance], Y)
  1617.             img.text(((w-b)/2,(h-25)-i*5),t2,0,f2)
  1618.             img.text(((w-b)/2-2,(h-25-1)-i*5-2),t2,G,f2)
  1619.             img.text(((w-a)/2,35+i*5),t1,0,f1)
  1620.             img.text(((w-a)/2-2,35-1+i*5-2),t1,Y,f1)
  1621.             img.rectangle((0,0,w,h),Y)
  1622.             if t2h < distance:
  1623.                 e32.ao_sleep(2)
  1624.                 i=0
  1625.             i+=1
  1626.         elif go == '$text2fit':
  1627.             if init != go:
  1628.                 init=cv.go
  1629.                 app.menu=[(u'Rotate Display',z_ori), g_menu]
  1630.             img.clear(0x5555ff)
  1631.             o1st_entry='This is a "measure_text" wrap method example whereas...'
  1632.             o2nd_entry=['blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah',
  1633.                     'should','appear','segmented','to','stay','within','the','given','boundary.']
  1634.             #
  1635.             text2wrap('',o1st_entry)
  1636.             for divided in o2nd_entry:
  1637.                 text2wrap(wrapped,divided)
  1638.             text2wrap(0xffffff)
  1639.         elif go == '-':
  1640.             pass
  1641.         draw(())
  1642.         cv.incr=0
  1643.  
  1644.     e32.ao_yield()
  1645.  
  1646. try:
  1647.     sens.stop_listening()
  1648. except: pass
  1649. try:
  1650.     timer.cancel()
  1651. except: pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement