keyboard_screen.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import pygame
  2. from .base_screen import BaseScreen
  3. from ..graphic_utils import ScreenObjectsManager, TouchAndTextItem
  4. from ..input import InputManager
  5. class Keyboard(BaseScreen):
  6. def __init__(self, size, base_size, manager, fonts, listener):
  7. BaseScreen.__init__(self, size, base_size, manager, fonts)
  8. self.base_width = size[0]/10
  9. self.base_height = size[1]/5
  10. self.listener = listener
  11. self.manager = manager
  12. self.selected_row = 0
  13. self.selected_col = 0
  14. self.selected_others = -1
  15. self.font = pygame.font.SysFont("arial", size[1]/6)
  16. self.keyboards = [ScreenObjectsManager(), ScreenObjectsManager()]
  17. self.other_objects = ScreenObjectsManager()
  18. self.current_keyboard = 0
  19. self.keys = [[['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'],
  20. ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '-'],
  21. [',', 'z', 'x', 'c', 'v', 'b', 'n', 'm', '.', '_']],
  22. [['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
  23. ['!', '@', '#', '$', '%', '&', '/', '(', ')', '='],
  24. ['?', '{', '}', '_', '[', ']', '+', '<', '>', '*']]]
  25. line = self.base_height
  26. for row in self.keys[self.current_keyboard]:
  27. pos = 0
  28. for key in row:
  29. button = \
  30. TouchAndTextItem(self.font, key,
  31. (pos, line),
  32. (self.base_width, self.base_height),
  33. center=True, background=(150, 150, 150))
  34. self.keyboards[self.current_keyboard].\
  35. set_touch_object(key, button)
  36. pos += self.base_width
  37. line += self.base_height
  38. self.current_keyboard = 1
  39. line = self.base_height
  40. for row in self.keys[self.current_keyboard]:
  41. pos = 0
  42. for key in row:
  43. button = \
  44. TouchAndTextItem(self.font, key, (pos, line),
  45. (self.base_width, self.base_height),
  46. center=True, background=(150, 150, 150))
  47. self.keyboards[self.current_keyboard].\
  48. set_touch_object(key, button)
  49. pos += self.base_width
  50. line += self.base_height
  51. self.current_keyboard = 0
  52. # Symbol button
  53. button = TouchAndTextItem(self.font, "123",
  54. (0, self.base_height*4),
  55. (self.base_width*2, self.base_height),
  56. center=True, background=(150, 150, 150))
  57. self.other_objects.set_touch_object("symbols", button)
  58. # remove button
  59. button = TouchAndTextItem(self.font, "<-",
  60. (self.base_width*2, self.base_height*4),
  61. (self.base_width*2, self.base_height),
  62. center=True, background=(150, 150, 150))
  63. self.other_objects.set_touch_object("remove", button)
  64. # Space button
  65. button = TouchAndTextItem(self.font, " ",
  66. (self.base_width*4, self.base_height*4),
  67. (self.base_width*4, self.base_height),
  68. center=True, background=(150, 150, 150))
  69. self.other_objects.set_touch_object("space", button)
  70. # OK button
  71. button = TouchAndTextItem(self.font, "->",
  72. (self.base_width*8, self.base_height*4),
  73. (self.base_width*2, self.base_height),
  74. center=True, background=(150, 150, 150))
  75. self.other_objects.set_touch_object("ok", button)
  76. # EditText button
  77. button = TouchAndTextItem(self.font, "",
  78. (0, 0),
  79. (self.base_width*10, self.base_height),
  80. center=True)
  81. self.other_objects.set_object("text", button)
  82. self.change_selected(0, 0)
  83. def update(self, screen):
  84. screen.fill((0, 0, 0))
  85. self.keyboards[self.current_keyboard].render(screen)
  86. self.other_objects.render(screen)
  87. def touch_event(self, touch_event):
  88. if touch_event.type == InputManager.click:
  89. keys = self.keyboards[self.current_keyboard]\
  90. .get_touch_objects_in_pos(touch_event.current_pos)
  91. for key in keys:
  92. self.other_objects.get_object("text").add_text(key, False)
  93. keys = self.other_objects.get_touch_objects_in_pos(
  94. touch_event.current_pos)
  95. for key in keys:
  96. if key == 'symbols':
  97. self.change_keyboard()
  98. elif key == "remove":
  99. self.other_objects.get_object("text").remove_text(1, False)
  100. elif key == "space":
  101. self.other_objects.get_object("text").add_text(" ", False)
  102. elif key == "ok":
  103. text = self.other_objects.get_object("text").text
  104. self.listener.text_input(text)
  105. self.manager.close_keyboard()
  106. elif touch_event.type == InputManager.key:
  107. if isinstance(touch_event.unicode, unicode):
  108. if touch_event.unicode == u'\x08':
  109. self.other_objects.get_object("text").remove_text(1, False)
  110. else:
  111. self.other_objects.get_object("text").add_text(
  112. touch_event.unicode, False)
  113. elif touch_event.direction is not None:
  114. x = 0
  115. y = 0
  116. if touch_event.direction == InputManager.left:
  117. x = -1
  118. elif touch_event.direction == InputManager.right:
  119. x = 1
  120. elif touch_event.direction == InputManager.up:
  121. y = -1
  122. elif touch_event.direction == InputManager.down:
  123. y = 1
  124. if touch_event.direction == InputManager.enter:
  125. self.selected_click()
  126. else:
  127. self.change_selected(x, y)
  128. def change_keyboard(self):
  129. if self.current_keyboard == 0:
  130. self.current_keyboard = 1
  131. else:
  132. self.current_keyboard = 0
  133. if self.selected_others < 0:
  134. self.change_selected(0, 0)
  135. def change_selected(self, x, y):
  136. if self.selected_others < 0:
  137. # We are on the keyboard
  138. # Update col
  139. self.selected_col += x
  140. if self.selected_col < 0:
  141. self.selected_col = 0
  142. elif self.selected_col > 9:
  143. self.selected_col = 9
  144. # Update row
  145. self.selected_row += y
  146. if self.selected_row < 0:
  147. self.selected_row = 0
  148. elif self.selected_row > 2:
  149. # Change to the bottom part
  150. if self.selected_col < 2:
  151. self.selected_others = 0
  152. elif self.selected_col < 4:
  153. self.selected_others = 1
  154. elif self.selected_col < 8:
  155. self.selected_others = 2
  156. else:
  157. self.selected_others = 3
  158. # Update selected
  159. if self.selected_others < 0:
  160. key = self.keys[self.current_keyboard][
  161. self.selected_row][self.selected_col]
  162. self.keyboards[self.current_keyboard].set_selected(key)
  163. else:
  164. self.keyboards[0].set_selected(None)
  165. self.keyboards[1].set_selected(None)
  166. self.set_selected_other()
  167. else:
  168. # We are on the bottom part
  169. if y < 0:
  170. # we are returning to the keyboard
  171. # Select col
  172. if self.selected_others == 0:
  173. self.selected_col = 0
  174. elif self.selected_others == 1:
  175. self.selected_col = 2
  176. elif self.selected_others == 2:
  177. self.selected_col = 4
  178. else:
  179. self.selected_col = 8
  180. self.selected_others = -1
  181. self.set_selected_other()
  182. self.selected_row = 2
  183. key = self.keys[self.current_keyboard][
  184. self.selected_row][self.selected_col]
  185. self.keyboards[self.current_keyboard].set_selected(key)
  186. elif x != 0:
  187. # We change in horizontal
  188. self.selected_others += x
  189. if self.selected_others < 0:
  190. self.selected_others = 0
  191. elif self.selected_others > 3:
  192. self.selected_others = 3
  193. self.set_selected_other()
  194. def selected_click(self):
  195. if self.selected_others >= 0:
  196. if self.selected_others == 0:
  197. self.change_keyboard()
  198. elif self.selected_others == 1:
  199. self.other_objects.get_object("text").remove_text(1, False)
  200. elif self.selected_others == 2:
  201. self.other_objects.get_object("text").add_text(" ", False)
  202. elif self.selected_others == 3:
  203. text = self.other_objects.get_object("text").text
  204. self.listener.text_input(text)
  205. self.manager.close_keyboard()
  206. else:
  207. key = self.keys[self.current_keyboard][
  208. self.selected_row][self.selected_col]
  209. self.other_objects.get_object("text").add_text(
  210. key, False)
  211. def set_selected_other(self):
  212. key = None
  213. if self.selected_others == 0:
  214. key = "symbols"
  215. elif self.selected_others == 1:
  216. key = "remove"
  217. elif self.selected_others == 2:
  218. key = "space"
  219. elif self.selected_others == 3:
  220. key = "ok"
  221. self.other_objects.set_selected(key)