Browse Source

Define a canvas and preliminary rendering code

Yentl Van Tendeloo 8 years ago
parent
commit
10e79bd9e1

+ 73 - 14
classes/main_app.xml

@@ -163,13 +163,69 @@
                                 </raise>
                             </onentry>
 
-                            <transition event="mv_response" target="../../wait_close_splash">
+                            <transition event="mv_response" target="../upload_models">
                                 <raise event="update_status" scope="narrow" target="self.splash_window">
-                                    <parameter expr="100"/>
+                                    <parameter expr="70"/>
                                     <parameter expr="'Logging in... OK'"/>
                                 </raise>
                             </transition>
                         </state>
+
+                        <state id="upload_models" initial="upload_MM_render">
+                            <state id="upload_MM_render">
+                                <onentry>
+                                    <raise event="mv_request">
+                                        <parameter expr="'model_add'"/>
+                                        <parameter expr="['formalisms/MM_render', 'formalisms/SimpleClassDiagrams', open('models/MM_render.mvc', 'r').read()]"/>
+                                    </raise>
+                                    <raise event="update_status" scope="narrow" target="self.splash_window">
+                                        <parameter expr="75"/>
+                                        <parameter expr="'Uploading MM render...'"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="mv_exception" target="../upload_render_SCD"/>
+                                <transition event="mv_response" target="../upload_render_SCD"/>
+                            </state>
+
+                            <state id="upload_render_SCD">
+                                <onentry>
+                                    <raise event="mv_request">
+                                        <parameter expr="'transformation_add_AL'"/>
+                                        <parameter expr="[{'MM_RENDER': 'formalisms/MM_render', 'SCD': 'formalisms/SimpleClassDiagrams'}, {'MM_RENDER': 'formalisms/MM_render', 'SCD': 'formalisms/SimpleClassDiagrams'}, 'models/render_SCD', open('models/render_SCD.alc', 'r').read()]"/>
+                                    </raise>
+                                    <raise event="update_status" scope="narrow" target="self.splash_window">
+                                        <parameter expr="80"/>
+                                        <parameter expr="'Uploading render_SCD...'"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="mv_exception" target="../../../wait_close_splash"/>
+                                <transition event="mv_response" target="../modify_render_SCD">
+                                    <parameter name="context"/>
+                                    <script>
+                                        self.context = context
+                                    </script>
+                                </transition>
+                            </state>
+
+                            <state id="modify_render_SCD">
+                                <onentry>
+                                    <raise event="mv_request_context">
+                                        <parameter expr="'exit'"/>
+                                        <parameter expr="[]"/>
+                                        <parameter expr="self.context"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="mv_exception" target="../../../wait_close_splash"/>
+                                <transition event="mv_response" target="../../../wait_close_splash">
+                                    <script>
+                                        self.context = None
+                                    </script>
+                                </transition>
+                            </state>
+                        </state>
                     </state>
 
                     <state id="wait_close_splash">
@@ -216,28 +272,30 @@
                         </script>
                     </onentry>
                 </state>
-
-                <transition event="mv_exception" target="stopped">
-                    <parameter name="ID"/>
-                    <parameter name="exception_name"/>
-                    <parameter name="exception"/>
-                    <script>
-                        print("Got uncaught exception from Modelverse: " + str(exception_name))
-                        print("Parameters: " + str(exception))
-                    </script>
-                </transition>
             </state>
 
             <state id="forward_requests">
                 <state id="forward">
+                    <transition event="mv_request_context" target=".">
+                        <parameter name="name"/>
+                        <parameter name="params"/>
+                        <parameter name="context" default="None"/>
+                        <raise event="action" scope="narrow" target="'modelverse'">
+                            <parameter expr="name"/>
+                            <parameter expr="None"/>
+                            <parameter expr="context"/>
+                            <parameter expr="params"/>
+                        </raise>
+                    </transition>
+
                     <transition event="mv_request" target=".">
                         <parameter name="name"/>
