Browse Source

Added functioning layers

Yentl Van Tendeloo 8 years ago
parent
commit
2426b91eda

+ 2 - 0
classes/canvas/canvas.xml

@@ -30,6 +30,7 @@
             self.group_location = {}
             self.group_location = {}
             self.connecting_lines = {}
             self.connecting_lines = {}
             self.lines = set()
             self.lines = set()
+            self.layers = []
         </body>
         </body>
     </constructor>
     </constructor>
     <destructor>
     <destructor>
@@ -57,6 +58,7 @@
                 </raise>
                 </raise>
                 <script>
                 <script>
                     self.group_location = {}
                     self.group_location = {}
+                    self.layers = []
                 </script>
                 </script>
             </transition>
             </transition>
 
 

+ 15 - 1
classes/canvas/canvas_element.xml

@@ -30,12 +30,25 @@
         </body>
         </body>
     </destructor>
     </destructor>
 
 
+    <method name="add_to_layer">
+        <parameter name="layer"/>
+        <parameter name="ID"/>
+        <body>
+            # Code adapted from: https://stackoverflow.com/questions/9576063/stacking-order-maintenance-in-tkinter
+            layer_tag = "layer %s" % layer
+            if layer_tag not in self.containing_canvas.layers: self.containing_canvas.layers.append(layer_tag)
+            self.containing_canvas.itemconfigure(ID, tags=[layer_tag])
+
+            for layer in sorted(self.containing_canvas.layers):
+                self.containing_canvas.lift(layer)
+        </body>
+    </method>
+
     <scxml initial="main">
     <scxml initial="main">
         <state id="main">
         <state id="main">
             <transition event="draw_element" target=".">
             <transition event="draw_element" target=".">
                 <parameter name="element"/>
                 <parameter name="element"/>
                 <script>
                 <script>
-                    print("Create element with ID %s" % (element['id']))
                     elem_x = self.coordinates[0] + element["x"]
                     elem_x = self.coordinates[0] + element["x"]
                     elem_y = self.coordinates[1] + element["y"]
                     elem_y = self.coordinates[1] + element["y"]
                     if element["type"] == "Rectangle":
                     if element["type"] == "Rectangle":
@@ -51,6 +64,7 @@
                     if result is not None:
                     if result is not None:
                         self.elements[result] = element["id"]
                         self.elements[result] = element["id"]
                         self.set_bindable_and_tagorid(self.containing_canvas, result)
                         self.set_bindable_and_tagorid(self.containing_canvas, result)
+                        self.add_to_layer(element["layer"], result)
                 </script>
                 </script>
             </transition>
             </transition>
 
 

+ 17 - 4
classes/canvas/connecting_line.xml

@@ -26,11 +26,24 @@
         </body>
         </body>
     </destructor>
     </destructor>
 
 
+    <method name="add_to_layer">
+        <parameter name="layer"/>
+        <parameter name="ID"/>
+        <body>
+            # Code adapted from: https://stackoverflow.com/questions/9576063/stacking-order-maintenance-in-tkinter
+            layer_tag = "layer %s" % layer
+            if layer_tag not in self.containing_canvas.layers: self.containing_canvas.layers.append(layer_tag)
+            self.containing_canvas.itemconfigure(ID, tags=[layer_tag])
+
+            for layer in sorted(self.containing_canvas.layers):
+                self.containing_canvas.lift(layer)
+        </body>
+    </method>
+
     <scxml initial="init">
     <scxml initial="init">
         <state id="init">
         <state id="init">
             <transition cond="self.cs_element['__source'] in self.containing_canvas.group_location and self.cs_element['__target'] in self.containing_canvas.group_location" target="../main">
             <transition cond="self.cs_element['__source'] in self.containing_canvas.group_location and self.cs_element['__target'] in self.containing_canvas.group_location" target="../main">
                 <script>
                 <script>
