ui_classes.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. from widget_private_ports import Widget
  2. from sccd.runtime.statecharts_core import Event
  3. import Tkinter as tk
  4. import random
  5. class WindowVis(tk.Toplevel, Widget):
  6. def __init__(self, sccd_object):
  7. tk.Toplevel.__init__(self)
  8. self.sccd_object = sccd_object
  9. self.inport = self.sccd_object.inports["window_ui_in"]
  10. self.outport = self.sccd_object.outports["window_ui_out"]
  11. Widget.__init__(self, True, self.inport, self.outport)
  12. self.buttons = {}
  13. self.balls = {}
  14. self.title('BouncingBalls')
  15. self.c = tk.Canvas(self, relief=tk.RIDGE)
  16. self.repack()
  17. self.set_bindable_and_tagorid(self.c)
  18. self.c.bind("<Configure>", self.window_resize_handler)
  19. self.listener = self.sccd_object.controller.addOutputListener(self.outport)
  20. self.after(40, self.handle_output_events)
  21. Widget.controller.addInput(Event("ui_initialized", self.inport, [self.winfo_width(), self.winfo_height()]))
  22. def destruct(self):
  23. self.destroy()
  24. def repack(self):
  25. self.c.pack_forget()
  26. for b in self.buttons.itervalues():
  27. b.pack_forget()
  28. b.pack(expand=False, fill=tk.X, side=tk.TOP)
  29. self.c.focus_force()
  30. self.c.pack(expand=True, fill=tk.BOTH)
  31. self.update()
  32. def window_resize_handler(self, event):
  33. Widget.controller.addInput(Event("size_changed", self.inport, [event.width, event.height]))
  34. def on_click(self, event):
  35. event_name = None
  36. if event.num == 1:
  37. event_name = "left-click"
  38. elif event.num == 2:
  39. event_name = "middle-click"
  40. elif event.num == 3:
  41. event_name = "right-click"
  42. if event_name == "right-click":
  43. self.last_x = event.x
  44. self.last_y = event.y
  45. Widget.controller.addInput(Event("create_ball", self.inport, [self.last_x, self.last_y]))
  46. def handle_output_events(self):
  47. while True:
  48. output_event = self.listener.fetch(0)
  49. if not output_event is None:
  50. if output_event.getName() == "create_new_button":
  51. self.on_create_new_button(output_event)
  52. elif output_event.getName() == "delete_ball":
  53. self.on_delete_ball(output_event)
  54. elif output_event.getName() == "create_new_ball":
  55. self.on_create_new_ball(output_event)
  56. elif output_event.getName() == "resize_window":
  57. self.on_resize_window(output_event)
  58. else:
  59. break
  60. for b in self.buttons.itervalues():
  61. b.handle_output_events()
  62. for b in self.balls.itervalues():
  63. b.handle_output_events()
  64. self.after(40, self.handle_output_events)
  65. def on_create_new_button(self, event):
  66. assoc_name = event.getParameters()[0]
  67. sccd_object = event.getParameters()[1]
  68. self.buttons[assoc_name] = ButtonVis(sccd_object, self)
  69. self.repack()
  70. def on_delete_ball(self, event):
  71. self.balls[event.getParameters()[0]].destruct()
  72. del self.balls[event.getParameters()[0]]
  73. def on_create_new_ball(self, event):
  74. assoc_name = event.getParameters()[0]
  75. sccd_object = event.getParameters()[1]
  76. self.balls[assoc_name] = BallVis(sccd_object, self.c)
  77. def on_resize_window(self, event):
  78. #self.geometry("%sx%s" % tuple(event.getParameters()))
  79. pass
  80. class ButtonVis(tk.Button, Widget):
  81. def __init__(self, sccd_object, window):
  82. tk.Button.__init__(self, window)
  83. self.sccd_object = sccd_object
  84. self.inport = self.sccd_object.inports["button_ui_in"]
  85. self.outport = self.sccd_object.outports["button_ui_out"]
  86. Widget.__init__(self, False, self.inport, self.outport)
  87. self.listener = self.sccd_object.controller.addOutputListener(self.outport)
  88. Widget.controller.addInput(Event("ui_initialized", self.inport))
  89. def on_click(self, event):
  90. event_name = None
  91. if event.num == 1:
  92. event_name = "left-click"
  93. elif event.num == 2:
  94. event_name = "middle-click"
  95. elif event.num == 3:
  96. event_name = "right-click"
  97. if event_name == "left-click":
  98. Widget.controller.addInput(Event("clicked", self.inport))
  99. def handle_output_events(self):
  100. while True:
  101. output_event = self.listener.fetch(0)
  102. if not output_event is None:
  103. if output_event.getName() == "set_text":
  104. self.on_set_text(output_event)
  105. else:
  106. break
  107. def on_set_text(self, event):
  108. self.config(text=event.getParameters()[0])
  109. def mymethod(self):
  110. pass
  111. class BallVis(Widget):
  112. def __init__(self, sccd_object, canvas):
  113. self.sccd_object = sccd_object
  114. self.inport = self.sccd_object.inports["ball_ui_in"]
  115. self.outport = self.sccd_object.outports["ball_ui_out"]
  116. Widget.__init__(self, True, self.inport, self.outport)
  117. self.canvas = canvas
  118. self.listener = self.sccd_object.controller.addOutputListener(self.outport)
  119. Widget.controller.addInput(Event("ui_initialized", self.inport))
  120. def destruct(self):
  121. self.canvas.delete(self.id)
  122. def on_click(self, event):
  123. event_name = None
  124. if event.num == 1:
  125. event_name = "left-click"
  126. elif event.num == 2:
  127. event_name = "middle-click"
  128. elif event.num == 3:
  129. event_name = "right-click"
  130. if event_name == "left-click":
  131. self.last_x = event.x
  132. self.last_y = event.y
  133. Widget.controller.addInput(Event("select_ball", self.inport))
  134. def on_release(self, event):
  135. event_name = None
  136. if event.num == 1:
  137. event_name = "left-release"
  138. elif event.num == 2:
  139. event_name = "middle-release"
  140. elif event.num == 3:
  141. event_name = "right-release"
  142. if event_name == "left-release":
  143. self.last_x = event.x
  144. self.last_y = event.y
  145. Widget.controller.addInput(Event("unselect_ball", self.inport))
  146. def on_motion(self, event):
  147. Widget.controller.addInput(Event("motion", self.inport, [self.canvas.canvasx(event.x) - self.canvas.canvasx(self.last_x), self.canvas.canvasy(event.y) - self.canvas.canvasy(self.last_y)]))
  148. self.last_x = event.x
  149. self.last_y = event.y
  150. def handle_output_events(self):
  151. while True:
  152. output_event = self.listener.fetch(0)
  153. if not output_event is None:
  154. if output_event.getName() == "set_initial_params":
  155. self.on_set_initial_params(output_event)
  156. if output_event.getName() == "change_position":
  157. self.on_change_position(output_event)
  158. if output_event.getName() == "change_color":
  159. self.on_change_color(output_event)
  160. else:
  161. break
  162. def on_set_initial_params(self, event):
  163. self.x, self.y, self.r = event.getParameters()
  164. self.id = self.canvas.create_oval(self.x, self.y, self.x + (self.r * 2), self.y + (self.r * 2), fill="black")
  165. self.set_bindable_and_tagorid(self.canvas, self.id)
  166. def on_change_position(self, event):
  167. self.x, self.y = event.getParameters()
  168. self.canvas.coords(self.id, self.x, self.y, self.x + (self.r * 2), self.y + (self.r * 2))
  169. def on_change_color(self, event):
  170. self.canvas.itemconfig(self.id, fill=event.getParameters()[0])