-                        <parameter name="parameters"/>
+                        <parameter name="params"/>
                         <raise event="action" scope="narrow" target="'modelverse'">
                             <parameter expr="name"/>
                             <parameter expr="None"/>
                             <parameter expr="None"/>
-                            <parameter expr="parameters"/>
+                            <parameter expr="params"/>
                         </raise>
                     </transition>
 
@@ -253,6 +311,7 @@
                     </transition>
 
                     <transition event="mv_exception" target=".">
+                        <parameter name="ID"/>
                         <parameter name="exception_name"/>
                         <parameter name="exception"/>
                         <raise event="mv_exception" scope="broad">

+ 9 - 6
classes/window/browser.xml

@@ -5,7 +5,7 @@
         <association name="buttons" class="Button"/>
         <association name="labels" class="Label"/>
         <association name="parent" class="A"/>
-        <association name="progressbar" class="Progressbar"/>
+        <association name="progressbar" class="ProgressBar"/>
     </relationships>
 
     <constructor>
@@ -17,10 +17,13 @@
             tk.Label(self, text=prompt).pack()
 
             self.button_frame = tk.Frame(self)
-            self.button_frame.pack()
+            self.button_frame.pack(fill=tk.X)
+
+            self.progressbar_frame = tk.Frame(self)
+            self.progressbar_frame.pack(fill=tk.X)
 
             self.browser_frame = tk.Frame(self)
-            self.browser_frame.pack()
+            self.browser_frame.pack(fill=tk.BOTH)
 
             self.current_location = ""
             self.selected_label = None
@@ -62,7 +65,7 @@
                 <transition event="tk_widget" target="../button_back">
                     <parameter name="tk_elem"/>
                     <script>
-                        tk_elem.grid(row=0, column=0)
+                        tk_elem.pack(fill=tk.BOTH, expand=tk.TRUE)
                     </script>
                 </transition>
             </state>
@@ -92,7 +95,7 @@
                 <transition event="tk_widget" target="../progressbar">
                     <parameter name="tk_elem"/>
                     <script>
-                        tk_elem.grid(row=0, column=1)
+                        tk_elem.pack(fill=tk.BOTH, expand=tk.TRUE)
                     </script>
                 </transition>
             </state>
@@ -122,7 +125,7 @@
                 <transition event="tk_widget" target="../../root">
                     <parameter name="tk_elem"/>
                     <script>
-                        tk_elem.grid(row=1, column=0, columnspan=2)
+                        tk_elem.pack(fill=tk.BOTH, expand=tk.TRUE)
                     </script>
                 </transition>
             </state>

+ 130 - 25
classes/window/main_window.xml

@@ -4,7 +4,9 @@
         <inheritance class="SCCDWidget" priority="0"/>
         <association name="parent" class="A"/>
         <association name="toolbars" class="Toolbar"/>
-        <association name="browsers" class="Browser"/>
+        <association name="subwindow" class="Window"/>
+        <association name="canvas" class="Canvas"/>
+        <association name="progress_bar" class="ProgressBar"/>
     </relationships>
 
     <constructor>
@@ -13,6 +15,12 @@
         <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)
+            self.toolbar_frame.pack(fill=tk.X)
+            self.canvas_frame.pack(fill=tk.BOTH, expand=tk.TRUE)
+            self.progressbar_frame.pack(fill=tk.X)
         </body>
     </constructor>
 
@@ -29,7 +37,7 @@
                     <raise event="create_instance" scope="cd">
                         <parameter expr="'toolbars'"/>
                         <parameter expr="'GenericToolbar'"/>
-                        <parameter expr="self"/>
+                        <parameter expr="self.toolbar_frame"/>
                     </raise>
                 </onentry>
 
@@ -45,31 +53,61 @@
                 <transition event="tk_widget" target="../canvas">
                     <parameter name="tk_elem"/>
                     <script>