-                    print("Draw connecting line %s from %s to %s" % (self.cs_element['id'], self.cs_element['__source'], self.cs_element['__target']))
                     source_x = self.containing_canvas.group_location[self.cs_element['__source']][0] + self.cs_element['offsetSourceX']
                     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']
                     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_x = self.containing_canvas.group_location[self.cs_element['__target']][0] + self.cs_element['offsetTargetX']
@@ -49,9 +62,9 @@
                     self.cs_element['elem'] = (line1, line2)
                     self.cs_element['elem'] = (line1, line2)
                     self.elements.add(line1)
                     self.elements.add(line1)
                     self.elements.add(line2)
                     self.elements.add(line2)
-
-                    self.containing_canvas.lower(line1)
-                    self.containing_canvas.lower(line2)
+                    
+                    self.add_to_layer(self.cs_element["layer"], line1)
+                    self.add_to_layer(self.cs_element["layer"], line2)
 
 
                     self.set_bindable_and_tagorid(self.containing_canvas, line1)
                     self.set_bindable_and_tagorid(self.containing_canvas, line1)
                     self.set_bindable_and_tagorid(self.containing_canvas, line2)
                     self.set_bindable_and_tagorid(self.containing_canvas, line2)

+ 28 - 5
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:   Fri Oct  6 09:28:21 2017
+Date:   Fri Oct  6 10:19:43 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 
@@ -7111,6 +7111,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.group_location = {}
         self.group_location = {}
         self.connecting_lines = {}
         self.connecting_lines = {}
         self.lines = set()
         self.lines = set()
+        self.layers = []
     
     
     def user_defined_destructor(self):
     def user_defined_destructor(self):
         self.destroy()
         self.destroy()
@@ -7194,6 +7195,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'connecting_lines']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'connecting_lines']))
         self.group_location = {}
         self.group_location = {}
+        self.layers = []
     
     
     def _ready_1_exec(self, parameters):
     def _ready_1_exec(self, parameters):
         element = parameters[0]
         element = parameters[0]
@@ -7274,6 +7276,17 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
             SCCDWidget.__del__(self)
             SCCDWidget.__del__(self)
     
     
     
     
+    # user defined method
+    def add_to_layer(self, layer, ID):
+        # Code adapted from: https://stackoverflow.com/questions/9576063/stacking-order-maintenance-in-tkinter
+        layer_tag = "layer %s" % layer
+        if layer_tag not in self.containing_canvas.layers: self.containing_canvas.layers.append(layer_tag)
+        self.containing_canvas.itemconfigure(ID, tags=[layer_tag])
+        
+        for layer in sorted(self.containing_canvas.layers):
+            self.containing_canvas.lift(layer)
+    
+    
     # builds Statechart structure
     # builds Statechart structure
     def build_statechart_structure(self):
     def build_statechart_structure(self):
         
         
@@ -7397,7 +7410,6 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.cs_element['id'], 'dirty', True]])]))
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.cs_element['id'], 'dirty', True]])]))
     
     
     def _init_0_exec(self, parameters):
     def _init_0_exec(self, parameters):
-        print("Draw connecting line %s from %s to %s" % (self.cs_element['id'], self.cs_element['__source'], self.cs_element['__target']))
         source_x = self.containing_canvas.group_location[self.cs_element['__source']][0] + self.cs_element['offsetSourceX']
         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']
         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_x = self.containing_canvas.group_location[self.cs_element['__target']][0] + self.cs_element['offsetTargetX']
@@ -7417,8 +7429,8 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
         self.elements.add(line1)
         self.elements.add(line1)
         self.elements.add(line2)
         self.elements.add(line2)
         
         
-        self.containing_canvas.lower(line1)
-        self.containing_canvas.lower(line2)
+        self.add_to_layer(self.cs_element["layer"], line1)
+        self.add_to_layer(self.cs_element["layer"], line2)
         
         
         self.set_bindable_and_tagorid(self.containing_canvas, line1)
         self.set_bindable_and_tagorid(self.containing_canvas, line1)
         self.set_bindable_and_tagorid(self.containing_canvas, line2)
         self.set_bindable_and_tagorid(self.containing_canvas, line2)
