concretesyntax_toolbar.xml 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <class name="ConcreteSyntaxToolbar">
  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="allowed_mappers"/>
  10. <parameter name="allowed_rendered"/>
  11. <super class="Toolbar">
  12. <parameter expr="parent"/>
  13. </super>
  14. <body>
  15. self.to_create = ["rerender", "new_rendered", "object_diagrams"]
  16. self.button_info = {"rerender": "Rerender the current model using the specified mapper and visualized model.",
  17. "new_rendered": "Create a new 'vanilla' visualized model of the same Abstract Syntax model.",
  18. "object_diagrams": "Bind the Object Diagrams visualization to this model.",
  19. }
  20. self.buttons = {}
  21. tk.Label(self, text="Visualization").pack(side=tk.LEFT)
  22. # Mapper
  23. global current_mapper
  24. selected_mapper = tk.StringVar(self)
  25. selected_mapper.set(current_mapper if current_mapper is not None else "(none)")
  26. om = tk.OptionMenu(self, selected_mapper, *list(allowed_mappers) if allowed_mappers else "(none)")
  27. if not allowed_mappers:
  28. om.configure(state=tk.DISABLED)
  29. om.pack(side=tk.LEFT)
  30. selected_mapper.trace('w', lambda name, index, mode: self.controller.addInput(Event("changed_mapper", "input", [id(self), selected_mapper.get()])))
  31. # Rendered
  32. global current_rendered_model
  33. selected_rendered = tk.StringVar(self)
  34. selected_rendered.set(current_rendered_model if current_rendered_model is not None else "(none)")
  35. om = tk.OptionMenu(self, selected_rendered, *list(allowed_rendered) if allowed_rendered else "(none)")
  36. if not allowed_rendered:
  37. om.configure(state=tk.DISABLED)
  38. om.pack(side=tk.LEFT)
  39. selected_rendered.trace('w', lambda name, index, mode: self.controller.addInput(Event("changed_rendered", "input", [id(self), selected_rendered.get()])))
  40. </body>
  41. </constructor>
  42. <destructor>
  43. <super class="Toolbar"/>
  44. </destructor>
  45. <scxml initial="init">
  46. <state id="init" initial="init_buttons">
  47. <onexit>
  48. <raise event="tk_widget" scope="narrow" target="'parent'">
  49. <parameter expr="self"/>
  50. </raise>
  51. </onexit>
  52. <state id="init_buttons">
  53. <onentry>
  54. <raise event="create_instance" scope="cd">
  55. <parameter expr="'buttons'"/>
  56. <parameter expr="'Button'"/>
  57. <parameter expr="{'parent': self, 'visual': ImageVisual('icons/%s.png' % self.to_create[0]), 'tooltip_text': self.button_info[self.to_create[0]], '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 == 'rerender'" target=".">
  86. <parameter name="event_name"/>
  87. <raise event="rerender_model" scope="narrow" target="'parent'"/>
  88. </transition>
  89. <transition event="button_pressed" cond="event_name == 'new_rendered'" target=".">
  90. <parameter name="event_name"/>
  91. <raise event="new_rendered" scope="narrow" target="'parent'"/>
  92. </transition>
  93. <transition event="button_pressed" cond="event_name == 'object_diagrams'" target=".">
  94. <parameter name="event_name"/>
  95. <raise event="add_object_diagrams" scope="narrow" target="'parent'"/>
  96. </transition>
  97. <transition event="changed_mapper" cond="ID == id(self) and new_mapper != current_mapper" target=".">
  98. <parameter name="ID"/>
  99. <parameter name="new_mapper"/>
  100. <raise event="change_mapper" scope="narrow" target="'parent'">
  101. <parameter expr="new_mapper"/>
  102. </raise>
  103. </transition>
  104. <transition event="changed_rendered" cond="ID == id(self) and new_rendered != current_rendered_model" target=".">
  105. <parameter name="ID"/>
  106. <parameter name="new_rendered"/>
  107. <raise event="change_rendered" scope="narrow" target="'parent'">
  108. <parameter expr="new_rendered"/>
  109. </raise>
  110. </transition>
  111. <transition event="close" target="../closing"/>
  112. </state>
  113. <state id="closing">
  114. <onentry>
  115. <raise event="delete_instance" scope="cd">
  116. <parameter expr="self.buttons.popitem()[1]"/>
  117. </raise>
  118. </onentry>
  119. <transition event="instance_deleted" cond="len(self.buttons) > 0" target="../closing"/>
  120. <transition event="instance_deleted" cond="len(self.buttons) == 0" target="../close"/>
  121. </state>
  122. <state id="close">
  123. <onentry>
  124. <raise event="close_window" scope="narrow" target="'parent'"/>
  125. </onentry>
  126. </state>
  127. </scxml>
  128. </class>