浏览代码

Better working browser, with progress bar

Yentl Van Tendeloo 8 年之前
父节点
当前提交
7f96e53f14
共有 7 个文件被更改,包括 193 次插入192 次删除
  1. 0 54
      classes/button/button.xml
  2. 0 63
      classes/label/label.xml
  3. 9 0
      classes/main_app.xml
  4. 13 0
      classes/modelverse/modelverse.xml
  5. 136 70
      classes/window/browser.xml
  6. 31 2
      classes/window/main_window.xml
  7. 4 3
      frontend.xml

+ 0 - 54
classes/button/button.xml

@@ -1,54 +0,0 @@
-<class name="Button">
-    <relationships>
-        <association name="parent" class="A"/>
-        <inheritance class="MvKWidget" priority='0'/>
-        <inheritance class="tk.Button" priority='1'/>
-    </relationships>
-    <constructor>
-        <parameter name="constructor_parameters" type='dict' default='{}' />
-        <super class="tk.Button">
-            <parameter expr="constructor_parameters['parent']"/>
-            <parameter expr="**(constructor_parameters['visual'].get_params())"/>
-        </super>
-        <super class="MvKWidget">
-        </super>
-        <body>
-            self.event_parameters = constructor_parameters["event_parameters"]
-            if "tooltip_text" in constructor_parameters:
-                self.tooltip = ToolTip(self, constructor_parameters["tooltip_text"])
-            else:
-                self.tooltip = None
-            self.visual = constructor_parameters["visual"]
-            self.pack(**constructor_parameters.get('packing', {}))
-        </body>
-    </constructor>
-    <destructor>
-        <body>
-            self.destroy()
-        </body>
-    </destructor>
-    <scxml initial="main">
-        <state id="main" initial='initializing'>
-            <state id="initializing">
-                <transition port='input' event="left-click" target='.' cond='tagorid == id(self)'>
-                    <parameter name='tagorid' type='int' default='None' />
-                    <raise event="button_pressed" scope="narrow" target="'parent'">
-                        <parameter expr="self.event_parameters" />
-                    </raise>
-                </transition>
-                <transition port='input' event="enter" target='.' cond='tagorid == id(self) and self.tooltip is not None'>
-                    <parameter name='tagorid' type='int' default='None' />
-                    <script>
-                        self.tooltip.showtip()
-                    </script>
-                </transition>
-                <transition port='input' event="leave" target='.' cond='tagorid == id(self) and self.tooltip is not None'>
-                    <parameter name='tagorid' type='int' default='None' />
-                    <script>
-                        self.tooltip.hidetip()
-                    </script>
-                </transition>
-            </state>
-        </state>
-    </scxml>
-</class>

+ 0 - 63
classes/label/label.xml

@@ -1,63 +0,0 @@
-<class name="Label">
-    <relationships>
-        <association name="parent" class="A" min="1" max="1" />
-        <inheritance class="MvKWidget" priority='0'/>
-        <inheritance class="tk.Label" priority='1'/>
-    </relationships>
-    <constructor>
-        <parameter name="constructor_parameters" type="dict" default="{}" />
-        <super class="tk.Label">
-            <parameter expr="constructor_parameters['parent']"/>
-            <parameter expr="**({'text': constructor_parameters['text'], 'bg': 'white'})"/>
-        </super>
-        <super class="MvKWidget">
-        </super>
-        <body>
-            self.pack()
-        </body>
-    </constructor>
-    <destructor>
-        <body>
-            self.destroy()
-        </body>
-    </destructor>
-    <method name="set_text">
-        <parameter name="text" type="str" />
-        <body>
-            self.config(text=text)
-        </body>
-    </method>
-    <scxml initial="root">
-        <state id="root" initial='initializing'>
-            <state id="initializing">
-                <transition event='set_association_name' target="../running">
-                    <parameter name='association_name' type='str' />
-                    <script>
-                        self.association_name = association_name
-                    </script>
-                    <raise event="label_created" scope="narrow" target="'parent'">
-                        <parameter expr="self" />
-                    </raise>
-                </transition>
-            </state>
-            <state id="running">
-                <transition port='input' event="left-click" target='.' cond='tagorid == id(self)'>
-                    <parameter name='tagorid' type='int' default='None' />
-                    <raise event="label_pressed" scope="narrow" target="'parent'">
-                        <parameter expr="self.cget('text')" />
-                    </raise>
-                </transition>
-                <transition event="highlight" target=".">                        
-                    <script>
-                        self.config(bg="yellow")
-                    </script>
-                </transition>
-                <transition event="unhighlight" target=".">                        
-                    <script>
-                        self.config(bg="white")
-                    </script>
-                </transition>
-            </state>
-        </state>
-    </scxml>
-</class>

