Преглед изворни кода

First draft of attribute editor

Yentl Van Tendeloo пре 8 година
родитељ
комит
6fa4868dfa
1 измењених фајлова са 390 додато и 66 уклоњено
  1. 390 66
      classes/window/attribute_editor.xml

+ 390 - 66
classes/window/attribute_editor.xml

@@ -2,108 +2,432 @@
     <relationships>
         <inheritance class="tk.Toplevel" priority="1"/>
         <inheritance class="SCCDWidget" priority="0"/>
-        <association name="buttons" class="Button"/>
+        <association name="names" class="Entry"/>
+        <association name="types" class="DropDown"/>
+        <association name="optional" class="ToggleButton"/>
+        <association name="delete" class="Button"/>
+        <association name="add_attribute_button" class="Button"/>
         <association name="parent" class="A"/>
     </relationships>
 
     <constructor>
-        <parameter name="entries"/>
-        <parameter name="options"/>
+        <parameter name="as_element"/>
+        <parameter name="allowed_types"/>
         <super class="tk.TopLevel"/>
         <super class="SCCDWidget"/>
         <body>
-            self.entries = {}
+            self.as_element = element
+            self.allowed_types = allowed_types
 
-            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()
+            self.attrs = None
+            self.associations_name = {}
+            self.associations_type = {}
+            self.associations_optional = {}
+            self.associations_delete = {}
         </body>
     </constructor>
+
     <destructor>
         <body>
             self.destroy()
         </body>
     </destructor>
 
