Selaa lähdekoodia

Working line drawing

Yentl Van Tendeloo 7 vuotta sitten
vanhempi
commit
3b727ab8ea
3 muutettua tiedostoa jossa 503 lisäystä ja 174 poistoa
  1. 47 42
      classes/canvas/canvas.xml
  2. 80 74
      classes/window/choice_prompt_window.xml
  3. 376 58
      frontend.py

+ 47 - 42
classes/canvas/canvas.xml

@@ -35,11 +35,13 @@
             self.to_move = {}
 
             self.elems = []
+            self.tmp_line = None
 
             self.currently_selected = None
             self.loading = [tk.PhotoImage(file="icons/loading.gif", format="gif -index %i" % i) for i in range(8)]
         </body>
     </constructor>
+
     <destructor>
         <body>
             self.destroy()
@@ -58,22 +60,6 @@
         <parallel id="ready">
             <state id="process_events" initial="ready">
                 <state id="ready">
-                    <transition event="clear_canvas" target=".">
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="'elements'"/>
-                        </raise>
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="'connecting_lines'"/>
-                        </raise>
-                        <script>
-                            for f in self.elems:
-                                self.delete(f[1])
-                            self.elems = []
-                            self.group_location = {}
-                            self.layers = []
-                        </script>
-                    </transition>
-
                     <transition event="select_for_creation" target=".">
                         <parameter name="element_name"/>
                         <script>
@@ -164,12 +150,6 @@
                         </script>
                     </onentry>
 
-                    <onexit>
-                        <script>
-                            self.delete(self.tmp_line)
-                        </script>
-                    </onexit>
-
                     <state id="drawing">
                         <transition event="motion" target=".">
                             <script>
@@ -192,6 +172,10 @@
 
                         <transition event="right-click" cond="ID == id(self)" target="../../ready">
                             <parameter name="ID"/>
+                            <script>
+                                self.delete(self.tmp_line)
+                                self.tmp_line = None
+                            </script>
                         </transition>
 
                         <transition event="create_line" target="../create_in_mv">
@@ -241,6 +225,7 @@
                                 <raise event="create_instance" scope="cd">
                                     <parameter expr="'prompt'"/>
                                     <parameter expr="'ChoicePrompt'"/>
+                                    <parameter expr="'Pick desired link type:'"/>
                                     <parameter expr="self.allowed_types"/>
                                 </raise>
                             </onentry>
@@ -264,19 +249,35 @@
                                 </script>
                             </transition>
 
-                            <transition event="window_close" cond="self.assoc_type is not None" target="../create"/>
-                            <transition event="window_close" cond="self.assoc_type is None" target="../../../ready"/>
+                            <transition event="close_window" cond="self.assoc_type is not None" target="../create">
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="'prompt'"/>
+                                </raise>
+                            </transition>
+
+                            <transition event="close_window" cond="self.assoc_type is None" target="../../../ready">
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="'prompt'"/>
+                                </raise>
+                                <script>
+                                    self.delete(self.tmp_line)
+                                    self.tmp_line = None
+                                </script>
+                            </transition>
                         </state>
 
                         <state id="create">
                             <onentry>
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'instantiate'"/>
-                                    <parameter expr="[current_model, self.assoc_type, '', (self.creating_line[1], self.creating_line[3])]"/>
+                                    <parameter expr="[current_model, self.assoc_type, (self.creating_line[1], self.creating_line[3]), '']"/>
                                 </raise>
                             </onentry>
 
-                            <transition event="mv_response" target="../../../ready"/>
+                            <transition event="mv_response" target="../../../waiting_for_clear">
+                                <parameter name="ID"/>
+                                <raise event="rerender_model" scope="narrow" target="'parent'"/>
+                            </transition>
                         </state>
                     </state>
                 </state>
@@ -332,22 +333,26 @@
                     </transition>
                 </state>
 
-                <state id="waiting_for_clear">
-                    <transition event="clear_canvas" target="../ready">
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="'elements'"/>
-                        </raise>
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="'connecting_lines'"/>
-                        </raise>
-                        <script>
-                            for f in self.elems:
-                                self.delete(f[1])
-                            self.group_location = {}
-                            self.layers = []
-                        </script>
-                    </transition>
-                </state>
+                <state id="waiting_for_clear"/>
+
+                <transition event="clear_canvas" target="ready">
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'elements'"/>
+                    </raise>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'connecting_lines'"/>
+                    </raise>
+                    <script>
+                        for f in self.elems:
+                            self.delete(f[1])
+                        if self.tmp_line is not None:
+                            self.delete(self.tmp_line)
+                            self.tmp_line = None
+                        self.elems = []
+                        self.group_location = {}
+                        self.layers = []
+                    </script>
+                </transition>
             </state>
 
             <state id="update_loading">

+ 80 - 74
classes/window/choice_prompt_window.xml

@@ -1,4 +1,4 @@
-<class name="Browser">
+<class name="ChoicePrompt">
     <relationships>
         <inheritance class="tk.Toplevel" priority="1"/>
         <inheritance class="SCCDWidget" priority="0"/>