+ 9 - 0
classes/main_app.xml

@@ -226,6 +226,9 @@
                     <transition event="mv_request" target=".">
                         <parameter name="name"/>
                         <parameter name="parameters"/>
+                        <script>
+                            print("Raising action to MV: " + str(name))
+                        </script>
                         <raise event="action" scope="narrow" target="'modelverse'">
                             <parameter expr="name"/>
                             <parameter expr="None"/>
@@ -235,6 +238,9 @@
                     </transition>
 
                     <transition event="mv_result" target=".">
+                        <script>
+                            print("Got MV reply: " + str(result))
+                        </script>
                         <parameter name="ID"/>
                         <parameter name="result"/>
                         <raise event="mv_response" scope="broad">
@@ -252,6 +258,9 @@
                             <parameter expr="exception_name"/>
                             <parameter expr="exception"/>
                         </raise>
+                        <script>
+                            print("Got Modelverse exception: " + str(exception_name))
+                        </script>
                     </transition>
                 </state>
             </state>

+ 13 - 0
classes/modelverse/modelverse.xml

@@ -283,12 +283,18 @@
 
                     <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>
@@ -1340,6 +1346,13 @@
                             self.responses.pop(0)
                         </script>
                     </transition>
+
+                    <transition cond="self.expect_response_partial('', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'UnknownError'"/>
+                            <parameter expr="'Error: %s' % self.responses.pop(0)"/>
+                        </raise>
+                    </transition>
                 </state>
 
                 <state id="wait_for_action" initial="disconnected">

+ 136 - 70
classes/window/browser.xml

@@ -5,11 +5,12 @@
         <association name="buttons" class="Button"/>
         <association name="labels" class="Label"/>
         <association name="parent" class="A"/>
+        <association name="progressbar" class="Progressbar"/>
     </relationships>
 
     <constructor>
         <parameter name="prompt"/>
-        <parameter name="filter_metamodel" default="None"/>
+        <parameter name="filter_metamodels" default="None"/>
         <super class="tk.TopLevel"/>
         <super class="MvKWidget"/>
         <body>
@@ -22,9 +23,8 @@
 
             self.current_location = ""
             self.selected_label = None
-            self.labels = []
-            self.closing = False
-            self.filter_metamodel = filter_metamodel
+            self.labels = {}
+            self.filter_metamodels = filter_metamodels
         </body>
     </constructor>
 
@@ -50,6 +50,10 @@
                     <raise event="start_instance" scope="cd">
                         <parameter expr="association_name"/>
                     </raise>
+
+                    <script>
+                        self.button_ok = association_name
+                    </script>
                 </transition>
             </state>
 
@@ -62,16 +66,71 @@
                     </raise>
                 </onentry>
 
+                <transition event="instance_created" target="../progressbar">
+                    <parameter name="association_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="association_name"/>
+                    </raise>
+
+                    <script>
+                        self.button_back = association_name
+                    </script>
+                </transition>
+            </state>
+
+            <state id="progressbar">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'progressbar'"/>
+                        <parameter expr="'ProgressBar'"/>
+                        <parameter expr="{'parent': self.button_frame}"/>
+                    </raise>
+                </onentry>
+
                 <transition event="instance_created" target="../../root">
                     <parameter name="association_name"/>
                     <raise event="start_instance" scope="cd">
                         <parameter expr="association_name"/>
                     </raise>
