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

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="SCCDWidget" priority='0'/>
         <inheritance class="tk.Canvas" priority='1'/>
         <inheritance class="tk.Canvas" priority='1'/>
         <association name="elements" class="CanvasElement"/>
         <association name="elements" class="CanvasElement"/>
+        <association name="connecting_lines" class="ConnectingLines"/>
     </relationships>
     </relationships>
     <constructor>
     <constructor>
         <parameter name="parent" />
         <parameter name="parent" />
@@ -80,11 +81,10 @@
                 <raise event="delete_instance" scope="cd">
                 <raise event="delete_instance" scope="cd">
                     <parameter expr="'elements'"/>
                     <parameter expr="'elements'"/>
                 </raise>
                 </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'connecting_lines'"/>
+                </raise>
                 <script>
                 <script>
-                    self.shift = {}
-                    for l in self.lines:
-                        self.delete(l)
-                    self.connecting_lines = {}
                     self.group_location = {}
                     self.group_location = {}
                 </script>
                 </script>
             </transition>
             </transition>
@@ -94,7 +94,6 @@
                 <script>
                 <script>
                     self.creating_id = element["id"]
                     self.creating_id = element["id"]
                     self.group_location[element['id']] = (element['x'], element['y'])
                     self.group_location[element['id']] = (element['x'], element['y'])
-                    print("Creating new group %s --> %s" % (element['id'], (element['x'], element['y'])))
                 </script>
                 </script>
                 <raise event="create_instance" scope="cd">
                 <raise event="create_instance" scope="cd">
                     <parameter expr="'elements'"/>
                     <parameter expr="'elements'"/>
@@ -122,35 +121,31 @@
 
 
             <transition event="draw_canvas" cond="element['type'] == 'ConnectingLine'" target=".">
             <transition event="draw_canvas" cond="element['type'] == 'ConnectingLine'" target=".">
                 <parameter name="element"/>
                 <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>
 
 
             <transition event="moved_group" target=".">
             <transition event="moved_group" target=".">
                 <parameter name="group_element"/>
                 <parameter name="group_element"/>
                 <parameter name="new_location"/>
                 <parameter name="new_location"/>
                 <script>
                 <script>
-                    self.move_element(group_element, new_location)
+                    self.group_location[group_element] = new_location
                 </script>
                 </script>
+                <raise event="moved_element" scope="narrow" target="'connecting_lines'">
+                    <parameter expr="'group_element'"/>
+                    <parameter expr="'new_location'"/>
+                </raise>
             </transition>
             </transition>
         </state>
         </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)
 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 author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -7201,8 +7201,12 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.states["/ready"].addTransition(_ready_4)
         self.states["/ready"].addTransition(_ready_4)
         _ready_5 = Transition(self, self.states["/ready"], [self.states["/ready"]])
         _ready_5 = Transition(self, self.states["/ready"], [self.states["/ready"]])
         _ready_5.setAction(self._ready_5_exec)
         _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)
         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
         # transition /creating_group
         _creating_group_0 = Transition(self, self.states["/creating_group"], [self.states["/ready"]])
         _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):
     def _ready_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
         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 = {}
         self.group_location = {}
     
     
     def _ready_1_exec(self, parameters):
     def _ready_1_exec(self, parameters):
         element = parameters[0]
         element = parameters[0]
         self.creating_id = element["id"]
         self.creating_id = element["id"]
         self.group_location[element['id']] = (element['x'], element['y'])
         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']]))
         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):
     def _ready_2_exec(self, parameters):
@@ -7242,34 +7242,21 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
     
     
     def _ready_4_exec(self, parameters):
     def _ready_4_exec(self, parameters):
         element = parameters[0]
         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):
     def _ready_4_guard(self, parameters):
         element = parameters[0]
         element = parameters[0]
         return element['type'] == 'ConnectingLine'
         return element['type'] == 'ConnectingLine'
     
     
     def _ready_5_exec(self, parameters):
     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]
         group_element = parameters[0]
         new_location = parameters[1]
         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):
     def _creating_group_0_exec(self, parameters):
         assoc_name = parameters[0]
         assoc_name = parameters[0]
@@ -7686,6 +7673,7 @@ class ObjectManager(ObjectManagerBase):
             instance.associations = {}
             instance.associations = {}
             instance.associations["parent"] = Association("A", 1, 1)
             instance.associations["parent"] = Association("A", 1, 1)
             instance.associations["elements"] = Association("CanvasElement", 0, -1)
             instance.associations["elements"] = Association("CanvasElement", 0, -1)
+            instance.associations["connecting_lines"] = Association("ConnectingLines", 0, -1)
         elif class_name == "CanvasElement":
         elif class_name == "CanvasElement":
             instance = CanvasElement(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3])
             instance = CanvasElement(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3])
             instance.associations = {}
             instance.associations = {}

+ 1 - 0
frontend.xml

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