dsl_toolbar.xml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <class name="DSLToolbar">
  2. <relationships>
  3. <inheritance class="Toolbar"/>
  4. <association name="buttons" class="Button"/>
  5. <association name="parent" class="A"/>
  6. </relationships>
  7. <constructor>
  8. <parameter name="parent"/>
  9. <parameter name="elements"/>
  10. <super class="Toolbar">
  11. <parameter expr="parent"/>
  12. </super>
  13. <body>
  14. self.to_create = [i[0] for i in elements if i[1] == "Class"]
  15. self.buttons = {}
  16. tk.Label(self, text="Domain-Specific").pack(side=tk.LEFT)
  17. self.currently_active = None
  18. </body>
  19. </constructor>
  20. <destructor>
  21. <super class="Toolbar"/>
  22. </destructor>
  23. <scxml initial="init">
  24. <state id="init" initial="next_button">
  25. <onexit>
  26. <raise event="tk_widget" scope="narrow" target="'parent'">
  27. <parameter expr="self"/>
  28. </raise>
  29. </onexit>
  30. <state id="init_buttons">
  31. <onentry>
  32. <raise event="mv_request" scope="broad">
  33. <parameter expr="'read_attrs'"/>
  34. <parameter expr="[current_metamodel, self.to_create[0]]"/>
  35. </raise>
  36. </onentry>
  37. <transition event="mv_response" cond="'name' in result and result['name'] is not None and result['abstract'] != True" target="../create_buttons">
  38. <parameter name="result"/>
  39. <script>
  40. self.button_text = result["name"]
  41. print("Got attrs: " + str(result))
  42. </script>
  43. </transition>
  44. <transition event="mv_response" cond="ELSE" target="../next_button">
  45. <parameter name="result"/>
  46. <script>
  47. print("Skipping button for %s as it has no name attribute defined" % self.to_create[0])
  48. self.to_create.pop(0)
  49. </script>
  50. </transition>
  51. </state>
  52. <state id="create_buttons">
  53. <onentry>
  54. <raise event="create_instance" scope="cd">
  55. <parameter expr="'buttons'"/>
  56. <parameter expr="'Button'"/>
  57. <parameter expr="{'parent': self, 'visual': TextVisual(self.button_text), 'tooltip_text': 'Instantiate element %s' % self.button_text, 'event_parameters': self.to_create[0]}"/>
  58. </raise>
  59. </onentry>
  60. <transition event="instance_created" target="../pack_button">
  61. <parameter name="association_name"/>
  62. <raise event="start_instance" scope="cd">
  63. <parameter expr="association_name"/>
  64. </raise>
  65. <script>
  66. self.buttons[self.to_create[0]] = association_name
  67. self.to_create.pop(0)
  68. </script>
  69. </transition>
  70. </state>
  71. <state id="pack_button">
  72. <transition event="tk_widget" target="../next_button">
  73. <parameter name="tk_elem"/>
  74. <script>
  75. tk_elem.pack(side=tk.LEFT)
  76. </script>
  77. </transition>
  78. </state>
  79. <state id="next_button">
  80. <transition cond="len(self.to_create) == 0" target="../../root"/>
  81. <transition cond="len(self.to_create) > 0" target="../init_buttons"/>
  82. </state>
  83. </state>
  84. <state id="root">
  85. <transition event="button_pressed" cond="event_name != self.currently_active" target=".">
  86. <parameter name="event_name"/>
  87. <!-- Fake conditional raise: if no button pressed, we don't want to raise an event, but we have to :(
  88. As such, we send the event to the parent, which we HOPE doesn't catch this event. -->
  89. <raise event="deactivate" scope="narrow" target="self.buttons[self.currently_active] if self.currently_active is not None else 'parent'"/>
  90. <raise event="activate" scope="narrow" target="self.buttons[event_name]"/>
  91. <raise event="select_for_creation" scope="narrow" target="'parent'">
  92. <parameter expr="event_name"/>
  93. </raise>
  94. <script>
  95. self.currently_active = event_name
  96. </script>
  97. </transition>
  98. <transition event="close" cond="self.buttons" target="../closing"/>
  99. <transition event="close" cond="not self.buttons" target="../close"/>
  100. </state>
  101. <state id="closing">
  102. <onentry>
  103. <raise event="delete_instance" scope="cd">
  104. <parameter expr="self.buttons.popitem()[1]"/>
  105. </raise>
  106. </onentry>
  107. <transition event="instance_deleted" cond="len(self.buttons) > 0" target="../closing"/>
  108. <transition event="instance_deleted" cond="len(self.buttons) == 0" target="../close"/>
  109. </state>
  110. <state id="close">
  111. <onentry>
  112. <raise event="close_window" scope="narrow" target="'parent'"/>
  113. </onentry>
  114. </state>
  115. </scxml>
  116. </class>