Browse Source

Allow moving of elements, which updates the CS in the Mv

Yentl Van Tendeloo 7 years ago
parent
commit
bf2e017f12

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+*.pyc

BIN
classes/canvas/.canvas_element.xml.swp


+ 46 - 3
classes/canvas/canvas_element.xml

@@ -13,7 +13,8 @@
         <body>
             self.containing_canvas = parent
             self.coordinates = coordinates
-            self.elements = []
+            self.elements = {}
+            self.tmp = {}
         </body>
     </constructor>
     <destructor>
@@ -39,7 +40,7 @@
                         result = None
 
                     if result is not None:
-                        self.elements.append(result)
+                        self.elements[result] = element["id"]
                         self.set_bindable_and_tagorid(self.containing_canvas, result)
                 </script>
             </transition>
@@ -70,12 +71,54 @@
                 </script>
             </transition>
 
-            <transition event="left-release" cond="id(self) == ID" target="../main">
+            <transition event="left-release" cond="id(self) == ID" target="../update_mv">
                 <parameter name="ID"/>
                 <script>
                     self.coordinates = self.coordinates[0] - (self.original_coords[0] - self.last_x), self.coordinates[1] - (self.original_coords[1] - self.last_y)
+                    self.to_update = dict(self.elements)
                 </script>
             </transition>
         </state>
+
+        <state id="update_mv" initial="init">
+            <state id="init">
+                <transition cond="len(self.to_update) > 0" target="../x">
+                    <script>
+                        tk_id, self.tmp["mv_id"] = self.to_update.popitem()
+                        self.tmp['x'], self.tmp['y'] = self.containing_canvas.coords(tk_id)[:2]
+                    </script>
+                </transition>
+
+                <transition cond="len(self.to_update) == 0" target="../../main"/>
+            </state>
+
+            <state id="x">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_assign'"/>
+                        <parameter expr="[current_rendered_model, self.tmp['mv_id'], 'x', self.tmp['x']]"/>
+                    </raise>
+                    <script>
+                        print("Update X")
+                    </script>
+                </onentry>
+
+                <transition event="mv_response" target="../y"/>
+            </state>
+
+            <state id="y">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_assign'"/>
+                        <parameter expr="[current_rendered_model, self.tmp['mv_id'], 'y', self.tmp['y']]"/>
+                    </raise>
+                    <script>
+                        print("Update Y")
+                    </script>
+                </onentry>
+
+                <transition event="mv_response" target="../init"/>
+            </state>
+        </state>
     </scxml>
 </class>

+ 3 - 0
classes/main_app.xml

@@ -291,6 +291,9 @@
                     <transition event="mv_request" target=".">
                         <parameter name="name"/>
                         <parameter name="params"/>
+                        <script>
+                            print("MV OPERATION " + str(name))
+                        </script>
                         <raise event="action" scope="narrow" target="'modelverse'">
                             <parameter expr="name"/>
                             <parameter expr="None"/>

+ 4 - 8
classes/modelverse/modelverse.xml

@@ -283,18 +283,12 @@
 
                     <state id="model_list">
                         <onentry>
-                            <script>
-                                print("DOING model_list")
-                            </script>
                             <raise event="request">
                                 <parameter expr="['model_list', self.parameters[0]]"/>
                             </raise>
                         </onentry>
 
                         <transition cond="self.expect_response_partial('Success: ', pop=False)" target="../../wait_for_action/history">
-                            <script>
-                                print("Got response to model_list")
-                            </script>
                             <raise event="result">
                                 <parameter expr="set(self.split_response(self.responses.pop(0)))"/>
                             </raise>
@@ -1583,7 +1577,8 @@
                             </script>
                         </transition>
 