@@ -7541,6 +7553,17 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
             SCCDWidget.__del__(self)
             SCCDWidget.__del__(self)
     
     
     
     
+    # user defined method
+    def add_to_layer(self, layer, ID):
+        # Code adapted from: https://stackoverflow.com/questions/9576063/stacking-order-maintenance-in-tkinter
+        layer_tag = "layer %s" % layer
+        if layer_tag not in self.containing_canvas.layers: self.containing_canvas.layers.append(layer_tag)
+        self.containing_canvas.itemconfigure(ID, tags=[layer_tag])
+        
+        for layer in sorted(self.containing_canvas.layers):
+            self.containing_canvas.lift(layer)
+    
+    
     # builds Statechart structure
     # builds Statechart structure
     def build_statechart_structure(self):
     def build_statechart_structure(self):
         
         
@@ -7705,7 +7728,6 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
     
     
     def _main_0_exec(self, parameters):
     def _main_0_exec(self, parameters):
         element = parameters[0]
         element = parameters[0]
-        print("Create element with ID %s" % (element['id']))
         elem_x = self.coordinates[0] + element["x"]
         elem_x = self.coordinates[0] + element["x"]
         elem_y = self.coordinates[1] + element["y"]
         elem_y = self.coordinates[1] + element["y"]
         if element["type"] == "Rectangle":
         if element["type"] == "Rectangle":
@@ -7721,6 +7743,7 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         if result is not None:
         if result is not None:
             self.elements[result] = element["id"]
             self.elements[result] = element["id"]
             self.set_bindable_and_tagorid(self.containing_canvas, result)
             self.set_bindable_and_tagorid(self.containing_canvas, result)
+            self.add_to_layer(element["layer"], result)
     
     
     def _main_1_exec(self, parameters):
     def _main_1_exec(self, parameters):
         ID = parameters[0]
         ID = parameters[0]

+ 2 - 0
models/MM_render.mvc

@@ -7,6 +7,7 @@ SimpleAttribute Boolean {}
 Class GraphicalElement {
 Class GraphicalElement {
     x : Natural
     x : Natural
     y : Natural
     y : Natural
+    layer : Natural
 }
 }
 
 
 Class Group : GraphicalElement {
 Class Group : GraphicalElement {
@@ -24,6 +25,7 @@ Association ConnectingLine (Group, Group) {
     arrow : Boolean
     arrow : Boolean
     __asid : String
     __asid : String
     dirty : Boolean
     dirty : Boolean
+    layer : Natural
 }
 }
 
 
 Class LineElement : GraphicalElement {
 Class LineElement : GraphicalElement {

+ 6 - 0
models/render_OD.alc

@@ -91,6 +91,7 @@ Boolean function main(model : Element):
 				instantiate_attribute(model, group, "x", x)
 				instantiate_attribute(model, group, "x", x)
 				instantiate_attribute(model, group, "y", y)
 				instantiate_attribute(model, group, "y", y)
 				instantiate_attribute(model, group, "__asid", list_read(string_split(class, "/"), 1))
 				instantiate_attribute(model, group, "__asid", list_read(string_split(class, "/"), 1))
+				instantiate_attribute(model, group, "layer", 0)
 				dict_add(groups, class, group)
 				dict_add(groups, class, group)
 
 
 				loc_x = loc_x + 250
 				loc_x = loc_x + 250
@@ -106,6 +107,7 @@ Boolean function main(model : Element):
 				instantiate_attribute(model, elem, "lineWidth", 2) 
 				instantiate_attribute(model, elem, "lineWidth", 2) 
 				instantiate_attribute(model, elem, "lineColour", "black")
 				instantiate_attribute(model, elem, "lineColour", "black")
 				instantiate_attribute(model, elem, "fillColour", "white")
 				instantiate_attribute(model, elem, "fillColour", "white")
+				instantiate_attribute(model, elem, "layer", 1)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 
 
 				elem = instantiate_node(model, "rendered/Text", "")
 				elem = instantiate_node(model, "rendered/Text", "")
@@ -114,6 +116,7 @@ Boolean function main(model : Element):
 				instantiate_attribute(model, elem, "lineWidth", 1)
 				instantiate_attribute(model, elem, "lineWidth", 1)
 				instantiate_attribute(model, elem, "lineColour", "black")
 				instantiate_attribute(model, elem, "lineColour", "black")
 				instantiate_attribute(model, elem, "text", string_join(cast_v2s(list_read(string_split(class, "/"), 1)), " : " + cast_v2s(list_read(string_split(read_type(model, class), "/"), 1))))
 				instantiate_attribute(model, elem, "text", string_join(cast_v2s(list_read(string_split(class, "/"), 1)), " : " + cast_v2s(list_read(string_split(read_type(model, class), "/"), 1))))
+				instantiate_attribute(model, elem, "layer", 2)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 
 
 				elem = instantiate_node(model, "rendered/Line", "")
 				elem = instantiate_node(model, "rendered/Line", "")
@@ -124,6 +127,7 @@ Boolean function main(model : Element):
 				instantiate_attribute(model, elem, "lineWidth", 1)
 				instantiate_attribute(model, elem, "lineWidth", 1)
 				instantiate_attribute(model, elem, "lineColour", "black")
 				instantiate_attribute(model, elem, "lineColour", "black")
 				instantiate_attribute(model, elem, "arrow", False)
 				instantiate_attribute(model, elem, "arrow", False)
+				instantiate_attribute(model, elem, "layer", 2)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 
 
 				attrs = getAttributes(model, class)
 				attrs = getAttributes(model, class)
@@ -136,6 +140,7 @@ Boolean function main(model : Element):
 					instantiate_attribute(model, elem, "lineWidth", 1)
 					instantiate_attribute(model, elem, "lineWidth", 1)
 					instantiate_attribute(model, elem, "lineColour", "black")
 					instantiate_attribute(model, elem, "lineColour", "black")
 					instantiate_attribute(model, elem, "text", (attr_key + " = ") + cast_v2s(attrs[attr_key]))
 					instantiate_attribute(model, elem, "text", (attr_key + " = ") + cast_v2s(attrs[attr_key]))
+					instantiate_attribute(model, elem, "layer", 2)
 					instantiate_link(model, "rendered/contains", "", group, elem)
 					instantiate_link(model, "rendered/contains", "", group, elem)
 					text_loc = text_loc + 15
 					text_loc = text_loc + 15
 
 
@@ -192,6 +197,7 @@ Boolean function main(model : Element):
 			instantiate_attribute(model, elem, "lineColour", "black")
 			instantiate_attribute(model, elem, "lineColour", "black")
 			instantiate_attribute(model, elem, "arrow", True)
 			instantiate_attribute(model, elem, "arrow", True)
 			instantiate_attribute(model, elem, "__asid", list_read(string_split(class, "/"), 1))
 			instantiate_attribute(model, elem, "__asid", list_read(string_split(class, "/"), 1))
+			instantiate_attribute(model, elem, "layer", 0)
 			instantiate_link(model, "rendered/contains", "", group, elem)
 			instantiate_link(model, "rendered/contains", "", group, elem)
 
 
 		if (num_to_render == list_len(delayed_elements)):
 		if (num_to_render == list_len(delayed_elements)):

+ 6 - 0
models/render_SCD.alc

@@ -71,6 +71,7 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, group, "x", x)
 		instantiate_attribute(model, group, "x", x)
 		instantiate_attribute(model, group, "y", y)
 		instantiate_attribute(model, group, "y", y)
 		instantiate_attribute(model, group, "__asid", list_read(string_split(class, "/"), 1))
 		instantiate_attribute(model, group, "__asid", list_read(string_split(class, "/"), 1))
+		instantiate_attribute(model, group, "layer", 0)
 		dict_add(groups, class, group)
 		dict_add(groups, class, group)
 		loc = loc + 200
 		loc = loc + 200
 
 
@@ -82,6 +83,7 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, elem, "lineWidth", 2) 
 		instantiate_attribute(model, elem, "lineWidth", 2) 
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "fillColour", "white")
 		instantiate_attribute(model, elem, "fillColour", "white")