@@ -33,48 +33,48 @@
         </body>
     </destructor>
 
-    <scxml initial="init">
-        <state id="init">
-            <onentry>
-                <raise event="create_instance" scope="cd">
-                    <parameter expr="'buttons'"/>
-                    <parameter expr="'Button'"/>
-                    <parameter expr="{'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Commit decision', 'event_parameters': 'OK'}"/>
-                </raise>
-            </onentry>
-
-            <transition event="instance_created" target="../wait_for_packing_OK">
-                <parameter name="association_name"/>
-                <raise event="start_instance" scope="cd">
-                    <parameter expr="association_name"/>
-                </raise>
+    <scxml initial="all">
+        <state id="all" initial="init">
+            <state id="init">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'buttons'"/>
+                        <parameter expr="'Button'"/>
+                        <parameter expr="{'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Commit decision', 'event_parameters': 'OK'}"/>
+                    </raise>
+                </onentry>
+
+                <transition event="instance_created" target="../wait_for_packing_OK">
+                    <parameter name="association_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="association_name"/>
+                    </raise>
 
-                <script>
-                    self.button_ok = association_name
-                </script>
-            </transition>
-        </state>
-
-        <state id="wait_for_packing_OK">
-            <transition event="tk_widget" target="../create_labels">
-                <parameter name="tk_elem"/>
-                <script>
-                    tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
-                </script>
-            </transition>
-        </state>
+                    <script>
+                        self.button_ok = association_name
+                    </script>
+                </transition>
+            </state>
 
-        <state id="create_labels" initial="query">
-            <state id="query">
-                <transition target="check_continue">
+            <state id="wait_for_packing_OK">
+                <transition event="tk_widget" target="../create_labels">
+                    <parameter name="tk_elem"/>
                     <script>
-                        self.labels_to_add = sorted(self.options)
-                        self.all_results = sorted(self.options)
+                        tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
                     </script>
                 </transition>
             </state>
 
-            <state id="add_labels" initial="add_label">
+            <state id="create_labels" initial="query">
+                <state id="query">
+                    <transition target="../check_continue">
+                        <script>
+                            self.labels_to_add = sorted(self.options)
+                            self.all_results = sorted(self.options)
+                        </script>
+                    </transition>
+                </state>
+
                 <state id="add_label">
                     <onentry>
                         <raise event="create_instance" scope="cd">
@@ -108,10 +108,8 @@
                     <transition cond="len(self.labels_to_add) > 0" target="../add_label"/>
                 </state>
             </state>
-        </state>
 
-        <state id="waiting">
-            <state id="selecting_label">
+            <state id="waiting">
                 <transition event="label_pressed" cond="self.selected_label is None" target=".">
                     <parameter name="text"/>
                     <raise event="highlight" target="self.labels[text]" scope="narrow"/>
@@ -133,47 +131,55 @@
                     <parameter name="text"/>
                 </transition>
 
-                <transition event="button_pressed" cond="event_name == 'OK' and self.selected_label is not None" target="../delete_labels"/>
+                <transition event="button_pressed" cond="event_name == 'OK' and self.selected_label is not None" target="../delete_labels">
+                    <parameter name="event_name"/>
+                </transition>
             </state>
-        </state>
 
-        <state id="delete_labels">
-            <transition cond="len(self.labels) > 0" target=".">
-                <raise event="delete_instance" scope="cd">
-                    <parameter expr="self.labels.popitem()[1]"/>
-                </raise>
-            </transition>
+            <state id="delete_labels">
+                <transition cond="len(self.labels) > 0" target=".">
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="self.labels.popitem()[1]"/>
+                    </raise>
+                </transition>
 
-            <transition cond="len(self.labels) == 0" target="../send_results"/>
-        </state>
+                <transition cond="len(self.labels) == 0" target="../send_results"/>
+            </state>
 
-        <state id="send_results">
-            <transition target="../closing">
-                <raise event="choice_result" target="'parent'" scope="narrow">
-                    <parameter expr="self.selected_label"/>
-                </raise>
-            </transition>
-        </state>
+            <state id="send_results">
+                <transition target="../closing">
+                    <raise event="choice_result" target="'parent'" scope="narrow">
+                        <parameter expr="self.selected_label"/>
+                    </raise>
+                    <script>
+                        self.to_close = self.labels.values() + [self.button_ok]
+                    </script>
+                </transition>
+            </state>
 
-        <state id="closing">
-            <onentry>
-                <raise event="delete_instance" scope="cd">
-                    <parameter expr="self.to_close.pop(0)"/>
-                </raise>
-            </onentry>
+            <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>
-                <raise event="close_window" scope="narrow" target="'parent'"/>
-            </onentry>
-        </state>
+                <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>
+                    <raise event="close_window" scope="narrow" target="'parent'"/>
+                </onentry>
+            </state>
 
