Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # GraphSMS
- # Joe, 04/02/2015
- import appuifw as A
- import graphics as G
- import inbox,time
- from akntextutils import wrap_text_to_array as wt
- class Color:
- def __init__(self):
- self.bg=0x222222
- self.text=0xaaaaaa
- self.focus=0xffffff
- self.line=0x666666
- self.highlight_t=0xfff
- self.highlight_b=0xddd
- self.window=0x111111
- self.empty=0x880000
- self.sidebar=0x666666
- class GraphSMS:
- ''' listing sms inbox in canvas '''
- def __init__(self):
- self.state='main'
- self.run,self.lock=0,0
- self.cur,self.page,self.offset=0,0,3
- self.px,self.py,self.th=5,5,14
- self.items,self.selected=[],None
- A.app.screen='full'
- self.c=A.Canvas(redraw_callback=self._redraw,event_callback=self._event)
- A.app.body=self.c
- A.app.exit_key_handler=lambda:None
- self.running()
- def _redraw(self,rect):
- if img:self.c.blit(img)
- def _event(self,sc):
- k=sc['scancode']
- if self.lock:return
- if self.state=='main':
- if sc['type']==3 and k==165:self.state='exit'
- if sc['type'] is not A.EEventKey:return
- # key down / 8
- if k in (17,56):
- self.cur+=1
- if self.cur>self.offset-1:
- self.page+=1
- self.cur=0
- if self.page*self.offset+self.cur>=len(self.items):
- self.page=0
- self.cur=0
- # key up / 2
- elif k in (16,50):
- self.cur-=1
- if self.cur<0:
- if self.page>0:
- self.page-=1
- self.cur=self.offset-1
- else:
- self.page=(len(self.items)-1)/self.offset
- self.cur = (len(self.items)-1)-self.page*self.offset
- # key * (scroll ke atas per page)
- elif k==42:
- self.page-=1
- self.cur=0
- if self.page<0:
- self.page=(len(self.items)-1)/self.offset
- self.cur=0
- # key # (scroll kebawah per page)
- elif k==127:
- self.page+=1
- if self.page<len(self.items)/self.offset:
- self.cur=self.offset-1
- else:
- #self.cur = (len(self.items)-1)-self.page*self.offset
- self.cur = (len(self.items)-1)
- if self.page > (len(self.items)-1)/self.offset:
- self.page=0
- self.cur=self.offset-1
- # key center, 5 atau key kanan
- elif k in (167,53,15):
- if len(self.items)>0:
- self.state='view'
- self.selected = self.items[self.page * self.offset + self.cur]
- # Key C test delete items
- elif k==1:
- if len(self.items):
- self.items.pop(self.page * self.offset + self.cur)
- if self.page>0:
- if self.cur == len(self.items)-self.page*self.offset:
- self.cur-=1
- if self.cur<0:
- self.page-=1
- self.cur=self.offset-1
- else:
- if self.cur == len(self.items)-self.page*self.offset:
- self.page=0
- self.cur-=1
- elif self.state=='view':
- if sc['type']==3 and k==165:self.state,self.selected='main',None
- elif self.state=='exit':
- if sc['type']==3 and k==164:self.run=0
- elif sc['type']==3 and k==165:self.state='main'
- def _setkey(self,ltxt,rtxt):
- fnt='legend'
- if ltxt:img.text((5,size[1]-5),ltxt,color.text,'legend')
- if rtxt:
- tw=tsize(rtxt,fnt)[0]
- img.text((size[0]-tw-5,size[1]-5),rtxt,color.text,fnt)
- def _scan(self):
- self.lock=1
- msg=box.sms_messages()
- n=0
- for i in range(len(msg)):
- n+=1
- img.clear(color.bg)
- self.items.append( (box.time(msg[i]),u''+str(box.content(msg[i])), u''+str(box.address(msg[i]))))
- img.text((self.px+5,self.py+self.th),u'Scanning Inbox (%d)' %len(self.items),color.text,'legend')
- img.text((self.px+5,self.py+(self.th*2)),u'Please wait'+('.'*n),color.text,'legend')
- self._redraw(())
- A.e32.ao_sleep(1e-02)
- n%=10
- def _draw(self,state):
- if state=='main':
- if len(self.items):
- rh=((size[1]-(self.py * self.offset))/self.offset)-self.py
- if len(self.items)-self.page*self.offset<self.offset:mx=len(self.items)-self.page*self.offset
- else:mx=self.offset
- # sidebar
- sy=(self.offset*rh)
- bar_s=int(sy/len(self.items))
- bar_h=12
- bar_c = self.page * self.offset + self.cur
- 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)
- # background list
- img.rectangle((self.px,self.py,size[0]-self.px,self.py+(mx*rh)),fill=color.window)
- # kursor highlight
- 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)
- 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)
- 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))
- img.text((size[0]/2-tsize(txt,'dense')[0]/2,size[1]-5),txt,color.text)
- for i in range(0,mx):
- txt = self.items[self.page*self.offset+i][2]+'\n' + dec(self.items[self.page*self.offset+i][1])
- txt=wt(txt,'legend',size[0]-(self.px*4))
- col=(color.text,color.focus)[i==self.cur]
- for j in range(len(txt)):
- img.text((self.px+5,self.py+(self.py*self.offset)+(i*rh) + (j*self.th)),txt[j],col,'legend')
- else:
- x,y,r=size[0]/2,size[1]/2,20
- txt,fnt=u'Inbox Empty','legend'
- # cross
- img.line((x-r,y-r,x+r,y+r),color.empty,width=12)
- img.line((x+r,y-r,x-r,y+r),color.empty,width=12)
- img.text((size[0]/2-tsize(txt,fnt)[0]/2,size[1]/2),txt,color.text,fnt)
- elif state=='view':
- (tm,content,sender)=self.selected
- txt=u'From: '+sender+'\n' + str(time.ctime(tm)) + '\n\n' + content
- txt=wt(txt,'legend',size[0]-(self.px*4))
- img.rectangle((self.px,self.py,size[0]-self.px,self.py+(len(txt)*self.th+self.th)),fill=color.window)
- for i in range(len(txt)):
- img.text((self.px+5,self.py+self.th+(i*self.th)),txt[i],color.text,('legend','dense')[i==1])
- self._setkey('',u'Back')
- elif state=='exit':
- x,y=size[0]/2,size[1]/2
- rw=80
- txt,fnt=u'Exit Now.\nAre you sure ?!','legend'
- txt=wt(txt,fnt,rw*2)
- rh=(len(txt)*self.th)
- img.rectangle((x-rw,y-rh,x+rw,y+rh),fill=color.window)
- for i in range(len(txt)):
- img.text((x-rw+5,y-rh+self.th+i*self.th),txt[i],color.text,fnt)
- self._setkey(u'Yes',u'Cancel')
- def running(self):
- self._scan()
- self.lock=0
- self.run=1
- while self.run:
- img.clear(color.bg)
- self._draw(self.state)
- self._redraw(())
- A.e32.ao_sleep(0)
- size=G.sysinfo.display_pixels()
- img=G.Image.new(size)
- def tsize(text,fnt):
- if not isinstance(text,unicode):
- text=unicode(text)
- m=img.measure_text(text,font=fnt)[0]
- w,h=(m[2]-m[0],m[3]-m[1])
- return (w,h)
- def dec(x):
- if len(x)>60:x=x[:30]+'...'
- return x
- color=Color()
- box=inbox.Inbox()
- GraphSMS()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement