Просмотр исходного кода

Made changes to how lines work (untested)

Yentl Van Tendeloo 8 лет назад
Родитель
Сommit
f0eb412d02
4 измененных файлов с 220 добавлено и 54 удалено
  1. 22 27
      classes/canvas/canvas.xml
  2. 182 0
      classes/canvas/connecting_line.xml
  3. 15 27
      frontend.py
  4. 1 0
      frontend.xml

+ 22 - 27
classes/canvas/canvas.xml

@@ -4,6 +4,7 @@
         <inheritance class="SCCDWidget" priority='0'/>
         <inheritance class="tk.Canvas" priority='1'/>
         <association name="elements" class="CanvasElement"/>
+        <association name="connecting_lines" class="ConnectingLines"/>
     </relationships>
     <constructor>
         <parameter name="parent" />
@@ -80,11 +81,10 @@
                 <raise event="delete_instance" scope="cd">
                     <parameter expr="'elements'"/>
                 </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'connecting_lines'"/>
+                </raise>
                 <script>
-                    self.shift = {}
-                    for l in self.lines:
-                        self.delete(l)
-                    self.connecting_lines = {}
                     self.group_location = {}
                 </script>
             </transition>
@@ -94,7 +94,6 @@
                 <script>
                     self.creating_id = element["id"]
                     self.group_location[element['id']] = (element['x'], element['y'])
-                    print("Creating new group %s --> %s" % (element['id'], (element['x'], element['y'])))
                 </script>
                 <raise event="create_instance" scope="cd">
                     <parameter expr="'elements'"/>
@@ -122,35 +121,31 @@
 
             <transition event="draw_canvas" cond="element['type'] == 'ConnectingLine'" target=".">
                 <parameter name="element"/>
-                <script>
-                    source_x = self.group_location[element['__source']][0] + element['offsetSourceX']
-                    source_y = self.group_location[element['__source']][1] + element['offsetSourceY']
-                    target_x = self.group_location[element['__target']][0] + element['offsetTargetX']
-                    target_y = self.group_location[element['__target']][1] + element['offsetTargetY']
-                    middle_x = (source_x + target_x) / 2
-                    middle_y = (source_y + target_y) / 2
-                    self.group_location[element['id']] = (middle_x, middle_y)
-
-                    self.connecting_lines.setdefault(element['__source'], []).append(element)
-                    self.connecting_lines.setdefault(element['__target'], []).append(element)
-
-                    print("DRAW connecting line from ((%s, %s) to (%s, %s))" % (source_x, source_y, target_x, target_y))
-                    print("Source: " + str(element['__source']))
-                    print("Target: " + str(element['__target']))
-                    line1 = self.create_line(source_x, source_y, middle_x, middle_y, fill=element['lineColour'], width=element['lineWidth'], arrow=tk.LAST if element['arrow'] else tk.NONE)
-                    line2 = self.create_line(middle_x, middle_y, target_x, target_y, fill=element['lineColour'], width=element['lineWidth'])
-                    element['elem'] = (line1, line2)
-                    self.lines.add(line1)
-                    self.lines.add(line2)
-                </script>
+                <raise event="create_instance" scope="cd">
+                    <parameter expr="'connecting_lines'"/>
+                    <parameter expr="'ConnectingLine'"/>
+                    <parameter expr="self"/>
+                    <parameter expr="element"/>
+                </raise>
+            </transition>
+
+            <transition event="instance_created" target=".">
+                <parameter name="result"/>
+                <raise event="start_instance" scope="cd">
+                    <parameter expr="result"/>
+                </raise>
             </transition>
 
             <transition event="moved_group" target=".">
                 <parameter name="group_element"/>
                 <parameter name="new_location"/>
                 <script>
-                    self.move_element(group_element, new_location)
+                    self.group_location[group_element] = new_location
                 </script>
+                <raise event="moved_element" scope="narrow" target="'connecting_lines'">
+                    <parameter expr="'group_element'"/>
+                    <parameter expr="'new_location'"/>
+                </raise>
             </transition>
         </state>
 

+ 182 - 0
classes/canvas/connecting_line.xml

@@ -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>

