keyboard.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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. def __init__(self):
  61. self._Secs = {}
  62. self._SecsKeys = {}
  63. self._Icons = {}
  64. def ReadLayoutFile(self,fname):
  65. LayoutIndex = 0
  66. with open(fname) as f:
  67. content = f.readlines()
  68. content = [ x.strip() for x in content]
  69. content = [ x.split(" ") for x in content]
  70. for i in content:
  71. i = [ x.strip() for x in i]
  72. if len(i) > 2:
  73. if LayoutIndex in self._Secs:
  74. self._Secs[LayoutIndex].append(i)
  75. else:
  76. self._Secs[LayoutIndex] = []
  77. self._Secs[LayoutIndex].append(i)
  78. else:
  79. LayoutIndex+=1
  80. def SetPassword(self,pwd):
  81. pwd_list = list(pwd)
  82. self._Textarea.ResetMyWords()
  83. for i in pwd_list:
  84. self._Textarea.AppendText(i)
  85. #self._Textarea.BlitText()
  86. def Init(self):
  87. self._CanvasHWND = self._Screen._CanvasHWND
  88. self.ReadLayoutFile(self._KeyboardLayoutFile) ## assign to _Secs
  89. self._SectionNumbers = len(self._Secs)
  90. self._PosX = self._Index*self._Screen._Width
  91. self._Width = self._Screen._Width
  92. self._Height = self._Screen._Height
  93. fontobj = fonts["veramono24"]
  94. word_margin = 15
  95. start_x = (self._Width - fontobj.size( "".join(self._Secs[0][0]))[0]-len(self._Secs[0][0])*word_margin)/2+word_margin/2
  96. start_y = 0
  97. cnt = 0
  98. for i in range(0,self._SectionNumbers):
  99. self._SecsKeys[i] = []
  100. for j in range(0,len(self._Secs[i])):
  101. self._SecsKeys[i].append( [] )
  102. start_x = (self._Width - fontobj.size( "".join(self._Secs[i][j]))[0]-len(self._Secs[i][j])*word_margin)/2+word_margin/2
  103. start_x = start_x + i*Width
  104. start_y = 84+j*(word_margin+14)
  105. for idx,val in enumerate(self._Secs[i][j]):
  106. ti = TextItem()
  107. ti._FontObj = fontobj
  108. ti._Parent = self
  109. if val == "_L" or val == "_R":
  110. it = KeyboardIcon()
  111. it._ImgSurf = MyIconPool._Icons[val]
  112. it._Parent = self
  113. it._Str = val
  114. it.Init(start_x+it._ImgSurf.get_width()/2 ,start_y,it._ImgSurf.get_width(),it._ImgSurf.get_height(),0)
  115. #self._Icons[val] = it
  116. self._SecsKeys[i][j].append(it)
  117. self._IconNumbers+=1
  118. start_x = start_x + it._ImgSurf.get_width()+word_margin
  119. else:
  120. if val == "_S":
  121. val = "Space"
  122. ti._FontObj = fonts["veramono15"]
  123. ti._Bold = True
  124. cur_alpha_size = ti._FontObj.size( val)
  125. ti.Init(start_x + cur_alpha_size[0]/2,start_y,cur_alpha_size[0],cur_alpha_size[1],0)
  126. ti._Str = val
  127. start_x = start_x + cur_alpha_size[0]+word_margin # prepare for next alpha
  128. self._SecsKeys[i][j].append(ti)
  129. self._SectionIndex = 0
  130. self._Textarea = Textarea()
  131. self._Textarea._PosX = 4
  132. self._Textarea._PosY = 4
  133. self._Textarea._Width= self._Width - 4*2
  134. self._Textarea._Height = 60
  135. self._Textarea._CanvasHWND = self._CanvasHWND
  136. self._Textarea.Init()
  137. ps = KeyboardSelector()
  138. ps._Parent = self
  139. ps.Init(start_x,start_y,25,25,128)
  140. self._Ps = ps
  141. self._PsIndex = 0
  142. self._Ps._OnShow = True
  143. def SelectUpChar(self):
  144. sec_idx = self._SectionIndex
  145. self._RowIndex-=1
  146. if self._RowIndex <0:
  147. self._RowIndex = len(self._SecsKeys[sec_idx])-1
  148. if self._PsIndex >=len(self._SecsKeys[sec_idx][self._RowIndex]):
  149. self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex])-1
  150. self.ClearCanvas()
  151. self.Draw()
  152. self._Screen.SwapAndShow()
  153. def SelectDownChar(self):
  154. sec_idx = self._SectionIndex
  155. self._RowIndex+=1
  156. if self._RowIndex >= len(self._SecsKeys[sec_idx]):
  157. self._RowIndex = 0
  158. if self._PsIndex >=len(self._SecsKeys[sec_idx][self._RowIndex]):
  159. self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex])-1
  160. self.ClearCanvas()
  161. self.Draw()
  162. self._Screen.SwapAndShow()
  163. def SelectNextChar(self):
  164. sec_idx = self._SectionIndex
  165. row_idx = self._RowIndex
  166. self._PsIndex+=1
  167. if self._PsIndex >= len(self._SecsKeys[sec_idx][row_idx]):
  168. self._PsIndex = 0
  169. self._RowIndex+=1
  170. if self._RowIndex >= len(self._SecsKeys[sec_idx]):
  171. self._RowIndex = 0
  172. self.ClearCanvas()
  173. self.Draw()
  174. self._Screen.SwapAndShow()
  175. def SelectPrevChar(self):
  176. sec_idx = self._SectionIndex
  177. self._PsIndex-=1
  178. if self._PsIndex < 0:
  179. self._RowIndex-=1
  180. if self._RowIndex <=0:
  181. self._RowIndex = len(self._SecsKeys[sec_idx])-1
  182. self._PsIndex = len(self._SecsKeys[sec_idx][self._RowIndex]) -1
  183. self.ClearCanvas()
  184. self.Draw()
  185. self._Screen.SwapAndShow()
  186. def ClickOnChar(self):
  187. sec_idx = self._SectionIndex
  188. alphabet = self._SecsKeys[sec_idx][self._RowIndex][self._PsIndex]._Str
  189. if alphabet == "Space":
  190. alphabet = " "
  191. if alphabet == "_L" or alphabet == "_R":
  192. if alphabet == "_L":
  193. self._Textarea.SubTextIndex()
  194. elif alphabet == "_R":
  195. self._Textarea.AddTextIndex()
  196. else:
  197. self._Textarea.AppendText(alphabet)
  198. self._Textarea.Draw()
  199. self._Screen.SwapAndShow()
  200. def KeyboardShift(self):
  201. current_time = 0.0
  202. start_posx = 0.0
  203. current_posx = start_posx
  204. final_posx = 320.0
  205. posx_init = 0.0
  206. dur = 30
  207. last_posx = 0.0
  208. all_last_posx = []
  209. for i in range(0,Width*dur):
  210. current_posx = easing.SineIn(current_time,start_posx,final_posx-start_posx,float(dur))
  211. if current_posx >= final_posx:
  212. current_posx = final_posx
  213. dx = current_posx - last_posx
  214. all_last_posx.append(int(dx))
  215. current_time +=1
  216. last_posx = current_posx
  217. if current_posx >= final_posx:
  218. break
  219. c = 0
  220. for i in all_last_posx:
  221. c+=i
  222. if c < final_posx - start_posx:
  223. all_last_posx.append(final_posx - c)
  224. for i in all_last_posx:
  225. for j in range(0,self._SectionNumbers):
  226. for u in self._SecsKeys[j]:
  227. for x in u:
  228. x._PosX += self._LeftOrRight*i
  229. self.ResetPageSelector()
  230. self.ClearCanvas()
  231. self.Draw()
  232. self._Screen.SwapAndShow()
  233. def KeyDown(self,event):# event from pygame.event.get()
  234. if event.key == CurKeys["Up"]:
  235. self.SelectUpChar()
  236. if event.key == CurKeys["Down"]:
  237. self.SelectDownChar()
  238. if event.key == CurKeys["Right"]:
  239. self.SelectNextChar()
  240. if event.key == CurKeys["Left"]:
  241. self.SelectPrevChar()
  242. if event.key == CurKeys["B"] or event.key == CurKeys["Enter"]:
  243. self.ClickOnChar()
  244. if event.key == CurKeys["X"]:
  245. if self._SectionIndex <= 0:
  246. self._LeftOrRight = -1
  247. if self._SectionIndex >= (self._SectionNumbers -1):
  248. self._LeftOrRight = 1
  249. self.ShiftKeyboardPage()
  250. if event.key == CurKeys["Menu"]: # we assume keyboard always be child page
  251. self.ReturnToUpLevelPage()
  252. self._Screen.Draw()
  253. self._Screen.SwapAndShow()
  254. if event.key == CurKeys["Y"]: #done
  255. print("".join(self._Textarea._MyWords))
  256. self.ReturnToUpLevelPage()
  257. self._Screen.SwapAndShow()
  258. #Uplevel page invokes OnReturnBackCb,eg: ConfigWireless
  259. if event.key == CurKeys["A"]:
  260. self._Textarea.RemoveFromLastText()
  261. self._Textarea.Draw()
  262. self._Screen.SwapAndShow()
  263. if event.key == CurKeys["LK1"]:
  264. if self._SectionIndex < self._SectionNumbers -1:
  265. self._LeftOrRight = -1
  266. self.ShiftKeyboardPage()
  267. if event.key == CurKeys["LK5"]:
  268. if self._SectionIndex > 0:
  269. self._LeftOrRight = 1
  270. self.ShiftKeyboardPage()
  271. def Draw(self):
  272. self.ClearCanvas()
  273. self._Ps.Draw()
  274. for i in range(0,self._SectionNumbers):
  275. for j in self._SecsKeys[i]:
  276. for u in j:
  277. u.Draw()
  278. self._Textarea.Draw()
  279. def ShiftKeyboardPage(self):
  280. self.KeyboardShift()
  281. self._SectionIndex -= self._LeftOrRight
  282. self.Draw()
  283. self._Screen.SwapAndShow()