keyboard.py 11 KB

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