+ 15 - 27
frontend.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Thu Oct  5 16:13:47 2017
+Date:   Thu Oct  5 16:46:48 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -7201,8 +7201,12 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.states["/ready"].addTransition(_ready_4)
         _ready_5 = Transition(self, self.states["/ready"], [self.states["/ready"]])
         _ready_5.setAction(self._ready_5_exec)
-        _ready_5.setTrigger(Event("moved_group", None))
+        _ready_5.setTrigger(Event("instance_created", None))
         self.states["/ready"].addTransition(_ready_5)
+        _ready_6 = Transition(self, self.states["/ready"], [self.states["/ready"]])
+        _ready_6.setAction(self._ready_6_exec)
+        _ready_6.setTrigger(Event("moved_group", None))
+        self.states["/ready"].addTransition(_ready_6)
         
         # transition /creating_group
         _creating_group_0 = Transition(self, self.states["/creating_group"], [self.states["/ready"]])
@@ -7215,17 +7219,13 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
     
     def _ready_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
-        self.shift = {}
-        for l in self.lines:
-            self.delete(l)
-        self.connecting_lines = {}
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'connecting_lines']))
         self.group_location = {}
     
     def _ready_1_exec(self, parameters):
         element = parameters[0]
         self.creating_id = element["id"]
         self.group_location[element['id']] = (element['x'], element['y'])
-        print("Creating new group %s --> %s" % (element['id'], (element['x'], element['y'])))
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'elements', 'CanvasElement', self, (element['x'], element['y']), element['id'], element['__asid']]))
     
     def _ready_2_exec(self, parameters):
@@ -7242,34 +7242,21 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
     
     def _ready_4_exec(self, parameters):
         element = parameters[0]
-        source_x = self.group_location[element['__source']][0] + element['offsetSourceX']
-        source_y = self.group_location[element['__source']][1] + element['offsetSourceY']
-        target_x = self.group_location[element['__target']][0] + element['offsetTargetX']
-        target_y = self.group_location[element['__target']][1] + element['offsetTargetY']
-        middle_x = (source_x + target_x) / 2
-        middle_y = (source_y + target_y) / 2
-        self.group_location[element['id']] = (middle_x, middle_y)
-        
-        self.connecting_lines.setdefault(element['__source'], []).append(element)
-        self.connecting_lines.setdefault(element['__target'], []).append(element)
-        
-        print("DRAW connecting line from ((%s, %s) to (%s, %s))" % (source_x, source_y, target_x, target_y))
-        print("Source: " + str(element['__source']))
-        print("Target: " + str(element['__target']))
-        line1 = self.create_line(source_x, source_y, middle_x, middle_y, fill=element['lineColour'], width=element['lineWidth'], arrow=tk.LAST if element['arrow'] else tk.NONE)
-        line2 = self.create_line(middle_x, middle_y, target_x, target_y, fill=element['lineColour'], width=element['lineWidth'])
-        element['elem'] = (line1, line2)
-        self.lines.add(line1)
-        self.lines.add(line2)
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'connecting_lines', 'ConnectingLine', self, element]))
     
     def _ready_4_guard(self, parameters):
         element = parameters[0]
         return element['type'] == 'ConnectingLine'
     
     def _ready_5_exec(self, parameters):
+        result = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, result]))
+    
+    def _ready_6_exec(self, parameters):
         group_element = parameters[0]
         new_location = parameters[1]
-        self.move_element(group_element, new_location)
+        self.group_location[group_element] = new_location
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'connecting_lines', Event("moved_element", None, ['group_element', 'new_location'])]))
     
     def _creating_group_0_exec(self, parameters):
         assoc_name = parameters[0]
@@ -7686,6 +7673,7 @@ class ObjectManager(ObjectManagerBase):
             instance.associations = {}
             instance.associations["parent"] = Association("A", 1, 1)
             instance.associations["elements"] = Association("CanvasElement", 0, -1)
+            instance.associations["connecting_lines"] = Association("ConnectingLines", 0, -1)
         elif class_name == "CanvasElement":
             instance = CanvasElement(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3])
             instance.associations = {}

+ 1 - 0
frontend.xml

@@ -37,5 +37,6 @@
     <class src="classes/widgets/label.xml"/>
     <class src="classes/widgets/progress_bar.xml"/>
     <class src="classes/canvas/canvas.xml"/>
+    <class src="classes/canvas/connecting_line.xml"/>
     <class src="classes/canvas/canvas_element.xml"/>
 </diagram>