Преглед изворни кода

Fixed GUI to use an internal renderer

Yentl Van Tendeloo пре 8 година
родитељ
комит
301b582d43
5 измењених фајлова са 614 додато и 327 уклоњено
  1. 40 11
      classes/canvas/canvas_element.xml
  2. 129 33
      classes/window/main_window.xml
  3. 420 236
      frontend.py
  4. 13 17
      models/render_OD.alc
  5. 12 30
      models/render_SCD.alc

+ 40 - 11
classes/canvas/canvas_element.xml

@@ -82,7 +82,17 @@
                 </transition>
             </state>
 
-            <state id="update_mv" initial="x">
+            <state id="update_mv" initial="check">
+                <state id="check">
+                    <transition cond="current_rendered_model" target="../x"/>
+                    <transition cond="not current_rendered_model" target="../../../main">
+                        <raise event="move" scope="narrow" target="'parent/parent'">
+                            <parameter expr="self.as_element"/>
+                            <parameter expr="self.coordinates"/>
+                        </raise>
+                    </transition>
+                </state>
+
                 <state id="x">
                     <onentry>
                         <raise event="mv_request" scope="broad">
@@ -287,20 +297,39 @@
                 </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, 'dirty', True]"/>
+            <state id="mark_dirty" initial="check">
+                <state id="check">
+                    <transition cond="current_rendered_model" target="../do"/>
+                    <transition cond="not current_rendered_model" target="../../../main">
+                        <raise event="rerender_model" scope="narrow" target="'parent/parent'"/>
+                    </transition>
+                </state>
+
+                <state id="do">
+                    <onentry>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'attr_assign'"/>
+                            <parameter expr="[current_rendered_model, self.cs_element, 'dirty', True]"/>
+                        </raise>
+                    </onentry>
+                    <transition event="mv_response" target="../../../main">
+                        <raise event="rerender_model" scope="narrow" target="'parent/parent'"/>
+                    </transition>
+                </state>
+            </state>
+        </state>
+
+        <state id="update_mv" initial="check">
+            <state id="check">
+                <transition cond="current_rendered_model" target="../x"/>
+                <transition cond="not current_rendered_model" target="../../main">
+                    <raise event="move" scope="narrow" target="'parent/parent'">
+                        <parameter expr="self.as_element"/>
+                        <parameter expr="self.coordinates"/>
                     </raise>
-                </onentry>
-                <transition event="mv_response" target="../../main">
-                    <raise event="rerender_model" scope="narrow" target="'parent/parent'"/>
                 </transition>
             </state>
-        </state>
 
-        <state id="update_mv" initial="x">
             <state id="x">
                 <onentry>
                     <script>

+ 129 - 33
classes/window/main_window.xml

@@ -146,8 +146,10 @@
                             <parameter name="new_mapper"/>
                             <script>
                                 global current_mapper
-                                current_mapper = new_mapper
-                                print("Switch mapper to " + str(new_mapper))
+                                if new_mapper == "(none)":
+                                    current_mapper = None
+                                else:
+                                    current_mapper = new_mapper
                             </script>
                         </transition>
                         <transition event="change_rendered" target="../change_rendered">
@@ -169,6 +171,7 @@
                                 global current_model
                                 current_model = self.preload_model
                                 self.preload_model = None
+                                self.locations = {}
                             </script>
                         </transition>
                     </state>
@@ -386,9 +389,6 @@
 
                     <state id="change_metamodel">
                         <onentry>
-                            <script>
-                                print("MM -> " + current_metamodel)
-                            </script>
                             <raise event="update_status" scope="narrow" target="'progress_bar'">
                                 <parameter expr="20"/>
                                 <parameter expr="'Storing model context...'"/>
@@ -603,6 +603,7 @@
                                 <script>
                                     global current_model
                                     current_model = result
+                                    self.locations = {}
                                 </script>
                             </transition>
                         </state>
@@ -631,7 +632,6 @@
                                 <parameter name="result"/>
                                 <script>
                                     global current_metamodel
-                                    print("Allowed metamodels: " + str(result))
                                     if len(result) > 0:
                                         current_metamodel = next(iter(result))
                                     else:
@@ -657,25 +657,26 @@
                                     <parameter expr="'transformation_between'"/>
                                     <parameter expr="[{'abstract': current_metamodel, 'rendered': 'formalisms/MM_render/graphical'}, {'rendered': 'formalisms/MM_render/graphical'}]"/>
                                 </raise>
