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

+ 15 - 1
classes/canvas/canvas_element.xml

@@ -30,12 +30,25 @@
         </body>
     </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">
         <state id="main">
             <transition event="draw_element" target=".">
                 <parameter name="element"/>
                 <script>
-                    print("Create element with ID %s" % (element['id']))
                     elem_x = self.coordinates[0] + element["x"]
                     elem_y = self.coordinates[1] + element["y"]
                     if element["type"] == "Rectangle":
@@ -51,6 +64,7 @@
                     if result is not None:
                         self.elements[result] = element["id"]
                         self.set_bindable_and_tagorid(self.containing_canvas, result)
+                        self.add_to_layer(element["layer"], result)
                 </script>
             </transition>
 

+ 17 - 4
classes/canvas/connecting_line.xml

@@ -26,11 +26,24 @@
         </body>
     </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">
         <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">
                 <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_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']
@@ -49,9 +62,9 @@
                     self.cs_element['elem'] = (line1, line2)
                     self.elements.add(line1)
                     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, 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)
 
-Date:   Fri Oct  6 09:28:21 2017
+Date:   Fri Oct  6 10:19:43 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -7111,6 +7111,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.group_location = {}
         self.connecting_lines = {}
         self.lines = set()
+        self.layers = []
     
     def user_defined_destructor(self):
         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, 'connecting_lines']))
         self.group_location = {}
+        self.layers = []
     
     def _ready_1_exec(self, parameters):
         element = parameters[0]
@@ -7274,6 +7276,17 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
             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
     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]])]))
     
     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_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']
@@ -7417,8 +7429,8 @@ class ConnectingLine(RuntimeClassBase, SCCDWidget):
         self.elements.add(line1)
         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, line2)
@@ -7541,6 +7553,17 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
             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
     def build_statechart_structure(self):
         
@@ -7705,7 +7728,6 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
     
     def _main_0_exec(self, parameters):
         element = parameters[0]
-        print("Create element with ID %s" % (element['id']))
         elem_x = self.coordinates[0] + element["x"]
         elem_y = self.coordinates[1] + element["y"]
         if element["type"] == "Rectangle":
@@ -7721,6 +7743,7 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         if result is not None:
             self.elements[result] = element["id"]
             self.set_bindable_and_tagorid(self.containing_canvas, result)
+            self.add_to_layer(element["layer"], result)
     
     def _main_1_exec(self, parameters):
         ID = parameters[0]

+ 2 - 0
models/MM_render.mvc

@@ -7,6 +7,7 @@ SimpleAttribute Boolean {}
 Class GraphicalElement {
     x : Natural
     y : Natural
+    layer : Natural
 }
 
 Class Group : GraphicalElement {
@@ -24,6 +25,7 @@ Association ConnectingLine (Group, Group) {
     arrow : Boolean
     __asid : String
     dirty : Boolean
+    layer : Natural
 }
 
 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, "y", y)
 				instantiate_attribute(model, group, "__asid", list_read(string_split(class, "/"), 1))
+				instantiate_attribute(model, group, "layer", 0)
 				dict_add(groups, class, group)
 
 				loc_x = loc_x + 250
@@ -106,6 +107,7 @@ Boolean function main(model : Element):
 				instantiate_attribute(model, elem, "lineWidth", 2) 
 				instantiate_attribute(model, elem, "lineColour", "black")
 				instantiate_attribute(model, elem, "fillColour", "white")
+				instantiate_attribute(model, elem, "layer", 1)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 
 				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, "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, "layer", 2)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 
 				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, "lineColour", "black")
 				instantiate_attribute(model, elem, "arrow", False)
+				instantiate_attribute(model, elem, "layer", 2)
 				instantiate_link(model, "rendered/contains", "", group, elem)
 
 				attrs = getAttributes(model, class)
@@ -136,6 +140,7 @@ Boolean function main(model : Element):
 					instantiate_attribute(model, elem, "lineWidth", 1)
 					instantiate_attribute(model, elem, "lineColour", "black")
 					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)
 					text_loc = text_loc + 15
 
@@ -192,6 +197,7 @@ Boolean function main(model : Element):
 			instantiate_attribute(model, elem, "lineColour", "black")
 			instantiate_attribute(model, elem, "arrow", True)
 			instantiate_attribute(model, elem, "__asid", list_read(string_split(class, "/"), 1))
+			instantiate_attribute(model, elem, "layer", 0)
 			instantiate_link(model, "rendered/contains", "", group, elem)
 
 		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, "y", y)
 		instantiate_attribute(model, group, "__asid", list_read(string_split(class, "/"), 1))
+		instantiate_attribute(model, group, "layer", 0)
 		dict_add(groups, class, group)
 		loc = loc + 200
 
@@ -82,6 +83,7 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, elem, "lineWidth", 2) 
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "fillColour", "white")
+		instantiate_attribute(model, elem, "layer", 1)
 		instantiate_link(model, "rendered/contains", "", group, elem)
 
 		String multiplicities
@@ -103,6 +105,7 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, elem, "lineWidth", 1)
 		instantiate_attribute(model, elem, "lineColour", "black")
 		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)
 
 		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, "lineColour", "black")
 		instantiate_attribute(model, elem, "arrow", False)
+		instantiate_attribute(model, elem, "layer", 2)
 		instantiate_link(model, "rendered/contains", "", group, elem)
 
 		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, "lineColour", "black")
 			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)
 			text_loc = text_loc + 15
 
@@ -152,6 +157,7 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, elem, "lineColour", "black")
 		instantiate_attribute(model, elem, "arrow", True)
 		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)))
 		instantiate_link(model, "rendered/contains", "", group, elem)