sccd_multiwindow.py 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Model author: Simon Van Mierlo
  4. Model name: Bouncing Balls - Tkinter Version
  5. Model description:
  6. Tkinter frame with bouncing balls in it.
  7. """
  8. from sccd.runtime.statecharts_core import *
  9. import random
  10. import tkinter as tk
  11. from widget import Widget
  12. # package "Bouncing Balls - Tkinter Version "
  13. class MainApp(RuntimeClassBase):
  14. def __init__(self, controller, root):
  15. RuntimeClassBase.__init__(self, controller)
  16. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  17. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  18. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  19. self.semantics.priority = StatechartSemantics.SourceParent
  20. self.semantics.concurrency = StatechartSemantics.Single
  21. # build Statechart structure
  22. self.build_statechart_structure()
  23. # call user defined constructor
  24. MainApp.user_defined_constructor(self, root)
  25. def user_defined_constructor(self, root):
  26. self.nr_of_windows = 0
  27. self.root = root
  28. def user_defined_destructor(self):
  29. pass
  30. # builds Statechart structure
  31. def build_statechart_structure(self):
  32. # state <root>
  33. self.states[""] = State(0, "", self)
  34. # state /main
  35. self.states["/main"] = ParallelState(1, "/main", self)
  36. # state /main/main_behaviour
  37. self.states["/main/main_behaviour"] = State(2, "/main/main_behaviour", self)
  38. # state /main/main_behaviour/initializing
  39. self.states["/main/main_behaviour/initializing"] = State(3, "/main/main_behaviour/initializing", self)
  40. self.states["/main/main_behaviour/initializing"].setEnter(self._main_main_behaviour_initializing_enter)
  41. # state /main/main_behaviour/running
  42. self.states["/main/main_behaviour/running"] = State(4, "/main/main_behaviour/running", self)
  43. # state /main/creating_behaviour
  44. self.states["/main/creating_behaviour"] = State(5, "/main/creating_behaviour", self)
  45. # state /main/creating_behaviour/waiting
  46. self.states["/main/creating_behaviour/waiting"] = State(6, "/main/creating_behaviour/waiting", self)
  47. # state /main/creating_behaviour/creating
  48. self.states["/main/creating_behaviour/creating"] = State(7, "/main/creating_behaviour/creating", self)
  49. # state /main/deleting_behaviour
  50. self.states["/main/deleting_behaviour"] = State(8, "/main/deleting_behaviour", self)
  51. # state /main/deleting_behaviour/waiting
  52. self.states["/main/deleting_behaviour/waiting"] = State(9, "/main/deleting_behaviour/waiting", self)
  53. # state /main/deleting_behaviour/deleting
  54. self.states["/main/deleting_behaviour/deleting"] = State(10, "/main/deleting_behaviour/deleting", self)
  55. # state /stopped
  56. self.states["/stopped"] = State(11, "/stopped", self)
  57. self.states["/stopped"].setEnter(self._stopped_enter)
  58. # add children
  59. self.states[""].addChild(self.states["/main"])
  60. self.states[""].addChild(self.states["/stopped"])
  61. self.states["/main"].addChild(self.states["/main/main_behaviour"])
  62. self.states["/main"].addChild(self.states["/main/creating_behaviour"])
  63. self.states["/main"].addChild(self.states["/main/deleting_behaviour"])
  64. self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/initializing"])
  65. self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/running"])
  66. self.states["/main/creating_behaviour"].addChild(self.states["/main/creating_behaviour/waiting"])
  67. self.states["/main/creating_behaviour"].addChild(self.states["/main/creating_behaviour/creating"])
  68. self.states["/main/deleting_behaviour"].addChild(self.states["/main/deleting_behaviour/waiting"])
  69. self.states["/main/deleting_behaviour"].addChild(self.states["/main/deleting_behaviour/deleting"])
  70. self.states[""].fixTree()
  71. self.states[""].default_state = self.states["/main"]
  72. self.states["/main/main_behaviour"].default_state = self.states["/main/main_behaviour/initializing"]
  73. self.states["/main/creating_behaviour"].default_state = self.states["/main/creating_behaviour/waiting"]
  74. self.states["/main/deleting_behaviour"].default_state = self.states["/main/deleting_behaviour/waiting"]
  75. # transition /main/main_behaviour/initializing
  76. _main_main_behaviour_initializing_0 = Transition(self, self.states["/main/main_behaviour/initializing"], [self.states["/main/main_behaviour/running"]])
  77. _main_main_behaviour_initializing_0.setTrigger(None)
  78. self.states["/main/main_behaviour/initializing"].addTransition(_main_main_behaviour_initializing_0)
  79. # transition /main/main_behaviour/running
  80. _main_main_behaviour_running_0 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
  81. _main_main_behaviour_running_0.setAction(self._main_main_behaviour_running_0_exec)
  82. _main_main_behaviour_running_0.setTrigger(Event("window_created", None))
  83. self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_0)
  84. _main_main_behaviour_running_1 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
  85. _main_main_behaviour_running_1.setAction(self._main_main_behaviour_running_1_exec)
  86. _main_main_behaviour_running_1.setTrigger(Event("window_deleted", None))
  87. _main_main_behaviour_running_1.setGuard(self._main_main_behaviour_running_1_guard)
  88. self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_1)
  89. _main_main_behaviour_running_2 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
  90. _main_main_behaviour_running_2.setAction(self._main_main_behaviour_running_2_exec)
  91. _main_main_behaviour_running_2.setTrigger(Event("window_deleted", None))
  92. _main_main_behaviour_running_2.setGuard(self._main_main_behaviour_running_2_guard)
  93. self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_2)
  94. # transition /main/creating_behaviour/waiting
  95. _main_creating_behaviour_waiting_0 = Transition(self, self.states["/main/creating_behaviour/waiting"], [self.states["/main/creating_behaviour/creating"]])
  96. _main_creating_behaviour_waiting_0.setAction(self._main_creating_behaviour_waiting_0_exec)
  97. _main_creating_behaviour_waiting_0.setTrigger(Event("create_window", None))
  98. self.states["/main/creating_behaviour/waiting"].addTransition(_main_creating_behaviour_waiting_0)
  99. # transition /main/creating_behaviour/creating
  100. _main_creating_behaviour_creating_0 = Transition(self, self.states["/main/creating_behaviour/creating"], [self.states["/main/creating_behaviour/waiting"]])
  101. _main_creating_behaviour_creating_0.setAction(self._main_creating_behaviour_creating_0_exec)
  102. _main_creating_behaviour_creating_0.setTrigger(Event("instance_created", None))
  103. self.states["/main/creating_behaviour/creating"].addTransition(_main_creating_behaviour_creating_0)
  104. # transition /main/deleting_behaviour/waiting
  105. _main_deleting_behaviour_waiting_0 = Transition(self, self.states["/main/deleting_behaviour/waiting"], [self.states["/main/deleting_behaviour/deleting"]])
  106. _main_deleting_behaviour_waiting_0.setAction(self._main_deleting_behaviour_waiting_0_exec)
  107. _main_deleting_behaviour_waiting_0.setTrigger(Event("delete_window", None))
  108. self.states["/main/deleting_behaviour/waiting"].addTransition(_main_deleting_behaviour_waiting_0)
  109. # transition /main/deleting_behaviour/deleting
  110. _main_deleting_behaviour_deleting_0 = Transition(self, self.states["/main/deleting_behaviour/deleting"], [self.states["/main/deleting_behaviour/waiting"]])
  111. _main_deleting_behaviour_deleting_0.setAction(self._main_deleting_behaviour_deleting_0_exec)
  112. _main_deleting_behaviour_deleting_0.setTrigger(Event("instance_deleted", None))
  113. self.states["/main/deleting_behaviour/deleting"].addTransition(_main_deleting_behaviour_deleting_0)
  114. # transition /main
  115. _main_0 = Transition(self, self.states["/main"], [self.states["/stopped"]])
  116. _main_0.setTrigger(Event("stop", None))
  117. self.states["/main"].addTransition(_main_0)
  118. def _main_main_behaviour_initializing_enter(self):
  119. self.raiseInternalEvent(Event("create_window", None, []))
  120. def _stopped_enter(self):
  121. self.root.quit()
  122. def _main_main_behaviour_running_0_exec(self, parameters):
  123. self.nr_of_windows += 1
  124. def _main_main_behaviour_running_1_exec(self, parameters):
  125. self.nr_of_windows -= 1
  126. def _main_main_behaviour_running_1_guard(self, parameters):
  127. return self.nr_of_windows > 1
  128. def _main_main_behaviour_running_2_exec(self, parameters):
  129. self.raiseInternalEvent(Event("stop", None, []))
  130. def _main_main_behaviour_running_2_guard(self, parameters):
  131. return self.nr_of_windows == 1
  132. def _main_creating_behaviour_waiting_0_exec(self, parameters):
  133. self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows']))
  134. def _main_creating_behaviour_creating_0_exec(self, parameters):
  135. association_name = parameters[0]
  136. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  137. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  138. self.raiseInternalEvent(Event("window_created", None, []))
  139. def _main_deleting_behaviour_waiting_0_exec(self, parameters):
  140. association_name = parameters[0]
  141. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  142. def _main_deleting_behaviour_deleting_0_exec(self, parameters):
  143. self.raiseInternalEvent(Event("window_deleted", None, []))
  144. def initializeStatechart(self):
  145. # enter default state
  146. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  147. RuntimeClassBase.initializeStatechart(self)
  148. class Window(RuntimeClassBase, tk.Toplevel, Widget):
  149. def __init__(self, controller):
  150. RuntimeClassBase.__init__(self, controller)
  151. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  152. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  153. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  154. self.semantics.priority = StatechartSemantics.SourceParent
  155. self.semantics.concurrency = StatechartSemantics.Single
  156. # build Statechart structure
  157. self.build_statechart_structure()
  158. # call user defined constructor
  159. Window.user_defined_constructor(self)
  160. def user_defined_constructor(self):
  161. tk.Toplevel.__init__(self)
  162. Widget.__init__(self, True)
  163. self.title('BouncingBalls')
  164. CANVAS_SIZE_TUPLE = (0, 0, self.winfo_screenwidth() * 2, self.winfo_screenheight() * 2)
  165. self.c = tk.Canvas(self, relief=tk.RIDGE, scrollregion=CANVAS_SIZE_TUPLE)
  166. self.set_bindable_and_tagorid(self.c)
  167. def user_defined_destructor(self):
  168. self.destroy()
  169. # call super class destructors
  170. if hasattr(tk.Toplevel, "__del__"):
  171. tk.Toplevel.__del__(self)
  172. if hasattr(Widget, "__del__"):
  173. Widget.__del__(self)
  174. # builds Statechart structure
  175. def build_statechart_structure(self):
  176. # state <root>
  177. self.states[""] = State(0, "", self)
  178. # state /main
  179. self.states["/main"] = ParallelState(1, "/main", self)
  180. # state /main/main_behaviour
  181. self.states["/main/main_behaviour"] = State(2, "/main/main_behaviour", self)
  182. # state /main/main_behaviour/initializing
  183. self.states["/main/main_behaviour/initializing"] = State(3, "/main/main_behaviour/initializing", self)
  184. # state /main/main_behaviour/creating_button
  185. self.states["/main/main_behaviour/creating_button"] = State(4, "/main/main_behaviour/creating_button", self)
  186. # state /main/main_behaviour/packing_button
  187. self.states["/main/main_behaviour/packing_button"] = State(5, "/main/main_behaviour/packing_button", self)
  188. # state /main/main_behaviour/running
  189. self.states["/main/main_behaviour/running"] = State(6, "/main/main_behaviour/running", self)
  190. # state /main/main_behaviour/creating_ball
  191. self.states["/main/main_behaviour/creating_ball"] = State(7, "/main/main_behaviour/creating_ball", self)
  192. # state /stopped
  193. self.states["/stopped"] = State(8, "/stopped", self)
  194. self.states["/stopped"].setEnter(self._stopped_enter)
  195. # add children
  196. self.states[""].addChild(self.states["/main"])
  197. self.states[""].addChild(self.states["/stopped"])
  198. self.states["/main"].addChild(self.states["/main/main_behaviour"])
  199. self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/initializing"])
  200. self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/creating_button"])
  201. self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/packing_button"])
  202. self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/running"])
  203. self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/creating_ball"])
  204. self.states[""].fixTree()
  205. self.states[""].default_state = self.states["/main"]
  206. self.states["/main/main_behaviour"].default_state = self.states["/main/main_behaviour/initializing"]
  207. # transition /main/main_behaviour/initializing
  208. _main_main_behaviour_initializing_0 = Transition(self, self.states["/main/main_behaviour/initializing"], [self.states["/main/main_behaviour/creating_button"]])
  209. _main_main_behaviour_initializing_0.setAction(self._main_main_behaviour_initializing_0_exec)
  210. _main_main_behaviour_initializing_0.setTrigger(Event("set_association_name", None))
  211. self.states["/main/main_behaviour/initializing"].addTransition(_main_main_behaviour_initializing_0)
  212. # transition /main/main_behaviour/creating_button
  213. _main_main_behaviour_creating_button_0 = Transition(self, self.states["/main/main_behaviour/creating_button"], [self.states["/main/main_behaviour/packing_button"]])
  214. _main_main_behaviour_creating_button_0.setAction(self._main_main_behaviour_creating_button_0_exec)
  215. _main_main_behaviour_creating_button_0.setTrigger(Event("instance_created", None))
  216. self.states["/main/main_behaviour/creating_button"].addTransition(_main_main_behaviour_creating_button_0)
  217. # transition /main/main_behaviour/packing_button
  218. _main_main_behaviour_packing_button_0 = Transition(self, self.states["/main/main_behaviour/packing_button"], [self.states["/main/main_behaviour/running"]])
  219. _main_main_behaviour_packing_button_0.setAction(self._main_main_behaviour_packing_button_0_exec)
  220. _main_main_behaviour_packing_button_0.setTrigger(Event("button_created", None))
  221. self.states["/main/main_behaviour/packing_button"].addTransition(_main_main_behaviour_packing_button_0)
  222. # transition /main/main_behaviour/running
  223. _main_main_behaviour_running_0 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
  224. _main_main_behaviour_running_0.setAction(self._main_main_behaviour_running_0_exec)
  225. _main_main_behaviour_running_0.setTrigger(Event("window-close", self.getInPortName("input")))
  226. _main_main_behaviour_running_0.setGuard(self._main_main_behaviour_running_0_guard)
  227. self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_0)
  228. _main_main_behaviour_running_1 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
  229. _main_main_behaviour_running_1.setAction(self._main_main_behaviour_running_1_exec)
  230. _main_main_behaviour_running_1.setTrigger(Event("button_pressed", None))
  231. _main_main_behaviour_running_1.setGuard(self._main_main_behaviour_running_1_guard)
  232. self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_1)
  233. _main_main_behaviour_running_2 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/creating_ball"]])
  234. _main_main_behaviour_running_2.setAction(self._main_main_behaviour_running_2_exec)
  235. _main_main_behaviour_running_2.setTrigger(Event("right-click", self.getInPortName("input")))
  236. _main_main_behaviour_running_2.setGuard(self._main_main_behaviour_running_2_guard)
  237. self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_2)
  238. _main_main_behaviour_running_3 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
  239. _main_main_behaviour_running_3.setAction(self._main_main_behaviour_running_3_exec)
  240. _main_main_behaviour_running_3.setTrigger(Event("delete_ball", None))
  241. self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_3)
  242. # transition /main/main_behaviour/creating_ball
  243. _main_main_behaviour_creating_ball_0 = Transition(self, self.states["/main/main_behaviour/creating_ball"], [self.states["/main/main_behaviour/running"]])
  244. _main_main_behaviour_creating_ball_0.setAction(self._main_main_behaviour_creating_ball_0_exec)
  245. _main_main_behaviour_creating_ball_0.setTrigger(Event("instance_created", None))
  246. self.states["/main/main_behaviour/creating_ball"].addTransition(_main_main_behaviour_creating_ball_0)
  247. # transition /main
  248. _main_0 = Transition(self, self.states["/main"], [self.states["/stopped"]])
  249. _main_0.setAction(self._main_0_exec)
  250. _main_0.setTrigger(Event("stop", None))
  251. self.states["/main"].addTransition(_main_0)
  252. def _stopped_enter(self):
  253. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_window", None, [self.association_name])]))
  254. def _main_0_exec(self, parameters):
  255. self.big_step.outputEventOM(Event("delete_instance", None, [self, 'buttons']))
  256. self.big_step.outputEventOM(Event("delete_instance", None, [self, 'balls']))
  257. def _main_main_behaviour_initializing_0_exec(self, parameters):
  258. association_name = parameters[0]
  259. self.association_name = association_name
  260. self.big_step.outputEventOM(Event("create_instance", None, [self, 'buttons', 'Button', self, 'create_window', 'Create Window']))
  261. def _main_main_behaviour_creating_button_0_exec(self, parameters):
  262. association_name = parameters[0]
  263. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  264. def _main_main_behaviour_packing_button_0_exec(self, parameters):
  265. button = parameters[0]
  266. button.pack(expand=False, fill=tk.X, side=tk.TOP)
  267. self.c.focus_force()
  268. self.c.pack(expand=True, fill=tk.BOTH)
  269. def _main_main_behaviour_running_0_exec(self, parameters):
  270. tagorid = parameters[0]
  271. self.raiseInternalEvent(Event("stop", None, []))
  272. def _main_main_behaviour_running_0_guard(self, parameters):
  273. tagorid = parameters[0]
  274. return tagorid == id(self)
  275. def _main_main_behaviour_running_1_exec(self, parameters):
  276. event_name = parameters[0]
  277. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("create_window", None, [])]))
  278. def _main_main_behaviour_running_1_guard(self, parameters):
  279. event_name = parameters[0]
  280. return event_name == 'create_window'
  281. def _main_main_behaviour_running_2_exec(self, parameters):
  282. tagorid = parameters[0]
  283. self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.c, self.last_x, self.last_y]))
  284. def _main_main_behaviour_running_2_guard(self, parameters):
  285. tagorid = parameters[0]
  286. return tagorid == id(self)
  287. def _main_main_behaviour_running_3_exec(self, parameters):
  288. association_name = parameters[0]
  289. self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
  290. def _main_main_behaviour_creating_ball_0_exec(self, parameters):
  291. association_name = parameters[0]
  292. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  293. self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
  294. def initializeStatechart(self):
  295. # enter default state
  296. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  297. RuntimeClassBase.initializeStatechart(self)
  298. class Button(RuntimeClassBase, tk.Button, Widget):
  299. def __init__(self, controller, parent, event_name, button_text):
  300. RuntimeClassBase.__init__(self, controller)
  301. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  302. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  303. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  304. self.semantics.priority = StatechartSemantics.SourceParent
  305. self.semantics.concurrency = StatechartSemantics.Single
  306. # build Statechart structure
  307. self.build_statechart_structure()
  308. # call user defined constructor
  309. Button.user_defined_constructor(self, parent, event_name, button_text)
  310. def user_defined_constructor(self, parent, event_name, button_text):
  311. tk.Button.__init__(self, parent, **{'text': button_text})
  312. Widget.__init__(self)
  313. self.event_name = event_name
  314. def user_defined_destructor(self):
  315. self.destroy()
  316. # call super class destructors
  317. if hasattr(tk.Button, "__del__"):
  318. tk.Button.__del__(self)
  319. if hasattr(Widget, "__del__"):
  320. Widget.__del__(self)
  321. # builds Statechart structure
  322. def build_statechart_structure(self):
  323. # state <root>
  324. self.states[""] = State(0, "", self)
  325. # state /initializing
  326. self.states["/initializing"] = State(1, "/initializing", self)
  327. self.states["/initializing"].setEnter(self._initializing_enter)
  328. # state /running
  329. self.states["/running"] = State(2, "/running", self)
  330. # add children
  331. self.states[""].addChild(self.states["/initializing"])
  332. self.states[""].addChild(self.states["/running"])
  333. self.states[""].fixTree()
  334. self.states[""].default_state = self.states["/initializing"]
  335. # transition /initializing
  336. _initializing_0 = Transition(self, self.states["/initializing"], [self.states["/running"]])
  337. _initializing_0.setTrigger(None)
  338. self.states["/initializing"].addTransition(_initializing_0)
  339. # transition /running
  340. _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
  341. _running_0.setAction(self._running_0_exec)
  342. _running_0.setTrigger(Event("left-click", self.getInPortName("input")))
  343. _running_0.setGuard(self._running_0_guard)
  344. self.states["/running"].addTransition(_running_0)
  345. def _initializing_enter(self):
  346. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_created", None, [self])]))
  347. def _running_0_exec(self, parameters):
  348. tagorid = parameters[0]
  349. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [self.event_name])]))
  350. def _running_0_guard(self, parameters):
  351. tagorid = parameters[0]
  352. return tagorid == id(self)
  353. def initializeStatechart(self):
  354. # enter default state
  355. self.default_targets = self.states["/initializing"].getEffectiveTargetStates()
  356. RuntimeClassBase.initializeStatechart(self)
  357. class Ball(RuntimeClassBase, Widget):
  358. def __init__(self, controller, canvas, x, y):
  359. RuntimeClassBase.__init__(self, controller)
  360. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  361. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  362. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  363. self.semantics.priority = StatechartSemantics.SourceParent
  364. self.semantics.concurrency = StatechartSemantics.Single
  365. # build Statechart structure
  366. self.build_statechart_structure()
  367. # user defined attributes
  368. self.canvas = None
  369. # call user defined constructor
  370. Ball.user_defined_constructor(self, canvas, x, y)
  371. def user_defined_constructor(self, canvas, x, y):
  372. Widget.__init__(self, True)
  373. self.canvas = canvas
  374. self.r = 20.0;
  375. self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
  376. self.smooth = 0.4 # value between 0 and 1
  377. self.id = self.canvas.create_oval(x, y, x + (self.r * 2), y + (self.r * 2), fill="black")
  378. self.set_bindable_and_tagorid(self.canvas, self.id)
  379. def user_defined_destructor(self):
  380. self.canvas.delete(self.id)
  381. # call super class destructors
  382. if hasattr(Widget, "__del__"):
  383. Widget.__del__(self)
  384. # builds Statechart structure
  385. def build_statechart_structure(self):
  386. # state <root>
  387. self.states[""] = State(0, "", self)
  388. # state /initializing
  389. self.states["/initializing"] = State(1, "/initializing", self)
  390. # state /bouncing
  391. self.states["/bouncing"] = State(2, "/bouncing", self)
  392. self.states["/bouncing"].setEnter(self._bouncing_enter)
  393. self.states["/bouncing"].setExit(self._bouncing_exit)
  394. # state /dragging
  395. self.states["/dragging"] = State(3, "/dragging", self)
  396. # state /selected
  397. self.states["/selected"] = State(4, "/selected", self)
  398. # state /deleted
  399. self.states["/deleted"] = State(5, "/deleted", self)
  400. # add children
  401. self.states[""].addChild(self.states["/initializing"])
  402. self.states[""].addChild(self.states["/bouncing"])
  403. self.states[""].addChild(self.states["/dragging"])
  404. self.states[""].addChild(self.states["/selected"])
  405. self.states[""].addChild(self.states["/deleted"])
  406. self.states[""].fixTree()
  407. self.states[""].default_state = self.states["/initializing"]
  408. # transition /initializing
  409. _initializing_0 = Transition(self, self.states["/initializing"], [self.states["/bouncing"]])
  410. _initializing_0.setAction(self._initializing_0_exec)
  411. _initializing_0.setTrigger(Event("set_association_name", None))
  412. self.states["/initializing"].addTransition(_initializing_0)
  413. # transition /bouncing
  414. _bouncing_0 = Transition(self, self.states["/bouncing"], [self.states["/bouncing"]])
  415. _bouncing_0.setAction(self._bouncing_0_exec)
  416. _bouncing_0.setTrigger(Event("_0after"))
  417. self.states["/bouncing"].addTransition(_bouncing_0)
  418. _bouncing_1 = Transition(self, self.states["/bouncing"], [self.states["/selected"]])
  419. _bouncing_1.setAction(self._bouncing_1_exec)
  420. _bouncing_1.setTrigger(Event("left-click", self.getInPortName("input")))
  421. _bouncing_1.setGuard(self._bouncing_1_guard)
  422. self.states["/bouncing"].addTransition(_bouncing_1)
  423. # transition /dragging
  424. _dragging_0 = Transition(self, self.states["/dragging"], [self.states["/dragging"]])
  425. _dragging_0.setAction(self._dragging_0_exec)
  426. _dragging_0.setTrigger(Event("motion", self.getInPortName("input")))
  427. self.states["/dragging"].addTransition(_dragging_0)
  428. _dragging_1 = Transition(self, self.states["/dragging"], [self.states["/bouncing"]])
  429. _dragging_1.setAction(self._dragging_1_exec)
  430. _dragging_1.setTrigger(Event("left-release", self.getInPortName("input")))
  431. self.states["/dragging"].addTransition(_dragging_1)
  432. # transition /selected
  433. _selected_0 = Transition(self, self.states["/selected"], [self.states["/dragging"]])
  434. _selected_0.setTrigger(Event("left-click", self.getInPortName("input")))
  435. _selected_0.setGuard(self._selected_0_guard)
  436. self.states["/selected"].addTransition(_selected_0)
  437. _selected_1 = Transition(self, self.states["/selected"], [self.states["/deleted"]])
  438. _selected_1.setAction(self._selected_1_exec)
  439. _selected_1.setTrigger(Event("delete", self.getInPortName("input")))
  440. self.states["/selected"].addTransition(_selected_1)
  441. def _bouncing_enter(self):
  442. self.addTimer(0, (20 - self.getSimulatedTime() % 20) / 1000.0)
  443. def _bouncing_exit(self):
  444. self.removeTimer(0)
  445. def _initializing_0_exec(self, parameters):
  446. association_name = parameters[0]
  447. self.association_name = association_name
  448. def _bouncing_0_exec(self, parameters):
  449. pos = self.canvas.coords(self.id)
  450. x = self.canvas.canvasx(pos[0])
  451. y = self.canvas.canvasy(pos[1])
  452. if x <= 0 or x + (self.r * 2) >= self.canvas.canvasx(self.canvas.winfo_width()):
  453. self.vel['x'] = -self.vel['x']
  454. if y <= 0 or y + (self.r * 2) >= self.canvas.canvasy(self.canvas.winfo_height()):
  455. self.vel['y'] = -self.vel['y']
  456. self.canvas.move(self.id, self.vel['x'], self.vel['y']);
  457. def _bouncing_1_exec(self, parameters):
  458. tagorid = parameters[0]
  459. self.canvas.itemconfig(self.id, fill="yellow")
  460. def _bouncing_1_guard(self, parameters):
  461. tagorid = parameters[0]
  462. return tagorid == id(self)
  463. def _dragging_0_exec(self, parameters):
  464. tagorid = parameters[0]
  465. coords = self.canvas.coords(self.id)
  466. dx = self.canvas.canvasx(self.last_x) - self.canvas.canvasx(coords[0])
  467. dy = self.canvas.canvasx(self.last_y) - self.canvas.canvasy(coords[1])
  468. self.canvas.move(self.id, dx, dy);
  469. # keep ball within boundaries
  470. coords = self.canvas.coords(self.id)
  471. x = self.canvas.canvasx(coords[0])
  472. y = self.canvas.canvasy(coords[1])
  473. if x - self.r <= 0:
  474. x = 1;
  475. elif x + self.r >= self.canvas.winfo_width():
  476. x = self.canvas.winfo_width() - (2 * self.r) - 1
  477. if y - self.r <= 0:
  478. y = 1
  479. elif y + self.r >= self.canvas.winfo_height():
  480. y = self.canvas.winfo_height() - (2 * self.r) - 1;
  481. self.canvas.coords(self.id, x, y, x + (self.r * 2), y + (self.r * 2));
  482. self.vel = {
  483. 'x': (1 - self.smooth) * dx + self.smooth * self.vel['x'],
  484. 'y': (1 - self.smooth) * dy + self.smooth * self.vel['y']
  485. }
  486. def _dragging_1_exec(self, parameters):
  487. tagorid = parameters[0]
  488. self.canvas.itemconfig(self.id, fill="red")
  489. def _selected_0_guard(self, parameters):
  490. tagorid = parameters[0]
  491. return tagorid == id(self)
  492. def _selected_1_exec(self, parameters):
  493. tagorid = parameters[0]
  494. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_ball", None, [self.association_name])]))
  495. def initializeStatechart(self):
  496. # enter default state
  497. self.default_targets = self.states["/initializing"].getEffectiveTargetStates()
  498. RuntimeClassBase.initializeStatechart(self)
  499. class ObjectManager(ObjectManagerBase):
  500. def __init__(self, controller):
  501. ObjectManagerBase.__init__(self, controller)
  502. def instantiate(self, class_name, construct_params):
  503. if class_name == "MainApp":
  504. instance = MainApp(self.controller, construct_params[0])
  505. instance.associations = {}
  506. instance.associations["windows"] = Association("Window", 0, -1)
  507. elif class_name == "Window":
  508. instance = Window(self.controller)
  509. instance.associations = {}
  510. instance.associations["parent"] = Association("MainApp", 1, 1)
  511. instance.associations["buttons"] = Association("Button", 0, -1)
  512. instance.associations["balls"] = Association("Ball", 0, -1)
  513. elif class_name == "Button":
  514. instance = Button(self.controller, construct_params[0], construct_params[1], construct_params[2])
  515. instance.associations = {}
  516. instance.associations["parent"] = Association("Field", 1, 1)
  517. elif class_name == "Ball":
  518. instance = Ball(self.controller, construct_params[0], construct_params[1], construct_params[2])
  519. instance.associations = {}
  520. instance.associations["parent"] = Association("Window", 1, 1)
  521. else:
  522. raise Exception("Cannot instantiate class " + class_name)
  523. return instance
  524. class Controller(EventLoopControllerBase):
  525. def __init__(self, root, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
  526. if finished_callback == None: finished_callback = None
  527. if behind_schedule_callback == None: behind_schedule_callback = None
  528. EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
  529. self.addInputPort("input")
  530. self.object_manager.createInstance("MainApp", [root])