-                                <script>
-                                    print("Finding transformation with current MM: " + current_metamodel)
-                                </script>
                             </onentry>
 
                             <transition event="mv_response" target="../check_CS_mapper">
                                 <parameter name="result"/>
                                 <script>
-                                    print("MM: " + str(current_metamodel))
-                                    print("Allowed mappers: " + str(result))
+                                    result.add("(none)")
                                     self.allowed_mappers = list(result)
                                     global current_mapper
-                                    if len(result) > 0:
-                                        if current_mapper not in result:
-                                            current_mapper = next(iter(result))
-                                            print("CHANGING MAPPER TO " + str(current_mapper))
-                                    else:
-                                        current_mapper = None
-                                        print("NO MAPPER found")
+                                    if current_mapper not in result:
+                                        current_mapper = next(iter(result))
+                                        if current_mapper == "(none)":
+                                            current_mapper = None
+                                </script>
+                            </transition>
+
+                            <transition event="mv_exception" target="../check_CS_mapper">
+                                <script>
+                                    self.allowed_mappers = ["(none)"]
+                                    global current_mapper
+                                    current_mapper = None
                                 </script>
                             </transition>
                         </state>
@@ -689,6 +690,7 @@
                                 </script>
                                 <raise event="clear_canvas" scope="narrow" target="'canvas'"/>
                             </transition>
+
                             <transition cond="current_mapper is not None" target="../search_CS_rendered"/>
                         </state>
 
@@ -703,19 +705,20 @@
                             <transition event="mv_response" target="../store_metamodel">
                                 <parameter name="result"/>
                                 <script>
-                                    print("Allowed rendered: " + str(result))
-                                    print("Current mapper: " + str(current_mapper))
                                     self.allowed_rendered = list(result)
+
+                                    self.allowed_rendered.append("(none)")
                                     global current_rendered_model
 
                                     if (len(result) > 0):
                                         if current_rendered_model not in result:
-                                            print("Reusing an existing rendered model")
                                             current_rendered_model = next(iter(result))
                                     else:
-                                        print("Creating new rendered model!")
                                         current_rendered_model = "rendered/%s" % str(uuid.uuid4())
                                         self.allowed_rendered.append(current_rendered_model)
+
+                                    if current_rendered_model == "(none)":
+                                        current_rendered_model = None
                                 </script>
                             </transition>
                         </state>
@@ -826,6 +829,7 @@
                                     global current_model
                                     self.subwindow = association_name
                                     current_model = ""
+                                    self.locations = {}
                                 </script>
                             </transition>
                         </state>
@@ -836,6 +840,7 @@
                                 <script>
                                     global current_model
                                     current_model = results["Model name"]
+                                    self.locations = {}
                                 </script>
                             </transition>
 
@@ -1021,14 +1026,7 @@
                             </state>
 
                             <state id="pack_dsl_toolbar">
-                                <transition event="tk_widget" cond="current_mapper is None" target="../../../idle">
-                                    <parameter name="tk_elem"/>
-                                    <script>
-                                        tk_elem.pack(anchor=tk.W)
-                                    </script>
-                                </transition>
-
-                                <transition event="tk_widget" cond="current_mapper is not None" target="../../request_render">
+                                <transition event="tk_widget" target="../../request_render">
                                     <parameter name="tk_elem"/>
                                     <script>
                                         tk_elem.pack(anchor=tk.W)
@@ -1040,8 +1038,8 @@
                         <state id="request_render">
                             <onentry>
                                 <raise event="mv_request" scope="broad">
-                                    <parameter expr="'model_render'"/>
-                                    <parameter expr="[current_model, current_mapper, current_rendered_model]"/>
+                                    <parameter expr="'model_render' if current_rendered_model else 'element_list_nice'"/>
+                                    <parameter expr="[current_model, current_mapper, current_rendered_model] if current_rendered_model else [current_model]"/>
                                 </raise>
                                 <raise event="update_status" scope="narrow" target="'progress_bar'">
                                     <parameter expr="50"/>
@@ -1049,12 +1047,93 @@
                                 </raise>
                             </onentry>
 
-                            <transition event="mv_response" target="../render_model">
+                            <transition event="mv_response" cond="current_rendered_model" target="../render_model">
                                 <parameter name="result"/>
                                 <script>
                                     self.rendered = result
                                 </script>
                             </transition>