-                        <transition cond="self.expect_action(None, ['element_list', 'element_list_nice', 'types', 'types_full', 'read_info', 'read_attrs', 'instantiate', 'delete_element', 'attr_assign', 'attr_assign_code', 'attr_delete', 'read_outgoing', 'read_incoming', 'read_association_source', 'read_association_destination', 'connections_between', 'define_attribute', 'all_instances'])" target="../../going_manual"/>
+                        <transition cond="self.expect_action(None, ['element_list', 'element_list_nice', 'types', 'types_full', 'read_info', 'read_attrs', 'instantiate', 'delete_element', 'attr_assign', 'attr_assign_code', 'attr_delete', 'read_outgoing', 'read_incoming', 'read_association_source', 'read_association_destination', 'connections_between', 'define_attribute', 'all_instances'])" target="../../going_manual">
+                        </transition>
                     </state>
 
                     <state id="modelling">
@@ -1759,7 +1754,8 @@
                         </raise>
                     </onentry>
 
-                    <transition cond="self.expect_response('Model loaded, ready for commands!', pop=True)" target="../wait_for_action/modelling/recognized/manual"/>
+                    <transition cond="self.expect_response('Model loaded, ready for commands!', pop=True)" target="../wait_for_action/modelling/recognized/manual">
+                    </transition>
 
                     <transition cond="self.expect_response_partial('No conformance relation can be found ', pop=False)" target="../wait_for_action/megamodelling">
                         <raise event="exception">

+ 46 - 19
classes/window/main_window.xml

@@ -13,8 +13,6 @@
         <super class="tk.TopLevel"/>
         <super class="SCCDWidget"/>
         <body>
-            self.current_model = None
-            self.metamodel = None
             self.toolbar_frame = tk.Frame(self)
             self.canvas_frame = tk.Frame(self)
             self.progressbar_frame = tk.Frame(self)
@@ -164,7 +162,8 @@
                     <transition event="browse_result" target="../got_model">
                         <parameter name="result"/>
                         <script>
-                            self.current_model = result
+                            global current_model
+                            current_model = result
                         </script>
                     </transition>
                 </state>
@@ -181,7 +180,7 @@
                     <onentry>
                         <raise event="mv_request" scope="broad">
                             <parameter expr="'model_types'"/>
-                            <parameter expr="[self.current_model]"/>
+                            <parameter expr="[current_model]"/>
                         </raise>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                             <parameter expr="10"/>
@@ -193,10 +192,11 @@
                         <parameter name="result"/>
                         <script>
                             print("Allowable types for this model: " + str(result))
+                            global current_metamodel
                             if len(result) > 0:
-                                self.metamodel = next(iter(result))
+                                current_metamodel = next(iter(result))
                             else:
-                                self.metamodel = ''
+                                current_metamodel = ''
                         </script>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                             <parameter expr="20"/>
@@ -210,7 +210,7 @@
                         <raise event="create_instance" scope="cd">
                             <parameter expr="'subwindow'"/>
                             <parameter expr="'PromptWindow'"/>
-                            <parameter expr="{'Metamodel name': self.metamodel}"/>
+                            <parameter expr="{'Metamodel name': current_metamodel}"/>
                             <parameter expr="{}"/>
                         </raise>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
@@ -234,11 +234,12 @@
                     <transition event="prompt_results" target=".">
                         <parameter name="results"/>
                         <script>
-                            self.metamodel = results["Metamodel name"]
+                            global current_metamodel
+                            current_metamodel = results["Metamodel name"]
                         </script>
                     </transition>
 
-                    <transition event="close_window" cond="self.metamodel != ''" target="../../rerender_model">
+                    <transition event="close_window" cond="current_metamodel != ''" target="../store_metamodel">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                         </raise>
@@ -248,16 +249,33 @@
                         </raise>
                     </transition>
 
-                    <transition event="close_window" cond="self.metamodel == ''" target="../../idle">
+                    <transition event="close_window" cond="current_metamodel == ''" target="../../idle">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                         </raise>
                         <script>
-                            self.current_model = None
-                            self.metamodel = None
+                            global current_model
+                            global current_metamodel
+                            current_model = None
+                            current_metamodel = None
                         </script>
                     </transition>
                 </state>