-        <transition event="window-close" cond="ID == id(self)" target="../closing">
-            <parameter name="ID"/>
-        </transition>
+            <transition event="window-close" cond="ID == id(self)" target="closing">
+                <parameter name="ID"/>
+                <script>
+                    self.to_close = self.labels.values() + [self.button_ok]
+                </script>
+            </transition>
+        </state>
     </scxml>
 </class>

+ 376 - 58
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:   Mon Oct  9 16:33:03 2017
+Date:   Tue Oct 10 09:18:41 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -5945,6 +5945,309 @@ class Popup(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.default_targets = self.states["/init"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
 
+class ChoicePrompt(RuntimeClassBase, tk.Toplevel, SCCDWidget):
+    def __init__(self, controller, prompt, options = None):
+        if options == None: options = None
+        RuntimeClassBase.__init__(self, controller)
+        
+        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
+        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
+        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
+        self.semantics.priority = StatechartSemantics.SourceParent
+        self.semantics.concurrency = StatechartSemantics.Single
+        
+        # build Statechart structure
+        self.build_statechart_structure()
+        
+        # call user defined constructor
+        ChoicePrompt.user_defined_constructor(self, prompt, options)
+    
+    def user_defined_constructor(self, prompt, options = None):
+        if options == None: options = None
+        tk.Toplevel.__init__(self)
+        SCCDWidget.__init__(self)
+        tk.Label(self, text=prompt).pack()
+        
+        self.button_frame = tk.Frame(self)
+        self.button_frame.pack(fill=tk.X)
+        
+        self.browser_frame = tk.Frame(self)
+        self.browser_frame.pack(fill=tk.BOTH)
+        
+        self.selected_label = None
+        self.labels = {}
+        self.options = options
+    
+    def user_defined_destructor(self):
+        self.destroy()
+        # call super class destructors
+        if hasattr(tk.Toplevel, "__del__"):
+            tk.Toplevel.__del__(self)
+        if hasattr(SCCDWidget, "__del__"):
+            SCCDWidget.__del__(self)
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /all
+        self.states["/all"] = State(1, "/all", self)
+        
+        # state /all/init
+        self.states["/all/init"] = State(2, "/all/init", self)
+        self.states["/all/init"].setEnter(self._all_init_enter)
+        
+        # state /all/wait_for_packing_OK
+        self.states["/all/wait_for_packing_OK"] = State(3, "/all/wait_for_packing_OK", self)
+        
+        # state /all/create_labels
+        self.states["/all/create_labels"] = State(4, "/all/create_labels", self)
+        
+        # state /all/create_labels/query
+        self.states["/all/create_labels/query"] = State(5, "/all/create_labels/query", self)
+        
+        # state /all/create_labels/add_label
+        self.states["/all/create_labels/add_label"] = State(6, "/all/create_labels/add_label", self)
+        self.states["/all/create_labels/add_label"].setEnter(self._all_create_labels_add_label_enter)
+        
+        # state /all/create_labels/pack_label
+        self.states["/all/create_labels/pack_label"] = State(7, "/all/create_labels/pack_label", self)
+        
+        # state /all/create_labels/check_continue
+        self.states["/all/create_labels/check_continue"] = State(8, "/all/create_labels/check_continue", self)
+        
+        # state /all/waiting
+        self.states["/all/waiting"] = State(9, "/all/waiting", self)
+        
+        # state /all/delete_labels
+        self.states["/all/delete_labels"] = State(10, "/all/delete_labels", self)
+        
+        # state /all/send_results
+        self.states["/all/send_results"] = State(11, "/all/send_results", self)
+        
+        # state /all/closing
+        self.states["/all/closing"] = State(12, "/all/closing", self)
+        self.states["/all/closing"].setEnter(self._all_closing_enter)
+        
+        # state /all/close
+        self.states["/all/close"] = State(13, "/all/close", self)
+        self.states["/all/close"].setEnter(self._all_close_enter)
+        
+        # add children
+        self.states[""].addChild(self.states["/all"])
+        self.states["/all"].addChild(self.states["/all/init"])
+        self.states["/all"].addChild(self.states["/all/wait_for_packing_OK"])
+        self.states["/all"].addChild(self.states["/all/create_labels"])
+        self.states["/all"].addChild(self.states["/all/waiting"])
+        self.states["/all"].addChild(self.states["/all/delete_labels"])
+        self.states["/all"].addChild(self.states["/all/send_results"])
+        self.states["/all"].addChild(self.states["/all/closing"])
+        self.states["/all"].addChild(self.states["/all/close"])
+        self.states["/all/create_labels"].addChild(self.states["/all/create_labels/query"])
+        self.states["/all/create_labels"].addChild(self.states["/all/create_labels/add_label"])
+        self.states["/all/create_labels"].addChild(self.states["/all/create_labels/pack_label"])
+        self.states["/all/create_labels"].addChild(self.states["/all/create_labels/check_continue"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/all"]
+        self.states["/all"].default_state = self.states["/all/init"]
+        self.states["/all/create_labels"].default_state = self.states["/all/create_labels/query"]
+        
+        # transition /all/init
+        _all_init_0 = Transition(self, self.states["/all/init"], [self.states["/all/wait_for_packing_OK"]])
+        _all_init_0.setAction(self._all_init_0_exec)
+        _all_init_0.setTrigger(Event("instance_created", None))
+        self.states["/all/init"].addTransition(_all_init_0)
+        
+        # transition /all/wait_for_packing_OK
+        _all_wait_for_packing_OK_0 = Transition(self, self.states["/all/wait_for_packing_OK"], [self.states["/all/create_labels"]])
+        _all_wait_for_packing_OK_0.setAction(self._all_wait_for_packing_OK_0_exec)
+        _all_wait_for_packing_OK_0.setTrigger(Event("tk_widget", None))
+        self.states["/all/wait_for_packing_OK"].addTransition(_all_wait_for_packing_OK_0)
+        
+        # transition /all/create_labels/query
+        _all_create_labels_query_0 = Transition(self, self.states["/all/create_labels/query"], [self.states["/all/create_labels/check_continue"]])
+        _all_create_labels_query_0.setAction(self._all_create_labels_query_0_exec)
+        _all_create_labels_query_0.setTrigger(None)
+        self.states["/all/create_labels/query"].addTransition(_all_create_labels_query_0)
+        
+        # transition /all/create_labels/add_label
+        _all_create_labels_add_label_0 = Transition(self, self.states["/all/create_labels/add_label"], [self.states["/all/create_labels/pack_label"]])
+        _all_create_labels_add_label_0.setAction(self._all_create_labels_add_label_0_exec)
+        _all_create_labels_add_label_0.setTrigger(Event("instance_created", None))
+        self.states["/all/create_labels/add_label"].addTransition(_all_create_labels_add_label_0)
+        
+        # transition /all/create_labels/pack_label
+        _all_create_labels_pack_label_0 = Transition(self, self.states["/all/create_labels/pack_label"], [self.states["/all/create_labels/check_continue"]])
+        _all_create_labels_pack_label_0.setAction(self._all_create_labels_pack_label_0_exec)
+        _all_create_labels_pack_label_0.setTrigger(Event("tk_widget", None))
+        self.states["/all/create_labels/pack_label"].addTransition(_all_create_labels_pack_label_0)
+        
+        # transition /all/create_labels/check_continue
+        _all_create_labels_check_continue_0 = Transition(self, self.states["/all/create_labels/check_continue"], [self.states["/all/waiting"]])
+        _all_create_labels_check_continue_0.setTrigger(None)
+        _all_create_labels_check_continue_0.setGuard(self._all_create_labels_check_continue_0_guard)
+        self.states["/all/create_labels/check_continue"].addTransition(_all_create_labels_check_continue_0)
+        _all_create_labels_check_continue_1 = Transition(self, self.states["/all/create_labels/check_continue"], [self.states["/all/create_labels/add_label"]])
+        _all_create_labels_check_continue_1.setTrigger(None)
+        _all_create_labels_check_continue_1.setGuard(self._all_create_labels_check_continue_1_guard)
+        self.states["/all/create_labels/check_continue"].addTransition(_all_create_labels_check_continue_1)
+        
+        # transition /all/waiting
+        _all_waiting_0 = Transition(self, self.states["/all/waiting"], [self.states["/all/waiting"]])
+        _all_waiting_0.setAction(self._all_waiting_0_exec)
+        _all_waiting_0.setTrigger(Event("label_pressed", None))
+        _all_waiting_0.setGuard(self._all_waiting_0_guard)
+        self.states["/all/waiting"].addTransition(_all_waiting_0)
+        _all_waiting_1 = Transition(self, self.states["/all/waiting"], [self.states["/all/waiting"]])
+        _all_waiting_1.setAction(self._all_waiting_1_exec)
+        _all_waiting_1.setTrigger(Event("label_pressed", None))
+        _all_waiting_1.setGuard(self._all_waiting_1_guard)
+        self.states["/all/waiting"].addTransition(_all_waiting_1)
+        _all_waiting_2 = Transition(self, self.states["/all/waiting"], [self.states["/all/delete_labels"]])
+        _all_waiting_2.setTrigger(Event("label_pressed", None))
+        _all_waiting_2.setGuard(self._all_waiting_2_guard)
+        self.states["/all/waiting"].addTransition(_all_waiting_2)
+        _all_waiting_3 = Transition(self, self.states["/all/waiting"], [self.states["/all/delete_labels"]])
+        _all_waiting_3.setTrigger(Event("button_pressed", None))
+        _all_waiting_3.setGuard(self._all_waiting_3_guard)
+        self.states["/all/waiting"].addTransition(_all_waiting_3)
+        
+        # transition /all/delete_labels
+        _all_delete_labels_0 = Transition(self, self.states["/all/delete_labels"], [self.states["/all/delete_labels"]])
+        _all_delete_labels_0.setAction(self._all_delete_labels_0_exec)
+        _all_delete_labels_0.setTrigger(None)
+        _all_delete_labels_0.setGuard(self._all_delete_labels_0_guard)
+        self.states["/all/delete_labels"].addTransition(_all_delete_labels_0)
+        _all_delete_labels_1 = Transition(self, self.states["/all/delete_labels"], [self.states["/all/send_results"]])
+        _all_delete_labels_1.setTrigger(None)
+        _all_delete_labels_1.setGuard(self._all_delete_labels_1_guard)
+        self.states["/all/delete_labels"].addTransition(_all_delete_labels_1)
+        
+        # transition /all/send_results
+        _all_send_results_0 = Transition(self, self.states["/all/send_results"], [self.states["/all/closing"]])
+        _all_send_results_0.setAction(self._all_send_results_0_exec)
+        _all_send_results_0.setTrigger(None)
+        self.states["/all/send_results"].addTransition(_all_send_results_0)
+        
+        # transition /all/closing
+        _all_closing_0 = Transition(self, self.states["/all/closing"], [self.states["/all/closing"]])
+        _all_closing_0.setTrigger(Event("instance_deleted", None))
+        _all_closing_0.setGuard(self._all_closing_0_guard)
+        self.states["/all/closing"].addTransition(_all_closing_0)
+        _all_closing_1 = Transition(self, self.states["/all/closing"], [self.states["/all/close"]])
+        _all_closing_1.setTrigger(Event("instance_deleted", None))
+        _all_closing_1.setGuard(self._all_closing_1_guard)
+        self.states["/all/closing"].addTransition(_all_closing_1)
+        
+        # transition /all
+        _all_0 = Transition(self, self.states["/all"], [self.states["/all/closing"]])
+        _all_0.setAction(self._all_0_exec)
+        _all_0.setTrigger(Event("window-close", None))
+        _all_0.setGuard(self._all_0_guard)
+        self.states["/all"].addTransition(_all_0)
+    
+    def _all_init_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'buttons', 'Button', {'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Commit decision', 'event_parameters': 'OK'}]))
+    
+    def _all_create_labels_add_label_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'labels', 'Label', {'parent': self.browser_frame, 'text': self.labels_to_add[0]}]))
+    
+    def _all_closing_enter(self):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.to_close.pop(0)]))
+    
+    def _all_close_enter(self):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_window", None, [])]))
+    
+    def _all_0_exec(self, parameters):
+        ID = parameters[0]
+        self.to_close = self.labels.values() + [self.button_ok]
+    
+    def _all_0_guard(self, parameters):
+        ID = parameters[0]
+        return ID == id(self)
+    
+    def _all_init_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.button_ok = association_name
+    
+    def _all_wait_for_packing_OK_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
+    
+    def _all_create_labels_query_0_exec(self, parameters):
+        self.labels_to_add = sorted(self.options)
+        self.all_results = sorted(self.options)
+    
+    def _all_create_labels_add_label_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.labels[self.labels_to_add.pop(0)] = association_name
+    
+    def _all_create_labels_pack_label_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack()
+    
+    def _all_create_labels_check_continue_0_guard(self, parameters):
+        return len(self.labels_to_add) == 0
+    
+    def _all_create_labels_check_continue_1_guard(self, parameters):
+        return len(self.labels_to_add) > 0
+    
+    def _all_waiting_0_exec(self, parameters):
+        text = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[text], Event("highlight", None, [])]))
+        self.selected_label = text
+    
+    def _all_waiting_0_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is None
+    
+    def _all_waiting_1_exec(self, parameters):
+        text = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[self.selected_label], Event("unhighlight", None, [])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[text], Event("highlight", None, [])]))
+        self.selected_label = text
+    
+    def _all_waiting_1_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is not None and self.selected_label != text
+    
+    def _all_waiting_2_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is not None and self.selected_label == text
+    
+    def _all_waiting_3_guard(self, parameters):
+        event_name = parameters[0]
+        return event_name == 'OK' and self.selected_label is not None
+    
+    def _all_delete_labels_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.labels.popitem()[1]]))
+    
+    def _all_delete_labels_0_guard(self, parameters):
+        return len(self.labels) > 0
+    
+    def _all_delete_labels_1_guard(self, parameters):
+        return len(self.labels) == 0
+    
+    def _all_send_results_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("choice_result", None, [self.selected_label])]))
+        self.to_close = self.labels.values() + [self.button_ok]
+    
+    def _all_closing_0_guard(self, parameters):
+        return len(self.to_close) > 0
+    
+    def _all_closing_1_guard(self, parameters):
+        return len(self.to_close) == 0
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/all"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
 class Toolbar(RuntimeClassBase, tk.Frame, SCCDWidget):
     def __init__(self, controller, parent):
         RuntimeClassBase.__init__(self, controller)