+
+                            <transition event="mv_response" cond="not current_rendered_model" target="../render_model">
+                                <parameter name="result"/>
+                                <script>
+                                    print("Got result: " + str(result))
+                                    print("Finding elements:")
+                                    self.rendered = []
+
+                                    group_counter = 0
+                                    groups = {}
+                                    edges = []
+
+                                    for elem in list(result):
+                                        print("Got element: " + str(elem))
+                                        is_edge = False
+                                        attrs = {}
+                                        for key, value in elem.items():
+                                            if key == "id":
+                                                element_id = value
+                                            elif key == "__source":
+                                                element_source = value
+                                                is_edge = True
+                                            elif key == "__target":
+                                                element_target = value
+                                                is_edge = True
+                                            elif key == "type":
+                                                element_type = value
+                                            else:
+                                                attrs[key] = value
+                                        print("ID: " + str(element_id))
+                                        print("Is association: " + str(is_edge))
+                                        print("Type: " + str(element_type))
+                                        print("Attributes: " + str(attrs))
+                                        max_text = 0
+
+                                        if is_edge:
+                                            cs_elem_id = str(uuid.uuid4())
+                                            edges.append({"id": cs_elem_id, "type": "ConnectingLine", "offsetSourceX": 0, "offsetSourceY": 0, "offsetTargetX": 0, "offsetTargetY": 0, "lineWidth": 1, "lineColour": "black", "arrow": True, "__asid": element_id, "layer": 0, "__source": element_source, "__target": element_target})
+                                            groups[element_id] = cs_elem_id
+                                        else:
+                                            # Add the group
+                                            print("Searching location in " + str(self.locations))
+                                            x, y = self.locations.get(element_id, (30 + (group_counter * 150) % 1000, 30 + ((group_counter / 10) * 150)))
+                                            self.rendered.append({"id": str(group_counter), "type": "Group", "x": x, "y": y, "__asid": element_id})
+                                            self.locations[element_id] = (x, y)
+                                            group_id = str(group_counter)
+                                            groups[element_id] = group_id
+                                            group_counter += 1
+
+                                            # Add the text elements
+                                            # First the header
+                                            cs_elem_id = str(uuid.uuid4())
+                                            self.rendered.append({"id": cs_elem_id, "type": "Text", "x": 10, "y": 10, "text": "%s : %s" % (element_id, element_type), "lineWidth": 1, "lineColour": "black", "layer": 2})
+                                            self.rendered.append({"id": str(uuid.uuid4()), "type": "contains", "__source": group_id, "__target": cs_elem_id})
+                                            max_text = max(len("%s : %s" % (element_id, element_type)), max_text)
+                                            # Then the attributes
+                                            text_counter = 0
+                                            for key, value in attrs.items():
+                                                cs_elem_id = str(uuid.uuid4())
+                                                self.rendered.append({"id": cs_elem_id, "type": "Text", "x": 10, "y": 25 + text_counter * 11, "text": "%s = %s" % (key, value), "lineWidth": 1, "lineColour": "black", "layer": 2})
+                                                max_text = max(len("%s = %s" % (key, value)), max_text)
+                                                self.rendered.append({"id": str(uuid.uuid4()), "type": "contains", "__source": group_id, "__target": cs_elem_id})
+                                                text_counter += 1
+
+                                            # Add the rectangle
+                                            cs_elem_id = str(uuid.uuid4())
+                                            self.rendered.append({"id": cs_elem_id, "type": "Rectangle", "x": 0, "y": 0, "width": max_text * 8, "height": 35 + text_counter * 11, "lineWidth": 1, "lineColour": "black", "fillColour": "white", "layer": 1})
+                                            self.rendered.append({"id": str(uuid.uuid4()), "type": "contains", "__source": group_id, "__target": cs_elem_id})
+
+                                            # Add the line
+                                            cs_elem_id = str(uuid.uuid4())
+                                            self.rendered.append({"id": cs_elem_id, "type": "Line", "x": 0, "y": 20, "targetX": max_text * 8, "targetY": 20, "lineWidth": 1, "lineColour": "black", "layer": 0, "arrow": False})
+                                            self.rendered.append({"id": str(uuid.uuid4()), "type": "contains", "__source": group_id, "__target": cs_elem_id})
+
+                                    for edge in edges:
+                                        edge["__source"] = groups[edge["__source"]]
+                                        edge["__target"] = groups[edge["__target"]]
+                                        self.rendered.append(edge)
+                                </script>
+                            </transition>
+
                             <transition event="mv_exception" target="../../../close"/>
                         </state>
 
@@ -1070,6 +1149,10 @@
                                     self.contains = [i for i in self.rendered if i["type"] == "contains"]
                                     self.rendered = [i for i in self.rendered if i["type"] not in ["Group", "contains"]]
                                     self.rendered.reverse()
