ソースを参照

Add delete option (right click + control)

Yentl Van Tendeloo 8 年 前
コミット
5918198034

+ 80 - 41
classes/canvas/canvas.xml

@@ -67,7 +67,7 @@
                         </script>
                     </transition>
 
-                    <transition event="right-click" cond="self.currently_selected is not None and id(self) == ID" target="../creating_element">
+                    <transition event="right-click" cond="self.currently_selected is not None and id(self) == ID and not control_pressed" target="../creating_element">
                         <parameter name="ID"/>
                         <script>
                             self.create_location = (self.last_x, self.last_y)
@@ -170,7 +170,7 @@
                             </script>
                         </transition>
 
-                        <transition event="right-click" cond="ID == id(self)" target="../../ready">
+                        <transition event="right-click" cond="ID == id(self) and not control_pressed" target="../../ready">
                             <parameter name="ID"/>
                             <script>
                                 self.delete(self.tmp_line)
@@ -217,53 +217,92 @@
                                     self.assoc_type = self.allowed_types.pop()
                                 </script>
                             </transition>
-                            <transition cond="len(self.allowed_types) > 1" target="../request_user"/>
-                        </state>
-
-                        <state id="request_user">
-                            <onentry>
-                                <raise event="create_instance" scope="cd">
-                                    <parameter expr="'prompt'"/>
-                                    <parameter expr="'ChoicePrompt'"/>
-                                    <parameter expr="'Pick desired link type:'"/>
-                                    <parameter expr="self.allowed_types"/>
-                                </raise>
-                            </onentry>
-
-                            <transition event="instance_created" target="../wait_for_response">
-                                <parameter name="assoc_name"/>
-                                <raise event="start_instance" scope="cd">
-                                    <parameter expr="assoc_name"/>
-                                </raise>
+                            <transition cond="len(self.allowed_types) > 1" target="../request_user">
                                 <script>
-                                    self.assoc_type = None
+                                    self.allowed_types = list(self.allowed_types)
                                 </script>
                             </transition>
                         </state>
 
-                        <state id="wait_for_response">
-                            <transition event="choice_result" target=".">
-                                <parameter name="result"/>
+                        <state id="request_user" initial="check_next">
+                            <onentry>
                                 <script>
-                                    self.assoc_type = result
+                                    self.new_allowed_types = {}
                                 </script>
-                            </transition>
-
-                            <transition event="close_window" cond="self.assoc_type is not None" target="../create">
-                                <raise event="delete_instance" scope="cd">
-                                    <parameter expr="'prompt'"/>
-                                </raise>
-                            </transition>
+                            </onentry>
 
-                            <transition event="close_window" cond="self.assoc_type is None" target="../../../ready">
-                                <raise event="delete_instance" scope="cd">
-                                    <parameter expr="'prompt'"/>
-                                </raise>
-                                <script>
-                                    self.delete(self.tmp_line)
-                                    self.tmp_line = None
-                                </script>
-                            </transition>
+                            <state id="check_next">
+                                <transition cond="len(self.allowed_types) > 0" target="../convert_to_name"/>
+                                <transition cond="len(self.allowed_types) == 0" target="../request">
+                                    <script>
+                                        self.allowed_types = self.new_allowed_types
+                                    </script>
+                                </transition>
+                            </state>
+
+                            <state id="convert_to_name">
+                                <onentry>
+                                    <raise event="mv_request" scope="broad">
+                                        <parameter expr="'read_attrs'"/>
+                                        <parameter expr="[current_metamodel, self.allowed_types[0]]"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="mv_response" target="../check_next">
+                                    <parameter name="result"/>
+                                    <script>
+                                        if 'name' in result and result['name'] != "null":
+                                            self.new_allowed_types[result['name'][1:-1]] = self.allowed_types[0]
+                                        self.allowed_types.pop(0)
+                                    </script>
+                                </transition>
+                            </state>
+
+                            <state id="request">
+                                <onentry>
+                                    <raise event="create_instance" scope="cd">
+                                        <parameter expr="'prompt'"/>
+                                        <parameter expr="'ChoicePrompt'"/>
+                                        <parameter expr="'Pick desired link type:'"/>
+                                        <parameter expr="self.allowed_types.keys()"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="instance_created" target="../wait_for_response">
+                                    <parameter name="assoc_name"/>
+                                    <raise event="start_instance" scope="cd">
+                                        <parameter expr="assoc_name"/>
+                                    </raise>
+                                    <script>
+                                        self.assoc_type = None
+                                    </script>
+                                </transition>
+                            </state>
+
+                            <state id="wait_for_response">
+                                <transition event="choice_result" target=".">
+                                    <parameter name="result"/>
+                                    <script>
+                                        self.assoc_type = self.allowed_types[result]
+                                    </script>
+                                </transition>
+
+                                <transition event="close_window" cond="self.assoc_type is not None" target="../../create">
+                                    <raise event="delete_instance" scope="cd">
+                                        <parameter expr="'prompt'"/>
+                                    </raise>
+                                </transition>
+
+                                <transition event="close_window" cond="self.assoc_type is None" target="../../../../ready">
+                                    <raise event="delete_instance" scope="cd">
+                                        <parameter expr="'prompt'"/>
+                                    </raise>
+                                    <script>
+                                        self.delete(self.tmp_line)
+                                        self.tmp_line = None
+                                    </script>
+                                </transition>
+                            </state>
                         </state>
 
                         <state id="create">