@@ -7147,6 +7450,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.to_move = {}
         
         self.elems = []
+        self.tmp_line = None
         
         self.currently_selected = None
         self.loading = [tk.PhotoImage(file="icons/loading.gif", format="gif -index %i" % i) for i in range(8)]
@@ -7181,7 +7485,6 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         # state /ready/process_events/creating_line
         self.states["/ready/process_events/creating_line"] = State(5, "/ready/process_events/creating_line", self)
         self.states["/ready/process_events/creating_line"].setEnter(self._ready_process_events_creating_line_enter)
-        self.states["/ready/process_events/creating_line"].setExit(self._ready_process_events_creating_line_exit)
         
         # state /ready/process_events/creating_line/drawing
         self.states["/ready/process_events/creating_line/drawing"] = State(6, "/ready/process_events/creating_line/drawing", self)
@@ -7264,28 +7567,29 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         # transition /ready/process_events/ready
         _ready_process_events_ready_0 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_0.setAction(self._ready_process_events_ready_0_exec)
-        _ready_process_events_ready_0.setTrigger(Event("clear_canvas", None))
+        _ready_process_events_ready_0.setTrigger(Event("select_for_creation", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_0)
-        _ready_process_events_ready_1 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_ready_1 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_element"]])
         _ready_process_events_ready_1.setAction(self._ready_process_events_ready_1_exec)
-        _ready_process_events_ready_1.setTrigger(Event("select_for_creation", None))
+        _ready_process_events_ready_1.setTrigger(Event("right-click", None))
+        _ready_process_events_ready_1.setGuard(self._ready_process_events_ready_1_guard)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_1)
-        _ready_process_events_ready_2 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_element"]])
+        _ready_process_events_ready_2 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_line"]])
         _ready_process_events_ready_2.setAction(self._ready_process_events_ready_2_exec)