+
+                <state id="store_metamodel">
+                    <onentry>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'alter_context'"/>
+                            <parameter expr="[current_model, current_metamodel]"/>
+                        </raise>
+                        <raise event="update_status" scope="narrow" target="'progress_bar'">
+                            <parameter expr="45"/>
+                            <parameter expr="'Storing model context...'"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="mv_response" target="../../rerender_model"/>
+                </state>
             </state>
 
             <state id="create_new_model" initial="query_metamodel">
@@ -296,7 +314,8 @@
                     <transition event="browse_result" target="../got_mm">
                         <parameter name="result"/>
                         <script>
-                            self.metamodel = result
+                            global current_metamodel
+                            current_metamodel = result
                         </script>
                     </transition>
                 </state>
@@ -334,7 +353,7 @@
                         </raise>
                         <script>
                             self.subwindow = association_name
-                            self.current_model = ""
+                            current_model = ""
                         </script>
                     </transition>
                 </state>
@@ -343,11 +362,11 @@
                     <transition event="prompt_results" target=".">
                         <parameter name="results"/>
                         <script>
-                            self.current_model = results["Model name"]
+                            current_model = results["Model name"]
                         </script>
                     </transition>
 
-                    <transition event="close_window" cond="self.current_model != ''" target="../creating_model">
+                    <transition event="close_window" cond="current_model != ''" target="../creating_model">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                         </raise>
@@ -357,7 +376,7 @@
                         </raise>
                     </transition>
 
-                    <transition event="close_window" cond="self.current_model == ''" target="../../idle">
+                    <transition event="close_window" cond="current_model == ''" target="../../idle">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                         </raise>
@@ -368,7 +387,7 @@
                     <onentry>
                         <raise event="mv_request" scope="broad">
                             <parameter expr="'model_add'"/>
-                            <parameter expr="[self.current_model, self.metamodel, '']"/>
+                            <parameter expr="[current_model, current_metamodel, '']"/>
                         </raise>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                             <parameter expr="25"/>
@@ -390,8 +409,12 @@
                     <onentry>
                         <raise event="mv_request" scope="broad">
                             <parameter expr="'model_render'"/>
-                            <parameter expr="[self.current_model, 'models/render_SCD']"/>
+                            <parameter expr="[current_model, 'models/render_SCD']"/>
                         </raise>
+                        <script>
+                            global current_rendered_model
+                            current_rendered_model = "rendered/%s%s" % (current_model, 'models/render_SCD')
+                        </script>
                         <raise event="update_status" scope="narrow" target="'progress_bar'">
                             <parameter expr="50"/>
                             <parameter expr="'Perceptualizing model...'"/>
@@ -421,6 +444,10 @@
                             self.rendered = [i for i in self.rendered if i["type"] not in ["Group", "contains"]]
                             self.rendered.reverse()
                         </script>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'alter_context'"/>
+                            <parameter expr="['rendered/%s%s' % (current_model, 'models/render_SCD'), 'formalisms/MM_render']"/>
+                        </raise>
                     </onentry>
 
                     <state id="allocate_groups">

+ 124 - 45
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:   Wed Sep 13 14:34:26 2017
+Date:   Wed Sep 13 15:54:04 2017
 
 Model author: Yentl Van Tendeloo and Addis Gebremichael
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -17,6 +17,9 @@ import uuid
 import json
 import urllib
 
+global current_model
+global current_metamodel
+
 # package "Modelverse Visual Editor - Tkinter Version "
 
 class MainApp(RuntimeClassBase):
@@ -397,6 +400,7 @@ class MainApp(RuntimeClassBase):
     def _parallel_forward_requests_forward_1_exec(self, parameters):
         name = parameters[0]
         params = parameters[1]
+        print("MV OPERATION " + str(name))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'modelverse', Event("action", None, [name, None, None, params])]))
     
     def _parallel_forward_requests_forward_2_exec(self, parameters):