+
+                    <script>
+                        self.progressbar = association_name
+                    </script>
                 </transition>
             </state>
         </state>
 
         <parallel id="root">
+            <state id="label_clicked">
+                <state id="selecting_label">
+                    <transition event="label_pressed" cond="self.selected_label is None" target=".">
+                        <parameter name="text"/>
+                        <raise event="highlight" target="self.labels[text]" scope="narrow"/>
+                        <script>
+                            self.selected_label = text
+                        </script>
+                    </transition>
+
+                    <transition event="label_pressed" cond="self.selected_label is not None and self.selected_label != text" target=".">
+                        <parameter name="text"/>
+                        <raise event="unhighlight" target="self.labels[self.selected_label]" scope="narrow"/>
+                        <raise event="highlight" target="self.labels[text]" scope="narrow"/>
+                        <script>
+                            self.selected_label = text
+                        </script>
+                    </transition>
+
+                    <transition event="label_pressed" cond="self.selected_label is not None and self.selected_label == text" target=".">
+                        <parameter name="text"/>
+                        <script>
+                            self.current_location += self.selected_label
+                            self.selected_label = None
+                        </script>
+                        <raise event="redraw_labels"/>
+                    </transition>
+                </state>
+            </state>
+
             <state id="state" initial="root">
                 <state id="root">
                     <transition event="button_pressed" cond="event_name == 'OK' and self.selected_label is not None" target=".">
@@ -80,6 +139,8 @@
                             self.current_location += self.selected_label
                             self.selected_label = None
                         </script>
+
+                        <raise event="redraw_labels"/>
                     </transition>
 
                     <transition event="button_pressed" cond="event_name == 'UP' and self.current_location != ''" target=".">
@@ -89,42 +150,27 @@
                             self.selected_label = None
                         </script>
 
-                        <raise event="draw_labels"/>
+                        <raise event="redraw_labels"/>
                     </transition>
-
-                    <transition cond="len(self.current_location) > 0 and self.current_location[-1] != '/'" target="../closing">
-                        <raise event="browse_result" target="'parent'" scope="narrow">
-                            <parameter expr="self.current_location"/>
-                        </raise>
-                    </transition>
-
-                    <transition event="ready_to_close" target="../closing"/>
                 </state>
 
-                <state id="closing">
-                    <state id="close">
-                        <onentry>
-                            <raise event="delete_instance" scope="cd">
-                                <parameter expr="self.button"/>
-                            </raise>
-                        </onentry>
-                    </state>
-
-                    <transition event="instance_deleted" target="../removed_buttons"/>
-                </state>
-
-                <state id="removed_buttons">
-                    <raise event="close_complete"/>
-                </state>
+                <state id="finished"/>
             </state>
 
             <state id="draw_labels" initial="create_labels">
                 <state id="create_labels" initial="query">
                     <state id="query">
                         <onentry>
+                            <script>
+                                print("QUERY MV")
+                            </script>
                             <raise event="mv_request" scope="broad">
                                 <parameter expr="'model_list'"/>
-                                <parameter expr="[self.current_location]"/>
+                                <parameter expr="[self.current_location if self.current_location == '' else self.current_location[:-1]]"/>
+                            </raise>
+                            <raise event="update_status" scope="narrow" target="self.progressbar">
+                                <parameter expr="0"/>
+                                <parameter expr="'Querying list of models...'"/>
                             </raise>
                         </onentry>
 
@@ -132,34 +178,43 @@
                             <parameter name="result"/>
                             <script>
                                 self.labels_to_add = sorted(result)
+                                self.all_results = sorted(result)
                             </script>
                         </transition>
                     </state>
 
                     <state id="add_labels" initial="check_type">
                         <state id="check_type">
+                            <onentry>
+                                <raise event="update_status" scope="narrow" target="self.progressbar">
+                                    <parameter expr="100.0 * (len(self.all_results) - len(self.labels_to_add) + 1) / (len(self.all_results) + 1)"/>
+                                    <parameter expr="('Checking model type of %s' % self.labels_to_add[0]) if len(self.labels_to_add) > 0 else 'Finished!'"/>
+                                </raise>
+                            </onentry>
+
                             <transition cond="len(self.labels_to_add) == 0" target="../../../waiting"/>
