bouncing_balls.py 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316
  1. # Statechart compiler by Glenn De Jonghe
  2. #
  3. # Date: Mon Aug 17 14:45:55 2015
  4. # Model author: Simon Van Mierlo+Joeri Exelmans+Raphael Mannadiar
  5. # Model name: Bouncing_Balls
  6. # Model description:
  7. """
  8. Tkinter frame with bouncing balls in it.
  9. """
  10. from python_runtime.statecharts_core import ObjectManagerBase, Event, InstanceWrapper, RuntimeClassBase, Association
  11. from python_runtime.libs.ui import *
  12. from python_runtime.libs.utils import *
  13. class Button(RuntimeClassBase):
  14. # Unique IDs for all statechart nodes
  15. Root = 0
  16. Root_initializing = 1
  17. Root_running = 2
  18. def commonConstructor(self, controller = None):
  19. """Constructor part that is common for all constructors."""
  20. RuntimeClassBase.__init__(self)
  21. # User defined input ports
  22. self.inports = {}
  23. self.controller = controller
  24. self.object_manager = controller.getObjectManager()
  25. self.current_state = {}
  26. self.history_state = {}
  27. #Initialize statechart :
  28. self.current_state[self.Root] = []
  29. def start(self):
  30. super(Button, self).start()
  31. self.enter_Root_initializing()
  32. #The actual constructor
  33. def __init__(self, controller, parent, event_name, button_text):
  34. self.commonConstructor(controller)
  35. #constructor body (user-defined)
  36. self.event_name = event_name
  37. button = ui.append_button(parent.field_window, event_name)
  38. ui.bind_event(button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'mouse_click')
  39. # Statechart enter/exit action method(s) :
  40. def enter_Root_initializing(self):
  41. self.current_state[self.Root].append(self.Root_initializing)
  42. def exit_Root_initializing(self):
  43. self.current_state[self.Root] = []
  44. def enter_Root_running(self):
  45. self.current_state[self.Root].append(self.Root_running)
  46. def exit_Root_running(self):
  47. self.current_state[self.Root] = []
  48. #Statechart transitions :
  49. def transition_Root(self, event) :
  50. catched = False
  51. if not catched :
  52. if self.current_state[self.Root][0] == self.Root_initializing:
  53. catched = self.transition_Root_initializing(event)
  54. elif self.current_state[self.Root][0] == self.Root_running:
  55. catched = self.transition_Root_running(event)
  56. return catched
  57. def transition_Root_initializing(self, event) :
  58. catched = False
  59. enableds = []
  60. enableds.append(1)
  61. if len(enableds) > 1 :
  62. print "Runtime warning : indeterminism detected in a transition from node Root_initializing. Only the first in document order enabled transition is executed."
  63. if len(enableds) > 0 :
  64. enabled = enableds[0]
  65. if enabled == 1 :
  66. self.exit_Root_initializing()
  67. send_event = Event("button_created", parameters = [])
  68. self.object_manager.addEvent(Event("narrow_cast", parameters = [self, 'parent' , send_event]))
  69. self.enter_Root_running()
  70. catched = True
  71. return catched
  72. def transition_Root_running(self, event) :
  73. catched = False
  74. enableds = []
  75. if event.name == "mouse_click" and event.getPort() == "ui" :
  76. parameters = event.getParameters()
  77. x = parameters[0]
  78. y = parameters[1]
  79. button = parameters[2]
  80. if button == ui.MOUSE_BUTTONS.LEFT :
  81. enableds.append(1)
  82. if len(enableds) > 1 :
  83. print "Runtime warning : indeterminism detected in a transition from node Root_running. Only the first in document order enabled transition is executed."
  84. if len(enableds) > 0 :
  85. enabled = enableds[0]
  86. if enabled == 1 :
  87. parameters = event.getParameters()
  88. x = parameters[0]
  89. y = parameters[1]
  90. button = parameters[2]
  91. self.exit_Root_running()
  92. send_event = Event("button_pressed", parameters = [self.event_name])
  93. self.object_manager.addEvent(Event("narrow_cast", parameters = [self, 'parent' , send_event]))
  94. self.enter_Root_running()
  95. catched = True
  96. return catched
  97. # Execute transitions
  98. def transition(self, event = Event("")):
  99. self.state_changed = self.transition_Root(event)
  100. # inState method for statechart
  101. def inState(self, nodes):
  102. for actives in self.current_state.itervalues():
  103. nodes = [node for node in nodes if node not in actives]
  104. if not nodes :
  105. return True
  106. return False
  107. class Field(RuntimeClassBase):
  108. # Unique IDs for all statechart nodes
  109. Root = 0
  110. Root_root = 1
  111. Root_root_running = 2
  112. Root_root_running_main_behaviour = 3
  113. Root_root_running_deleting_behaviour = 4
  114. Root_root_running_child_behaviour = 5
  115. Root_root_waiting = 6
  116. Root_root_packing = 7
  117. Root_root_deleting = 8
  118. Root_root_creating = 9
  119. Root_root_initializing = 10
  120. Root_root_deleted = 11
  121. Root_root_running_main_behaviour_running = 12
  122. Root_root_running_main_behaviour_creating = 13
  123. Root_root_running_deleting_behaviour_running = 14
  124. Root_root_running_child_behaviour_listening = 15
  125. def commonConstructor(self, controller = None):
  126. """Constructor part that is common for all constructors."""
  127. RuntimeClassBase.__init__(self)
  128. # User defined input ports
  129. self.inports = {}
  130. self.inports["field_ui"] = controller.addInputPort("field_ui", self)
  131. # User defined attributes
  132. self.field_window = None
  133. self.canvas = None
  134. self.controller = controller
  135. self.object_manager = controller.getObjectManager()
  136. self.current_state = {}
  137. self.history_state = {}
  138. self.timers = {}
  139. #Initialize statechart :
  140. self.current_state[self.Root] = []
  141. self.current_state[self.Root_root] = []
  142. self.current_state[self.Root_root_running] = []
  143. self.current_state[self.Root_root_running_main_behaviour] = []
  144. self.current_state[self.Root_root_running_deleting_behaviour] = []
  145. self.current_state[self.Root_root_running_child_behaviour] = []
  146. def start(self):
  147. super(Field, self).start()
  148. self.enterDefault_Root_root()
  149. #The actual constructor
  150. def __init__(self, controller):
  151. self.commonConstructor(controller)
  152. #constructor body (user-defined)
  153. self.field_window = ui.new_window(400, 450)
  154. self.canvas = ui.append_canvas(self.field_window, 400, 400, {'background':'#eee'})
  155. ui.bind_event(self.field_window, ui.EVENTS.WINDOW_CLOSE, self.controller, 'window_close')
  156. ui.bind_event(self.field_window, ui.EVENTS.KEY_PRESS, self.controller, 'key_press')
  157. ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RIGHT_CLICK, self.controller, 'right_click', self.inports['field_ui'])
  158. ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move')
  159. ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release')
  160. # User defined destructor
  161. def __del__(self):
  162. ui.close_window(self.field_window)
  163. # Statechart enter/exit action method(s) :
  164. def enter_Root_root(self):
  165. self.current_state[self.Root].append(self.Root_root)
  166. def exit_Root_root(self):
  167. if self.Root_root_waiting in self.current_state[self.Root_root] :
  168. self.exit_Root_root_waiting()
  169. if self.Root_root_packing in self.current_state[self.Root_root] :
  170. self.exit_Root_root_packing()
  171. if self.Root_root_deleting in self.current_state[self.Root_root] :
  172. self.exit_Root_root_deleting()
  173. if self.Root_root_creating in self.current_state[self.Root_root] :
  174. self.exit_Root_root_creating()
  175. if self.Root_root_initializing in self.current_state[self.Root_root] :
  176. self.exit_Root_root_initializing()
  177. if self.Root_root_deleted in self.current_state[self.Root_root] :
  178. self.exit_Root_root_deleted()
  179. if self.Root_root_running in self.current_state[self.Root_root] :
  180. self.exit_Root_root_running()
  181. self.current_state[self.Root] = []
  182. def enter_Root_root_running(self):
  183. self.current_state[self.Root_root].append(self.Root_root_running)
  184. def exit_Root_root_running(self):
  185. self.exit_Root_root_running_main_behaviour()
  186. self.exit_Root_root_running_deleting_behaviour()
  187. self.exit_Root_root_running_child_behaviour()
  188. self.current_state[self.Root_root] = []
  189. def enter_Root_root_running_main_behaviour(self):
  190. self.current_state[self.Root_root_running].append(self.Root_root_running_main_behaviour)
  191. def exit_Root_root_running_main_behaviour(self):
  192. if self.Root_root_running_main_behaviour_running in self.current_state[self.Root_root_running_main_behaviour] :
  193. self.exit_Root_root_running_main_behaviour_running()
  194. if self.Root_root_running_main_behaviour_creating in self.current_state[self.Root_root_running_main_behaviour] :
  195. self.exit_Root_root_running_main_behaviour_creating()
  196. self.current_state[self.Root_root_running] = []
  197. def enter_Root_root_running_deleting_behaviour(self):
  198. self.current_state[self.Root_root_running].append(self.Root_root_running_deleting_behaviour)
  199. def exit_Root_root_running_deleting_behaviour(self):
  200. if self.Root_root_running_deleting_behaviour_running in self.current_state[self.Root_root_running_deleting_behaviour] :
  201. self.exit_Root_root_running_deleting_behaviour_running()
  202. self.current_state[self.Root_root_running] = []
  203. def enter_Root_root_running_child_behaviour(self):
  204. self.current_state[self.Root_root_running].append(self.Root_root_running_child_behaviour)
  205. def exit_Root_root_running_child_behaviour(self):
  206. if self.Root_root_running_child_behaviour_listening in self.current_state[self.Root_root_running_child_behaviour] :
  207. self.exit_Root_root_running_child_behaviour_listening()
  208. self.current_state[self.Root_root_running] = []
  209. def enter_Root_root_waiting(self):
  210. self.current_state[self.Root_root].append(self.Root_root_waiting)
  211. def exit_Root_root_waiting(self):
  212. self.current_state[self.Root_root] = []
  213. def enter_Root_root_packing(self):
  214. self.current_state[self.Root_root].append(self.Root_root_packing)
  215. def exit_Root_root_packing(self):
  216. self.current_state[self.Root_root] = []
  217. def enter_Root_root_deleting(self):
  218. self.timers[0] = 0.05
  219. self.current_state[self.Root_root].append(self.Root_root_deleting)
  220. def exit_Root_root_deleting(self):
  221. self.timers.pop(0, None)
  222. self.current_state[self.Root_root] = []
  223. def enter_Root_root_creating(self):
  224. self.current_state[self.Root_root].append(self.Root_root_creating)
  225. def exit_Root_root_creating(self):
  226. self.current_state[self.Root_root] = []
  227. def enter_Root_root_initializing(self):
  228. self.current_state[self.Root_root].append(self.Root_root_initializing)
  229. def exit_Root_root_initializing(self):
  230. self.current_state[self.Root_root] = []
  231. def enter_Root_root_deleted(self):
  232. self.current_state[self.Root_root].append(self.Root_root_deleted)
  233. def exit_Root_root_deleted(self):
  234. self.current_state[self.Root_root] = []
  235. def enter_Root_root_running_main_behaviour_running(self):
  236. self.current_state[self.Root_root_running_main_behaviour].append(self.Root_root_running_main_behaviour_running)
  237. def exit_Root_root_running_main_behaviour_running(self):
  238. self.current_state[self.Root_root_running_main_behaviour] = []
  239. def enter_Root_root_running_main_behaviour_creating(self):
  240. self.current_state[self.Root_root_running_main_behaviour].append(self.Root_root_running_main_behaviour_creating)
  241. def exit_Root_root_running_main_behaviour_creating(self):
  242. self.current_state[self.Root_root_running_main_behaviour] = []
  243. def enter_Root_root_running_deleting_behaviour_running(self):
  244. self.current_state[self.Root_root_running_deleting_behaviour].append(self.Root_root_running_deleting_behaviour_running)
  245. def exit_Root_root_running_deleting_behaviour_running(self):
  246. self.current_state[self.Root_root_running_deleting_behaviour] = []
  247. def enter_Root_root_running_child_behaviour_listening(self):
  248. self.current_state[self.Root_root_running_child_behaviour].append(self.Root_root_running_child_behaviour_listening)
  249. def exit_Root_root_running_child_behaviour_listening(self):
  250. self.current_state[self.Root_root_running_child_behaviour] = []
  251. #Statechart enter/exit default method(s) :
  252. def enterDefault_Root_root(self):
  253. self.enter_Root_root()
  254. self.enter_Root_root_waiting()
  255. def enterDefault_Root_root_running(self):
  256. self.enter_Root_root_running()
  257. self.enterDefault_Root_root_running_main_behaviour()
  258. self.enterDefault_Root_root_running_deleting_behaviour()
  259. self.enterDefault_Root_root_running_child_behaviour()
  260. def enterDefault_Root_root_running_main_behaviour(self):
  261. self.enter_Root_root_running_main_behaviour()
  262. self.enter_Root_root_running_main_behaviour_running()
  263. def enterDefault_Root_root_running_deleting_behaviour(self):
  264. self.enter_Root_root_running_deleting_behaviour()
  265. self.enter_Root_root_running_deleting_behaviour_running()
  266. def enterDefault_Root_root_running_child_behaviour(self):
  267. self.enter_Root_root_running_child_behaviour()
  268. self.enter_Root_root_running_child_behaviour_listening()
  269. #Statechart transitions :
  270. def transition_Root(self, event) :
  271. catched = False
  272. if not catched :
  273. if self.current_state[self.Root][0] == self.Root_root:
  274. catched = self.transition_Root_root(event)
  275. return catched
  276. def transition_Root_root(self, event) :
  277. catched = False
  278. if not catched :
  279. if self.current_state[self.Root_root][0] == self.Root_root_waiting:
  280. catched = self.transition_Root_root_waiting(event)
  281. elif self.current_state[self.Root_root][0] == self.Root_root_packing:
  282. catched = self.transition_Root_root_packing(event)
  283. elif self.current_state[self.Root_root][0] == self.Root_root_deleting:
  284. catched = self.transition_Root_root_deleting(event)
  285. elif self.current_state[self.Root_root][0] == self.Root_root_creating:
  286. catched = self.transition_Root_root_creating(event)
  287. elif self.current_state[self.Root_root][0] == self.Root_root_initializing:
  288. catched = self.transition_Root_root_initializing(event)
  289. elif self.current_state[self.Root_root][0] == self.Root_root_deleted:
  290. catched = self.transition_Root_root_deleted(event)
  291. elif self.current_state[self.Root_root][0] == self.Root_root_running:
  292. catched = self.transition_Root_root_running(event)
  293. return catched
  294. def transition_Root_root_waiting(self, event) :
  295. catched = False
  296. enableds = []
  297. if event.name == "set_association_name" and event.getPort() == "" :
  298. enableds.append(1)
  299. if len(enableds) > 1 :
  300. print "Runtime warning : indeterminism detected in a transition from node Root_root_waiting. Only the first in document order enabled transition is executed."
  301. if len(enableds) > 0 :
  302. enabled = enableds[0]
  303. if enabled == 1 :
  304. parameters = event.getParameters()
  305. association_name = parameters[0]
  306. self.exit_Root_root_waiting()
  307. self.association_name = association_name
  308. self.enter_Root_root_initializing()
  309. catched = True
  310. return catched
  311. def transition_Root_root_packing(self, event) :
  312. catched = False
  313. enableds = []
  314. if event.name == "button_created" and event.getPort() == "" :
  315. enableds.append(1)
  316. if len(enableds) > 1 :
  317. print "Runtime warning : indeterminism detected in a transition from node Root_root_packing. Only the first in document order enabled transition is executed."
  318. if len(enableds) > 0 :
  319. enabled = enableds[0]
  320. if enabled == 1 :
  321. self.exit_Root_root_packing()
  322. self.enterDefault_Root_root_running()
  323. catched = True
  324. return catched
  325. def transition_Root_root_deleting(self, event) :
  326. catched = False
  327. enableds = []
  328. if event.name == "_0after" and event.getPort() == "" :
  329. enableds.append(1)
  330. if len(enableds) > 1 :
  331. print "Runtime warning : indeterminism detected in a transition from node Root_root_deleting. Only the first in document order enabled transition is executed."
  332. if len(enableds) > 0 :
  333. enabled = enableds[0]
  334. if enabled == 1 :
  335. self.exit_Root_root_deleting()
  336. send_event = Event("delete_field", parameters = [self.association_name])
  337. self.object_manager.addEvent(Event("narrow_cast", parameters = [self, 'parent' , send_event]))
  338. self.enter_Root_root_deleted()
  339. catched = True
  340. return catched
  341. def transition_Root_root_creating(self, event) :
  342. catched = False
  343. enableds = []
  344. if event.name == "instance_created" and event.getPort() == "" :
  345. enableds.append(1)
  346. if len(enableds) > 1 :
  347. print "Runtime warning : indeterminism detected in a transition from node Root_root_creating. Only the first in document order enabled transition is executed."
  348. if len(enableds) > 0 :
  349. enabled = enableds[0]
  350. if enabled == 1 :
  351. parameters = event.getParameters()
  352. association_name = parameters[0]
  353. self.exit_Root_root_creating()
  354. self.object_manager.addEvent(Event("start_instance", parameters = [self, association_name]))
  355. self.enter_Root_root_packing()
  356. catched = True
  357. return catched
  358. def transition_Root_root_initializing(self, event) :
  359. catched = False
  360. enableds = []
  361. enableds.append(1)
  362. if len(enableds) > 1 :
  363. print "Runtime warning : indeterminism detected in a transition from node Root_root_initializing. Only the first in document order enabled transition is executed."
  364. if len(enableds) > 0 :
  365. enabled = enableds[0]
  366. if enabled == 1 :
  367. self.exit_Root_root_initializing()
  368. self.object_manager.addEvent(Event("create_instance", parameters = [self, 'buttons','Button',self,'create_new_field','Spawn New Window']))
  369. self.enter_Root_root_creating()
  370. catched = True
  371. return catched
  372. def transition_Root_root_deleted(self, event) :
  373. catched = False
  374. return catched
  375. def transition_Root_root_running(self, event) :
  376. catched = False
  377. enableds = []
  378. if event.name == "window_close" and event.getPort() == "ui" :
  379. parameters = event.getParameters()
  380. window = parameters[0]
  381. if window == self.field_window or window == ui.window :
  382. enableds.append(1)
  383. if len(enableds) > 1 :
  384. print "Runtime warning : indeterminism detected in a transition from node Root_root_running. Only the first in document order enabled transition is executed."
  385. if len(enableds) > 0 :
  386. enabled = enableds[0]
  387. if enabled == 1 :
  388. parameters = event.getParameters()
  389. window = parameters[0]
  390. self.exit_Root_root_running()
  391. self.object_manager.addEvent(Event("delete_instance", parameters = [self, 'buttons']))
  392. send_event = Event("delete_self", parameters = [])
  393. self.object_manager.addEvent(Event("narrow_cast", parameters = [self, 'balls' , send_event]))
  394. self.enter_Root_root_deleting()
  395. catched = True
  396. if not catched :
  397. catched = self.transition_Root_root_running_main_behaviour(event) or catched
  398. catched = self.transition_Root_root_running_deleting_behaviour(event) or catched
  399. catched = self.transition_Root_root_running_child_behaviour(event) or catched
  400. return catched
  401. def transition_Root_root_running_main_behaviour(self, event) :
  402. catched = False
  403. if not catched :
  404. if self.current_state[self.Root_root_running_main_behaviour][0] == self.Root_root_running_main_behaviour_running:
  405. catched = self.transition_Root_root_running_main_behaviour_running(event)
  406. elif self.current_state[self.Root_root_running_main_behaviour][0] == self.Root_root_running_main_behaviour_creating:
  407. catched = self.transition_Root_root_running_main_behaviour_creating(event)
  408. return catched
  409. def transition_Root_root_running_main_behaviour_running(self, event) :
  410. catched = False
  411. enableds = []
  412. if event.name == "right_click" and event.getPort() == "field_ui" :
  413. enableds.append(1)
  414. if len(enableds) > 1 :
  415. print "Runtime warning : indeterminism detected in a transition from node Root_root_running_main_behaviour_running. Only the first in document order enabled transition is executed."
  416. if len(enableds) > 0 :
  417. enabled = enableds[0]
  418. if enabled == 1 :
  419. parameters = event.getParameters()
  420. x = parameters[0]
  421. y = parameters[1]
  422. button = parameters[2]
  423. self.exit_Root_root_running_main_behaviour_running()
  424. self.object_manager.addEvent(Event("create_instance", parameters = [self, 'balls','Ball',self.canvas,x,y,self.field_window]))
  425. self.enter_Root_root_running_main_behaviour_creating()
  426. catched = True
  427. return catched
  428. def transition_Root_root_running_main_behaviour_creating(self, event) :
  429. catched = False
  430. enableds = []
  431. if event.name == "instance_created" and event.getPort() == "" :
  432. enableds.append(1)
  433. if len(enableds) > 1 :
  434. print "Runtime warning : indeterminism detected in a transition from node Root_root_running_main_behaviour_creating. Only the first in document order enabled transition is executed."
  435. if len(enableds) > 0 :
  436. enabled = enableds[0]
  437. if enabled == 1 :
  438. parameters = event.getParameters()
  439. association_name = parameters[0]
  440. self.exit_Root_root_running_main_behaviour_creating()
  441. send_event = Event("set_association_name", parameters = [association_name])
  442. self.object_manager.addEvent(Event("narrow_cast", parameters = [self, association_name , send_event]))
  443. self.object_manager.addEvent(Event("start_instance", parameters = [self, association_name]))
  444. self.enter_Root_root_running_main_behaviour_running()
  445. catched = True
  446. return catched
  447. def transition_Root_root_running_deleting_behaviour(self, event) :
  448. catched = False
  449. if not catched :
  450. if self.current_state[self.Root_root_running_deleting_behaviour][0] == self.Root_root_running_deleting_behaviour_running:
  451. catched = self.transition_Root_root_running_deleting_behaviour_running(event)
  452. return catched
  453. def transition_Root_root_running_deleting_behaviour_running(self, event) :
  454. catched = False
  455. enableds = []
  456. if event.name == "delete_ball" and event.getPort() == "" :
  457. enableds.append(1)
  458. if len(enableds) > 1 :
  459. print "Runtime warning : indeterminism detected in a transition from node Root_root_running_deleting_behaviour_running. Only the first in document order enabled transition is executed."
  460. if len(enableds) > 0 :
  461. enabled = enableds[0]
  462. if enabled == 1 :
  463. parameters = event.getParameters()
  464. association_name = parameters[0]
  465. self.exit_Root_root_running_deleting_behaviour_running()
  466. self.object_manager.addEvent(Event("delete_instance", parameters = [self, association_name]))
  467. self.enter_Root_root_running_deleting_behaviour_running()
  468. catched = True
  469. return catched
  470. def transition_Root_root_running_child_behaviour(self, event) :
  471. catched = False
  472. if not catched :
  473. if self.current_state[self.Root_root_running_child_behaviour][0] == self.Root_root_running_child_behaviour_listening:
  474. catched = self.transition_Root_root_running_child_behaviour_listening(event)
  475. return catched
  476. def transition_Root_root_running_child_behaviour_listening(self, event) :
  477. catched = False
  478. enableds = []
  479. if event.name == "button_pressed" and event.getPort() == "" :
  480. enableds.append(1)
  481. if len(enableds) > 1 :
  482. print "Runtime warning : indeterminism detected in a transition from node Root_root_running_child_behaviour_listening. Only the first in document order enabled transition is executed."
  483. if len(enableds) > 0 :
  484. enabled = enableds[0]
  485. if enabled == 1 :
  486. parameters = event.getParameters()
  487. event_name = parameters[0]
  488. self.exit_Root_root_running_child_behaviour_listening()
  489. send_event = Event("button_pressed", parameters = [event_name])
  490. self.object_manager.addEvent(Event("narrow_cast", parameters = [self, 'parent' , send_event]))
  491. self.enter_Root_root_running_child_behaviour_listening()
  492. catched = True
  493. return catched
  494. # Execute transitions
  495. def transition(self, event = Event("")):
  496. self.state_changed = self.transition_Root(event)
  497. # inState method for statechart
  498. def inState(self, nodes):
  499. for actives in self.current_state.itervalues():
  500. nodes = [node for node in nodes if node not in actives]
  501. if not nodes :
  502. return True
  503. return False
  504. class MainApp(RuntimeClassBase):
  505. # Unique IDs for all statechart nodes
  506. Root = 0
  507. Root_running = 1
  508. Root_running_root = 2
  509. Root_running_root_main_behaviour = 3
  510. Root_running_root_cd_behaviour = 4
  511. Root_running_stopped = 5
  512. Root_running_root_main_behaviour_initializing = 6
  513. Root_running_root_main_behaviour_running = 7
  514. Root_running_root_cd_behaviour_creating = 8
  515. Root_running_root_cd_behaviour_waiting = 9
  516. Root_running_root_cd_behaviour_check_nr_of_fields = 10
  517. def commonConstructor(self, controller = None):
  518. """Constructor part that is common for all constructors."""
  519. RuntimeClassBase.__init__(self)
  520. # User defined input ports
  521. self.inports = {}
  522. self.controller = controller
  523. self.object_manager = controller.getObjectManager()
  524. self.current_state = {}
  525. self.history_state = {}
  526. #Initialize statechart :
  527. self.current_state[self.Root] = []
  528. self.current_state[self.Root_running] = []
  529. self.current_state[self.Root_running_root] = []
  530. self.current_state[self.Root_running_root_main_behaviour] = []
  531. self.current_state[self.Root_running_root_cd_behaviour] = []
  532. def start(self):
  533. super(MainApp, self).start()
  534. self.enterDefault_Root_running()
  535. #The actual constructor
  536. def __init__(self, controller):
  537. self.commonConstructor(controller)
  538. #constructor body (user-defined)
  539. self.nr_of_fields = 0
  540. ui.bind_event(ui.window, ui.EVENTS.WINDOW_CLOSE, self.controller, 'window_close')
  541. # Statechart enter/exit action method(s) :
  542. def enter_Root_running(self):
  543. self.current_state[self.Root].append(self.Root_running)
  544. def exit_Root_running(self):
  545. if self.Root_running_stopped in self.current_state[self.Root_running] :
  546. self.exit_Root_running_stopped()
  547. if self.Root_running_root in self.current_state[self.Root_running] :
  548. self.exit_Root_running_root()
  549. self.current_state[self.Root] = []
  550. def enter_Root_running_root(self):
  551. self.current_state[self.Root_running].append(self.Root_running_root)
  552. def exit_Root_running_root(self):
  553. self.exit_Root_running_root_main_behaviour()
  554. self.exit_Root_running_root_cd_behaviour()
  555. self.current_state[self.Root_running] = []
  556. def enter_Root_running_root_main_behaviour(self):
  557. self.current_state[self.Root_running_root].append(self.Root_running_root_main_behaviour)
  558. def exit_Root_running_root_main_behaviour(self):
  559. if self.Root_running_root_main_behaviour_initializing in self.current_state[self.Root_running_root_main_behaviour] :
  560. self.exit_Root_running_root_main_behaviour_initializing()
  561. if self.Root_running_root_main_behaviour_running in self.current_state[self.Root_running_root_main_behaviour] :
  562. self.exit_Root_running_root_main_behaviour_running()
  563. self.current_state[self.Root_running_root] = []
  564. def enter_Root_running_root_cd_behaviour(self):
  565. self.current_state[self.Root_running_root].append(self.Root_running_root_cd_behaviour)
  566. def exit_Root_running_root_cd_behaviour(self):
  567. if self.Root_running_root_cd_behaviour_creating in self.current_state[self.Root_running_root_cd_behaviour] :
  568. self.exit_Root_running_root_cd_behaviour_creating()
  569. if self.Root_running_root_cd_behaviour_waiting in self.current_state[self.Root_running_root_cd_behaviour] :
  570. self.exit_Root_running_root_cd_behaviour_waiting()
  571. if self.Root_running_root_cd_behaviour_check_nr_of_fields in self.current_state[self.Root_running_root_cd_behaviour] :
  572. self.exit_Root_running_root_cd_behaviour_check_nr_of_fields()
  573. self.current_state[self.Root_running_root] = []
  574. def enter_Root_running_stopped(self):
  575. self.current_state[self.Root_running].append(self.Root_running_stopped)
  576. def exit_Root_running_stopped(self):
  577. self.current_state[self.Root_running] = []
  578. def enter_Root_running_root_main_behaviour_initializing(self):
  579. self.current_state[self.Root_running_root_main_behaviour].append(self.Root_running_root_main_behaviour_initializing)
  580. def exit_Root_running_root_main_behaviour_initializing(self):
  581. self.current_state[self.Root_running_root_main_behaviour] = []
  582. def enter_Root_running_root_main_behaviour_running(self):
  583. self.current_state[self.Root_running_root_main_behaviour].append(self.Root_running_root_main_behaviour_running)
  584. def exit_Root_running_root_main_behaviour_running(self):
  585. self.current_state[self.Root_running_root_main_behaviour] = []
  586. def enter_Root_running_root_cd_behaviour_creating(self):
  587. self.current_state[self.Root_running_root_cd_behaviour].append(self.Root_running_root_cd_behaviour_creating)
  588. def exit_Root_running_root_cd_behaviour_creating(self):
  589. self.current_state[self.Root_running_root_cd_behaviour] = []
  590. def enter_Root_running_root_cd_behaviour_waiting(self):
  591. self.current_state[self.Root_running_root_cd_behaviour].append(self.Root_running_root_cd_behaviour_waiting)
  592. def exit_Root_running_root_cd_behaviour_waiting(self):
  593. self.current_state[self.Root_running_root_cd_behaviour] = []
  594. def enter_Root_running_root_cd_behaviour_check_nr_of_fields(self):
  595. self.current_state[self.Root_running_root_cd_behaviour].append(self.Root_running_root_cd_behaviour_check_nr_of_fields)
  596. def exit_Root_running_root_cd_behaviour_check_nr_of_fields(self):
  597. self.current_state[self.Root_running_root_cd_behaviour] = []
  598. #Statechart enter/exit default method(s) :
  599. def enterDefault_Root_running(self):
  600. self.enter_Root_running()
  601. self.enterDefault_Root_running_root()
  602. def enterDefault_Root_running_root(self):
  603. self.enter_Root_running_root()
  604. self.enterDefault_Root_running_root_main_behaviour()
  605. self.enterDefault_Root_running_root_cd_behaviour()
  606. def enterDefault_Root_running_root_main_behaviour(self):
  607. self.enter_Root_running_root_main_behaviour()
  608. self.enter_Root_running_root_main_behaviour_initializing()
  609. def enterDefault_Root_running_root_cd_behaviour(self):
  610. self.enter_Root_running_root_cd_behaviour()
  611. self.enter_Root_running_root_cd_behaviour_waiting()
  612. #Statechart transitions :
  613. def transition_Root(self, event) :
  614. catched = False
  615. if not catched :
  616. if self.current_state[self.Root][0] == self.Root_running:
  617. catched = self.transition_Root_running(event)
  618. return catched
  619. def transition_Root_running(self, event) :
  620. catched = False
  621. if not catched :
  622. if self.current_state[self.Root_running][0] == self.Root_running_stopped:
  623. catched = self.transition_Root_running_stopped(event)
  624. elif self.current_state[self.Root_running][0] == self.Root_running_root:
  625. catched = self.transition_Root_running_root(event)
  626. return catched
  627. def transition_Root_running_stopped(self, event) :
  628. catched = False
  629. return catched
  630. def transition_Root_running_root(self, event) :
  631. catched = False
  632. if not catched :
  633. catched = self.transition_Root_running_root_main_behaviour(event) or catched
  634. catched = self.transition_Root_running_root_cd_behaviour(event) or catched
  635. return catched
  636. def transition_Root_running_root_main_behaviour(self, event) :
  637. catched = False
  638. if not catched :
  639. if self.current_state[self.Root_running_root_main_behaviour][0] == self.Root_running_root_main_behaviour_initializing:
  640. catched = self.transition_Root_running_root_main_behaviour_initializing(event)
  641. elif self.current_state[self.Root_running_root_main_behaviour][0] == self.Root_running_root_main_behaviour_running:
  642. catched = self.transition_Root_running_root_main_behaviour_running(event)
  643. return catched
  644. def transition_Root_running_root_main_behaviour_initializing(self, event) :
  645. catched = False
  646. enableds = []
  647. enableds.append(1)
  648. if len(enableds) > 1 :
  649. print "Runtime warning : indeterminism detected in a transition from node Root_running_root_main_behaviour_initializing. Only the first in document order enabled transition is executed."
  650. if len(enableds) > 0 :
  651. enabled = enableds[0]
  652. if enabled == 1 :
  653. self.exit_Root_running_root_main_behaviour_initializing()
  654. self.addEvent(Event("create_field", parameters = []))
  655. self.enter_Root_running_root_main_behaviour_running()
  656. catched = True
  657. return catched
  658. def transition_Root_running_root_main_behaviour_running(self, event) :
  659. catched = False
  660. enableds = []
  661. if event.name == "button_pressed" and event.getPort() == "" :
  662. parameters = event.getParameters()
  663. event_name = parameters[0]
  664. if event_name == 'create_new_field' :
  665. enableds.append(1)
  666. if len(enableds) > 1 :
  667. print "Runtime warning : indeterminism detected in a transition from node Root_running_root_main_behaviour_running. Only the first in document order enabled transition is executed."
  668. if len(enableds) > 0 :
  669. enabled = enableds[0]
  670. if enabled == 1 :
  671. parameters = event.getParameters()
  672. event_name = parameters[0]
  673. self.exit_Root_running_root_main_behaviour_running()
  674. self.addEvent(Event("create_field", parameters = []))
  675. self.enter_Root_running_root_main_behaviour_running()
  676. catched = True
  677. return catched
  678. def transition_Root_running_root_cd_behaviour(self, event) :
  679. catched = False
  680. if not catched :
  681. if self.current_state[self.Root_running_root_cd_behaviour][0] == self.Root_running_root_cd_behaviour_creating:
  682. catched = self.transition_Root_running_root_cd_behaviour_creating(event)
  683. elif self.current_state[self.Root_running_root_cd_behaviour][0] == self.Root_running_root_cd_behaviour_waiting:
  684. catched = self.transition_Root_running_root_cd_behaviour_waiting(event)
  685. elif self.current_state[self.Root_running_root_cd_behaviour][0] == self.Root_running_root_cd_behaviour_check_nr_of_fields:
  686. catched = self.transition_Root_running_root_cd_behaviour_check_nr_of_fields(event)
  687. return catched
  688. def transition_Root_running_root_cd_behaviour_creating(self, event) :
  689. catched = False
  690. enableds = []
  691. if event.name == "instance_created" and event.getPort() == "" :
  692. enableds.append(1)
  693. if len(enableds) > 1 :
  694. print "Runtime warning : indeterminism detected in a transition from node Root_running_root_cd_behaviour_creating. Only the first in document order enabled transition is executed."
  695. if len(enableds) > 0 :
  696. enabled = enableds[0]
  697. if enabled == 1 :
  698. parameters = event.getParameters()
  699. association_name = parameters[0]
  700. self.exit_Root_running_root_cd_behaviour_creating()
  701. self.object_manager.addEvent(Event("start_instance", parameters = [self, association_name]))
  702. send_event = Event("set_association_name", parameters = [association_name])
  703. self.object_manager.addEvent(Event("narrow_cast", parameters = [self, association_name , send_event]))
  704. self.nr_of_fields += 1
  705. self.enter_Root_running_root_cd_behaviour_waiting()
  706. catched = True
  707. return catched
  708. def transition_Root_running_root_cd_behaviour_waiting(self, event) :
  709. catched = False
  710. enableds = []
  711. if event.name == "create_field" and event.getPort() == "" :
  712. enableds.append(1)
  713. if event.name == "delete_field" and event.getPort() == "" :
  714. enableds.append(2)
  715. if len(enableds) > 1 :
  716. print "Runtime warning : indeterminism detected in a transition from node Root_running_root_cd_behaviour_waiting. Only the first in document order enabled transition is executed."
  717. if len(enableds) > 0 :
  718. enabled = enableds[0]
  719. if enabled == 1 :
  720. self.exit_Root_running_root_cd_behaviour_waiting()
  721. self.object_manager.addEvent(Event("create_instance", parameters = [self, 'fields']))
  722. self.enter_Root_running_root_cd_behaviour_creating()
  723. elif enabled == 2 :
  724. parameters = event.getParameters()
  725. association_name = parameters[0]
  726. self.exit_Root_running_root_cd_behaviour_waiting()
  727. self.object_manager.addEvent(Event("delete_instance", parameters = [self, association_name]))
  728. self.nr_of_fields -= 1
  729. self.enter_Root_running_root_cd_behaviour_check_nr_of_fields()
  730. catched = True
  731. return catched
  732. def transition_Root_running_root_cd_behaviour_check_nr_of_fields(self, event) :
  733. catched = False
  734. enableds = []
  735. if self.nr_of_fields != 0 :
  736. enableds.append(1)
  737. if self.nr_of_fields == 0 :
  738. enableds.append(2)
  739. if len(enableds) > 1 :
  740. print "Runtime warning : indeterminism detected in a transition from node Root_running_root_cd_behaviour_check_nr_of_fields. Only the first in document order enabled transition is executed."
  741. if len(enableds) > 0 :
  742. enabled = enableds[0]
  743. if enabled == 1 :
  744. self.exit_Root_running_root_cd_behaviour_check_nr_of_fields()
  745. self.enter_Root_running_root_cd_behaviour_waiting()
  746. elif enabled == 2 :
  747. self.exit_Root_running_root()
  748. ui.close_window(ui.window)
  749. self.enter_Root_running_stopped()
  750. catched = True
  751. return catched
  752. # Execute transitions
  753. def transition(self, event = Event("")):
  754. self.state_changed = self.transition_Root(event)
  755. # inState method for statechart
  756. def inState(self, nodes):
  757. for actives in self.current_state.itervalues():
  758. nodes = [node for node in nodes if node not in actives]
  759. if not nodes :
  760. return True
  761. return False
  762. class Ball(RuntimeClassBase):
  763. # Unique IDs for all statechart nodes
  764. Root = 0
  765. Root_main_behaviour = 1
  766. Root_main_behaviour_dragging = 2
  767. Root_main_behaviour_selected = 3
  768. Root_main_behaviour_initializing = 4
  769. Root_main_behaviour_bouncing = 5
  770. Root_deleted = 6
  771. def commonConstructor(self, controller = None):
  772. """Constructor part that is common for all constructors."""
  773. RuntimeClassBase.__init__(self)
  774. # User defined input ports
  775. self.inports = {}
  776. self.inports["ball_ui"] = controller.addInputPort("ball_ui", self)
  777. # User defined attributes
  778. self.field_window = None
  779. self.canvas = None
  780. self.element = None
  781. self.controller = controller
  782. self.object_manager = controller.getObjectManager()
  783. self.current_state = {}
  784. self.history_state = {}
  785. self.timers = {}
  786. #Initialize statechart :
  787. self.current_state[self.Root] = []
  788. self.current_state[self.Root_main_behaviour] = []
  789. def start(self):
  790. super(Ball, self).start()
  791. self.enterDefault_Root_main_behaviour()
  792. #The actual constructor
  793. def __init__(self, controller, canvas, x, y, field_window):
  794. self.commonConstructor(controller)
  795. #constructor body (user-defined)
  796. self.canvas = canvas
  797. self.field_window = field_window
  798. self.r = 20.0
  799. self.vel = {'x':utils.random() * 2.0 - 1.0, 'y':utils.random() * 2.0 - 1.0}
  800. self.mouse_pos = {'':''}
  801. self.smooth = 0.4
  802. circle = self.canvas.add_circle(x, y, self.r, {'fill':'#000'})
  803. ui.bind_event(circle, ui.EVENTS.MOUSE_PRESS, self.controller, 'mouse_press', self.inports['ball_ui'])
  804. ui.bind_event(circle, ui.EVENTS.MOUSE_RIGHT_CLICK, self.controller, 'right_click')
  805. self.element = circle
  806. # User defined destructor
  807. def __del__(self):
  808. self.canvas.remove_element(self.element)
  809. # Statechart enter/exit action method(s) :
  810. def enter_Root_main_behaviour(self):
  811. self.current_state[self.Root].append(self.Root_main_behaviour)
  812. def exit_Root_main_behaviour(self):
  813. if self.Root_main_behaviour_dragging in self.current_state[self.Root_main_behaviour] :
  814. self.exit_Root_main_behaviour_dragging()
  815. if self.Root_main_behaviour_selected in self.current_state[self.Root_main_behaviour] :
  816. self.exit_Root_main_behaviour_selected()
  817. if self.Root_main_behaviour_initializing in self.current_state[self.Root_main_behaviour] :
  818. self.exit_Root_main_behaviour_initializing()
  819. if self.Root_main_behaviour_bouncing in self.current_state[self.Root_main_behaviour] :
  820. self.exit_Root_main_behaviour_bouncing()
  821. self.current_state[self.Root] = []
  822. def enter_Root_main_behaviour_dragging(self):
  823. self.current_state[self.Root_main_behaviour].append(self.Root_main_behaviour_dragging)
  824. def exit_Root_main_behaviour_dragging(self):
  825. self.current_state[self.Root_main_behaviour] = []
  826. def enter_Root_main_behaviour_selected(self):
  827. self.current_state[self.Root_main_behaviour].append(self.Root_main_behaviour_selected)
  828. def exit_Root_main_behaviour_selected(self):
  829. self.current_state[self.Root_main_behaviour] = []
  830. def enter_Root_main_behaviour_initializing(self):
  831. self.current_state[self.Root_main_behaviour].append(self.Root_main_behaviour_initializing)
  832. def exit_Root_main_behaviour_initializing(self):
  833. self.current_state[self.Root_main_behaviour] = []
  834. def enter_Root_main_behaviour_bouncing(self):
  835. self.timers[0] = 0.01
  836. self.current_state[self.Root_main_behaviour].append(self.Root_main_behaviour_bouncing)
  837. def exit_Root_main_behaviour_bouncing(self):
  838. self.timers.pop(0, None)
  839. self.current_state[self.Root_main_behaviour] = []
  840. def enter_Root_deleted(self):
  841. self.current_state[self.Root].append(self.Root_deleted)
  842. def exit_Root_deleted(self):
  843. self.current_state[self.Root] = []
  844. #Statechart enter/exit default method(s) :
  845. def enterDefault_Root_main_behaviour(self):
  846. self.enter_Root_main_behaviour()
  847. self.enter_Root_main_behaviour_initializing()
  848. #Statechart transitions :
  849. def transition_Root(self, event) :
  850. catched = False
  851. if not catched :
  852. if self.current_state[self.Root][0] == self.Root_main_behaviour:
  853. catched = self.transition_Root_main_behaviour(event)
  854. elif self.current_state[self.Root][0] == self.Root_deleted:
  855. catched = self.transition_Root_deleted(event)
  856. return catched
  857. def transition_Root_main_behaviour(self, event) :
  858. catched = False
  859. enableds = []
  860. if event.name == "delete_self" and event.getPort() == "" :
  861. enableds.append(1)
  862. if len(enableds) > 1 :
  863. print "Runtime warning : indeterminism detected in a transition from node Root_main_behaviour. Only the first in document order enabled transition is executed."
  864. if len(enableds) > 0 :
  865. enabled = enableds[0]
  866. if enabled == 1 :
  867. self.exit_Root_main_behaviour()
  868. send_event = Event("delete_ball", parameters = [self.association_name])
  869. self.object_manager.addEvent(Event("narrow_cast", parameters = [self, 'parent' , send_event]))
  870. self.enter_Root_deleted()
  871. catched = True
  872. if not catched :
  873. if self.current_state[self.Root_main_behaviour][0] == self.Root_main_behaviour_dragging:
  874. catched = self.transition_Root_main_behaviour_dragging(event)
  875. elif self.current_state[self.Root_main_behaviour][0] == self.Root_main_behaviour_selected:
  876. catched = self.transition_Root_main_behaviour_selected(event)
  877. elif self.current_state[self.Root_main_behaviour][0] == self.Root_main_behaviour_initializing:
  878. catched = self.transition_Root_main_behaviour_initializing(event)
  879. elif self.current_state[self.Root_main_behaviour][0] == self.Root_main_behaviour_bouncing:
  880. catched = self.transition_Root_main_behaviour_bouncing(event)
  881. return catched
  882. def transition_Root_main_behaviour_dragging(self, event) :
  883. catched = False
  884. enableds = []
  885. if event.name == "mouse_release" and event.getPort() == "ui" :
  886. enableds.append(1)
  887. if event.name == "mouse_move" and event.getPort() == "ui" :
  888. enableds.append(2)
  889. if len(enableds) > 1 :
  890. print "Runtime warning : indeterminism detected in a transition from node Root_main_behaviour_dragging. Only the first in document order enabled transition is executed."
  891. if len(enableds) > 0 :
  892. enabled = enableds[0]
  893. if enabled == 1 :
  894. parameters = event.getParameters()
  895. x = parameters[0]
  896. y = parameters[1]
  897. self.exit_Root_main_behaviour_dragging()
  898. self.element.set_color('#f00')
  899. self.enter_Root_main_behaviour_bouncing()
  900. elif enabled == 2 :
  901. parameters = event.getParameters()
  902. x = parameters[0]
  903. y = parameters[1]
  904. button = parameters[2]
  905. self.exit_Root_main_behaviour_dragging()
  906. dx = x - self.mouse_pos['x']
  907. dy = y - self.mouse_pos['y']
  908. self.element.move(dx, dy)
  909. pos = self.element.get_position()
  910. if pos.x - self.r <= 0:
  911. pos.x = self.r + 1
  912. else:
  913. if pos.x + self.r >= self.canvas.width:
  914. pos.x = self.canvas.width - self.r - 1
  915. if pos.y - self.r <= 0:
  916. pos.y = self.r + 1
  917. else:
  918. if pos.y + self.r >= self.canvas.height:
  919. pos.y = self.canvas.height - self.r - 1
  920. self.element.set_position(pos.x, pos.y)
  921. self.mouse_pos = {'x':x, 'y':y}
  922. self.vel = {'x':(1 - self.smooth) * dx + self.smooth * self.vel['x'], 'y':(1 - self.smooth) * dy + self.smooth * self.vel['y']}
  923. self.enter_Root_main_behaviour_dragging()
  924. catched = True
  925. return catched
  926. def transition_Root_main_behaviour_selected(self, event) :
  927. catched = False
  928. enableds = []
  929. if event.name == "mouse_press" and event.getPort() == "ball_ui" :
  930. parameters = event.getParameters()
  931. x = parameters[0]
  932. y = parameters[1]
  933. button = parameters[2]
  934. if button == ui.MOUSE_BUTTONS.LEFT :
  935. enableds.append(1)
  936. if event.name == "key_press" and event.getPort() == "ui" :
  937. parameters = event.getParameters()
  938. key = parameters[0]
  939. active_window = parameters[1]
  940. if key == ui.KEYCODES.DELETE and active_window == self.field_window :
  941. enableds.append(2)
  942. if len(enableds) > 1 :
  943. print "Runtime warning : indeterminism detected in a transition from node Root_main_behaviour_selected. Only the first in document order enabled transition is executed."
  944. if len(enableds) > 0 :
  945. enabled = enableds[0]
  946. if enabled == 1 :
  947. parameters = event.getParameters()
  948. x = parameters[0]
  949. y = parameters[1]
  950. button = parameters[2]
  951. self.exit_Root_main_behaviour_selected()
  952. self.mouse_pos = {'x':x, 'y':y}
  953. self.enter_Root_main_behaviour_dragging()
  954. elif enabled == 2 :
  955. parameters = event.getParameters()
  956. key = parameters[0]
  957. active_window = parameters[1]
  958. self.exit_Root_main_behaviour_selected()
  959. self.addEvent(Event("delete_self", parameters = []))
  960. self.enter_Root_main_behaviour_selected()
  961. catched = True
  962. return catched
  963. def transition_Root_main_behaviour_initializing(self, event) :
  964. catched = False
  965. enableds = []
  966. if event.name == "set_association_name" and event.getPort() == "" :
  967. enableds.append(1)
  968. if len(enableds) > 1 :
  969. print "Runtime warning : indeterminism detected in a transition from node Root_main_behaviour_initializing. Only the first in document order enabled transition is executed."
  970. if len(enableds) > 0 :
  971. enabled = enableds[0]
  972. if enabled == 1 :
  973. parameters = event.getParameters()
  974. association_name = parameters[0]
  975. self.exit_Root_main_behaviour_initializing()
  976. self.association_name = association_name
  977. self.enter_Root_main_behaviour_bouncing()
  978. catched = True
  979. return catched
  980. def transition_Root_main_behaviour_bouncing(self, event) :
  981. catched = False
  982. enableds = []
  983. if event.name == "_0after" and event.getPort() == "" :
  984. enableds.append(1)
  985. if event.name == "mouse_press" and event.getPort() == "ball_ui" :
  986. parameters = event.getParameters()
  987. x = parameters[0]
  988. y = parameters[1]
  989. button = parameters[2]
  990. if button == ui.MOUSE_BUTTONS.LEFT :
  991. enableds.append(2)
  992. if len(enableds) > 1 :
  993. print "Runtime warning : indeterminism detected in a transition from node Root_main_behaviour_bouncing. Only the first in document order enabled transition is executed."
  994. if len(enableds) > 0 :
  995. enabled = enableds[0]
  996. if enabled == 1 :
  997. self.exit_Root_main_behaviour_bouncing()
  998. pos = self.element.get_position()
  999. if pos.x - self.r <= 0 or pos.x + self.r >= self.canvas.width:
  1000. self.vel['x'] = -self.vel['x']
  1001. if pos.y - self.r <= 0 or pos.y + self.r >= self.canvas.height:
  1002. self.vel['y'] = -self.vel['y']
  1003. self.element.move(self.vel['x'], self.vel['y'])
  1004. self.enter_Root_main_behaviour_bouncing()
  1005. elif enabled == 2 :
  1006. parameters = event.getParameters()
  1007. x = parameters[0]
  1008. y = parameters[1]
  1009. button = parameters[2]
  1010. self.exit_Root_main_behaviour_bouncing()
  1011. self.element.set_color('#ff0')
  1012. self.enter_Root_main_behaviour_selected()
  1013. catched = True
  1014. return catched
  1015. def transition_Root_deleted(self, event) :
  1016. catched = False
  1017. return catched
  1018. # Execute transitions
  1019. def transition(self, event = Event("")):
  1020. self.state_changed = self.transition_Root(event)
  1021. # inState method for statechart
  1022. def inState(self, nodes):
  1023. for actives in self.current_state.itervalues():
  1024. nodes = [node for node in nodes if node not in actives]
  1025. if not nodes :
  1026. return True
  1027. return False
  1028. class ObjectManager (ObjectManagerBase):
  1029. def __init__(self, controller):
  1030. super(ObjectManager, self).__init__(controller)
  1031. def instantiate(self, class_name, construct_params):
  1032. associations = []
  1033. if class_name == "Button" :
  1034. instance = Button(self.controller, *construct_params)
  1035. associations.append(Association("parent", "Field", 1, 1))
  1036. elif class_name == "Field" :
  1037. instance = Field(self.controller, *construct_params)
  1038. associations.append(Association("parent", "MainApp", 1, 1))
  1039. associations.append(Association("buttons", "Button", 0, -1))
  1040. associations.append(Association("balls", "Ball", 0, -1))
  1041. elif class_name == "MainApp" :
  1042. instance = MainApp(self.controller, *construct_params)
  1043. associations.append(Association("fields", "Field", 0, -1))
  1044. elif class_name == "Ball" :
  1045. instance = Ball(self.controller, *construct_params)
  1046. associations.append(Association("parent", "Field", 1, 1))
  1047. if instance:
  1048. return InstanceWrapper(instance, associations)
  1049. else :
  1050. return None
  1051. from python_runtime.statecharts_core import GameLoopControllerBase
  1052. class Controller(GameLoopControllerBase):
  1053. def __init__(self, keep_running = True):
  1054. super(Controller, self).__init__(ObjectManager(self), keep_running)
  1055. self.addInputPort("field_ui")
  1056. self.addInputPort("ball_ui")
  1057. self.addInputPort("ui")
  1058. self.object_manager.createInstance("MainApp", [])
  1059. def main():
  1060. controller = Controller()
  1061. controller.start()
  1062. if __name__ == "__main__":
  1063. main()