@@ -2143,7 +2147,6 @@ class Modelverse(RuntimeClassBase):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'http_client', 'HTTPClient']))
     
     def _initialized_behaviour_operations_model_list_enter(self):
-        print("DOING model_list")
         self.raiseInternalEvent(Event("request", None, [['model_list', self.parameters[0]]]))
     
     def _initialized_behaviour_operations_model_add_send_metadata_enter(self):
@@ -2592,7 +2595,6 @@ class Modelverse(RuntimeClassBase):
         return self.expect_response('Use the \'help\' command for a list of possible commands', pop=True)
     
     def _initialized_behaviour_operations_model_list_0_exec(self, parameters):
-        print("Got response to model_list")
         self.raiseInternalEvent(Event("result", None, [set(self.split_response(self.responses.pop(0)))]))
     
     def _initialized_behaviour_operations_model_list_0_guard(self, parameters):
@@ -3844,8 +3846,6 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def user_defined_constructor(self):
         tk.Toplevel.__init__(self)
         SCCDWidget.__init__(self)
-        self.current_model = None
-        self.metamodel = None
         self.toolbar_frame = tk.Frame(self)
         self.canvas_frame = tk.Frame(self)
         self.progressbar_frame = tk.Frame(self)
@@ -3923,55 +3923,59 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         # state /running/open_model/waiting_for_metamodel_name
         self.states["/running/open_model/waiting_for_metamodel_name"] = State(16, "/running/open_model/waiting_for_metamodel_name", self)
         
+        # state /running/open_model/store_metamodel
+        self.states["/running/open_model/store_metamodel"] = State(17, "/running/open_model/store_metamodel", self)
+        self.states["/running/open_model/store_metamodel"].setEnter(self._running_open_model_store_metamodel_enter)
+        
         # state /running/create_new_model
-        self.states["/running/create_new_model"] = State(17, "/running/create_new_model", self)
+        self.states["/running/create_new_model"] = State(18, "/running/create_new_model", self)
         
         # state /running/create_new_model/query_metamodel
-        self.states["/running/create_new_model/query_metamodel"] = State(18, "/running/create_new_model/query_metamodel", self)
+        self.states["/running/create_new_model/query_metamodel"] = State(19, "/running/create_new_model/query_metamodel", self)
         self.states["/running/create_new_model/query_metamodel"].setEnter(self._running_create_new_model_query_metamodel_enter)
         
         # state /running/create_new_model/wait_for_metamodel
-        self.states["/running/create_new_model/wait_for_metamodel"] = State(19, "/running/create_new_model/wait_for_metamodel", self)
+        self.states["/running/create_new_model/wait_for_metamodel"] = State(20, "/running/create_new_model/wait_for_metamodel", self)
         
         # state /running/create_new_model/got_mm
-        self.states["/running/create_new_model/got_mm"] = State(20, "/running/create_new_model/got_mm", self)
+        self.states["/running/create_new_model/got_mm"] = State(21, "/running/create_new_model/got_mm", self)
         
         # state /running/create_new_model/prompt_model_name
-        self.states["/running/create_new_model/prompt_model_name"] = State(21, "/running/create_new_model/prompt_model_name", self)
+        self.states["/running/create_new_model/prompt_model_name"] = State(22, "/running/create_new_model/prompt_model_name", self)
         self.states["/running/create_new_model/prompt_model_name"].setEnter(self._running_create_new_model_prompt_model_name_enter)
         
         # state /running/create_new_model/waiting_for_model_name
-        self.states["/running/create_new_model/waiting_for_model_name"] = State(22, "/running/create_new_model/waiting_for_model_name", self)
+        self.states["/running/create_new_model/waiting_for_model_name"] = State(23, "/running/create_new_model/waiting_for_model_name", self)
         
         # state /running/create_new_model/creating_model
-        self.states["/running/create_new_model/creating_model"] = State(23, "/running/create_new_model/creating_model", self)
+        self.states["/running/create_new_model/creating_model"] = State(24, "/running/create_new_model/creating_model", self)
         self.states["/running/create_new_model/creating_model"].setEnter(self._running_create_new_model_creating_model_enter)
         
         # state /running/rerender_model
