|
|
@@ -1,9 +1,9 @@
|
|
|
"""
|
|
|
Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
|
|
|
|
|
|
-Date: Fri Sep 15 11:45:03 2017
|
|
|
+Date: Wed Sep 27 15:50:59 2017
|
|
|
|
|
|
-Model author: Yentl Van Tendeloo and Addis Gebremichael
|
|
|
+Model author: Yentl Van Tendeloo
|
|
|
Model name: Modelverse Visual Editor - Tkinter Version
|
|
|
Model description:
|
|
|
Modelverse Visual Editor
|
|
|
@@ -3027,7 +3027,7 @@ class Modelverse(RuntimeClassBase):
|
|
|
def _initialized_behaviour_operations_read_attrs_0_exec(self, parameters):
|
|
|
response = self.responses.pop(0).strip()
|
|
|
_, response = response.split(": ", 1)
|
|
|
- values = {line.split(": ", 1)[0]: line.split(": ", 1)[1] for line in response.split("\n")}
|
|
|
+ values = {line.split(" : ", 1)[0]: line.split(" : ", 1)[1] for line in response.split("\n")}
|
|
|
values = {key: values[key].split(" = ", 1)[1] for key in values}
|
|
|
self.raiseInternalEvent(Event("result", None, [values]))
|
|
|
|
|
|
@@ -4474,7 +4474,6 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
|
|
|
|
|
|
def _running_rerender_model_request_render_0_exec(self, parameters):
|
|
|
result = parameters[0]
|
|
|
- print("Result: " + str(result))
|
|
|
self.rendered = result
|
|
|
|
|
|
def _running_rerender_model_render_model_allocate_groups_0_exec(self, parameters):
|
|
|
@@ -5735,7 +5734,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
|
|
|
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']]))
|
|
|
+ self.big_step.outputEventOM(Event("create_instance", None, [self, 'elements', 'CanvasElement', self, (element['x'], element['y']), element['id'], element['__asid']]))
|
|
|
|
|
|
def _ready_2_exec(self, parameters):
|
|
|
element = parameters[0]
|
|
|
@@ -5759,7 +5758,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
|
|
|
self.connecting_lines.setdefault(element['__source'], []).append(element)
|
|
|
self.connecting_lines.setdefault(element['__target'], []).append(element)
|
|
|
|
|
|
- line = self.create_line(source_x, source_y, target_x, target_y)
|
|
|
+ line = self.create_line(source_x, source_y, target_x, target_y, fill=element['lineColour'], width=element['lineWidth'], arrow=tk.LAST if element['arrow'] else tk.NONE)
|
|
|
element['elem'] = line
|
|
|
|
|
|
def _ready_4_guard(self, parameters):
|
|
|
@@ -5800,7 +5799,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
|
|
|
RuntimeClassBase.initializeStatechart(self)
|
|
|
|
|
|
class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
- def __init__(self, controller, parent, coordinates, group_element):
|
|
|
+ def __init__(self, controller, parent, coordinates, cs_element, as_element):
|
|
|
RuntimeClassBase.__init__(self, controller)
|
|
|
|
|
|
self.semantics.big_step_maximality = StatechartSemantics.TakeMany
|
|
|
@@ -5813,15 +5812,17 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
self.build_statechart_structure()
|
|
|
|
|
|
# call user defined constructor
|
|
|
- CanvasElement.user_defined_constructor(self, parent, coordinates, group_element)
|
|
|
+ CanvasElement.user_defined_constructor(self, parent, coordinates, cs_element, as_element)
|
|
|
|
|
|
- def user_defined_constructor(self, parent, coordinates, group_element):
|
|
|
+ def user_defined_constructor(self, parent, coordinates, cs_element, as_element):
|
|
|
SCCDWidget.__init__(self, True)
|
|
|
self.containing_canvas = parent
|
|
|
self.coordinates = coordinates
|
|
|
self.elements = {}
|
|
|
self.tmp = {}
|
|
|
- self.group_element = group_element
|
|
|
+ self.cs_element = cs_element
|
|
|
+ self.as_element = as_element
|
|
|
+ self.diff_results = {}
|
|
|
|
|
|
def user_defined_destructor(self):
|
|
|
# call super class destructors
|
|
|
@@ -5841,26 +5842,59 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
# state /dragging
|
|
|
self.states["/dragging"] = State(2, "/dragging", self)
|
|
|
|
|
|
+ # state /update_attrs
|
|
|
+ self.states["/update_attrs"] = State(3, "/update_attrs", self)
|
|
|
+
|
|
|
+ # state /update_attrs/query
|
|
|
+ self.states["/update_attrs/query"] = State(4, "/update_attrs/query", self)
|
|
|
+ self.states["/update_attrs/query"].setEnter(self._update_attrs_query_enter)
|
|
|
+
|
|
|
+ # state /update_attrs/prompt
|
|
|
+ self.states["/update_attrs/prompt"] = State(5, "/update_attrs/prompt", self)
|
|
|
+ self.states["/update_attrs/prompt"].setEnter(self._update_attrs_prompt_enter)
|
|
|
+
|
|
|
+ # state /update_attrs/wait_for_results
|
|
|
+ self.states["/update_attrs/wait_for_results"] = State(6, "/update_attrs/wait_for_results", self)
|
|
|
+
|
|
|
+ # state /update_attrs/process_results
|
|
|
+ self.states["/update_attrs/process_results"] = State(7, "/update_attrs/process_results", self)
|
|
|
+
|
|
|
+ # state /update_attrs/mark_dirty
|
|
|
+ self.states["/update_attrs/mark_dirty"] = State(8, "/update_attrs/mark_dirty", self)
|
|
|
+ self.states["/update_attrs/mark_dirty"].setEnter(self._update_attrs_mark_dirty_enter)
|
|
|
+
|
|
|
# state /update_mv
|
|
|
- self.states["/update_mv"] = State(3, "/update_mv", self)
|
|
|
+ self.states["/update_mv"] = State(9, "/update_mv", self)
|
|
|
+
|
|
|
+ # state /update_mv/mark_dirty
|
|
|
+ self.states["/update_mv/mark_dirty"] = State(10, "/update_mv/mark_dirty", self)
|
|
|
+ self.states["/update_mv/mark_dirty"].setEnter(self._update_mv_mark_dirty_enter)
|
|
|
|
|
|
# state /update_mv/x
|
|
|
- self.states["/update_mv/x"] = State(4, "/update_mv/x", self)
|
|
|
+ self.states["/update_mv/x"] = State(11, "/update_mv/x", self)
|
|
|
self.states["/update_mv/x"].setEnter(self._update_mv_x_enter)
|
|
|
|
|
|
# state /update_mv/y
|
|
|
- self.states["/update_mv/y"] = State(5, "/update_mv/y", self)
|
|
|
+ self.states["/update_mv/y"] = State(12, "/update_mv/y", self)
|
|
|
self.states["/update_mv/y"].setEnter(self._update_mv_y_enter)
|
|
|
|
|
|
# add children
|
|
|
self.states[""].addChild(self.states["/main"])
|
|
|
self.states[""].addChild(self.states["/dragging"])
|
|
|
+ self.states[""].addChild(self.states["/update_attrs"])
|
|
|
self.states[""].addChild(self.states["/update_mv"])
|
|
|
+ self.states["/update_attrs"].addChild(self.states["/update_attrs/query"])
|
|
|
+ self.states["/update_attrs"].addChild(self.states["/update_attrs/prompt"])
|
|
|
+ self.states["/update_attrs"].addChild(self.states["/update_attrs/wait_for_results"])
|
|
|
+ self.states["/update_attrs"].addChild(self.states["/update_attrs/process_results"])
|
|
|
+ self.states["/update_attrs"].addChild(self.states["/update_attrs/mark_dirty"])
|
|
|
+ self.states["/update_mv"].addChild(self.states["/update_mv/mark_dirty"])
|
|
|
self.states["/update_mv"].addChild(self.states["/update_mv/x"])
|
|
|
self.states["/update_mv"].addChild(self.states["/update_mv/y"])
|
|
|
self.states[""].fixTree()
|
|
|
self.states[""].default_state = self.states["/main"]
|
|
|
- self.states["/update_mv"].default_state = self.states["/update_mv/x"]
|
|
|
+ self.states["/update_attrs"].default_state = self.states["/update_attrs/query"]
|
|
|
+ self.states["/update_mv"].default_state = self.states["/update_mv/mark_dirty"]
|
|
|
|
|
|
# transition /main
|
|
|
_main_0 = Transition(self, self.states["/main"], [self.states["/main"]])
|
|
|
@@ -5872,6 +5906,10 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
_main_1.setTrigger(Event("left-click", None))
|
|
|
_main_1.setGuard(self._main_1_guard)
|
|
|
self.states["/main"].addTransition(_main_1)
|
|
|
+ _main_2 = Transition(self, self.states["/main"], [self.states["/update_attrs"]])
|
|
|
+ _main_2.setTrigger(Event("middle-click", None))
|
|
|
+ _main_2.setGuard(self._main_2_guard)
|
|
|
+ self.states["/main"].addTransition(_main_2)
|
|
|
|
|
|
# transition /dragging
|
|
|
_dragging_0 = Transition(self, self.states["/dragging"], [self.states["/dragging"]])
|
|
|
@@ -5885,6 +5923,53 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
_dragging_1.setGuard(self._dragging_1_guard)
|
|
|
self.states["/dragging"].addTransition(_dragging_1)
|
|
|
|
|
|
+ # transition /update_attrs/query
|
|
|
+ _update_attrs_query_0 = Transition(self, self.states["/update_attrs/query"], [self.states["/update_attrs/prompt"]])
|
|
|
+ _update_attrs_query_0.setAction(self._update_attrs_query_0_exec)
|
|
|
+ _update_attrs_query_0.setTrigger(Event("mv_response", None))
|
|
|
+ self.states["/update_attrs/query"].addTransition(_update_attrs_query_0)
|
|
|
+
|
|
|
+ # transition /update_attrs/prompt
|
|
|
+ _update_attrs_prompt_0 = Transition(self, self.states["/update_attrs/prompt"], [self.states["/update_attrs/wait_for_results"]])
|
|
|
+ _update_attrs_prompt_0.setAction(self._update_attrs_prompt_0_exec)
|
|
|
+ _update_attrs_prompt_0.setTrigger(Event("instance_created", None))
|
|
|
+ self.states["/update_attrs/prompt"].addTransition(_update_attrs_prompt_0)
|
|
|
+
|
|
|
+ # transition /update_attrs/wait_for_results
|
|
|
+ _update_attrs_wait_for_results_0 = Transition(self, self.states["/update_attrs/wait_for_results"], [self.states["/update_attrs/wait_for_results"]])
|
|
|
+ _update_attrs_wait_for_results_0.setAction(self._update_attrs_wait_for_results_0_exec)
|
|
|
+ _update_attrs_wait_for_results_0.setTrigger(Event("prompt_results", None))
|
|
|
+ self.states["/update_attrs/wait_for_results"].addTransition(_update_attrs_wait_for_results_0)
|
|
|
+ _update_attrs_wait_for_results_1 = Transition(self, self.states["/update_attrs/wait_for_results"], [self.states["/update_attrs/process_results"]])
|
|
|
+ _update_attrs_wait_for_results_1.setAction(self._update_attrs_wait_for_results_1_exec)
|
|
|
+ _update_attrs_wait_for_results_1.setTrigger(Event("close_window", None))
|
|
|
+ self.states["/update_attrs/wait_for_results"].addTransition(_update_attrs_wait_for_results_1)
|
|
|
+
|
|
|
+ # transition /update_attrs/process_results
|
|
|
+ _update_attrs_process_results_0 = Transition(self, self.states["/update_attrs/process_results"], [self.states["/update_attrs/process_results"]])
|
|
|
+ _update_attrs_process_results_0.setAction(self._update_attrs_process_results_0_exec)
|
|
|
+ _update_attrs_process_results_0.setTrigger(None)
|
|
|
+ _update_attrs_process_results_0.setGuard(self._update_attrs_process_results_0_guard)
|
|
|
+ self.states["/update_attrs/process_results"].addTransition(_update_attrs_process_results_0)
|
|
|
+ _update_attrs_process_results_1 = Transition(self, self.states["/update_attrs/process_results"], [self.states["/update_attrs/mark_dirty"]])
|
|
|
+ _update_attrs_process_results_1.setTrigger(None)
|
|
|
+ _update_attrs_process_results_1.setGuard(self._update_attrs_process_results_1_guard)
|
|
|
+ self.states["/update_attrs/process_results"].addTransition(_update_attrs_process_results_1)
|
|
|
+ _update_attrs_process_results_2 = Transition(self, self.states["/update_attrs/process_results"], [self.states["/update_attrs/process_results"]])
|
|
|
+ _update_attrs_process_results_2.setAction(self._update_attrs_process_results_2_exec)
|
|
|
+ _update_attrs_process_results_2.setTrigger(Event("mv_response", None))
|
|
|
+ self.states["/update_attrs/process_results"].addTransition(_update_attrs_process_results_2)
|
|
|
+
|
|
|
+ # transition /update_attrs/mark_dirty
|
|
|
+ _update_attrs_mark_dirty_0 = Transition(self, self.states["/update_attrs/mark_dirty"], [self.states["/main"]])
|
|
|
+ _update_attrs_mark_dirty_0.setTrigger(None)
|
|
|
+ self.states["/update_attrs/mark_dirty"].addTransition(_update_attrs_mark_dirty_0)
|
|
|
+
|
|
|
+ # transition /update_mv/mark_dirty
|
|
|
+ _update_mv_mark_dirty_0 = Transition(self, self.states["/update_mv/mark_dirty"], [self.states["/update_mv/x"]])
|
|
|
+ _update_mv_mark_dirty_0.setTrigger(Event("mv_response", None))
|
|
|
+ self.states["/update_mv/mark_dirty"].addTransition(_update_mv_mark_dirty_0)
|
|
|
+
|
|
|
# transition /update_mv/x
|
|
|
_update_mv_x_0 = Transition(self, self.states["/update_mv/x"], [self.states["/update_mv/y"]])
|
|
|
_update_mv_x_0.setTrigger(Event("mv_response", None))
|
|
|
@@ -5895,11 +5980,23 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
_update_mv_y_0.setTrigger(Event("mv_response", None))
|
|
|
self.states["/update_mv/y"].addTransition(_update_mv_y_0)
|
|
|
|
|
|
+ def _update_attrs_query_enter(self):
|
|
|
+ self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['read_attrs', [current_model, self.as_element]])]))
|
|
|
+
|
|
|
+ def _update_attrs_prompt_enter(self):
|
|
|
+ self.big_step.outputEventOM(Event("create_instance", None, [self, 'prompt', 'PromptWindow', self.prev_results, {}]))
|
|
|
+
|
|
|
+ def _update_attrs_mark_dirty_enter(self):
|
|
|
+ self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.cs_element, 'dirty', True]])]))
|
|
|
+
|
|
|
+ def _update_mv_mark_dirty_enter(self):
|
|
|
+ self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.cs_element, 'dirty', True]])]))
|
|
|
+
|
|
|
def _update_mv_x_enter(self):
|
|
|
- self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.group_element, 'x', self.coordinates[0]]])]))
|
|
|
+ self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.cs_element, 'x', self.coordinates[0]]])]))
|
|
|
|
|
|
def _update_mv_y_enter(self):
|
|
|
- self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.group_element, 'y', self.coordinates[1]]])]))
|
|
|
+ self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_rendered_model, self.cs_element, 'y', self.coordinates[1]]])]))
|
|
|
|
|
|
def _main_0_exec(self, parameters):
|
|
|
element = parameters[0]
|
|
|
@@ -5929,6 +6026,10 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
ID = parameters[0]
|
|
|
return id(self) == ID
|
|
|
|
|
|
+ def _main_2_guard(self, parameters):
|
|
|
+ ID = parameters[0]
|
|
|
+ return id(self) == ID
|
|
|
+
|
|
|
def _dragging_0_exec(self, parameters):
|
|
|
ID = parameters[0]
|
|
|
delta_x = self.prev_x - self.last_x
|
|
|
@@ -5951,7 +6052,7 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
|
|
|
delta_x = self.original_coords[0] - self.last_x
|
|
|
delta_y = self.original_coords[1] - self.last_y
|
|
|
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("moved_group", None, [self.group_element, (self.coordinates[0] - delta_x, self.coordinates[1] - delta_y)])]))
|
|
|
+ self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("moved_group", None, [self.cs_element, (self.coordinates[0] - delta_x, self.coordinates[1] - delta_y)])]))
|
|
|
|
|
|
def _dragging_0_guard(self, parameters):
|
|
|
ID = parameters[0]
|
|
|
@@ -5968,6 +6069,37 @@ class CanvasElement(RuntimeClassBase, SCCDWidget):
|
|
|
ID = parameters[0]
|
|
|
return id(self) == ID
|
|
|
|
|
|
+ def _update_attrs_query_0_exec(self, parameters):
|
|
|
+ result = parameters[0]
|
|
|
+ self.prev_results = result
|
|
|
+
|
|
|
+ def _update_attrs_prompt_0_exec(self, parameters):
|
|
|
+ name = parameters[0]
|
|
|
+ self.big_step.outputEventOM(Event("start_instance", None, [self, name]))
|
|
|
+
|
|
|
+ def _update_attrs_wait_for_results_0_exec(self, parameters):
|
|
|
+ results = parameters[0]
|
|
|
+ for k in results:
|
|
|
+ if results[k] != self.prev_results[k]:
|
|
|
+ self.diff_results[k] = json.loads(results[k])
|
|
|
+ self.remaining_responses = len(self.diff_results)
|
|
|
+
|
|
|
+ def _update_attrs_wait_for_results_1_exec(self, parameters):
|
|
|
+ self.big_step.outputEventOM(Event("delete_instance", None, [self, 'prompt']))
|
|
|
+
|
|
|
+ def _update_attrs_process_results_0_exec(self, parameters):
|
|
|
+ k, v = self.diff_results.popitem()
|
|
|
+ self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['attr_assign', [current_model, self.as_element, k, v]])]))
|
|
|
+
|
|
|
+ def _update_attrs_process_results_0_guard(self, parameters):
|
|
|
+ return len(self.diff_results) > 0
|
|
|
+
|
|
|
+ def _update_attrs_process_results_1_guard(self, parameters):
|
|
|
+ return self.remaining_responses == 0
|
|
|
+
|
|
|
+ def _update_attrs_process_results_2_exec(self, parameters):
|
|
|
+ self.remaining_responses -= 1
|
|
|
+
|
|
|
def initializeStatechart(self):
|
|
|
# enter default state
|
|
|
self.default_targets = self.states["/main"].getEffectiveTargetStates()
|
|
|
@@ -6038,10 +6170,11 @@ class ObjectManager(ObjectManagerBase):
|
|
|
instance.associations["parent"] = Association("A", 1, 1)
|
|
|
instance.associations["elements"] = Association("CanvasElement", 0, -1)
|
|
|
elif class_name == "CanvasElement":
|
|
|
- instance = CanvasElement(self.controller, construct_params[0], construct_params[1], construct_params[2])
|
|
|
+ instance = CanvasElement(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3])
|
|
|
instance.associations = {}
|
|
|
instance.associations["parent"] = Association("A", 1, 1)
|
|
|
instance.associations["elements"] = Association("CanvasElement", 0, -1)
|
|
|
+ instance.associations["prompt"] = Association("PromptWindow", 0, -1)
|
|
|
else:
|
|
|
raise Exception("Cannot instantiate class " + class_name)
|
|
|
return instance
|