-                        print("Got generic toolbar")
-                        tk_elem.pack(side=tk.LEFT)
+                        tk_elem.pack(side=tk.LEFT, fill=tk.X, expand=tk.TRUE)
                     </script>
                 </transition>
             </state>
 
             <state id="canvas">
-                <!--
                 <onentry>
                     <raise event="create_instance" scope="cd">
-                        <parameter expr="canvas"/>
-                        <parameter expr="Canvas"/>
+                        <parameter expr="'canvas'"/>
+                        <parameter expr="'Canvas'"/>
+                        <parameter expr="self.canvas_frame"/>
                     </raise>
                 </onentry>
                 
-                <transition event="instance_created" target="../../running">
+                <transition event="instance_created" target="../pack_canvas">
                     <parameter name="association_name"/>
                     <raise event="start_instance" scope="cd">
                         <parameter expr="association_name"/>
                     </raise>
                 </transition>
-                -->
+            </state>
+
+            <state id="pack_canvas">
+                <transition event="tk_widget" target="../progressbar">
+                    <parameter name="tk_elem"/>
+                    <script>
+                        tk_elem.pack(fill=tk.BOTH, expand=tk.TRUE)
+                    </script>
+                </transition>
+            </state>
+
+            <state id="progressbar">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'progress_bar'"/>
+                        <parameter expr="'ProgressBar'"/>
+                        <parameter expr="{'parent': self.progressbar_frame}"/>
+                    </raise>
+                </onentry>
+
+                <transition event="instance_created" target="../pack_progressbar">
+                    <parameter name="association_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="association_name"/>
+                    </raise>
+                </transition>
+            </state>
 
-                <!-- TODO remove -->
-                <transition target="../../running"/>
+            <state id="pack_progressbar">
+                <transition event="tk_widget" target="../../running">
+                    <parameter name="tk_elem"/>
+                    <script>
+                        tk_elem.pack(fill=tk.X, expand=tk.TRUE)
+                    </script>
+                </transition>
             </state>
         </state>
 
@@ -82,7 +120,7 @@
                 <state id="query_metamodel">
                     <onentry>
                         <raise event="create_instance" scope="cd">
-                            <parameter expr="'browsers'"/>
+                            <parameter expr="'subwindow'"/>
                             <parameter expr="'Browser'"/>
                             <parameter expr="'Select metamodel to instantiate'"/>
                             <parameter expr="['formalisms/SimpleClassDiagrams']"/>
@@ -116,14 +154,91 @@
                 </state>
 
                 <state id="got_mm">
-                    <transition event="close_window" target="../../idle">
+                    <transition event="close_window" target="../prompt_model_name">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="self.subwindow"/>
+                        </raise>
+                    </transition>
+                </state>
+
+                <state id="prompt_model_name">
+                    <onentry>
+                        <raise event="create_instance" scope="cd">
+                            <parameter expr="'subwindow'"/>
+                            <parameter expr="'PromptWindow'"/>
+                            <parameter expr="{'Model name': ''}"/>
+                            <parameter expr="{}"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="instance_created" target="../waiting_for_model_name">
+                        <parameter name="association_name"/>
+                        <raise event="start_instance" scope="cd">
+                            <parameter expr="association_name"/>
+                        </raise>
+                        <script>
+                            self.subwindow = association_name
+                            self.current_model = ""
+                        </script>
+                    </transition>
+                </state>
+
+                <state id="waiting_for_model_name">
+                    <transition event="prompt_results" target=".">
+                        <parameter name="results"/>
+                        <script>
+                            self.current_model = results["Model name"]
+                        </script>
+                    </transition>
+
+                    <transition event="close_window" cond="self.current_model != ''" target="../creating_model">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="self.subwindow"/>
+                        </raise>
+                    </transition>
+
+                    <transition event="close_window" cond="self.current_model == ''" target="../../idle">
                         <raise event="delete_instance" scope="cd">
                             <parameter expr="self.subwindow"/>
                         </raise>
