|
@@ -18,6 +18,9 @@ MAX_WIDTH = 500
|
|
|
MAX_HEIGHT = 500
|
|
|
MM_RENDERED = "MM_rendered_graphical"
|
|
|
|
|
|
+def rendered_formula(model_name, mapper_name):
|
|
|
+ return "__RENDERED_%s__%s" % (model_name, mapper_name)
|
|
|
+
|
|
|
init()
|
|
|
login("admin", "admin")
|
|
|
|
|
@@ -85,7 +88,7 @@ class Window(object):
|
|
|
# Change coordinates of all enclosed elements!
|
|
|
# elem is an AS id of the group
|
|
|
m_x, m_y = coords
|
|
|
- o_x, o_y = self.original_coords
|
|
|
+ o_x, o_y = self.previous_coords
|
|
|
d_x = m_x - o_x
|
|
|
d_y = m_y - o_y
|
|
|
|
|
@@ -97,28 +100,36 @@ class Window(object):
|
|
|
elif len(obj_coords) == 4:
|
|
|
c_x, c_y, c_x2, c_y2 = obj_coords
|
|
|
self.canvas.coords(tkinter_obj, (c_x + d_x, c_y + d_y, c_x2 + d_x, c_y2 + d_y))
|
|
|
- self.original_coords = coords
|
|
|
|
|
|
def left_clicked(self, evt):
|
|
|
# Left click means we select an element for dragging
|
|
|
x, y = evt.x, evt.y
|
|
|
- self.current_element = self.find_AS(x, y)
|
|
|
self.original_coords = x, y
|
|
|
- print("Left clicked on group with : " + str(self.current_element))
|
|
|
+ self.previous_coords = x, y
|
|
|
+ self.current_element = self.find_AS(x, y)
|
|
|
|
|
|
def left_drag(self, evt):
|
|
|
# Left drag means we are dragging something, but only if something is selected
|
|
|
- x, y = evt.x, evt.y
|
|
|
if self.current_element is not None:
|
|
|
+ x, y = evt.x, evt.y
|
|
|
self.move_group(self.current_element, (x, y))
|
|
|
+ self.previous_coords = x, y
|
|
|
|
|
|
def left_released(self, evt):
|
|
|
# Left click means we select an element for dragging
|
|
|
- x, y = evt.x, evt.y
|
|
|
if self.current_element is not None:
|
|
|
+ x, y = evt.x, evt.y
|
|
|
+ d_x = x - self.original_coords[0]
|
|
|
+ d_y = y - self.original_coords[1]
|
|
|
+
|
|
|
self.move_group(self.current_element, (x, y))
|
|
|
+ attrs = read_attrs(rendered_formula(self.selected_model.get(), self.selected_mapper.get()), self.AS_to_CS[self.current_element])
|
|
|
+
|
|
|
+ print("Shift: " + str((d_x, d_y)))
|
|
|
+
|
|
|
# Send new values to Modelverse!
|
|
|
- # TODO
|
|
|
+ attr_assign(rendered_formula(self.selected_model.get(), self.selected_mapper.get()), self.AS_to_CS[self.current_element], "x", attrs["x"] + d_x)
|
|
|
+ attr_assign(rendered_formula(self.selected_model.get(), self.selected_mapper.get()), self.AS_to_CS[self.current_element], "y", attrs["y"] + d_y)
|
|
|
|
|
|
def middle_clicked(self, evt):
|
|
|
# Middle clicked means we are modifying attributes of something
|
|
@@ -126,7 +137,7 @@ class Window(object):
|
|
|
|
|
|
# Read available attrs and their values
|
|
|
as_id = self.find_AS(x, y)
|
|
|
- attrs = read_attrs(as_id)
|
|
|
+ attrs = read_attrs(self.selected_model.get(), as_id)
|
|
|
attrs = {k: json.dumps(attrs[k]) for k in attrs}
|
|
|
print("Got attrs: " + str(attrs))
|
|
|
|
|
@@ -140,9 +151,9 @@ class Window(object):
|
|
|
for k, v in d.result.items():
|
|
|
v = json.loads(v)
|
|
|
if v is None:
|
|
|
- attr_delete(as_id, k)
|
|
|
+ attr_delete(self.selected_model.get(), as_id, k)
|
|
|
else:
|
|
|
- attr_assign(as_id, k, v)
|
|
|
+ attr_assign(self.selected_model.get(), as_id, k, v)
|
|
|
|
|
|
def right_clicked(self, evt):
|
|
|
# Right clicked means we are creating something
|
|
@@ -152,14 +163,11 @@ class Window(object):
|
|
|
pass
|
|
|
|
|
|
def visualize(self, model):
|
|
|
- print("Visualizing model: " + str(model))
|
|
|
cache = {}
|
|
|
hierarchy = {}
|
|
|
parent = {}
|
|
|
|
|
|
- # First remove all previous elements in the canvas!
|
|
|
- for elem in self.canvas.find_all():
|
|
|
- self.canvas.destroy(elem)
|
|
|
+ self.canvas.delete("all")
|
|
|
|
|
|
self.CS_to_AS = {}
|
|
|
self.AS_to_CS = {}
|
|
@@ -167,7 +175,6 @@ class Window(object):
|
|
|
self.TK_to_CS = {}
|
|
|
|
|
|
def findXY(element_id):
|
|
|
- print(cache[element_id])
|
|
|
x = cache[element_id]["x"]
|
|
|
y = cache[element_id]["y"]
|
|
|
|
|
@@ -217,7 +224,6 @@ class Window(object):
|
|
|
height = element["height"]
|
|
|
lineWidth = element["lineWidth"]
|
|
|
lineColour = element["lineColour"]
|
|
|
- print("Coordinates: " + str((x, y, x+width, y+height)))
|
|
|
tkinter_elem = self.canvas.create_rectangle(x, y, x+width, y+height, fill=fillColour, outline=lineColour)
|
|
|
elif t == "Ellipse":
|
|
|
fillColour = element["fillColour"]
|
|
@@ -257,11 +263,8 @@ class Window(object):
|
|
|
# Get instance model's type first, as transformations are defined on the type
|
|
|
models = dict(model_list())
|
|
|
type_model = models[instance_model]
|
|
|
- print("Found type model: " + type_model)
|
|
|
- print("Found MM_Rendered model: " + MM_RENDERED)
|
|
|
|
|
|
mappers = transformation_between(type_model, MM_RENDERED)
|
|
|
- print("Supported: " + str(mappers))
|
|
|
return mappers
|
|
|
|
|
|
def create_element(self, t):
|
|
@@ -277,23 +280,18 @@ class Window(object):
|
|
|
rendered = model_render(self.selected_model.get(), self.selected_mapper.get())
|
|
|
|
|
|
#TODO visualize rendered model
|
|
|
- print("Rendering model: " + rendered)
|
|
|
import json
|
|
|
self.visualize(json.loads(rendered))
|
|
|
- model_modify(self.selected_model.get())
|
|
|
|
|
|
def open_model(self):
|
|
|
try:
|
|
|
model_exit()
|
|
|
except InvalidMode:
|
|
|
pass
|
|
|
- print("Opening model: " + self.selected_model.get())
|
|
|
available_mappers = self.read_available_mappers(self.selected_model.get())
|
|
|
self.reset_optionmenu(self.mapper_options, available_mappers, self.selected_mapper)
|
|
|
|
|
|
- model_modify(self.selected_model.get())
|
|
|
-
|
|
|
- available_types = [i[0] for i in types_full() if i[1] == "Class"]
|
|
|
+ available_types = [i[0] for i in types_full(self.selected_model.get()) if i[1] == "Class"]
|
|
|
|
|
|
for button in self.mm_buttons:
|
|
|
button.destroy()
|
|
@@ -311,7 +309,6 @@ class Window(object):
|
|
|
d = PromptDialog(root, ["Name:"])
|
|
|
if d.result is not None:
|
|
|
name = str(d.result["Name:"])
|
|
|
- print("Creating new model named " + name)
|
|
|
model_add(name, self.selected_model.get())
|
|
|
self.reset_optionmenu(self.available_models, model_list())
|
|
|
self.selected_model.set(name)
|