-        _ready_process_events_ready_2.setTrigger(Event("right-click", None))
-        _ready_process_events_ready_2.setGuard(self._ready_process_events_ready_2_guard)
+        _ready_process_events_ready_2.setTrigger(Event("create_line", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_2)
-        _ready_process_events_ready_3 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_line"]])
+        _ready_process_events_ready_3 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_group"]])
         _ready_process_events_ready_3.setAction(self._ready_process_events_ready_3_exec)
-        _ready_process_events_ready_3.setTrigger(Event("create_line", None))
+        _ready_process_events_ready_3.setTrigger(Event("define_group", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_3)
-        _ready_process_events_ready_4 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_group"]])
+        _ready_process_events_ready_4 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_4.setAction(self._ready_process_events_ready_4_exec)
-        _ready_process_events_ready_4.setTrigger(Event("define_group", None))
+        _ready_process_events_ready_4.setTrigger(Event("define_contains", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_4)
         _ready_process_events_ready_5 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_5.setAction(self._ready_process_events_ready_5_exec)
-        _ready_process_events_ready_5.setTrigger(Event("define_contains", None))
+        _ready_process_events_ready_5.setTrigger(Event("draw_canvas", None))
+        _ready_process_events_ready_5.setGuard(self._ready_process_events_ready_5_guard)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_5)
         _ready_process_events_ready_6 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_6.setAction(self._ready_process_events_ready_6_exec)
@@ -7294,17 +7598,12 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_6)
         _ready_process_events_ready_7 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_7.setAction(self._ready_process_events_ready_7_exec)
-        _ready_process_events_ready_7.setTrigger(Event("draw_canvas", None))
-        _ready_process_events_ready_7.setGuard(self._ready_process_events_ready_7_guard)
+        _ready_process_events_ready_7.setTrigger(Event("instance_created", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_7)
         _ready_process_events_ready_8 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_8.setAction(self._ready_process_events_ready_8_exec)
-        _ready_process_events_ready_8.setTrigger(Event("instance_created", None))
+        _ready_process_events_ready_8.setTrigger(Event("moved_group", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_8)
-        _ready_process_events_ready_9 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
-        _ready_process_events_ready_9.setAction(self._ready_process_events_ready_9_exec)
-        _ready_process_events_ready_9.setTrigger(Event("moved_group", None))
-        self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_9)
         
         # transition /ready/process_events/creating_line/drawing
         _ready_process_events_creating_line_drawing_0 = Transition(self, self.states["/ready/process_events/creating_line/drawing"], [self.states["/ready/process_events/creating_line/drawing"]])
@@ -7312,6 +7611,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         _ready_process_events_creating_line_drawing_0.setTrigger(Event("motion", None))
         self.states["/ready/process_events/creating_line/drawing"].addTransition(_ready_process_events_creating_line_drawing_0)
         _ready_process_events_creating_line_drawing_1 = Transition(self, self.states["/ready/process_events/creating_line/drawing"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_creating_line_drawing_1.setAction(self._ready_process_events_creating_line_drawing_1_exec)
         _ready_process_events_creating_line_drawing_1.setTrigger(Event("right-click", None))
         _ready_process_events_creating_line_drawing_1.setGuard(self._ready_process_events_creating_line_drawing_1_guard)
         self.states["/ready/process_events/creating_line/drawing"].addTransition(_ready_process_events_creating_line_drawing_1)
@@ -7353,16 +7653,19 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         _ready_process_events_creating_line_create_in_mv_wait_for_response_0.setTrigger(Event("choice_result", None))
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_0)
         _ready_process_events_creating_line_create_in_mv_wait_for_response_1 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"], [self.states["/ready/process_events/creating_line/create_in_mv/create"]])
-        _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setTrigger(Event("window_close", None))
+        _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setAction(self._ready_process_events_creating_line_create_in_mv_wait_for_response_1_exec)
+        _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setTrigger(Event("close_window", None))
         _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setGuard(self._ready_process_events_creating_line_create_in_mv_wait_for_response_1_guard)
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_1)
         _ready_process_events_creating_line_create_in_mv_wait_for_response_2 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"], [self.states["/ready/process_events/ready"]])
-        _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setTrigger(Event("window_close", None))
+        _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setAction(self._ready_process_events_creating_line_create_in_mv_wait_for_response_2_exec)
+        _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setTrigger(Event("close_window", None))
         _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setGuard(self._ready_process_events_creating_line_create_in_mv_wait_for_response_2_guard)
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_2)
         
         # transition /ready/process_events/creating_line/create_in_mv/create
-        _ready_process_events_creating_line_create_in_mv_create_0 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/create"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_creating_line_create_in_mv_create_0 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/create"], [self.states["/ready/process_events/waiting_for_clear"]])
+        _ready_process_events_creating_line_create_in_mv_create_0.setAction(self._ready_process_events_creating_line_create_in_mv_create_0_exec)
         _ready_process_events_creating_line_create_in_mv_create_0.setTrigger(Event("mv_response", None))
         self.states["/ready/process_events/creating_line/create_in_mv/create"].addTransition(_ready_process_events_creating_line_create_in_mv_create_0)
         
@@ -7388,24 +7691,21 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         _ready_process_events_creating_element_0.setTrigger(Event("mv_response", None))
         self.states["/ready/process_events/creating_element"].addTransition(_ready_process_events_creating_element_0)
         
-        # transition /ready/process_events/waiting_for_clear
-        _ready_process_events_waiting_for_clear_0 = Transition(self, self.states["/ready/process_events/waiting_for_clear"], [self.states["/ready/process_events/ready"]])
-        _ready_process_events_waiting_for_clear_0.setAction(self._ready_process_events_waiting_for_clear_0_exec)
-        _ready_process_events_waiting_for_clear_0.setTrigger(Event("clear_canvas", None))
-        self.states["/ready/process_events/waiting_for_clear"].addTransition(_ready_process_events_waiting_for_clear_0)
-        
         # transition /ready/update_loading/updating
         _ready_update_loading_updating_0 = Transition(self, self.states["/ready/update_loading/updating"], [self.states["/ready/update_loading/updating"]])
         _ready_update_loading_updating_0.setAction(self._ready_update_loading_updating_0_exec)
         _ready_update_loading_updating_0.setTrigger(Event("_0after"))
         self.states["/ready/update_loading/updating"].addTransition(_ready_update_loading_updating_0)
+        
+        # transition /ready/process_events
+        _ready_process_events_0 = Transition(self, self.states["/ready/process_events"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_0.setAction(self._ready_process_events_0_exec)
+        _ready_process_events_0.setTrigger(Event("clear_canvas", None))
+        self.states["/ready/process_events"].addTransition(_ready_process_events_0)
     
     def _ready_process_events_creating_line_enter(self):
         self.tmp_line = self.create_line(self.creating_line[2][0], self.creating_line[2][1], self.last_x, self.last_y)
     
-    def _ready_process_events_creating_line_exit(self):
-        self.delete(self.tmp_line)
-    
     def _ready_process_events_creating_line_create_in_mv_query_type_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['connections_between', [current_model, self.creating_line[1], self.creating_line[3]]])]))
     
@@ -7413,10 +7713,10 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         print("Got allowed types: " + str(self.allowed_types))
     
     def _ready_process_events_creating_line_create_in_mv_request_user_enter(self):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'prompt', 'ChoicePrompt', self.allowed_types]))
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'prompt', 'ChoicePrompt', 'Pick desired link type:', self.allowed_types]))
     
     def _ready_process_events_creating_line_create_in_mv_create_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['instantiate', [current_model, self.assoc_type, '', (self.creating_line[1], self.creating_line[3])]])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['instantiate', [current_model, self.assoc_type, (self.creating_line[1], self.creating_line[3]), '']])]))
     
     def _ready_process_events_creating_element_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['instantiate', [current_model, self.currently_selected, None, '']])]))
@@ -7428,67 +7728,70 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
     def _ready_update_loading_updating_exit(self):
         self.removeTimer(0)
     
-    def _main_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self])]))
-    
-    def _ready_process_events_ready_0_exec(self, parameters):
+    def _ready_process_events_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'connecting_lines']))
         for f in self.elems:
             self.delete(f[1])
+        if self.tmp_line is not None:
+            self.delete(self.tmp_line)
+            self.tmp_line = None
         self.elems = []
         self.group_location = {}
         self.layers = []
     
-    def _ready_process_events_ready_1_exec(self, parameters):
+    def _main_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self])]))
+    
+    def _ready_process_events_ready_0_exec(self, parameters):
         element_name = parameters[0]
         self.currently_selected = element_name
     
