connecting_line.xml 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <class name="ConnectingLine">
  2. <relationships>
  3. <association name="parent" class="A" min="1" max="1" />
  4. <inheritance class="SCCDWidget" priority='0'/>
  5. <association name="elements" class="CanvasElement"/>
  6. <association name="prompt" class="PromptWindow"/>
  7. </relationships>
  8. <constructor>
  9. <parameter name="parent"/>
  10. <parameter name="cs_element"/>
  11. <super class="SCCDWidget">
  12. <parameter expr="True"/>
  13. </super>
  14. <body>
  15. self.containing_canvas = parent
  16. self.cs_element = cs_element
  17. self.as_element = cs_element['__asid']
  18. self.diff_results = {}
  19. self.elements = set()
  20. </body>
  21. </constructor>
  22. <destructor>
  23. <body>
  24. for f in self.elements:
  25. self.containing_canvas.delete(f)
  26. </body>
  27. </destructor>
  28. <scxml initial="init">
  29. <state id="init">
  30. <transition target="../main">
  31. <script>
  32. print("Draw connecting line %s from %s to %s" % (self.cs_element['id'], self.cs_element['__source'], self.cs_element['__target']))
  33. source_x = self.containing_canvas.group_location[self.cs_element['__source']][0] + self.cs_element['offsetSourceX']
  34. source_y = self.containing_canvas.group_location[self.cs_element['__source']][1] + self.cs_element['offsetSourceY']
  35. target_x = self.containing_canvas.group_location[self.cs_element['__target']][0] + self.cs_element['offsetTargetX']
  36. target_y = self.containing_canvas.group_location[self.cs_element['__target']][1] + self.cs_element['offsetTargetY']
  37. middle_x = (source_x + target_x) / 2
  38. middle_y = (source_y + target_y) / 2
  39. self.containing_canvas.group_location[self.cs_element['id']] = (middle_x, middle_y)
  40. line1 = self.containing_canvas.create_line(source_x, source_y, middle_x, middle_y, fill=self.cs_element['lineColour'], width=self.cs_element['lineWidth'], arrow=tk.LAST if self.cs_element['arrow'] else tk.NONE)
  41. line2 = self.containing_canvas.create_line(middle_x, middle_y, target_x, target_y, fill=self.cs_element['lineColour'], width=self.cs_element['lineWidth'])
  42. self.cs_element['elem'] = (line1, line2)
  43. self.elements.add(line1)
  44. self.elements.add(line2)
  45. self.containing_canvas.lower(line1)
  46. self.containing_canvas.lower(line2)
  47. self.set_bindable_and_tagorid(self.containing_canvas, line1)
  48. self.set_bindable_and_tagorid(self.containing_canvas, line2)
  49. </script>
  50. </transition>
  51. </state>
  52. <state id="main">
  53. <transition event="middle-click" cond="id(self) == ID" target="../update_attrs">
  54. <parameter name="ID"/>
  55. </transition>
  56. <transition event="moved_element" cond="element == self.cs_element['__source'] or element == self.cs_element['__target']" target=".">
  57. <parameter name="element"/>
  58. <parameter name="new_location"/>
  59. <script>
  60. print("Moving line %s with source %s and target %s" % (self.cs_element['id'], self.cs_element['__source'], self.cs_element['__target']))
  61. source_x, source_y, _, _ = self.containing_canvas.coords(self.cs_element['elem'][0])
  62. _, _, target_x, target_y = self.containing_canvas.coords(self.cs_element['elem'][1])
  63. if element == self.cs_element['__source']:
  64. # Changed source of our link
  65. source_x = new_location[0] + self.cs_element['offsetSourceX']
  66. source_y = new_location[1] + self.cs_element['offsetSourceY']
  67. print("Move source of line " + self.cs_element['id'])
  68. if element == self.cs_element['__target']:
  69. # Changed target of our link
  70. target_x = new_location[0] + self.cs_element['offsetTargetX']
  71. target_y = new_location[1] + self.cs_element['offsetTargetY']
  72. print("Move target of line " + self.cs_element['id'])
  73. self.middle_x = (source_x + target_x) / 2
  74. self.middle_y = (source_y + target_y) / 2
  75. self.containing_canvas.coords(self.cs_element['elem'][0], source_x, source_y, self.middle_x, self.middle_y)
  76. self.containing_canvas.coords(self.cs_element['elem'][1], self.middle_x, self.middle_y, target_x, target_y)
  77. </script>
  78. <raise event="moved_group" scope="narrow" target="'parent'">
  79. <parameter expr="self.cs_element['id']"/>
  80. <parameter expr="(self.middle_x, self.middle_y)"/>
  81. </raise>
  82. </transition>
  83. </state>
  84. <state id="update_attrs" initial="query">
  85. <state id="query">
  86. <onentry>
  87. <raise event="mv_request" scope="broad">
  88. <parameter expr="'read_attrs'"/>
  89. <parameter expr="[current_model, self.as_element]"/>
  90. </raise>
  91. </onentry>
  92. <transition event="mv_response" target="../prompt">
  93. <parameter name="result"/>
  94. <script>
  95. self.prev_results = result
  96. </script>
  97. </transition>
  98. </state>
  99. <state id="prompt">
  100. <onentry>
  101. <raise event="create_instance" scope="cd">
  102. <parameter expr="'prompt'"/>
  103. <parameter expr="'PromptWindow'"/>
  104. <parameter expr="self.prev_results"/>
  105. <parameter expr="{}"/>
  106. </raise>
  107. </onentry>
  108. <transition event="instance_created" target="../wait_for_results">
  109. <parameter name="name"/>
  110. <raise event="start_instance" scope="cd">
  111. <parameter expr="name"/>
  112. </raise>
  113. <script>
  114. self.remaining_responses = 0
  115. </script>
  116. </transition>
  117. </state>
  118. <state id="wait_for_results">
  119. <transition event="prompt_results" target=".">
  120. <parameter name="results"/>
  121. <script>
  122. for k in results:
  123. if results[k] != self.prev_results[k]:
  124. self.diff_results[k] = json.loads(results[k])
  125. self.remaining_responses = len(self.diff_results)
  126. </script>
  127. </transition>
  128. <transition event="close_window" cond="self.remaining_responses > 0" target="../process_results">
  129. <raise event="delete_instance" scope="cd">
  130. <parameter expr="'prompt'"/>
  131. </raise>
  132. </transition>
  133. <transition event="close_window" cond="self.remaining_responses == 0" target="../../main">
  134. <raise event="delete_instance" scope="cd">
  135. <parameter expr="'prompt'"/>
  136. </raise>
  137. </transition>
  138. </state>
  139. <state id="process_results">
  140. <transition cond="len(self.diff_results) > 0" target=".">
  141. <script>
  142. k, v = self.diff_results.popitem()
  143. </script>
  144. <raise event="mv_request" scope="broad">
  145. <parameter expr="'attr_assign'"/>
  146. <parameter expr="[current_model, self.as_element, k, v]"/>
  147. </raise>
  148. </transition>
  149. <transition cond="self.remaining_responses == 0" target="../mark_dirty"/>
  150. <transition event="mv_response" target=".">
  151. <script>
  152. self.remaining_responses -= 1
  153. </script>
  154. </transition>
  155. </state>
  156. <state id="mark_dirty">
  157. <onentry>
  158. <raise event="mv_request" scope="broad">
  159. <parameter expr="'attr_assign'"/>
  160. <parameter expr="[current_rendered_model, self.cs_element['id'], 'dirty', True]"/>
  161. </raise>
  162. </onentry>
  163. <transition event="mv_response" target="../../main">
  164. <raise event="rerender_model" scope="narrow" target="'parent/parent'"/>
  165. </transition>
  166. </state>
  167. </state>
  168. </scxml>
  169. </class>