Advertisement
phjoe

GraphSMS

Feb 4th, 2015
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # GraphSMS
  2. # Joe, 04/02/2015
  3. import appuifw as A
  4. import graphics as G
  5. import inbox,time
  6. from akntextutils import wrap_text_to_array as wt
  7.  
  8. class Color:
  9.  def __init__(self):
  10.   self.bg=0x222222
  11.   self.text=0xaaaaaa
  12.   self.focus=0xffffff
  13.   self.line=0x666666
  14.   self.highlight_t=0xfff
  15.   self.highlight_b=0xddd
  16.   self.window=0x111111
  17.   self.empty=0x880000
  18.   self.sidebar=0x666666
  19.  
  20.  
  21.  
  22. class GraphSMS:
  23.  ''' listing sms inbox in canvas '''
  24.  def __init__(self):
  25.   self.state='main'
  26.   self.run,self.lock=0,0
  27.   self.cur,self.page,self.offset=0,0,3
  28.   self.px,self.py,self.th=5,5,14
  29.   self.items,self.selected=[],None
  30.   A.app.screen='full'
  31.   self.c=A.Canvas(redraw_callback=self._redraw,event_callback=self._event)
  32.   A.app.body=self.c
  33.   A.app.exit_key_handler=lambda:None
  34.   self.running()
  35.  
  36.  def _redraw(self,rect):
  37.   if img:self.c.blit(img)
  38.  
  39.  def _event(self,sc):
  40.   k=sc['scancode']
  41.   if self.lock:return
  42.   if self.state=='main':
  43.    if sc['type']==3 and k==165:self.state='exit'
  44.    if sc['type'] is not A.EEventKey:return
  45.    # key down / 8
  46.    if k in (17,56):
  47.     self.cur+=1
  48.     if self.cur>self.offset-1:
  49.      self.page+=1
  50.      self.cur=0
  51.     if self.page*self.offset+self.cur>=len(self.items):
  52.      self.page=0
  53.      self.cur=0
  54.    # key up / 2
  55.    elif k in (16,50):
  56.     self.cur-=1
  57.     if self.cur<0:
  58.      if self.page>0:
  59.       self.page-=1
  60.       self.cur=self.offset-1
  61.      else:
  62.       self.page=(len(self.items)-1)/self.offset
  63.       self.cur = (len(self.items)-1)-self.page*self.offset
  64.    # key * (scroll ke atas per page)
  65.    elif k==42:
  66.     self.page-=1
  67.     self.cur=0
  68.     if self.page<0:
  69.      self.page=(len(self.items)-1)/self.offset
  70.      self.cur=0
  71.    # key # (scroll kebawah per page)
  72.    elif k==127:
  73.     self.page+=1
  74.     if self.page<len(self.items)/self.offset:
  75.      self.cur=self.offset-1
  76.     else:
  77.      #self.cur = (len(self.items)-1)-self.page*self.offset
  78.      self.cur = (len(self.items)-1)
  79.     if self.page > (len(self.items)-1)/self.offset:
  80.      self.page=0
  81.      self.cur=self.offset-1
  82.    # key center, 5 atau key kanan
  83.    elif k in (167,53,15):
  84.     if len(self.items)>0:
  85.      self.state='view'
  86.      self.selected = self.items[self.page * self.offset + self.cur]
  87.    # Key C test delete items
  88.    elif k==1:
  89.     if len(self.items):
  90.      self.items.pop(self.page * self.offset + self.cur)
  91.      if self.page>0:
  92.       if self.cur == len(self.items)-self.page*self.offset:
  93.        self.cur-=1
  94.        if self.cur<0:
  95.         self.page-=1
  96.         self.cur=self.offset-1
  97.      else:
  98.       if self.cur == len(self.items)-self.page*self.offset:
  99.        self.page=0
  100.        self.cur-=1
  101.   elif self.state=='view':
  102.    if sc['type']==3 and k==165:self.state,self.selected='main',None
  103.   elif self.state=='exit':
  104.    if sc['type']==3 and k==164:self.run=0
  105.    elif sc['type']==3 and k==165:self.state='main'
  106.  
  107.  def _setkey(self,ltxt,rtxt):
  108.   fnt='legend'
  109.   if ltxt:img.text((5,size[1]-5),ltxt,color.text,'legend')
  110.   if rtxt:
  111.    tw=tsize(rtxt,fnt)[0]
  112.    img.text((size[0]-tw-5,size[1]-5),rtxt,color.text,fnt)
  113.  
  114.  def _scan(self):
  115.   self.lock=1
  116.   msg=box.sms_messages()
  117.   n=0
  118.   for i in range(len(msg)):
  119.    n+=1
  120.    img.clear(color.bg)
  121.    self.items.append( (box.time(msg[i]),u''+str(box.content(msg[i])), u''+str(box.address(msg[i]))))
  122.    img.text((self.px+5,self.py+self.th),u'Scanning Inbox (%d)' %len(self.items),color.text,'legend')
  123.    img.text((self.px+5,self.py+(self.th*2)),u'Please wait'+('.'*n),color.text,'legend')
  124.    self._redraw(())
  125.    A.e32.ao_sleep(1e-02)
  126.    n%=10
  127.  
  128.  def _draw(self,state):
  129.   if state=='main':
  130.    if len(self.items):
  131.     rh=((size[1]-(self.py * self.offset))/self.offset)-self.py
  132.     if len(self.items)-self.page*self.offset<self.offset:mx=len(self.items)-self.page*self.offset
  133.     else:mx=self.offset
  134.  
  135.     # sidebar
  136.     sy=(self.offset*rh)
  137.     bar_s=int(sy/len(self.items))
  138.     bar_h=12
  139.     bar_c = self.page * self.offset + self.cur
  140.     img.rectangle( (size[0]-self.px,self.py+(bar_c*bar_s),size[0],self.py+(bar_c*bar_s) + (bar_h)),fill=color.sidebar)
  141.  
  142.     # background list
  143.     img.rectangle((self.px,self.py,size[0]-self.px,self.py+(mx*rh)),fill=color.window)
  144.  
  145.     # kursor highlight
  146.     img.rectangle((self.px,self.py+(self.cur*rh),size[0]-self.px,self.py+(self.cur*rh)+rh-self.th),fill=color.highlight_t)
  147.     img.rectangle((self.px,self.py+(self.cur*rh)+rh-self.th,size[0]-self.px,self.py+(self.cur*rh)+rh),fill=color.highlight_b)
  148.     txt=u'Page: %d / %d  -  SMS: %d / %d' %(self.page+1,(len(self.items)//self.offset),(self.page*self.offset+self.cur)+1,len(self.items))
  149.     img.text((size[0]/2-tsize(txt,'dense')[0]/2,size[1]-5),txt,color.text)
  150.     for i in range(0,mx):
  151.      txt = self.items[self.page*self.offset+i][2]+'\n' + dec(self.items[self.page*self.offset+i][1])
  152.      txt=wt(txt,'legend',size[0]-(self.px*4))
  153.      col=(color.text,color.focus)[i==self.cur]
  154.      for j in range(len(txt)):
  155.       img.text((self.px+5,self.py+(self.py*self.offset)+(i*rh) + (j*self.th)),txt[j],col,'legend')
  156.    else:
  157.     x,y,r=size[0]/2,size[1]/2,20
  158.     txt,fnt=u'Inbox Empty','legend'
  159.     # cross  
  160.     img.line((x-r,y-r,x+r,y+r),color.empty,width=12)
  161.     img.line((x+r,y-r,x-r,y+r),color.empty,width=12)
  162.     img.text((size[0]/2-tsize(txt,fnt)[0]/2,size[1]/2),txt,color.text,fnt)
  163.   elif state=='view':
  164.    (tm,content,sender)=self.selected
  165.    txt=u'From: '+sender+'\n' + str(time.ctime(tm)) + '\n\n' + content
  166.    txt=wt(txt,'legend',size[0]-(self.px*4))
  167.    img.rectangle((self.px,self.py,size[0]-self.px,self.py+(len(txt)*self.th+self.th)),fill=color.window)
  168.    for i in range(len(txt)):
  169.     img.text((self.px+5,self.py+self.th+(i*self.th)),txt[i],color.text,('legend','dense')[i==1])
  170.    self._setkey('',u'Back')
  171.   elif state=='exit':
  172.    x,y=size[0]/2,size[1]/2
  173.    rw=80
  174.    txt,fnt=u'Exit Now.\nAre you sure ?!','legend'
  175.    txt=wt(txt,fnt,rw*2)
  176.    rh=(len(txt)*self.th)
  177.    img.rectangle((x-rw,y-rh,x+rw,y+rh),fill=color.window)
  178.    for i in range(len(txt)):
  179.     img.text((x-rw+5,y-rh+self.th+i*self.th),txt[i],color.text,fnt)
  180.    self._setkey(u'Yes',u'Cancel')
  181.  
  182.  def running(self):
  183.   self._scan()
  184.   self.lock=0
  185.   self.run=1
  186.   while self.run:
  187.    img.clear(color.bg)
  188.    self._draw(self.state)
  189.    self._redraw(())
  190.    A.e32.ao_sleep(0)
  191.  
  192.  
  193. size=G.sysinfo.display_pixels()
  194. img=G.Image.new(size)
  195. def tsize(text,fnt):
  196.  if not isinstance(text,unicode):
  197.   text=unicode(text)
  198.  m=img.measure_text(text,font=fnt)[0]
  199.  w,h=(m[2]-m[0],m[3]-m[1])
  200.  return (w,h)
  201. def dec(x):
  202.  if len(x)>60:x=x[:30]+'...'
  203.  return x
  204.  
  205. color=Color()
  206. box=inbox.Inbox()
  207. GraphSMS()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement