Browse Source

Initialization seems fine now

Yentl Van Tendeloo 8 years ago
parent
commit
892c9ad7fb
5 changed files with 238 additions and 18 deletions
  1. 51 0
      classes/button/button.xml
  2. 71 17
      classes/main_app.xml
  3. 99 0
      classes/window/prompt_window.xml
  4. 12 0
      classes/window/splash_window.xml
  5. 5 1
      frontend.xml

+ 51 - 0
classes/button/button.xml

@@ -0,0 +1,51 @@
+<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"]
+            self.tooltip = ToolTip(self, constructor_parameters["tooltip_text"])
+            self.visual = constructor_parameters["visual"]
+            self.pack()
+        </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)'>
+                    <parameter name='tagorid' type='int' default='None' />
+                    <script>
+                        self.tooltip.showtip()
+                    </script>
+                </transition>
+                <transition port='input' event="leave" target='.' cond='tagorid == id(self)'>
+                    <parameter name='tagorid' type='int' default='None' />
+                    <script>
+                        self.tooltip.hidetip()
+                    </script>
+                </transition>
+            </state>
+        </state>
+    </scxml>
+</class>

+ 71 - 17
classes/main_app.xml

@@ -105,23 +105,79 @@
                         </transition>
                     </state>
 
-                    <state id="logging_in_modelverse">
-                        <onentry>
-                            <raise event="mv_request">
-                                <parameter expr="'login'"/>
-                                <parameter expr="[self.username, self.password]"/>
-                            </raise>
+                    <state id="logging_in_modelverse" initial="prompt_username">
+                        <state id="prompt_username">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'windows'"/>
+                                    <parameter expr="'PromptWindow'"/>
+                                    <parameter expr="{'username': self.username, 'password': self.password}"/>
+                                    <parameter expr="{'password': {'show': '*'}}"/>
+                                </raise>
+                            </onentry>
 
-                            <raise event="update_status" scope="narrow" target="self.splash_window">
-                                <parameter expr="90"/>
-                                <parameter expr="'Logging in...'"/>
-                            </raise>
+                            <transition event="instance_created" target="../wait_for_credentials">
+                                <parameter name="association_name"/>
+
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="association_name"/>
+                                </raise>
+
+                                <script>
+                                    self.prompt_window = association_name
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="wait_for_credentials">
+                            <transition event="prompt_results" target="../login">
+                                <parameter name="results"/>
+                                <script>
+                                    print("Got results from prompt: " + str(results))
+                                    self.username = results["username"]
+                                    self.password = results["password"]
+                                </script>
+                            </transition>
+
+                            <transition event="close_window" target="../prompt_username"/>
+
+                            <onexit>
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="self.prompt_window"/>
+                                </raise>
+                            </onexit>
+                        </state>
+
+                        <state id="login">
+                            <onentry>
+                                <raise event="mv_request">
+                                    <parameter expr="'login'"/>
+                                    <parameter expr="[self.username, self.password]"/>
+                                </raise>
+
+                                <raise event="update_status" scope="narrow" target="self.splash_window">
+                                    <parameter expr="90"/>
+                                    <parameter expr="'Logging in...'"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="mv_response" target="../../closing_splash">
+                                <raise event="update_status" scope="narrow" target="self.splash_window">
+                                    <parameter expr="100"/>
+                                    <parameter expr="'Logging in... OK'"/>
+                                </raise>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="closing_splash">
+                        <onentry>
+                            <raise event="close" scope="narrow" target="self.splash_window"/>
                         </onentry>
 
-                        <transition event="mv_response" target="../../init_main_window">
-                            <raise event="update_status" scope="narrow" target="self.splash_window">
-                                <parameter expr="100"/>
-                                <parameter expr="'Logging in... OK'"/>
+                        <transition event="close_window" target="../../init_main_window">
+                            <raise event="delete_instance" scope="cd">
+                                <parameter expr="self.splash_window"/>
                             </raise>
                         </transition>
                     </state>