-    <scxml initial="init">
-        <state id="init" initial="init_button_OK">
-            <state id="init_button_OK">
+    <method name="get_unique_attr_name">
+        <body>
+            i = 0
+            while 1:
+                attr_name = "attr%i" % i
+                if attr_name not in self.associations_name:
+                    return attr_name
+                else:
+                    i += 1
+        </body>
+    </method>
+
+    <scxml>
+        <state id="all" initial="init">
+            <state id="init" initial="get_defined_attrs">
+                <state id="get_defined_attrs">
+                    <onentry>
+                        <raise event="mv_request" scope="broad">
+                            <parameter expr="'read_defined_attrs'"/>
+                            <parameter expr="[current_model, self.as_element]"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="mv_response" target="../create_entries">
+                        <parameter name="result_mandatory"/>
+                        <parameter name="result_optional"/>
+                        <script>
+                            result_mandatory = {i: (result_mandatory[i], False) for i in result_mandatory}
+                            result_optional = {i: (result_optional[i], False) for i in result_optional}
+                            result = {}
+                            result.update(result_mandatory)
+                            result.update(result_optional)
+
+                            self.attrs = result
+                            self.attrs_modify = dict(self.attrs)
+                            self.counter = 0
+                        </script>
+                    </transition>
+                </state>
+
+                <state id="create_entries" initial="check_list">
+                    <state id="check_list">
+                        <transition cond="self.attrs_modify" target="../create_entry"/>
+                        <transition cond="not self.attrs_modify" target="../../add_new_attribute"/>
+                    </state>
+
+                    <state id="create_entry">
+                        <onentry>
+                            <script>
+                                current_attr = self.attrs_modify.popitem()
+                                self.current_attr = {'name': current_attrs[0], 'type': current_attrs[1][0], 'optional': current_attrs[1][1]}
+                            </script>
+                        </onentry>
+
+                        <onexit>
+                            <script>
+                                self.counter += 1
+                            </script>
+                        </onexit>
+
+                        <state id="name_entry" initial="create">
+                            <state id="create">
+                                <onentry>
+                                    <raise event="create_instance" scope="cd">
+                                        <parameter expr="'names'"/>
+                                        <parameter expr="'Entry'"/>
+                                        <parameter expr="self"/>
+                                        <parameter expr="self.current_attr['name']"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="instance_created" target="../pack">
+                                    <parameter name="assoc_name"/>
+                                    <raise event="start_instance" scope="cd">
+                                        <parameter expr="assoc_name"/>
+                                    </raise>
+                                    <script>
+                                        self.associations_name[self.current_attr['name']] = assoc_name
+                                    </script>
+                                </transition>
+                            </state>
+
+                            <state id="pack">
+                                <transition event="tk_widget" target="../../type_dropdown">
+                                    <parameter name="tk_widget"/>
+                                    <script>
+                                        tk_widget.grid(row=self.counter, column=0)
+                                    </script>
+                                </transition>
+                            </state>
+                        </state>
+
+                        <state id="type_dropdown" initial="create">
+                            <state id="create">
+                                <onentry>
+                                    <raise event="create_instance" scope="cd">
+                                        <parameter expr="'types'"/>
+                                        <parameter expr="'DropDown'"/>
+                                        <parameter expr="self"/>
+                                        <parameter expr="self.current_attr['name']"/>
+                                        <parameter expr="self.current_attr['type']"/>
+                                        <parameter expr="self.allowed_types"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="instance_created" target="../pack">
+                                    <parameter name="assoc_name"/>
+                                    <raise event="start_instance" scope="cd">
+                                        <parameter expr="assoc_name"/>
+                                    </raise>
+                                    <script>
+                                        self.associations_type[self.current_attr['name']] = assoc_name
+                                    </script>
+                                </transition>
+                            </state>
+
+                            <state id="pack">
+                                <transition event="tk_widget" target="../../optional_button">
+                                    <parameter name="tk_widget"/>
+                                    <script>
+                                        tk_widget.grid(row=self.counter, column=1)
+                                    </script>
+                                </transition>
+                            </state>
+                        </state>
+
+                        <state id="optional_button" initial="create">
+                            <state id="create">
+                                <onentry>
+                                    <raise event="create_instance" scope="cd">
+                                        <parameter expr="'optional'"/>
+                                        <parameter expr="'ToggleButton'"/>
+                                        <parameter expr="{'parent': self, 'on_activate': 'optional_%s' % self.current_attr['name'], 'on_deactivate': 'mandatory_%s' % self.current_attr['name'], 'active': self.current_attr['optional'], 'tooltip_text': 'Optional attribute?', 'visual': TextVisual('optional')}"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="instance_created" target="../pack">
+                                    <parameter name="assoc_name"/>
+                                    <raise event="start_instance" scope="cd">
+                                        <parameter expr="assoc_name"/>
+                                    </raise>
+                                    <script>
+                                        self.associations_optional[self.current_attr['name']] = assoc_name
+                                    </script>
+                                </transition>
+                            </state>
+
+                            <state id="pack">
+                                <transition event="tk_widget" target="../../delete_button">
+                                    <parameter name="tk_widget"/>
+                                    <script>
+                                        tk_widget.grid(row=self.counter, column=2)
+                                    </script>
+                                </transition>
+                            </state>
+                        </state>
+
+                        <state id="delete_button" initial="create">
+                            <state id="create">
+                                <onentry>
+                                    <raise event="create_instance" scope="cd">
+                                        <parameter expr="'delete'"/>
+                                        <parameter expr="'Button'"/>
+                                        <parameter expr="self"/>
+                                        <parameter expr="self.current_attr['name']"/>
+                                    </raise>
+                                </onentry>
+
+                                <transition event="instance_created" target="../pack">
+                                    <parameter name="assoc_name"/>
+                                    <raise event="start_instance" scope="cd">
+                                        <parameter expr="assoc_name"/>
+                                    </raise>
+                                    <script>
+                                        self.associations_delete[self.current_attr['name']] = assoc_name
+                                    </script>
+                                </transition>
+                            </state>
+
+                            <state id="pack">
+                                <transition event="tk_widget" target="../../../check_list">
+                                    <parameter name="tk_widget"/>
+                                    <script>
+                                        tk_widget.grid(row=self.counter, column=3)
+                                    </script>
+                                </transition>
+                            </state>
+                        </state>
+                    </state>
+                </state>
+
+                <state id="add_new_attribute" initial="create">
+                    <state id="create">
+                        <onentry>
+                            <raise event="create_instance" scope="cd">
+                                <parameter expr="'add_attribute_button'"/>
+                                <parameter expr="'Button'"/>
+                                <parameter expr="self"/>
+                            </raise>
+                        </onentry>
+
+                        <transition event="instance_created" target="../pack">
+                            <parameter name="assoc_name"/>
+                            <raise event="start_instance" scope="cd">
+                                <parameter expr="assoc_name"/>
+                            </raise>
+                        </transition>
+                    </state>
+
+                    <state id="pack">
+                        <transition event="tk_widget" target="../../../running">
+                            <parameter name="tk_widget"/>
+                            <script>
+                                tk_widget.grid(row=self.counter, column=3)
+                            </script>
+                        </transition>
+                    </state>
+                </state>
+            </state>
+
+            <state id="running">
+                <transition event="button_pressed" cond="event_name.startswith('delete_')" target="../delete_entry">
+                    <parameter name="event_name"/>
+                    <script>
+                        self.parameter = event_name.split("delete_", 1)[1]
+                    </script>
+                </transition>
+
+                <transition event="button_pressed" cond="event_name.startswith('optional_')" target="../make_optional">
+                    <parameter name="event_name"/>
+                    <script>
+                        self.parameter = event_name.split("optional_", 1)[1]
+                    </script>
+                </transition>
+
+                <transition event="button_pressed" cond="event_name.startswith('mandatory_')" target="../make_mandatory">
+                    <parameter name="event_name"/>
+                    <script>
+                        self.parameter = event_name.split("mandatory_", 1)[1]
+                    </script>
+                </transition>
+
+                <transition event="button_pressed" cond="event_name == 'create'" target="../create_new_entry">
+                    <parameter name="event_name"/>
+                    <script>
+                        self.attr_modify = [{'name': self.get_unique_attr_name(), 'type': next(iter(self.allowed_types)), 'optional': True}]
+                    </script>
+                </transition>
+
+                <transition event="change_dropdown" target="../change_type">
+                    <parameter name="event_name"/>
+                    <parameter name="new_name"/>
+                    <script>
+                        self.parameter = (event_name, new_name)
+                    </script>
+                </transition>
+
+                <transition event="change_entry" target="../change_name">
+                    <parameter name="original_name"/>
+                    <parameter name="new_name"/>
+                    <script>
+                        self.parameter = (original_name, new_name)
+                    </script>
+                </transition>
+            </state>
+
+            <state id="change_type">
                 <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 event="mv_request" scope="broad">