-                            <transition cond="self.filter_metamodel is None" target="../add_label"/>
-                            <transition cond="self.filter_metamodel is not None and self.labels_to_add[0][-1] == '/'" target="../add_label"/>
-                            <transition cond="self.filter_metamodel is not None and self.labels_to_add[0][-1] != '/'" target="../check_types"/>
+                            <transition cond="self.filter_metamodels is None" target="../add_label"/>
+                            <transition cond="self.filter_metamodels is not None and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] == '/'" target="../add_label"/>
+                            <transition cond="self.filter_metamodels is not None and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] != '/'" target="../check_types"/>
                         </state>
 
                         <state id="check_types">
                             <onentry>
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'model_types'"/>
-                                    <parameter expr="[self.labels_to_add[0]]"/>
+                                    <parameter expr="[self.current_location + self.labels_to_add[0]]"/>
                                 </raise>
                             </onentry>
 
-                            <transition event="mv_response" cond="len(set(result).intersection(set(self.filter_metamodels))) > 0" target="../check_type">
+                            <transition event="mv_response" cond="len(set(result).intersection(set(self.filter_metamodels))) == 0" target="../check_type">
                                 <parameter name="result"/>
+                                <script>
+                                    self.labels_to_add.pop(0)
+                                </script>
                             </transition>
 
-                            <transition event="mv_response" cond="len(set(result).intersection(set(self.filter_metamodels))) == 0" target="../add_label">
+                            <transition event="mv_response" cond="len(set(result).intersection(set(self.filter_metamodels))) > 0" target="../add_label">
                                 <parameter name="result"/>
-                                <script>
-                                </script>
                             </transition>
                         </state>
                         
@@ -170,63 +225,74 @@
                                     <parameter expr="'Label'"/>
                                     <parameter expr="{'parent': self.browser_frame, 'text': self.labels_to_add[0]}"/>
                                 </raise>
-
-                                <script>
-                                    self.labels_to_add.pop(0)
-                                </script>
                             </onentry>
 
-                            <transition event="instance_created" cond="len(self.labels_to_add) > 0" target=".">
+                            <transition event="instance_created" target="../check_type">
                                 <parameter name="association_name"/>
                                 <raise event="start_instance" scope="cd">
                                     <parameter expr="association_name"/>
                                 </raise>
                                 <script>
-                                    self.labels.append(association_name)
-                                </script>
-                            </transition>
-
-                            <transition event="instance_created" cond="len(self.labels_to_add) == 0" target="../../../waiting">
-                                <parameter name="association_name"/>
-                                <raise event="start_instance" scope="cd">
-                                    <parameter expr="association_name"/>
-                                </raise>
-                                <script>
-                                    self.labels.append(association_name)
+                                    self.labels[self.labels_to_add.pop(0)] = association_name
                                 </script>
                             </transition>
                         </state>
                     </state>
+                    <transition event="redraw_labels" target="../delete_labels"/>
                 </state>
 
-                <state id="waiting"/>
+                <state id="waiting">
+                    <transition event="redraw_labels" target="../delete_labels"/>
+                </state>
 
                 <state id="delete_labels">
                     <transition cond="len(self.labels) > 0" target=".">
                         <raise event="delete_instance" scope="cd">
-                            <parameter expr="self.labels.pop(0)"/>
+                            <parameter expr="self.labels.popitem()[1]"/>
                         </raise>
                     </transition>
 
-                    <transition cond="len(self.labels) == 0 and not self.closing" target="../create_labels"/>
-
-                    <transition cond="len(self.labels) == 0 and self.closing" target="../waiting">
-                        <raise event="ready_to_close"/>
-                    </transition>
+                    <transition cond="len(self.labels) == 0" target="../create_labels"/>
+                    <transition event="redraw_labels" target="../delete_labels"/>
                 </state>
