|
|
@@ -0,0 +1,182 @@
|
|
|
+<class name="ConnectingLine">
|
|
|
+ <relationships>
|
|
|
+ <association name="parent" class="A" min="1" max="1" />
|
|
|
+ <inheritance class="SCCDWidget" priority='0'/>
|
|
|
+ <association name="elements" class="CanvasElement"/>
|
|
|
+ <association name="prompt" class="PromptWindow"/>
|
|
|
+ </relationships>
|
|
|
+ <constructor>
|
|
|
+ <parameter name="parent"/>
|
|
|
+ <parameter name="cs_element"/>
|
|
|
+ <super class="SCCDWidget">
|
|
|
+ <parameter expr="True"/>
|
|
|
+ </super>
|
|
|
+ <body>
|
|
|
+ self.containing_canvas = parent
|
|
|
+ self.cs_element = cs_element
|
|
|
+ self.as_element = cs_element['__asid']
|
|
|
+ self.diff_results = {}
|
|
|
+ self.elements = set()
|
|
|
+ </body>
|
|
|
+ </constructor>
|
|
|
+ <destructor>
|
|
|
+ <body>
|
|
|
+ for f in self.elements:
|
|
|
+ self.containing_canvas.delete(f)
|
|
|
+ </body>
|
|
|
+ </destructor>
|
|
|
+
|
|
|
+ <scxml initial="init">
|
|
|
+ <state id="init">
|
|
|
+ <transition target="../main">
|
|
|
+ <script>
|
|
|
+ source_x = self.containing_canvas.group_location[self.cs_element['__source']][0] + self.cs_element['offsetSourceX']
|
|
|
+ source_y = self.containing_canvas.group_location[self.cs_element['__source']][1] + self.cs_element['offsetSourceY']
|
|
|
+ target_x = self.containing_canvas.group_location[self.cs_element['__target']][0] + self.cs_element['offsetTargetX']
|
|
|
+ target_y = self.containing_canvas.group_location[self.cs_element['__target']][1] + self.cs_element['offsetTargetY']
|
|
|
+ middle_x = (source_x + target_x) / 2
|
|
|
+ middle_y = (source_y + target_y) / 2
|
|
|
+ self.containing_canvas.group_location[self.cs_element['id']] = (middle_x, middle_y)
|
|
|
+
|
|
|
+ print("DRAW connecting line from ((%s, %s) to (%s, %s))" % (source_x, source_y, target_x, target_y))
|
|
|
+ line1 = self.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)
|
|
|
+ line2 = self.create_line(middle_x, middle_y, target_x, target_y, fill=self.cs_element['lineColour'], width=self.cs_element['lineWidth'])
|
|
|
+ self.cs_element['elem'] = (line1, line2)
|
|
|
+ self.elements.add(line1)
|
|
|
+ self.elements.add(line2)
|
|
|
+
|
|
|
+ self.set_bindable_and_tagorid(self.containing_canvas, line1)
|
|
|
+ self.set_bindable_and_tagorid(self.containing_canvas, line2)
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="main">
|
|
|
+ <transition event="middle-click" cond="id(self) == ID" target="../update_attrs">
|
|
|
+ <parameter name="ID"/>
|
|
|
+ </transition>
|
|
|
+
|
|
|
+ <transition event="moved_element" cond="element == self.cs_element['__source'] or element == self.cs_element['__target']" target=".">
|
|
|
+ <parameter name="element"/>
|
|
|
+ <parameter name="new_location"/>
|
|
|
+ <script>
|
|
|
+ source_x, source_y, _, _ = self.coords(self.cs_element['elem'][0])
|
|
|
+ _, _, target_x, target_y = self.coords(self.cs_element['elem'][1])
|
|
|
+
|
|
|
+ if element == self.cs_element['__source']:
|
|
|
+ # Changed source of our link
|
|
|
+ source_x = new_location[0] + self.cs_element['offsetSourceX']
|
|
|
+ source_y = new_location[1] + self.cs_element['offsetSourceY']
|
|
|
+
|
|
|
+ if element == self.cs_element['__target']:
|
|
|
+ # Changed target of our link
|
|
|
+ source_x = new_location[0] + self.cs_element['offsetTargetX']
|
|
|
+ source_y = new_location[1] + self.cs_element['offsetTargetY']
|
|
|
+
|
|
|
+ self.middle_x = (source_x + target_x) / 2
|
|
|
+ self.middle_y = (source_y + target_y) / 2
|
|
|
+
|
|
|
+ self.coords(line_element['elem'][0], source_x, source_y, self.middle_x, self.middle_y)
|
|
|
+ self.coords(line_element['elem'][1], self.middle_x, self.middle_y, target_x, target_y)
|
|
|
+ </script>
|
|
|
+ <raise event="moved_group" scope="narrow" target="parent">
|
|
|
+ <parameter expr="self.cs_element['id']"/>
|
|
|
+ <parameter expr="self.middle_x, self.middle_y"/>
|
|
|
+ </raise>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="update_attrs" initial="query">
|
|
|
+ <state id="query">
|
|
|
+ <onentry>
|
|
|
+ <raise event="mv_request" scope="broad">
|
|
|
+ <parameter expr="'read_attrs'"/>
|
|
|
+ <parameter expr="[current_model, self.as_element]"/>
|
|
|
+ </raise>
|
|
|
+ </onentry>
|
|
|
+
|
|
|
+ <transition event="mv_response" target="../prompt">
|
|
|
+ <parameter name="result"/>
|
|
|
+ <script>
|
|
|
+ self.prev_results = result
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="prompt">
|
|
|
+ <onentry>
|
|
|
+ <raise event="create_instance" scope="cd">
|
|
|
+ <parameter expr="'prompt'"/>
|
|
|
+ <parameter expr="'PromptWindow'"/>
|
|
|
+ <parameter expr="self.prev_results"/>
|
|
|
+ <parameter expr="{}"/>
|
|
|
+ </raise>
|
|
|
+ </onentry>
|
|
|
+
|
|
|
+ <transition event="instance_created" target="../wait_for_results">
|
|
|
+ <parameter name="name"/>
|
|
|
+ <raise event="start_instance" scope="cd">
|
|
|
+ <parameter expr="name"/>
|
|
|
+ </raise>
|
|
|
+ <script>
|
|
|
+ self.remaining_responses = 0
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="wait_for_results">
|
|
|
+ <transition event="prompt_results" target=".">
|
|
|
+ <parameter name="results"/>
|
|
|
+ <script>
|
|
|
+ for k in results:
|
|
|
+ if results[k] != self.prev_results[k]:
|
|
|
+ self.diff_results[k] = json.loads(results[k])
|
|
|
+ self.remaining_responses = len(self.diff_results)
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
+
|
|
|
+ <transition event="close_window" cond="self.remaining_responses > 0" target="../process_results">
|
|
|
+ <raise event="delete_instance" scope="cd">
|
|
|
+ <parameter expr="'prompt'"/>
|
|
|
+ </raise>
|
|
|
+ </transition>
|
|
|
+
|
|
|
+ <transition event="close_window" cond="self.remaining_responses == 0" target="../../main">
|
|
|
+ <raise event="delete_instance" scope="cd">
|
|
|
+ <parameter expr="'prompt'"/>
|
|
|
+ </raise>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="process_results">
|
|
|
+ <transition cond="len(self.diff_results) > 0" target=".">
|
|
|
+ <script>
|
|
|
+ k, v = self.diff_results.popitem()
|
|
|
+ </script>
|
|
|
+ <raise event="mv_request" scope="broad">
|
|
|
+ <parameter expr="'attr_assign'"/>
|
|
|
+ <parameter expr="[current_model, self.as_element, k, v]"/>
|
|
|
+ </raise>
|
|
|
+ </transition>
|
|
|
+ <transition cond="self.remaining_responses == 0" target="../mark_dirty"/>
|
|
|
+ <transition event="mv_response" target=".">
|
|
|
+ <script>
|
|
|
+ self.remaining_responses -= 1
|
|
|
+ </script>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="mark_dirty">
|
|
|
+ <onentry>
|
|
|
+ <raise event="mv_request" scope="broad">
|
|
|
+ <parameter expr="'attr_assign'"/>
|
|
|
+ <parameter expr="[current_rendered_model, self.cs_element['id'], 'dirty', True]"/>
|
|
|
+ </raise>
|
|
|
+ </onentry>
|
|
|
+ <transition event="mv_response" target="../../main">
|
|
|
+ <raise event="rerender_model" scope="narrow" target="'parent/parent'"/>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+ </state>
|
|
|
+ </scxml>
|
|
|
+</class>
|