sccd_no_ui.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <?xml version="1.1" ?>
  2. <diagram author="Simon Van Mierlo" name="Bouncing_Balls_Python_Version">
  3. <description>
  4. Bouncing Balls - no UI code.
  5. </description>
  6. <top>
  7. from ui_classes import *
  8. </top>
  9. <inport name="ui_in"/>
  10. <outport name="ui_out"/>
  11. <class name="MainApp" default="true">
  12. <relationships>
  13. <association name="windows" class="Window" />
  14. </relationships>
  15. <constructor>
  16. <body>
  17. <![CDATA[
  18. self.nr_of_windows = 0
  19. ]]>
  20. </body>
  21. </constructor>
  22. <scxml initial="main">
  23. <parallel id="main">
  24. <state id="main_behaviour" initial="initializing">
  25. <state id="initializing">
  26. <onentry>
  27. <raise event="create_window" scope="local" />
  28. </onentry>
  29. <transition target="../running" />
  30. </state>
  31. <state id="running">
  32. <transition event="window_created" target=".">
  33. <script>
  34. self.nr_of_windows += 1
  35. </script>
  36. </transition>
  37. <transition event="window_deleted" target="." cond="self.nr_of_windows > 1">
  38. <script>
  39. self.nr_of_windows -= 1
  40. </script>
  41. </transition>
  42. <transition event="window_deleted" target="." cond="self.nr_of_windows == 1">
  43. <raise event="stop" scope="local" />
  44. </transition>
  45. </state>
  46. </state>
  47. <state id="creating_behaviour" initial="waiting">
  48. <state id="waiting">
  49. <transition event="create_window" target="../creating">
  50. <raise event="create_instance" scope="cd">
  51. <parameter expr="'windows'" />
  52. <parameter expr="'Window'" />
  53. </raise>
  54. </transition>
  55. </state>
  56. <state id="creating">
  57. <transition event="instance_created" target="../waiting">
  58. <parameter name="association_name" />
  59. <raise event="create_new_window" port="ui_out">
  60. <parameter expr="association_name" />
  61. <parameter expr="self.getSingleChild(association_name)" />
  62. </raise>
  63. <raise event="start_instance" scope="cd">
  64. <parameter expr="association_name" />
  65. </raise>
  66. <raise event="set_association_name" scope="narrow" target="association_name">
  67. <parameter expr="association_name" />
  68. </raise>
  69. <raise event="window_created" scope="local" />
  70. </transition>
  71. </state>
  72. </state>
  73. <state id="deleting_behaviour" initial="waiting">
  74. <state id="waiting">
  75. <transition event="delete_window" target="../deleting">
  76. <parameter name="association_name" />
  77. <raise event="delete_window" port="ui_out">
  78. <parameter expr="association_name" />
  79. </raise>
  80. <raise event="delete_instance" scope="cd">
  81. <parameter expr="association_name" />
  82. </raise>
  83. </transition>
  84. </state>
  85. <state id="deleting">
  86. <transition event="instance_deleted" target="../waiting">
  87. <raise event="window_deleted" scope="local" />
  88. </transition>
  89. </state>
  90. </state>
  91. <transition event="stop" target="../stopped" />
  92. </parallel>
  93. <state id="stopped">
  94. <onentry>
  95. <raise event="stop_ui" port="ui_out" />
  96. </onentry>
  97. </state>
  98. </scxml>
  99. </class>
  100. <class name="Window">
  101. <inport name="window_ui_in" />
  102. <outport name="window_ui_out" />
  103. <relationships>
  104. <association name="balls" class="Ball" />
  105. <association name="buttons" class="Button" />
  106. <association name="parent" class="MainApp" min="1" max="1" />
  107. </relationships>
  108. <scxml initial="main">
  109. <parallel id="main">
  110. <state id="main_behaviour" initial="initializing">
  111. <state id="initializing">
  112. <transition event="set_association_name" target="../waiting_for_ui">
  113. <parameter name="association_name" />
  114. <script>
  115. self.association_name = association_name
  116. </script>
  117. </transition>
  118. </state>
  119. <state id="waiting_for_ui">
  120. <transition event="ui_initialized" target="../creating_button" port="window_ui_in">
  121. <parameter name="width" />
  122. <parameter name="height" />
  123. <script>
  124. self.width = width
  125. self.height = height
  126. </script>
  127. <raise scope="cd" event="create_instance">
  128. <parameter expr='"buttons"' />
  129. <parameter expr='"Button"' />
  130. <parameter expr="'create_window'" />
  131. </raise>
  132. </transition>
  133. </state>
  134. <state id="creating_button">
  135. <transition event="instance_created" target="../running">
  136. <parameter name="association_name" type="string"/>
  137. <raise event="create_new_button" port="window_ui_out">
  138. <parameter expr="association_name" />
  139. <parameter expr="self.getSingleChild(association_name)" />
  140. </raise>
  141. <raise scope="cd" event="start_instance">
  142. <parameter expr="association_name" />
  143. </raise>
  144. </transition>
  145. </state>
  146. <state id="running">
  147. <transition event="button_pressed" target="." cond="event_name == 'create_window'">
  148. <parameter name="event_name" type="string" />
  149. <raise event="create_window" scope="narrow" target="'parent'" />
  150. </transition>
  151. <transition event="close_window" port="window_ui_in" target=".">
  152. <raise event="stop" scope="local" />
  153. </transition>
  154. <transition event="create_ball" port="window_ui_in" target="../creating_ball">
  155. <parameter name="x" />
  156. <parameter name="y" />
  157. <raise scope="cd" event="create_instance">
  158. <parameter expr='"balls"' />
  159. <parameter expr='"Ball"' />
  160. <parameter expr="x" />
  161. <parameter expr="y" />
  162. <parameter expr="self.width" />
  163. <parameter expr="self.height" />
  164. </raise>
  165. </transition>
  166. <transition event="delete_ball" target=".">
  167. <parameter name="association_name" type="string" />
  168. <raise event="delete_instance" scope="cd">
  169. <parameter expr="association_name" />
  170. </raise>
  171. <raise event="delete_ball" port="window_ui_out">
  172. <parameter expr="association_name" />
  173. </raise>
  174. </transition>
  175. </state>
  176. <state id="creating_ball">
  177. <transition event="instance_created" target="../running">
  178. <parameter name="association_name" type="string"/>
  179. <raise event="create_new_ball" port="window_ui_out">
  180. <parameter expr="association_name" />
  181. <parameter expr="self.getSingleChild(association_name)" />
  182. </raise>
  183. <raise event="start_instance" scope="cd">
  184. <parameter expr="association_name" />
  185. </raise>
  186. <raise event="set_association_name" scope="narrow" target="association_name">
  187. <parameter expr="association_name" />
  188. </raise>
  189. </transition>
  190. </state>
  191. </state>
  192. <state id="size_change_listener" initial="listening">
  193. <state id="listening">
  194. <transition target="." event="size_changed" port="window_ui_in">
  195. <parameter name="new_width" />
  196. <parameter name="new_height" />
  197. <script>
  198. self.width = new_width
  199. self.height = new_height
  200. </script>
  201. <raise event="window_size_changed" scope="narrow" target="'balls'">
  202. <parameter expr="new_width" />
  203. <parameter expr="new_height" />
  204. </raise>
  205. </transition>
  206. </state>
  207. </state>
  208. <state id="delete_listener" initial="listening">
  209. <state id="listening">
  210. <transition event="delete" target="." port="window_ui_in">
  211. <raise event="delete" target="'balls'" />
  212. </transition>
  213. </state>
  214. </state>
  215. <transition event="stop" target="../stopped">
  216. <raise event="delete_instance" scope="cd">
  217. <parameter expr="'buttons'" />
  218. </raise>
  219. <raise event="delete_instance" scope="cd">
  220. <parameter expr="'balls'" />
  221. </raise>
  222. </transition>
  223. </parallel>
  224. <state id="stopped">
  225. <onentry>
  226. <raise event="delete_window" scope="narrow" target="'parent'">
  227. <parameter expr="self.association_name" />
  228. </raise>
  229. </onentry>
  230. </state>
  231. </scxml>
  232. </class>
  233. <class name="Button">
  234. <inport name="button_ui_in" />
  235. <outport name="button_ui_out" />
  236. <relationships>
  237. <association name="parent" class="Field" min="1" max="1" />
  238. </relationships>
  239. <constructor>
  240. <parameter name="event_name" type="str" />
  241. <body>
  242. self.event_name = event_name
  243. </body>
  244. </constructor>
  245. <scxml initial="waiting">
  246. <state id="waiting">
  247. <transition event="ui_initialized" target="../running" port="button_ui_in">
  248. <raise event="set_text" port="button_ui_out">
  249. <parameter expr="self.event_name" />
  250. </raise>
  251. </transition>
  252. </state>
  253. <state id="running">
  254. <transition event="clicked" port="button_ui_in" target=".">
  255. <raise event="button_pressed" scope="narrow" target="'parent'">
  256. <parameter expr="self.event_name" />
  257. </raise>
  258. </transition>
  259. </state>
  260. </scxml>
  261. </class>
  262. <class name="Ball">
  263. <inport name="ball_ui_in" />
  264. <outport name="ball_ui_out" />
  265. <relationships>
  266. <association name="parent" class="Window" min="1" max="1" />
  267. </relationships>
  268. <constructor>
  269. <parameter name="x" />
  270. <parameter name="y" />
  271. <parameter name="window_width" />
  272. <parameter name="window_height" />
  273. <body>
  274. self.x = x
  275. self.y = y
  276. self.window_width = window_width
  277. self.window_height = window_height
  278. self.r = 20.0;
  279. self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
  280. self.smooth = 0.4 # value between 0 and 1
  281. </body>
  282. </constructor>
  283. <scxml initial="main">
  284. <parallel id="main">
  285. <state id="main_behaviour" initial="initializing">
  286. <state id="initializing">
  287. <transition event="set_association_name" target="../waiting_for_ui">
  288. <parameter name="association_name" type="str" />
  289. <script>
  290. self.association_name = association_name
  291. </script>
  292. </transition>
  293. </state>
  294. <state id="waiting_for_ui">
  295. <transition event="ui_initialized" target="../bouncing" port="ball_ui_in">
  296. <raise event="set_initial_params" port="ball_ui_out">
  297. <parameter expr="self.x" />
  298. <parameter expr="self.y" />
  299. <parameter expr="self.r" />
  300. </raise>
  301. </transition>
  302. </state>
  303. <state id="bouncing">
  304. <transition after="(20 - self.getSimulatedTime() % 20) / 1000.0" target=".">
  305. <script>
  306. <![CDATA[
  307. if self.x <= 0 or self.x + (self.r * 2) >= self.window_width:
  308. self.vel['x'] = -self.vel['x']
  309. if self.y <= 0 or self.y + (self.r * 2) >= self.window_height:
  310. self.vel['y'] = -self.vel['y']
  311. self.x += self.vel['x']
  312. self.y += self.vel['y']
  313. ]]>
  314. </script>
  315. <raise event="change_position" port="ball_ui_out">
  316. <parameter expr="self.x" />
  317. <parameter expr="self.y" />
  318. </raise>
  319. </transition>
  320. <transition port="ball_ui_in" event="select_ball" target="../selected">
  321. <raise event="change_color" port="ball_ui_out">
  322. <parameter expr="'yellow'" />
  323. </raise>
  324. </transition>
  325. </state>
  326. <state id="dragging">
  327. <transition port="ball_ui_in" event="motion" target=".">
  328. <parameter name="dx" />
  329. <parameter name="dy" />
  330. <script>
  331. <![CDATA[
  332. self.x += dx
  333. self.y += dy
  334. if self.x - self.r <= 0:
  335. self.x = 1;
  336. elif self.x + self.r >= self.window_width:
  337. self.x = self.window_width - (2 * self.r) - 1
  338. if self.y - self.r <= 0:
  339. self.y = 1
  340. elif self.y + self.r >= self.window_height:
  341. self.y = self.window_height - (2 * self.r) - 1;
  342. self.vel = {
  343. 'x': (1 - self.smooth) * dx + self.smooth * self.vel['x'],
  344. 'y': (1 - self.smooth) * dy + self.smooth * self.vel['y']
  345. }
  346. ]]>
  347. </script>
  348. <raise event="change_position" port="ball_ui_out">
  349. <parameter expr="self.x" />
  350. <parameter expr="self.y" />
  351. </raise>
  352. </transition>
  353. <transition port="ball_ui_in" event="unselect_ball" target="../bouncing">
  354. <raise event="change_color" port="ball_ui_out">
  355. <parameter expr="'red'" />
  356. </raise>
  357. </transition>
  358. </state>
  359. <state id="selected">
  360. <transition port="ball_ui_in" event="select_ball" target="../dragging" />
  361. <transition event="delete" target=".">
  362. <raise event="delete_ball" scope="narrow" target="'parent'">
  363. <parameter expr="self.association_name" />
  364. </raise>
  365. <raise event="delete_local" />
  366. </transition>
  367. </state>
  368. </state>
  369. <state id="size_change_listener" initial="listening">
  370. <state id="listening">
  371. <transition target="." event="window_size_changed">
  372. <parameter name="new_width" />
  373. <parameter name="new_height" />
  374. <script>
  375. self.window_width = new_width
  376. self.window_height = new_height
  377. </script>
  378. </transition>
  379. </state>
  380. </state>
  381. <transition target="../deleted" event="delete_local" />
  382. </parallel>
  383. <state id="deleted" />
  384. </scxml>
  385. </class>
  386. </diagram>