+ 23 - 3
classes/canvas/canvas_element.xml

@@ -131,18 +131,18 @@
                 </script>
             </transition>
 
-            <transition event="left-click" cond="id(self) == ID" target="../dragging">
+            <transition event="left-click" cond="id(self) == ID and not control_pressed" target="../dragging">
                 <parameter name="ID"/>
                 <script>
                     self.original_coords = self.last_x, self.last_y
                 </script>
             </transition>
 
-            <transition event="middle-click" cond="id(self) == ID" target="../update_attrs">
+            <transition event="middle-click" cond="id(self) == ID and not control_pressed" target="../update_attrs">
                 <parameter name="ID"/>
             </transition>
 
-            <transition event="right-click" cond="id(self) == ID" target=".">
+            <transition event="right-click" cond="id(self) == ID and not control_pressed" target=".">
                 <parameter name="ID"/>
                 <script>
                     print("Right click in element " + str(self.cs_element))
@@ -153,6 +153,26 @@
                     <parameter expr="(self.last_x, self.last_y)"/>
                 </raise>
             </transition>
+
+            <transition event="right-click" cond="id(self) == ID and control_pressed" target="../remove_element">
+                <parameter name="ID"/>
+            </transition>
+        </state>
+
+        <state id="remove_element">
+            <onentry>
+                <raise event="mv_request" scope="broad">
+                    <parameter expr="'delete_element'"/>
+                    <parameter expr="[current_model, self.as_element]"/>
+                </raise>
+                <script>
+                    for f in self.elements:
+                        self.containing_canvas.delete(f)
+                    self.elements = {}
+                </script>
+            </onentry>
+
+            <transition event="mv_response" target="../main"/>
         </state>
 
         <state id="dragging">

+ 13 - 1
classes/canvas/connecting_line.xml

@@ -73,10 +73,22 @@
         </state>
 
         <state id="main">
-            <transition event="middle-click" cond="id(self) == ID" target="../update_attrs">
+            <transition event="middle-click" cond="id(self) == ID and not control_pressed" target="../update_attrs">
                 <parameter name="ID"/>
             </transition>
 
+            <transition event="right-click" cond="id(self) == ID and not control_pressed" target=".">
+                <parameter name="ID"/>
+                <script>
+                    print("Right click in element " + str(self.cs_element))
+                </script>
+                <raise event="create_line" scope="narrow" target="'parent'">
+                    <parameter expr="self.cs_element['id']"/>
+                    <parameter expr="self.as_element"/>
+                    <parameter expr="(self.last_x, self.last_y)"/>
+                </raise>
+            </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"/>

+ 12 - 1
classes/main_app.xml

@@ -163,7 +163,7 @@
                                 </raise>
                             </onentry>
 
-                            <transition event="mv_response" target="../upload_models">
+                            <transition event="mv_response" target="../register_SCD">
                                 <raise event="update_status" scope="narrow" target="self.splash_window">
                                     <parameter expr="70"/>
                                     <parameter expr="'Logging in... OK'"/>
@@ -178,6 +178,17 @@
                             </transition>
                         </state>
 
+                        <state id="register_SCD">
+                            <onentry>
+                                <raise event="mv_request">
+                                    <parameter expr="'alter_context'"/>
+                                    <parameter expr="['formalisms/SimpleClassDiagrams', 'formalisms/SimpleClassDiagrams']"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="mv_response" target="../upload_models"/>
+                        </state>
+
                         <state id="upload_models" initial="upload_MM_render">
                             <state id="upload_MM_render">
                                 <onentry>