-
-                <transition event="draw_labels" target="delete_labels"/>
-
-                <transition event="window-close" cond="ID == id(self)" target="delete_labels">
-                    <parameter name="ID"/>
-                    <script>
-                        self.closing = True
-                    </script>
-                </transition>
             </state>
 
-            <transition event="close_complete" target="../close"/>
+            <transition cond="len(self.current_location) > 0 and self.current_location[-1] != '/'" target="../closing">
+                <raise event="browse_result" target="'parent'" scope="narrow">
+                    <parameter expr="self.current_location"/>
+                </raise>
+
+                <raise event="close_self"/>
+
+                <script>
+                    self.to_close = self.labels.values() + [self.button_ok, self.button_back, self.progressbar]
+                </script>
+            </transition>
+
+            <transition event="window-close" cond="ID == id(self)" target="../closing">
+                <parameter name="ID"/>
+                <script>
+                    self.to_close = self.labels.values() + [self.button_ok, self.button_back, self.progressbar]
+                </script>
+            </transition>
+
+            <transition event="close_self" target="../closing">
+                <script>
+                    self.to_close = self.labels.values() + [self.button_ok, self.button_back, self.progressbar]
+                </script>
+            </transition>
         </parallel>
+
+        <state id="closing">
+            <onentry>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="self.to_close.pop(0)"/>
+                </raise>
+            </onentry>
+
+            <transition event="instance_deleted" cond="len(self.to_close) > 0" target="."/>
+            <transition event="instance_deleted" cond="len(self.to_close) == 0" target="../close"/>
+        </state>
             
         <state id="close">
             <onentry>

+ 31 - 2
classes/window/main_window.xml

@@ -12,6 +12,7 @@
         <super class="MvKWidget"/>
         <body>
             self.current_model = None
+            self.metamodel = None
         </body>
     </constructor>
 
@@ -74,7 +75,7 @@
                             <parameter expr="'browsers'"/>
                             <parameter expr="'Browser'"/>
                             <parameter expr="'Select metamodel to instantiate'"/>
-                            <parameter expr="'formalisms/SimpleClassDiagrams'"/>
+                            <parameter expr="['formalisms/SimpleClassDiagrams']"/>
                         </raise>
                     </onentry>
 
@@ -83,14 +84,42 @@
                         <raise event="start_instance" scope="cd">
                             <parameter expr="association_name"/>
                         </raise>
+                        <script>
+                            self.subwindow = association_name
+                        </script>
                     </transition>
                 </state>
 
                 <state id="wait_for_metamodel">
+                    <transition event="close_window" target="../../idle">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="self.subwindow"/>
+                        </raise>
+                    </transition>
+
+                    <transition event="browse_result" target="../got_mm">
+                        <parameter name="result"/>
+                        <script>
+                            self.metamodel = result
+                        </script>
+                    </transition>
+                </state>
+
+                <state id="got_mm">
+                    <transition event="close_window" target="../../idle">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="self.subwindow"/>
+                        </raise>
+                        <script>
+                            print("Got MM: " + str(self.metamodel))
+                        </script>
+                    </transition>
                 </state>
             </state>
 
-            <transition event="window-close" target="../close"/>
+            <transition event="window-close" cond="ID == id(self)" target="../close">
+                <parameter name="ID"/>
+            </transition>
         </state>
 
         <state id="close">

+ 4 - 3
frontend.xml

@@ -20,11 +20,12 @@
     <class src="classes/main_app.xml" default="true" />
     <class src="classes/modelverse/modelverse.xml"/>
     <class src="classes/modelverse/http_client.xml"/>
-    <class src="classes/window/splash_window.xml"/>
     <class src="classes/window/prompt_window.xml"/>
     <class src="classes/window/main_window.xml"/>
     <class src="classes/window/browser.xml"/>
+    <class src="classes/window/splash_window.xml"/>
     <class src="classes/toolbar/generic_toolbar.xml"/>
-    <class src="classes/button/button.xml"/>
-    <class src="classes/label/label.xml"/>
+    <class src="classes/widgets/button.xml"/>
+    <class src="classes/widgets/label.xml"/>
+    <class src="classes/widgets/progress_bar.xml"/>
 </diagram>