+                    </transition>
+                </state>
+
+                <state id="creating_model">
+                    <onentry>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'model_add'"/>
+                            <parameter expr="[self.current_model, self.metamodel, '']"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="mv_response" target="../../rerender_model">
+                        <script>
+                            print("Got added model")
+                        </script>
+                    </transition>
+                </state>
+            </state>
+
+            <state id="rerender_model" initial="request_render">
+                <state id="request_render">
+                    <onentry>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'model_render'"/>
+                            <parameter expr="[self.current_model, 'render_SCD']"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="mv_response" target="../render_model">
+                        <parameter name="result"/>
                         <script>
-                            print("Got MM: " + str(self.metamodel))
+                            print("Result: " + str(result))
                         </script>
                     </transition>
+                    <transition event="mv_exception" target="../../../close"/>
+                </state>
+
+                <state id="render_model">
                 </state>
             </state>
 
@@ -132,21 +247,11 @@
             </transition>
         </state>
 
-        <state id="closing">
-            <onentry>
-                <raise event="delete_instance" scope="cd">
-                    <parameter expr="self.to_remove.pop(0)"/>
-                </raise>
-            </onentry>
-
-            <transition event="instance_deleted" cond="len(self.to_remove) > 0" target="."/>
-            <transition event="instance_deleted" cond="len(self.to_remove) == 0" target="../close"/>
-        </state>
-
         <state id="close">
             <onentry>
                 <raise event="close_window" scope="narrow" target="'parent'"/>
             </onentry>
         </state>
+
     </scxml>
 </class>

+ 1 - 1
classes/window/splash_window.xml

@@ -39,7 +39,7 @@
                     <transition event="tk_widget" target="../ready">
                         <parameter name="tk_elem"/>
                         <script>
-                            tk_elem.pack()
+                            tk_elem.pack(fill=tk.X, expand=tk.TRUE)
                         </script>
                     </transition>
                 </state>

+ 1 - 0
frontend.xml

@@ -28,4 +28,5 @@
     <class src="classes/widgets/button.xml"/>
     <class src="classes/widgets/label.xml"/>
     <class src="classes/widgets/progress_bar.xml"/>
+    <class src="classes/canvas/canvas.xml"/>
 </diagram>

+ 55 - 0
models/MM_render.mvc

@@ -0,0 +1,55 @@
+include "primitives.alh"
+
+SimpleAttribute Natural {}
+SimpleAttribute String {}
+
+Class GraphicalElement {
+    x : Natural
+    y : Natural
+    __asid? : String
+}
+
+Class Group : GraphicalElement {
+}
+
+Class LineElement : GraphicalElement {
+    lineWidth : Natural
+    lineColour : String
+}
+
+Class Text : LineElement {
+    text : String
+}
+
+Class Line : LineElement {
+    targetX : Natural
+    targetY : Natural
+}
+
+Class Shape : LineElement {
+    fillColour : String
+    width : Natural
+    height : Natural
+}
+
+Class Figure : GraphicalElement {
+    width : Natural
+    height : Natural
+}
+
+Class SVG {
+    data : String
+}
+
+Class Rectangle : Shape {
+}
+
+Class Ellipse : Shape {
+}
+
+Association contains (Group, GraphicalElement) {}
+Association renders (Figure, SVG) {
+    source_lower_cardinality = 1
+    target_lower_cardinality = 1
+    target_upper_cardinality = 1
+}

+ 11 - 0
models/render_SCD.alc

@@ -0,0 +1,11 @@
+include "primitives.alh"
+include "modelling.alh"
+include "object_operations.alh"
+
+Boolean function main(model : Element):
+	log("Got model to render!")
+	log("Classes:")
+	log(set_to_string(allInstances(model, "SimpleClassDiagrams/Class")))
+	log("Associations:")
+	log(set_to_string(allInstances(model, "SimpleClassDiagrams/Association")))
+	return True!