-        self.states["/running/rerender_model"] = State(24, "/running/rerender_model", self)
+        self.states["/running/rerender_model"] = State(25, "/running/rerender_model", self)
         
         # state /running/rerender_model/request_render
-        self.states["/running/rerender_model/request_render"] = State(25, "/running/rerender_model/request_render", self)
+        self.states["/running/rerender_model/request_render"] = State(26, "/running/rerender_model/request_render", self)
         self.states["/running/rerender_model/request_render"].setEnter(self._running_rerender_model_request_render_enter)
         
         # state /running/rerender_model/render_model
-        self.states["/running/rerender_model/render_model"] = State(26, "/running/rerender_model/render_model", self)
+        self.states["/running/rerender_model/render_model"] = State(27, "/running/rerender_model/render_model", self)
         self.states["/running/rerender_model/render_model"].setEnter(self._running_rerender_model_render_model_enter)
         
         # state /running/rerender_model/render_model/allocate_groups
-        self.states["/running/rerender_model/render_model/allocate_groups"] = State(27, "/running/rerender_model/render_model/allocate_groups", self)
+        self.states["/running/rerender_model/render_model/allocate_groups"] = State(28, "/running/rerender_model/render_model/allocate_groups", self)
         
         # state /running/rerender_model/render_model/allocating_group
-        self.states["/running/rerender_model/render_model/allocating_group"] = State(28, "/running/rerender_model/render_model/allocating_group", self)
+        self.states["/running/rerender_model/render_model/allocating_group"] = State(29, "/running/rerender_model/render_model/allocating_group", self)
         
         # state /running/rerender_model/render_model/allocate_contains
-        self.states["/running/rerender_model/render_model/allocate_contains"] = State(29, "/running/rerender_model/render_model/allocate_contains", self)
+        self.states["/running/rerender_model/render_model/allocate_contains"] = State(30, "/running/rerender_model/render_model/allocate_contains", self)
         
         # state /running/rerender_model/render_model/render_elements
-        self.states["/running/rerender_model/render_model/render_elements"] = State(30, "/running/rerender_model/render_model/render_elements", self)
+        self.states["/running/rerender_model/render_model/render_elements"] = State(31, "/running/rerender_model/render_model/render_elements", self)
         
         # state /close
-        self.states["/close"] = State(31, "/close", self)
+        self.states["/close"] = State(32, "/close", self)
         self.states["/close"].setEnter(self._close_enter)
         
         # add children
@@ -3994,6 +3998,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/running/open_model"].addChild(self.states["/running/open_model/search_metamodels"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/prompt_metamodel"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/waiting_for_metamodel_name"])
+        self.states["/running/open_model"].addChild(self.states["/running/open_model/store_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/query_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/wait_for_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/got_mm"])
@@ -4098,7 +4103,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _running_open_model_waiting_for_metamodel_name_0.setAction(self._running_open_model_waiting_for_metamodel_name_0_exec)
         _running_open_model_waiting_for_metamodel_name_0.setTrigger(Event("prompt_results", None))
         self.states["/running/open_model/waiting_for_metamodel_name"].addTransition(_running_open_model_waiting_for_metamodel_name_0)
-        _running_open_model_waiting_for_metamodel_name_1 = Transition(self, self.states["/running/open_model/waiting_for_metamodel_name"], [self.states["/running/rerender_model"]])
+        _running_open_model_waiting_for_metamodel_name_1 = Transition(self, self.states["/running/open_model/waiting_for_metamodel_name"], [self.states["/running/open_model/store_metamodel"]])
         _running_open_model_waiting_for_metamodel_name_1.setAction(self._running_open_model_waiting_for_metamodel_name_1_exec)
         _running_open_model_waiting_for_metamodel_name_1.setTrigger(Event("close_window", None))
         _running_open_model_waiting_for_metamodel_name_1.setGuard(self._running_open_model_waiting_for_metamodel_name_1_guard)