-    def _ready_process_events_ready_2_exec(self, parameters):
+    def _ready_process_events_ready_1_exec(self, parameters):
         ID = parameters[0]
         self.create_location = (self.last_x, self.last_y)
     
-    def _ready_process_events_ready_2_guard(self, parameters):
+    def _ready_process_events_ready_1_guard(self, parameters):
         ID = parameters[0]
         return self.currently_selected is not None and id(self) == ID
     
-    def _ready_process_events_ready_3_exec(self, parameters):
+    def _ready_process_events_ready_2_exec(self, parameters):
         cs_element = parameters[0]
         as_element = parameters[1]
         coordinates = parameters[2]
         self.creating_line = (cs_element, as_element, coordinates)
     
-    def _ready_process_events_ready_4_exec(self, parameters):
+    def _ready_process_events_ready_3_exec(self, parameters):
         element = parameters[0]
         self.creating_id = element["id"]
         self.group_location[element['id']] = (element['x'], element['y'])
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'elements', 'CanvasElement', self, (element['x'], element['y']), element['id'], element['__asid']]))
     
-    def _ready_process_events_ready_5_exec(self, parameters):
+    def _ready_process_events_ready_4_exec(self, parameters):
         element = parameters[0]
         self.element_group[element["__target"]] = element["__source"]
     
-    def _ready_process_events_ready_6_exec(self, parameters):
+    def _ready_process_events_ready_5_exec(self, parameters):
         element = parameters[0]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.assoc_links[self.element_group[element['id']]], Event("draw_element", None, [element])]))
     
-    def _ready_process_events_ready_6_guard(self, parameters):
+    def _ready_process_events_ready_5_guard(self, parameters):
         element = parameters[0]
         return element['type'] != 'ConnectingLine'
     
-    def _ready_process_events_ready_7_exec(self, parameters):
+    def _ready_process_events_ready_6_exec(self, parameters):
         element = parameters[0]
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'connecting_lines', 'ConnectingLine', self, element]))
     
-    def _ready_process_events_ready_7_guard(self, parameters):
+    def _ready_process_events_ready_6_guard(self, parameters):
         element = parameters[0]
         return element['type'] == 'ConnectingLine'
     
-    def _ready_process_events_ready_8_exec(self, parameters):
+    def _ready_process_events_ready_7_exec(self, parameters):
         result = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, result]))
     
-    def _ready_process_events_ready_9_exec(self, parameters):
+    def _ready_process_events_ready_8_exec(self, parameters):
         group_element = parameters[0]
         new_location = parameters[1]
         self.group_location[group_element] = new_location
@@ -7510,6 +7813,11 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         
         self.coords(self.tmp_line, x, y, self.last_x, self.last_y)
     
+    def _ready_process_events_creating_line_drawing_1_exec(self, parameters):
+        ID = parameters[0]
+        self.delete(self.tmp_line)
+        self.tmp_line = None
+    
     def _ready_process_events_creating_line_drawing_1_guard(self, parameters):
         ID = parameters[0]
         return ID == id(self)
@@ -7545,12 +7853,24 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         result = parameters[0]
         self.assoc_type = result
     
+    def _ready_process_events_creating_line_create_in_mv_wait_for_response_1_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'prompt']))
+    
     def _ready_process_events_creating_line_create_in_mv_wait_for_response_1_guard(self, parameters):
         return self.assoc_type is not None
     
+    def _ready_process_events_creating_line_create_in_mv_wait_for_response_2_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'prompt']))
+        self.delete(self.tmp_line)
+        self.tmp_line = None
+    
     def _ready_process_events_creating_line_create_in_mv_wait_for_response_2_guard(self, parameters):
         return self.assoc_type is None
     
+    def _ready_process_events_creating_line_create_in_mv_create_0_exec(self, parameters):
+        ID = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("rerender_model", None, [])]))
+    
     def _ready_process_events_creating_group_0_exec(self, parameters):
         assoc_name = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
@@ -7570,14 +7890,6 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.to_move[ID] = self.create_location
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("rerender_model", None, [])]))
     
-    def _ready_process_events_waiting_for_clear_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
-        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'connecting_lines']))
-        for f in self.elems:
-            self.delete(f[1])
-        self.group_location = {}
-        self.layers = []
-    
     def _ready_update_loading_updating_0_exec(self, parameters):
         for i in self.elems:
             self.itemconfigure(i[1], image=self.loading[i[0]])
@@ -8318,6 +8630,12 @@ class ObjectManager(ObjectManagerBase):
             instance.associations = {}
             instance.associations["buttons"] = Association("Button", 0, -1)
             instance.associations["parent"] = Association("A", 0, -1)
+        elif class_name == "ChoicePrompt":
+            instance = ChoicePrompt(self.controller, construct_params[0], construct_params[1])
+            instance.associations = {}
+            instance.associations["buttons"] = Association("Button", 0, -1)
+            instance.associations["labels"] = Association("Label", 0, -1)
+            instance.associations["parent"] = Association("A", 0, -1)
         elif class_name == "Toolbar":
             instance = Toolbar(self.controller, construct_params[0])
             instance.associations = {}