+                        <parameter expr="'attr_type'"/>
+                        <parameter expr="[current_model, self.as_element, self.parameter[0], self.parameter[1]]"/>
                     </raise>
                 </onentry>
 
-                <transition event="instance_created" target="../wait_for_packing">
-                    <parameter name="association_name"/>
-                    <raise event="start_instance" scope="cd">
-                        <parameter expr="association_name"/>
+                <transition event="mv_response" target="../running"/>
+            </state>
+
+            <state id="change_name">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_name'"/>
+                        <parameter expr="[current_model, self.as_element, self.parameter[0], self.parameter[1]]"/>
                     </raise>
+                </onentry>
 
+                <transition event="mv_response" target="../running">
+                    <raise event="change_event_name" scope="narrow" target="self.associations_type[self.parameter[0]]">
+                        <parameter expr="self.parameter[1]"/>
+                    </raise>
+                    <raise event="change_event_name" scope="narrow" target="self.associations_optional[self.parameter[0]]">
+                        <parameter expr="self.parameter[1]"/>
+                    </raise>
+                    <raise event="change_event_name" scope="narrow" target="self.associations_delete[self.parameter[0]]">
+                        <parameter expr="self.parameter[1]"/>
+                    </raise>
                     <script>
-                        self.button = association_name
+                        self.associations_name[self.parameter[1]] = self.associations_name[self.parameter[0]]
+                        self.associations_type[self.parameter[1]] = self.associations_type[self.parameter[0]]
+                        self.associations_optional[self.parameter[1]] = self.associations_optional[self.parameter[0]]
+                        self.associations_delete[self.parameter[1]] = self.associations_delete[self.parameter[0]]
+
+                        del self.associations_name[self.parameter[0]]
+                        del self.associations_type[self.parameter[0]]
+                        del self.associations_optional[self.parameter[0]]
+                        del self.associations_delete[self.parameter[0]]
                     </script>
                 </transition>
             </state>
 
-            <state id="wait_for_packing">
-                <transition event="tk_widget" target="../../root">
-                    <parameter name="tk_elem"/>
+            <state id="create_new_entry">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_assign'"/>
+                        <parameter expr="[current_model, self.as_element, self.attr_modify['name'], self.attr_modify['type'], self.attr_modify['optional']]"/>
+                    </raise>
+                </onentry>
+
+                <transition event="mv_response" target="../init/create_entries"/>
+            </state>
+
+            <state id="make_optional">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_optional'"/>
+                        <parameter expr="[current_model, self.as_element, self.parameter]"/>
+                    </raise>
+
+                    <transition event="mv_response" target="../running">
+                        <raise event="activate" scope="narrow" target="self.associations_optional[self.parameter]"/>
+                    </transition>
+                </onentry>
+            </state>
+
+            <state id="make_mandatory">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_mandatory'"/>
+                        <parameter expr="[current_model, self.as_element, self.parameter]"/>
+                    </raise>
+
+                    <transition event="mv_response" target="../running">
+                        <raise event="deactivate" scope="narrow" target="self.associations_optional[self.parameter]"/>
+                    </transition>
+                </onentry>
+            </state>
+
+            <state id="delete_entry">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'attr_del'"/>
+                        <parameter expr="[current_model, self.as_element, self.parameter]"/>
+                    </raise>
+                </onentry>
+
+                <transition event="mv_response" target="../running">
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="self.associations_name[self.parameter]"/>
+                    </raise>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="self.associations_type[self.parameter]"/>
+                    </raise>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="self.associations_optional[self.parameter]"/>
+                    </raise>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="self.associations_delete[self.parameter]"/>
+                    </raise>
                     <script>
-                        tk_elem.pack(fill=tk.X)
+                        del self.associations_name[self.parameter]
+                        del self.associations_type[self.parameter]
+                        del self.associations_optional[self.parameter]
+                        del self.associations_delete[self.parameter]
                     </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()
-                    print("SENDING DATA")
-                </script>
+            <state id="closing">
+                <onentry>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="self.button"/>
+                    </raise>
+                </onentry>
 
-                <raise event="prompt_results" scope="narrow" target="'parent'">
-                    <parameter expr="results"/>
-                </raise>
-            </transition>
+                <transition event="instance_deleted" 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">
+            <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="narrow" target="'parent'"/>
-            </onentry>
-        </state>
     </scxml>
 </class>