@@ -4109,6 +4114,11 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _running_open_model_waiting_for_metamodel_name_2.setGuard(self._running_open_model_waiting_for_metamodel_name_2_guard)
         self.states["/running/open_model/waiting_for_metamodel_name"].addTransition(_running_open_model_waiting_for_metamodel_name_2)
         
+        # transition /running/open_model/store_metamodel
+        _running_open_model_store_metamodel_0 = Transition(self, self.states["/running/open_model/store_metamodel"], [self.states["/running/rerender_model"]])
+        _running_open_model_store_metamodel_0.setTrigger(Event("mv_response", None))
+        self.states["/running/open_model/store_metamodel"].addTransition(_running_open_model_store_metamodel_0)
+        
         # transition /running/create_new_model/query_metamodel
         _running_create_new_model_query_metamodel_0 = Transition(self, self.states["/running/create_new_model/query_metamodel"], [self.states["/running/create_new_model/wait_for_metamodel"]])
         _running_create_new_model_query_metamodel_0.setAction(self._running_create_new_model_query_metamodel_0_exec)
@@ -4219,6 +4229,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         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()
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', ['rendered/%s%s' % (current_model, 'models/render_SCD'), 'formalisms/MM_render']])]))
     
     def _init_generic_toolbar_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'toolbars', 'GenericToolbar', self.toolbar_frame]))
@@ -4237,13 +4248,17 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Browsing for model...'])]))
     
     def _running_open_model_search_metamodels_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_types', [self.current_model]])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_types', [current_model]])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Querying existing metamodels...'])]))
     
     def _running_open_model_prompt_metamodel_enter(self):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'PromptWindow', {'Metamodel name': self.metamodel}, {}]))
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'PromptWindow', {'Metamodel name': current_metamodel}, {}]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [30, 'Requesting desired metamodel...'])]))
     
+    def _running_open_model_store_metamodel_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', [current_model, current_metamodel]])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [45, 'Storing model context...'])]))
+    
     def _running_create_new_model_query_metamodel_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'Browser', 'Select metamodel to instantiate', ['formalisms/SimpleClassDiagrams']]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Browsing for metamodel...'])]))
@@ -4253,11 +4268,13 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Prompt model name...'])]))
     
     def _running_create_new_model_creating_model_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_add', [self.current_model, self.metamodel, '']])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_add', [current_model, current_metamodel, '']])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [25, 'Creating empty model...'])]))
     
     def _running_rerender_model_request_render_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_render', [self.current_model, 'models/render_SCD']])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_render', [current_model, 'models/render_SCD']])]))
+        global current_rendered_model
+        current_rendered_model = "rendered/%s%s" % (current_model, 'models/render_SCD')
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [50, 'Perceptualizing model...'])]))
     
     def _close_enter(self):
@@ -4302,7 +4319,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     def _running_open_model_wait_for_model_1_exec(self, parameters):
         result = parameters[0]
-        self.current_model = result
+        global current_model
+        current_model = result
     
     def _running_open_model_got_model_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
@@ -4310,10 +4328,11 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _running_open_model_search_metamodels_0_exec(self, parameters):
         result = parameters[0]
         print("Allowable types for this model: " + str(result))
+        global current_metamodel
         if len(result) > 0:
-            self.metamodel = next(iter(result))
+            current_metamodel = next(iter(result))
         else:
-            self.metamodel = ''
+            current_metamodel = ''
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [20, 'Querying existing metamodels... OK'])]))
     
     def _running_open_model_prompt_metamodel_0_exec(self, parameters):
@@ -4323,22 +4342,25 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     def _running_open_model_waiting_for_metamodel_name_0_exec(self, parameters):
         results = parameters[0]
-        self.metamodel = results["Metamodel name"]
+        global current_metamodel
+        current_metamodel = results["Metamodel name"]
     
     def _running_open_model_waiting_for_metamodel_name_1_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [40, 'Requesting desired metamodel... OK'])]))
     
     def _running_open_model_waiting_for_metamodel_name_1_guard(self, parameters):