@@ -134,9 +190,7 @@
                             <parameter expr="'MainWindow'"/>
                         </raise>
 
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="self.splash_window"/>
-                        </raise>
+                        <raise event="close" target="self.splash_window"/>
                     </onentry>
 
                     <transition event="instance_created" target="../main_behaviour"/>

+ 99 - 0
classes/window/prompt_window.xml

@@ -0,0 +1,99 @@
+<class name="PromptWindow">
+    <relationships>
+        <inheritance class="tk.Toplevel" priority="1"/>
+        <inheritance class="MvKWidget" priority="0"/>
+        <association name="buttons" class="Button"/>
+        <association name="parent" class="A"/>
+    </relationships>
+
+    <constructor>
+        <parameter name="entries"/>
+        <parameter name="options"/>
+        <super class="tk.TopLevel"/>
+        <super class="MvKWidget"/>
+        <body>
+            self.entries = {}
+
+            self.frame = tk.Frame(self)
+            counter = 0
+            for k, v in entries.items():
+                label = tk.Label(self.frame, text=k)
+                entry = tk.Entry(self.frame, **options.get(k, {}))
+                entry.insert(0, v)
+
+                label.grid(row=counter, column=0)
+                entry.grid(row=counter, column=1)
+                counter += 1
+
+                self.entries[k] = entry
+
+            self.frame.pack()
+        </body>
+    </constructor>
+    <destructor>
+        <body>
+            self.destroy()
+        </body>
+    </destructor>
+
+    <scxml initial="init">
+        <state id="init" initial="init_button_OK">
+            <state id="init_button_OK">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'buttons'"/>
+                        <parameter expr="'Button'"/>
+                        <parameter expr="{'parent': self, 'visual': TextVisual('OK'), 'tooltip_text': 'Accept values', 'event_parameters': 'OK'}"/>
+                    </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.button = association_name
+                    </script>
+                </transition>
+            </state>
+        </state>
+
+        <state id="root">
+            <transition event="button_pressed" cond="event_name == 'OK'" target="../closing">
+                <parameter name="event_name"/>
+
+                <script>
+                    results = {}
+                    for k, v in self.entries.items():
+                        results[k] = v.get()
+                </script>
+
+                <raise event="prompt_results" scope="narrow" target="'parent'">
+                    <parameter expr="results"/>
+                </raise>
+            </transition>
+
+            <transition event="window-close" cond="ID == id(self)" target="../closing">
+                <parameter name="ID"/>
+            </transition>
+        </state>
+
+        <state id="closing">
+            <onentry>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="self.button"/>
+                </raise>
+            </onentry>
+
+            <transition event="instance_deleted" target="../close"/>
+        </state>
+            
+        <state id="close">
+            <onentry>
+                <raise event="close_window" scope="broad"/>
+            </onentry>
+        </state>
+    </scxml>
+</class>

+ 12 - 0
classes/window/splash_window.xml

@@ -26,6 +26,18 @@
                     print(text)
                 </script>
             </transition>
+
+            <transition event="close" target="../close"/>
+        </state>
+
+        <state id="close">
+            <onentry>
+                <raise event="close_window" scope="broad"/>
+
+                <script>
+                    self.quit()
+                </script>
+            </onentry>
         </state>
     </scxml>
 </class>

+ 5 - 1
frontend.xml

@@ -6,12 +6,14 @@
     <top>
         import Tkinter as tk
         import ttk
-        from mvk_widget import MvKWidget
+        from mvk_widget import MvKWidget, ImageVisual, TextVisual, ToolTip
         import uuid
         import json
         import urllib
     </top>
 
+    <inport name="input"/>
+
     <inport name="socket_in"/>
     <outport name="socket_out"/>
 
@@ -19,4 +21,6 @@
     <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/button/button.xml"/>
 </diagram>