+		instantiate_attribute(model, elem, "layer", 1)
 		instantiate_link(model, "rendered/contains", "", group, elem)
 		instantiate_link(model, "rendered/contains", "", group, elem)
 
 
 		String multiplicities
 		String multiplicities
@@ -103,6 +105,7 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, elem, "lineWidth", 1)
 		instantiate_attribute(model, elem, "lineWidth", 1)
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "text", string_join(list_read(string_split(class, "/"), 1), "  " + multiplicities))
 		instantiate_attribute(model, elem, "text", string_join(list_read(string_split(class, "/"), 1), "  " + multiplicities))
+		instantiate_attribute(model, elem, "layer", 2)
 		instantiate_link(model, "rendered/contains", "", group, elem)
 		instantiate_link(model, "rendered/contains", "", group, elem)
 
 
 		elem = instantiate_node(model, "rendered/Line", "")
 		elem = instantiate_node(model, "rendered/Line", "")
@@ -113,6 +116,7 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, elem, "lineWidth", 1)
 		instantiate_attribute(model, elem, "lineWidth", 1)
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "arrow", False)
 		instantiate_attribute(model, elem, "arrow", False)
+		instantiate_attribute(model, elem, "layer", 2)
 		instantiate_link(model, "rendered/contains", "", group, elem)
 		instantiate_link(model, "rendered/contains", "", group, elem)
 
 
 		attrs = getInstantiatableAttributes(model, class, "abstract/AttributeLink")
 		attrs = getInstantiatableAttributes(model, class, "abstract/AttributeLink")
@@ -125,6 +129,7 @@ Boolean function main(model : Element):
 			instantiate_attribute(model, elem, "lineWidth", 1)
 			instantiate_attribute(model, elem, "lineWidth", 1)
 			instantiate_attribute(model, elem, "lineColour", "black")
 			instantiate_attribute(model, elem, "lineColour", "black")
 			instantiate_attribute(model, elem, "text", (attr_key + " : ") + cast_v2s(list_read(string_split(attrs[attr_key], "/"), 1)))
 			instantiate_attribute(model, elem, "text", (attr_key + " : ") + cast_v2s(list_read(string_split(attrs[attr_key], "/"), 1)))
+			instantiate_attribute(model, elem, "layer", 2)
 			instantiate_link(model, "rendered/contains", "", group, elem)
 			instantiate_link(model, "rendered/contains", "", group, elem)
 			text_loc = text_loc + 15
 			text_loc = text_loc + 15
 
 
@@ -152,6 +157,7 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "arrow", True)
 		instantiate_attribute(model, elem, "arrow", True)
 		instantiate_attribute(model, elem, "__asid", list_read(string_split(class, "/"), 1))
 		instantiate_attribute(model, elem, "__asid", list_read(string_split(class, "/"), 1))
+		instantiate_attribute(model, elem, "layer", 0)
 		log("Found ASID " + cast_v2s(list_read(string_split(class, "/"), 1)))
 		log("Found ASID " + cast_v2s(list_read(string_split(class, "/"), 1)))
 		instantiate_link(model, "rendered/contains", "", group, elem)
 		instantiate_link(model, "rendered/contains", "", group, elem)