choice_prompt_window.xml 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <class name="ChoicePrompt">
  2. <relationships>
  3. <inheritance class="tk.Toplevel" priority="1"/>
  4. <inheritance class="SCCDWidget" priority="0"/>
  5. <association name="buttons" class="Button"/>
  6. <association name="labels" class="Label"/>
  7. <association name="parent" class="A"/>
  8. </relationships>
  9. <constructor>
  10. <parameter name="prompt"/>
  11. <parameter name="options" default="None"/>
  12. <super class="tk.Toplevel"/>
  13. <super class="SCCDWidget"/>
  14. <body>
  15. tk.Label(self, text=prompt).pack()
  16. self.button_frame = tk.Frame(self)
  17. self.button_frame.pack(fill=tk.X)
  18. self.browser_frame = tk.Frame(self)
  19. self.browser_frame.pack(fill=tk.BOTH)
  20. self.selected_label = None
  21. self.labels = {}
  22. self.options = options
  23. </body>
  24. </constructor>
  25. <destructor>
  26. <body>
  27. self.destroy()
  28. </body>
  29. </destructor>
  30. <scxml initial="all">
  31. <state id="all" initial="init">
  32. <state id="init">
  33. <onentry>
  34. <raise event="create_instance" scope="cd">
  35. <parameter expr="'buttons'"/>
  36. <parameter expr="'Button'"/>
  37. <parameter expr="{'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Commit decision', 'event_parameters': 'OK'}"/>
  38. </raise>
  39. </onentry>
  40. <transition event="instance_created" target="../wait_for_packing_OK">
  41. <parameter name="association_name"/>
  42. <raise event="start_instance" scope="cd">
  43. <parameter expr="association_name"/>
  44. </raise>
  45. <script>
  46. self.button_ok = association_name
  47. </script>
  48. </transition>
  49. </state>
  50. <state id="wait_for_packing_OK">
  51. <transition event="tk_widget" target="../create_labels">
  52. <parameter name="tk_elem"/>
  53. <script>
  54. tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
  55. </script>
  56. </transition>
  57. </state>
  58. <state id="create_labels" initial="query">
  59. <state id="query">
  60. <transition target="../check_continue">
  61. <script>
  62. self.labels_to_add = sorted(self.options)
  63. self.all_results = sorted(self.options)
  64. </script>
  65. </transition>
  66. </state>
  67. <state id="add_label">
  68. <onentry>
  69. <raise event="create_instance" scope="cd">
  70. <parameter expr="'labels'"/>
  71. <parameter expr="'Label'"/>
  72. <parameter expr="{'parent': self.browser_frame, 'text': self.labels_to_add[0]}"/>
  73. </raise>
  74. </onentry>
  75. <transition event="instance_created" target="../pack_label">
  76. <parameter name="association_name"/>
  77. <raise event="start_instance" scope="cd">
  78. <parameter expr="association_name"/>
  79. </raise>
  80. <script>
  81. self.labels[self.labels_to_add.pop(0)] = association_name
  82. </script>
  83. </transition>
  84. </state>
  85. <state id="pack_label">
  86. <transition event="tk_widget" target="../check_continue">
  87. <parameter name="tk_elem"/>
  88. <script>
  89. tk_elem.pack()
  90. </script>
  91. </transition>
  92. </state>
  93. <state id="check_continue">
  94. <transition cond="len(self.labels_to_add) == 0" target="../../waiting"/>
  95. <transition cond="len(self.labels_to_add) > 0" target="../add_label"/>
  96. </state>
  97. </state>
  98. <state id="waiting">
  99. <transition event="label_pressed" cond="self.selected_label is None" target=".">
  100. <parameter name="text"/>
  101. <raise event="highlight" target="self.labels[text]" scope="narrow"/>
  102. <script>
  103. self.selected_label = text
  104. </script>
  105. </transition>
  106. <transition event="label_pressed" cond="self.selected_label is not None and self.selected_label != text" target=".">
  107. <parameter name="text"/>
  108. <raise event="unhighlight" target="self.labels[self.selected_label]" scope="narrow"/>
  109. <raise event="highlight" target="self.labels[text]" scope="narrow"/>
  110. <script>
  111. self.selected_label = text
  112. </script>
  113. </transition>
  114. <transition event="label_pressed" cond="self.selected_label is not None and self.selected_label == text" target="../delete_labels">
  115. <parameter name="text"/>
  116. </transition>
  117. <transition event="button_pressed" cond="event_name == 'OK' and self.selected_label is not None" target="../delete_labels">
  118. <parameter name="event_name"/>
  119. </transition>
  120. </state>
  121. <state id="delete_labels">
  122. <transition cond="len(self.labels) > 0" target=".">
  123. <raise event="delete_instance" scope="cd">
  124. <parameter expr="self.labels.popitem()[1]"/>
  125. </raise>
  126. </transition>
  127. <transition cond="len(self.labels) == 0" target="../send_results"/>
  128. </state>
  129. <state id="send_results">
  130. <transition target="../closing">
  131. <raise event="choice_result" target="'parent'" scope="narrow">
  132. <parameter expr="self.selected_label"/>
  133. </raise>
  134. <script>
  135. self.to_close = self.labels.values() + [self.button_ok]
  136. </script>
  137. </transition>
  138. </state>
  139. <state id="closing">
  140. <onentry>
  141. <raise event="delete_instance" scope="cd">
  142. <parameter expr="self.to_close.pop(0)"/>
  143. </raise>
  144. </onentry>
  145. <transition event="instance_deleted" cond="len(self.to_close) > 0" target="."/>
  146. <transition event="instance_deleted" cond="len(self.to_close) == 0" target="../close"/>
  147. </state>
  148. <state id="close">
  149. <onentry>
  150. <raise event="close_window" scope="narrow" target="'parent'"/>
  151. </onentry>
  152. </state>
  153. <transition event="window-close" cond="ID == id(self)" target="closing">
  154. <parameter name="ID"/>
  155. <script>
  156. self.to_close = self.labels.values() + [self.button_ok]
  157. </script>
  158. </transition>
  159. </state>
  160. </scxml>
  161. </class>