dsl_toolbar.xml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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" target="../create_buttons">
  38. <parameter name="result"/>
  39. <script>
  40. self.button_text = result["name"]
  41. </script>
  42. </transition>
  43. <transition event="mv_response" cond="'name' not in result or result['name'] is None" target="../next_button">
  44. <parameter name="result"/>
  45. <script>
  46. print("Skipping button for %s as it has no name attribute defined" % self.to_create[0])
  47. self.to_create.pop(0)
  48. </script>
  49. </transition>
  50. </state>
  51. <state id="create_buttons">
  52. <onentry>
  53. <raise event="create_instance" scope="cd">
  54. <parameter expr="'buttons'"/>
  55. <parameter expr="'Button'"/>
  56. <parameter expr="{'parent': self, 'visual': TextVisual(self.button_text), 'tooltip_text': 'Instantiate element %s' % self.button_text, 'event_parameters': self.to_create[0]}"/>
  57. </raise>
  58. </onentry>
  59. <transition event="instance_created" target="../pack_button">
  60. <parameter name="association_name"/>
  61. <raise event="start_instance" scope="cd">
  62. <parameter expr="association_name"/>
  63. </raise>
  64. <script>
  65. self.buttons[self.to_create[0]] = association_name
  66. self.to_create.pop(0)
  67. </script>
  68. </transition>
  69. </state>
  70. <state id="pack_button">
  71. <transition event="tk_widget" target="../next_button">
  72. <parameter name="tk_elem"/>
  73. <script>
  74. tk_elem.pack(side=tk.LEFT)
  75. </script>
  76. </transition>
  77. </state>
  78. <state id="next_button">
  79. <transition cond="len(self.to_create) == 0" target="../../root"/>
  80. <transition cond="len(self.to_create) > 0" target="../init_buttons"/>
  81. </state>
  82. </state>
  83. <state id="root">
  84. <transition event="button_pressed" cond="event_name != self.currently_active" target=".">
  85. <parameter name="event_name"/>
  86. <!-- Fake conditional raise: if no button pressed, we don't want to raise an event, but we have to :(
  87. As such, we send the event to the parent, which we HOPE doesn't catch this event. -->
  88. <raise event="deactivate" scope="narrow" target="self.buttons[self.currently_active] if self.currently_active is not None else 'parent'"/>
  89. <raise event="activate" scope="narrow" target="self.buttons[event_name]"/>
  90. <raise event="select_for_creation" scope="narrow" target="'parent'">
  91. <parameter expr="event_name"/>
  92. </raise>
  93. <script>
  94. self.currently_active = event_name
  95. </script>
  96. </transition>
  97. <transition event="close" cond="self.buttons" target="../closing"/>
  98. <transition event="close" cond="not self.buttons" target="../close"/>
  99. </state>
  100. <state id="closing">
  101. <onentry>
  102. <raise event="delete_instance" scope="cd">
  103. <parameter expr="self.buttons.popitem()[1]"/>
  104. </raise>
  105. </onentry>
  106. <transition event="instance_deleted" cond="len(self.buttons) > 0" target="../closing"/>
  107. <transition event="instance_deleted" cond="len(self.buttons) == 0" target="../close"/>
  108. </state>
  109. <state id="close">
  110. <onentry>
  111. <raise event="close_window" scope="narrow" target="'parent'"/>
  112. </onentry>
  113. </state>
  114. </scxml>
  115. </class>