|
|
@@ -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>
|