-        return self.metamodel != ''
+        return current_metamodel != ''
     
     def _running_open_model_waiting_for_metamodel_name_2_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
-        self.current_model = None
-        self.metamodel = None
+        global current_model
+        global current_metamodel
+        current_model = None
+        current_metamodel = None
     
     def _running_open_model_waiting_for_metamodel_name_2_guard(self, parameters):
-        return self.metamodel == ''
+        return current_metamodel == ''
     
     def _running_create_new_model_query_metamodel_0_exec(self, parameters):
         association_name = parameters[0]
@@ -4350,7 +4372,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     def _running_create_new_model_wait_for_metamodel_1_exec(self, parameters):
         result = parameters[0]
-        self.metamodel = result
+        global current_metamodel
+        current_metamodel = result
     
     def _running_create_new_model_got_mm_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
@@ -4360,24 +4383,24 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         association_name = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
         self.subwindow = association_name
-        self.current_model = ""
+        current_model = ""
     
     def _running_create_new_model_waiting_for_model_name_0_exec(self, parameters):
         results = parameters[0]
-        self.current_model = results["Model name"]
+        current_model = results["Model name"]
     
     def _running_create_new_model_waiting_for_model_name_1_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [20, 'Prompt model name... OK'])]))
     
     def _running_create_new_model_waiting_for_model_name_1_guard(self, parameters):
-        return self.current_model != ''
+        return current_model != ''
     
     def _running_create_new_model_waiting_for_model_name_2_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
     
     def _running_create_new_model_waiting_for_model_name_2_guard(self, parameters):
-        return self.current_model == ''
+        return current_model == ''
     
     def _running_create_new_model_creating_model_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [40, 'Creating empty model... OK'])]))
@@ -5676,7 +5699,8 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         SCCDWidget.__init__(self, True)
         self.containing_canvas = parent
         self.coordinates = coordinates
-        self.elements = []
+        self.elements = {}
+        self.tmp = {}
     
     def user_defined_destructor(self):
         # call super class destructors
@@ -5696,11 +5720,30 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         # state /dragging
         self.states["/dragging"] = State(2, "/dragging", self)
         
+        # state /update_mv
+        self.states["/update_mv"] = State(3, "/update_mv", self)
+        
+        # state /update_mv/init
+        self.states["/update_mv/init"] = State(4, "/update_mv/init", self)
+        
+        # state /update_mv/x
+        self.states["/update_mv/x"] = State(5, "/update_mv/x", self)
+        self.states["/update_mv/x"].setEnter(self._update_mv_x_enter)
+        
+        # state /update_mv/y
+        self.states["/update_mv/y"] = State(6, "/update_mv/y", self)
+        self.states["/update_mv/y"].setEnter(self._update_mv_y_enter)
+        
         # add children
         self.states[""].addChild(self.states["/main"])
         self.states[""].addChild(self.states["/dragging"])
+        self.states[""].addChild(self.states["/update_mv"])
+        self.states["/update_mv"].addChild(self.states["/update_mv/init"])
+        self.states["/update_mv"].addChild(self.states["/update_mv/x"])
+        self.states["/update_mv"].addChild(self.states["/update_mv/y"])
         self.states[""].fixTree()
         self.states[""].default_state = self.states["/main"]
+        self.states["/update_mv"].default_state = self.states["/update_mv/init"]
         
         # transition /main
         _main_0 = Transition(self, self.states["/main"], [self.states["/main"]])
@@ -5719,11 +5762,40 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
         _dragging_0.setTrigger(Event("motion", None))
         _dragging_0.setGuard(self._dragging_0_guard)
         self.states["/dragging"].addTransition(_dragging_0)
