keyboard.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. from libs import easing
  4. ## local UI import
  5. from UI.constants import Width,Height,ICON_TYPES
  6. from UI.page import Page,PageSelector
  7. from UI.label import Label
  8. from UI.fonts import fonts
  9. from UI.util_funcs import midRect
  10. from UI.keys_def import CurKeys
  11. from UI.icon_item import IconItem
  12. from UI.icon_pool import MyIconPool
  13. from UI.skin_manager import MySkinManager
  14. from libs.roundrects import aa_round_rect
  15. from textarea import Textarea
  16. from text_item import TextItem
  17. import myvars
  18. class KeyboardIcon(IconItem):
  19. _PosX = 0
  20. _PosY = 0
  21. _Width = 0
  22. _Height = 0
  23. _Color = MySkinManager.GiveColor('Text')
  24. _MyType = ICON_TYPES["NAV"]
  25. _Parent = None
  26. _Str = ""
  27. def Draw(self):
  28. self._Parent._CanvasHWND.blit(self._ImgSurf, \
  29. midRect(self._PosX,self._PosY,self._Width,self._Height,Width,Height))
  30. class KeyboardSelector(PageSelector):
  31. def Draw(self):
  32. sec_idx = self._Parent._SectionIndex
  33. row_idx = self._Parent._RowIndex
  34. idx = self._Parent._PsIndex
  35. x = self._Parent._SecsKeys[sec_idx][row_idx][idx]._PosX
  36. y = self._Parent._SecsKeys[sec_idx][row_idx][idx]._PosY
  37. w = self._Parent._SecsKeys[sec_idx][row_idx][idx]._Width+6
  38. h = self._Parent._SecsKeys[sec_idx][row_idx][idx]._Height+1
  39. rect = midRect(x,y,w,h,self._Parent._Width,self._Parent._Height)
  40. if rect.width <=0 or rect.height <= 0 :
  41. return
  42. aa_round_rect(self._Parent._CanvasHWND,rect, (126,206,244),3,0,(126,206,244))
  43. # pygame.draw.rect(self._Parent._CanvasHWND,(0,0,0),rect,1)
  44. class Keyboard(Page):
  45. _PosX = 0
  46. _PosY = 0
  47. _Width = 0
  48. _Height = 0
  49. _SectionNumbers = 3
  50. _SectionIndex = 1
  51. _Icons = {}
  52. _Secs = {}
  53. _SecsKeys = {}
  54. _KeyboardLayoutFile = "UI/keyboard_keys.layout"
  55. _Textarea = None
  56. _Selector = None
  57. _LeftOrRight = 1
  58. _FootMsg = ["Nav.","ABC","Done","Backspace","Enter"]
  59. _RowIndex = 0
  60. _Caller = None
  61. def __init__(self):
  62. self._Secs = {}
  63. self._SecsKeys = {}
  64. self._Icons = {}
  65. def ReadLayoutFile(self,fname):
  66. LayoutIndex = 0
  67. with open(fname) as f:
  68. content = f.readlines()
  69. content = [ x.strip() for x in content]
  70. content = [ x.split(" ") for x in content]
  71. for i in content:
  72. i = [ x.strip() for x in i]
  73. if len(i) > 2:
  74. if LayoutIndex in self._Secs:
  75. self._Secs[LayoutIndex].append(i)
  76. else:
  77. self._Secs[LayoutIndex] = []
  78. self._Secs[LayoutIndex].append(i)
  79. else:
  80. LayoutIndex+=1
  81. def SetPassword(self,pwd):
  82. pwd_list = list(pwd)
  83. self._Textarea.ResetMyWords()
  84. for i in pwd_list:
  85. self._Textarea.AppendText(i)
  86. #self._Textarea.BlitText()
  87. def Init(self):
  88. self._CanvasHWND = self._Screen._CanvasHWND
  89. self.ReadLayoutFile(self._KeyboardLayoutFile) ## assign to _Secs
  90. self._SectionNumbers = len(self._Secs)
  91. self._PosX = self._Index*self._Screen._Width
  92. self._Width = self._Screen._Width
  93. self._Height = self._Screen._Height
  94. fontobj = fonts["veramono24"]
  95. word_margin = 15
  96. start_x = (self._Width - fontobj.size( "".join(self._Secs[0][0]))[0]-len(self._Secs[0][0])*word_margin)/2+word_margin/2
  97. start_y = 0
  98. cnt = 0
  99. for i in range(0,self._SectionNumbers):
  100. self._SecsKeys[i] = []
  101. for j in range(0,len(self._Secs[i])):
  102. self._SecsKeys[i].append( [] )
  103. start_x = (self._Width - fontobj.size( "".join(self._Secs[i][j]))[0]-len(self._Secs[i][j])*word_margin)/2+word_margin/2
  104. start_x = start_x + i*Width
  105. start_y = 84+j*(word_margin+14)
  106. for idx,val in enumerate(self._Secs[i][j]):
  107. ti = TextItem()
  108. ti._FontObj = fontobj
  109. ti._Parent = self
  110. if val == "_L" or val == "_R":
  111. it = KeyboardIcon()
  112. it._ImgSurf = MyIconPool._Icons[val]
  113. it._Parent = self
  114. it._Str = val
  115. it.Init(start_x+it._ImgSurf.get_width()/2 ,start_y,it._ImgSurf.get_width(),it._ImgSurf.get_height(),0)
  116. #self._Icons[val] = it
  117. self._SecsKeys[i][j].append(it)
  118. self._IconNumbers+=1
  119. start_x = start_x + it._ImgSurf.get_width()+word_margin
  120. else:
  121. if val == "_S":
  122. val = "Space"
  123. ti._FontObj = fonts["veramono15"]
  124. ti._Bold = True
  125. cur_alpha_size = ti._FontObj.size( val)
  126. ti.Init(start_x + cur_alpha_size[0]/2,start_y,cur_alpha_size[0],cur_alpha_size[1],0)
  127. ti._Str = val
  128. start_x = start_x + cur_alpha_size[0]+word_margin # prepare for next alpha
  129. self._SecsKeys[i][j].append(ti)
  130. self._SectionIndex = 0
  131. self._Textarea = Textarea()
  132. self._Textarea._PosX = 4
  133. self._Textarea._PosY = 4
  134. self._Textarea._Width= self._Width - 4*2
  135. self._Textarea._Height = 60
  136. self._Textarea._CanvasHWND = self._CanvasHWND
  137. self._Textarea.Init()
  138. ps = KeyboardSelector()
  139. ps._Parent = self
  140. ps.Init(start_x,start_y,25,25,128)
  141. self._Ps = ps
  142. self._PsIndex = 0
  143. self._Ps._OnShow = True
  144. def SelectUpChar(self):
  145. sec_idx = self._SectionIndex
  146. self._RowIndex-=1
  147. if self._RowIndex <0:
  148. self._RowIndex = len(self._SecsKeys[sec_idx])-1
  149. if self._PsIndex >=len(self._SecsKeys[sec_idx][self._RowIndex]):
  150. self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex])-1
  151. self.ClearCanvas()
  152. self.Draw()
  153. self._Screen.SwapAndShow()
  154. def SelectDownChar(self):
  155. sec_idx = self._SectionIndex
  156. self._RowIndex+=1
  157. if self._RowIndex >= len(self._SecsKeys[sec_idx]):
  158. self._RowIndex = 0
  159. if self._PsIndex >=len(self._SecsKeys[sec_idx][self._RowIndex]):
  160. self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex])-1
  161. self.ClearCanvas()
  162. self.Draw()
  163. self._Screen.SwapAndShow()
  164. def SelectNextChar(self):
  165. sec_idx = self._SectionIndex
  166. row_idx = self._RowIndex
  167. self._PsIndex+=1
  168. if self._PsIndex >= len(self._SecsKeys[sec_idx][row_idx]):
  169. self._PsIndex = 0
  170. self._RowIndex+=1
  171. if self._RowIndex >= len(self._SecsKeys[sec_idx]):
  172. self._RowIndex = 0
  173. self.ClearCanvas()
  174. self.Draw()
  175. self._Screen.SwapAndShow()
  176. def SelectPrevChar(self):
  177. sec_idx = self._SectionIndex
  178. self._PsIndex-=1
  179. if self._PsIndex < 0:
  180. self._RowIndex-=1
  181. if self._RowIndex <=0:
  182. self._RowIndex = len(self._SecsKeys[sec_idx])-1
  183. self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex]) -1
  184. self.ClearCanvas()
  185. self.Draw()
  186. self._Screen.SwapAndShow()
  187. def ClickOnChar(self):
  188. sec_idx = self._SectionIndex
  189. alphabet = self._SecsKeys[sec_idx][self._RowIndex][self._PsIndex]._Str
  190. if alphabet == "Space":
  191. alphabet = " "
  192. if alphabet == "_L" or alphabet == "_R":
  193. if alphabet == "_L":
  194. self._Textarea.SubTextIndex()
  195. elif alphabet == "_R":
  196. self._Textarea.AddTextIndex()
  197. else:
  198. self._Textarea.AppendText(alphabet)
  199. self._Textarea.Draw()
  200. self._Screen.SwapAndShow()
  201. def KeyboardShift(self):
  202. current_time = 0.0
  203. start_posx = 0.0
  204. current_posx = start_posx
  205. final_posx = 320.0
  206. posx_init = 0.0
  207. dur = 30
  208. last_posx = 0.0
  209. all_last_posx = []
  210. for i in range(0,Width*dur):
  211. current_posx = easing.SineIn(current_time,start_posx,final_posx-start_posx,float(dur))
  212. if current_posx >= final_posx:
  213. current_posx = final_posx
  214. dx = current_posx - last_posx
  215. all_last_posx.append(int(dx))
  216. current_time +=1
  217. last_posx = current_posx
  218. if current_posx >= final_posx:
  219. break
  220. c = 0
  221. for i in all_last_posx:
  222. c+=i
  223. if c < final_posx - start_posx:
  224. all_last_posx.append(final_posx - c)
  225. for i in all_last_posx:
  226. for j in range(0,self._SectionNumbers):
  227. for u in self._SecsKeys[j]:
  228. for x in u:
  229. x._PosX += self._LeftOrRight*i
  230. self.ResetPageSelector()
  231. self.ClearCanvas()
  232. self.Draw()
  233. self._Screen.SwapAndShow()
  234. def KeyDown(self,event):# event from pygame.event.get()
  235. if event.key == CurKeys["Up"]:
  236. self.SelectUpChar()
  237. if event.key == CurKeys["Down"]:
  238. self.SelectDownChar()
  239. if event.key == CurKeys["Right"]:
  240. self.SelectNextChar()
  241. if event.key == CurKeys["Left"]:
  242. self.SelectPrevChar()
  243. if event.key == CurKeys["B"] or event.key == CurKeys["Enter"]:
  244. self.ClickOnChar()
  245. if event.key == CurKeys["X"]:
  246. if self._SectionIndex <= 0:
  247. self._LeftOrRight = -1
  248. if self._SectionIndex >= (self._SectionNumbers -1):
  249. self._LeftOrRight = 1
  250. self.ShiftKeyboardPage()
  251. if event.key == CurKeys["Menu"]: # we assume keyboard always be child page
  252. self.ReturnToUpLevelPage()
  253. self._Screen.Draw()
  254. self._Screen.SwapAndShow()
  255. if event.key == CurKeys["Y"]: #done
  256. print("".join(self._Textarea._MyWords))
  257. self.ReturnToUpLevelPage()
  258. self._Screen.SwapAndShow()
  259. if self._Caller != None:
  260. on_kbd_return_back_cb = getattr(self._Caller,"OnKbdReturnBackCb",None)
  261. if on_kbd_return_back_cb != None:
  262. if callable( on_kbd_return_back_cb ):
  263. self._Caller.OnKbdReturnBackCb()
  264. #Uplevel page invokes OnReturnBackCb,eg: ConfigWireless
  265. if event.key == CurKeys["A"]:
  266. self._Textarea.RemoveFromLastText()
  267. self._Textarea.Draw()
  268. self._Screen.SwapAndShow()
  269. if event.key == CurKeys["LK1"]:
  270. if self._SectionIndex < self._SectionNumbers -1:
  271. self._LeftOrRight = -1
  272. self.ShiftKeyboardPage()
  273. if event.key == CurKeys["LK5"]:
  274. if self._SectionIndex > 0:
  275. self._LeftOrRight = 1
  276. self.ShiftKeyboardPage()
  277. def Draw(self):
  278. self.ClearCanvas()
  279. self._Ps.Draw()
  280. for i in range(0,self._SectionNumbers):
  281. for j in self._SecsKeys[i]:
  282. for u in j:
  283. u.Draw()
  284. self._Textarea.Draw()
  285. def ShiftKeyboardPage(self):
  286. self.KeyboardShift()
  287. self._SectionIndex -= self._LeftOrRight
  288. self.Draw()
  289. self._Screen.SwapAndShow()