+                                    print("Got elements to render:")
+                                    print("Groups: " + str(self.groups))
+                                    print("Contains: " + str(self.contains))
+                                    print("Others: " + str(self.rendered))
                                 </script>
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'alter_context'"/>
@@ -1147,6 +1230,19 @@
                     </transition>
                 </state>
             </state>
+
+            <state id="mover">
+                <state id="move">
+                    <transition event="move" target=".">
+                        <parameter name="asid"/>
+                        <parameter name="location"/>
+                        <script>
+                            print("MOVE LOCATION")
+                            self.locations[asid] = location
+                        </script>
+                    </transition>
+                </state>
+            </state>
         </parallel>
     </scxml>
 </class>

Разлика између датотеке није приказан због своје велике величине
+ 420 - 236
frontend.py


+ 13 - 17
models/render_OD.alc

@@ -64,23 +64,19 @@ Boolean function main(model : Element):
 					Element related_groups
 					group = as_to_cs[class]
 
-					if (bool_not(read_attribute(model, group, "dirty"))):
-						dict_add(groups, class, group)
-						continue!
-					else:
-						group = as_to_cs[class]
-						to_remove = allAssociationDestinations(model, group, "rendered/contains")
-						x = create_value(read_attribute(model, group, "x"))
-						y = create_value(read_attribute(model, group, "y"))
-
-						while (set_len(to_remove) > 0):
-							elem_to_remove = set_pop(to_remove)
-							if (read_type(model, elem_to_remove) == "rendered/Group"):
-								set_add(to_remove, elem_to_remove)
-							else:
-								model_delete_element(model, elem_to_remove)
-						model_delete_element(model, group)
-						dict_delete(as_to_cs, class)
+					group = as_to_cs[class]
+					to_remove = allAssociationDestinations(model, group, "rendered/contains")
+					x = create_value(read_attribute(model, group, "x"))
+					y = create_value(read_attribute(model, group, "y"))
+
+					while (set_len(to_remove) > 0):
+						elem_to_remove = set_pop(to_remove)
+						if (read_type(model, elem_to_remove) == "rendered/Group"):
+							set_add(to_remove, elem_to_remove)
+						else:
+							model_delete_element(model, elem_to_remove)
+					model_delete_element(model, group)
+					dict_delete(as_to_cs, class)
 
 				if (dict_in(groups, class)):
 					// Already rendered this, so skip

+ 12 - 30
models/render_SCD.alc

@@ -46,39 +46,21 @@ Boolean function main(model : Element):
 		// Check if there is already an associated element
 		if (set_len(allOutgoingAssociationInstances(model, class, "TracabilityClass")) > 0):
 			// Yes, but is it still clean?
-			Boolean dirty
-			dirty = False
-
 			related_groups = allAssociationDestinations(model, class, "TracabilityClass")
+			Element to_remove
+			String elem_to_remove
 			while (set_len(related_groups) > 0):
 				group = set_pop(related_groups)
-				if (value_eq(read_attribute(model, group, "dirty"), True)):
-					// No, so mark all as dirty
-					dirty = True
-					break!
-				else:
-					// Yes, so just ignore this!
-					continue!
-
-			if (bool_not(dirty)):
-				dict_add(groups, class, group)
-				continue!
-			else:
-				related_groups = allAssociationDestinations(model, class, "TracabilityClass")
-				Element to_remove
-				String elem_to_remove
-				while (set_len(related_groups) > 0):
-					group = set_pop(related_groups)
-					to_remove = allAssociationDestinations(model, group, "rendered/contains")
-					x = create_value(read_attribute(model, group, "x"))
-					y = create_value(read_attribute(model, group, "y"))
-					while (set_len(to_remove) > 0):
-						elem_to_remove = set_pop(to_remove)
-						if (read_type(model, elem_to_remove) == "rendered/Group"):
-							set_add(to_remove, elem_to_remove)
-						else:
-							model_delete_element(model, elem_to_remove)
-					model_delete_element(model, group)
+				to_remove = allAssociationDestinations(model, group, "rendered/contains")
+				x = create_value(read_attribute(model, group, "x"))
+				y = create_value(read_attribute(model, group, "y"))
+				while (set_len(to_remove) > 0):
+					elem_to_remove = set_pop(to_remove)
+					if (read_type(model, elem_to_remove) == "rendered/Group"):
+						set_add(to_remove, elem_to_remove)
+					else:
+						model_delete_element(model, elem_to_remove)
+				model_delete_element(model, group)
 
 		attr_keys = dict_keys(getAttributeList(model, class))
 		text_loc = 5