-        _dragging_1 = Transition(self, self.states["/dragging"], [self.states["/main"]])
+        _dragging_1 = Transition(self, self.states["/dragging"], [self.states["/update_mv"]])
         _dragging_1.setAction(self._dragging_1_exec)
         _dragging_1.setTrigger(Event("left-release", None))
         _dragging_1.setGuard(self._dragging_1_guard)
         self.states["/dragging"].addTransition(_dragging_1)
+        
+        # transition /update_mv/init
+        _update_mv_init_0 = Transition(self, self.states["/update_mv/init"], [self.states["/update_mv/x"]])
+        _update_mv_init_0.setAction(self._update_mv_init_0_exec)
+        _update_mv_init_0.setTrigger(None)
+        _update_mv_init_0.setGuard(self._update_mv_init_0_guard)
+        self.states["/update_mv/init"].addTransition(_update_mv_init_0)
+        _update_mv_init_1 = Transition(self, self.states["/update_mv/init"], [self.states["/main"]])
+        _update_mv_init_1.setTrigger(None)
+        _update_mv_init_1.setGuard(self._update_mv_init_1_guard)
+        self.states["/update_mv/init"].addTransition(_update_mv_init_1)
+        
+        # transition /update_mv/x
+        _update_mv_x_0 = Transition(self, self.states["/update_mv/x"], [self.states["/update_mv/y"]])
+        _update_mv_x_0.setTrigger(Event("mv_response", None))
+        self.states["/update_mv/x"].addTransition(_update_mv_x_0)
+        
+        # transition /update_mv/y
+        _update_mv_y_0 = Transition(self, self.states["/update_mv/y"], [self.states["/update_mv/init"]])
+        _update_mv_y_0.setTrigger(Event("mv_response", None))
+        self.states["/update_mv/y"].addTransition(_update_mv_y_0)
+    
+    def _update_mv_x_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.tmp['mv_id'], 'x', self.tmp['x']]])]))
+        print("Update X")
+    
+    def _update_mv_y_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.tmp['mv_id'], 'y', self.tmp['y']]])]))
+        print("Update Y")
     
     def _main_0_exec(self, parameters):
         element = parameters[0]
@@ -5740,14 +5812,12 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
             result = None
         
         if result is not None:
-            self.elements.append(result)
+            self.elements[result] = element["id"]
             self.set_bindable_and_tagorid(self.containing_canvas, result)
     
     def _main_1_exec(self, parameters):
         ID = parameters[0]
-        print("LEFT CLICK on canvas element at " + str(self.coordinates))
         self.original_coords = self.last_x, self.last_y
-        print("Store click location: " + str(self.original_coords))
     
     def _main_1_guard(self, parameters):
         ID = parameters[0]
@@ -5773,14 +5843,23 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
     
     def _dragging_1_exec(self, parameters):
         ID = parameters[0]
-        print("Release at %s, so move coordinates" % str((self.last_x, self.last_y)))
         self.coordinates = self.coordinates[0] - (self.original_coords[0] - self.last_x), self.coordinates[1] - (self.original_coords[1] - self.last_y)
-        print("New coordinates of element: %s" % str(self.coordinates))
+        self.to_update = dict(self.elements)
     
     def _dragging_1_guard(self, parameters):
         ID = parameters[0]
         return id(self) == ID
     
+    def _update_mv_init_0_exec(self, parameters):
+        tk_id, self.tmp["mv_id"] = self.to_update.popitem()
+        self.tmp['x'], self.tmp['y'] = self.containing_canvas.coords(tk_id)[:2]
+    
+    def _update_mv_init_0_guard(self, parameters):
+        return len(self.to_update) > 0
+    
+    def _update_mv_init_1_guard(self, parameters):
+        return len(self.to_update) == 0
+    
     def initializeStatechart(self):
         # enter default state
         self.default_targets = self.states["/main"].getEffectiveTargetStates()

+ 3 - 0
frontend.xml

@@ -10,6 +10,9 @@
         import uuid
         import json
         import urllib
+        
+        global current_model
+        global current_metamodel
     </top>
 
     <inport name="input"/>