+ 1 - 1
classes/modelverse/modelverse.xml

@@ -1188,7 +1188,7 @@
                     <state id="delete_element">
                         <onentry>
                             <raise event="request">
-                                <parameter expr="['delete_element', self.parameters[1]]"/>
+                                <parameter expr="['delete', self.parameters[1]]"/>
                             </raise>
                         </onentry>
 

+ 25 - 3
classes/toolbar/dsl_toolbar.xml

@@ -14,7 +14,6 @@
         <body>
             print("Got elements: " + str(elements))
             self.to_create = [i[0] for i in elements if i[1] == "Class"]
-            self.button_info = {i: "Instantiate element %s" % i for i in self.to_create}
             self.buttons = {}
             tk.Label(self, text="Domain-Specific").pack(side=tk.LEFT)
             self.currently_active = None
@@ -26,7 +25,7 @@
     </destructor>
 
     <scxml initial="init">
-        <state id="init" initial="init_buttons">
+        <state id="init" initial="next_button">
             <onexit>
                 <raise event="tk_widget" scope="narrow" target="'parent'">
                     <parameter expr="self"/>
@@ -34,11 +33,34 @@
             </onexit>
 
             <state id="init_buttons">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'read_attrs'"/>
+                        <parameter expr="[current_metamodel, self.to_create[0]]"/>
+                    </raise>
+                </onentry>
+
+                <transition event="mv_response" cond="'name' in result and result['name'] != 'null'" target="../create_buttons">
+                    <parameter name="result"/>
+                    <script>
+                        self.button_text = result["name"][1:-1]
+                    </script>
+                </transition>
+                <transition event="mv_response" cond="'name' not in result or result['name'] == 'null'" target="../next_button">
+                    <parameter name="result"/>
+                    <script>
+                        print("Skipping button for %s as it has no name attribute defined" % self.to_create[0])
+                        self.to_create.pop(0)
+                    </script>
+                </transition>
+            </state>
+            
+            <state id="create_buttons">
                 <onentry>
                     <raise event="create_instance" scope="cd">
                         <parameter expr="'buttons'"/>
                         <parameter expr="'Button'"/>
-                        <parameter expr="{'parent': self, 'visual': TextVisual(self.to_create[0]), 'tooltip_text': self.button_info[self.to_create[0]], 'event_parameters': self.to_create[0]}"/>
+                        <parameter expr="{'parent': self, 'visual': TextVisual(self.button_text), 'tooltip_text': 'Instantiate element %s' % self.button_text, 'event_parameters': self.to_create[0]}"/>
                     </raise>
                 </onentry>
 

ファイルの差分が大きいため隠しています
+ 874 - 846
classes/window/main_window.xml


ファイルの差分が大きいため隠しています
+ 1058 - 873
frontend.py


+ 20 - 2
models/render_SCD.alc

@@ -12,11 +12,27 @@ Boolean function main(model : Element):
 	String elem
 	Integer loc
 	Integer text_loc
+	Element related_groups
 	loc = 10
 
 	Element groups
 	groups = dict_create()
 
+	elements = allInstances(model, "rendered/Group")
+	while (set_len(elements) > 0):
+		group = set_pop(elements)
+		if (set_len(allIncomingAssociationInstances(model, group, "TracabilityClass")) == 0):
+			Element to_remove
+			String elem_to_remove
+			to_remove = allAssociationDestinations(model, group, "rendered/contains")
+			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)
+
 	elements = allInstances(model, "abstract/Class")
 	while (set_len(elements) > 0):
 		class = set_pop(elements)
@@ -29,7 +45,6 @@ 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?
-			Element related_groups
 			Boolean dirty
 			dirty = False
 
@@ -104,7 +119,10 @@ Boolean function main(model : Element):
 		instantiate_attribute(model, elem, "y", 3)
 		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))
+		if (element_neq(read_attribute(model, class, "name"), read_root())):
+			instantiate_attribute(model, elem, "text", string_join(read_attribute(model, class, "name"), "  " + multiplicities))
+		else:
+			instantiate_attribute(model, elem, "text", "(unnamed) " + multiplicities)
 		instantiate_attribute(model, elem, "layer", 2)
 		instantiate_link(model, "rendered/contains", "", group, elem)