keyboard.py 11 KB

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