|
@@ -8,6 +8,7 @@ from sketchUI.graphics_sketch_group import SketchGroup
|
|
|
from sketchUI.graphics_sketch_line import SketchedLineItem
|
|
|
from sketchUI import mvops
|
|
|
from evolution.node_ops import NodeAdd, NodeDelete, NodeRetype
|
|
|
+from evolution.edge_ops import EdgeDel, EdgeAdd
|
|
|
from evolution.attribute_ops import AttributeAdd
|
|
|
import commons
|
|
|
|
|
@@ -43,18 +44,15 @@ class SketchScene(QGraphicsScene):
|
|
|
return False
|
|
|
return True
|
|
|
|
|
|
- def draw_edge(self, from_item, to_item, is_new, edge_id=None):
|
|
|
- # type: (GraphicsNodeItem, GraphicsNodeItem, bool, str) -> None
|
|
|
- # draw an edge between two items. If is_new, also add it to the model
|
|
|
+ def draw_edge(self, from_item, to_item, edge_id=None):
|
|
|
+ # type: (GraphicsNodeItem, GraphicsNodeItem, str) -> GraphicsEdgeItem
|
|
|
+ # draw an edge between two items.
|
|
|
line = GraphicsEdgeItem(from_item, to_item, edge_id)
|
|
|
line.setFlag(QGraphicsItem.ItemIsMovable, False)
|
|
|
line.setFlag(QGraphicsItem.ItemIsSelectable, False)
|
|
|
self.addItem(line)
|
|
|
line.redraw()
|
|
|
-
|
|
|
- if is_new:
|
|
|
- edge_id = mvops.add_edge(self._cur_model, from_item.node_id, to_item.node_id)
|
|
|
- line.edge_id = edge_id
|
|
|
+ return line
|
|
|
|
|
|
def mousePressEvent(self, event):
|
|
|
if event.button() == Qt.LeftButton and self._in_draw_mode():
|
|
@@ -94,7 +92,8 @@ class SketchScene(QGraphicsScene):
|
|
|
self._parent.tableWidget.blockSignals(False)
|
|
|
|
|
|
elif isinstance(item, GraphicsEdgeItem):
|
|
|
- self._parent.plainTextEdit.appendPlainText("Selected edge")
|
|
|
+ self._parent.plainTextEdit.appendPlainText("Selected edge ({},{}),id={}".format(item.from_item.get_type(),
|
|
|
+ item.to_item.get_type(), item.edge_id))
|
|
|
|
|
|
else:
|
|
|
pass
|
|
@@ -171,7 +170,26 @@ class SketchScene(QGraphicsScene):
|
|
|
item = self.itemAt(event.scenePos(), QTransform())
|
|
|
if not item or not isinstance(item, GraphicsNodeItem):
|
|
|
return
|
|
|
- self.draw_edge(self._connect_from_item, item, is_new=True)
|
|
|
+
|
|
|
+ from_item = self._connect_from_item
|
|
|
+ to_item = item
|
|
|
+ # global or local edge add?
|
|
|
+ scope, ok = QInputDialog.getItem(self._parent, "Select scope", "Scope", ["Local", "Global"])
|
|
|
+ if not ok:
|
|
|
+ return
|
|
|
+
|
|
|
+ QApplication.setOverrideCursor(Qt.WaitCursor)
|
|
|
+ add_handler = EdgeAdd()
|
|
|
+
|
|
|
+ if scope == "Global":
|
|
|
+ add_handler.execute(self._cur_model, from_item.node_id, to_item.node_id, local=False)
|
|
|
+ else:
|
|
|
+ add_handler.execute(self._cur_model, from_item.node_id, to_item.node_id, local=True)
|
|
|
+ self.draw_edge(self._connect_from_item, item)
|
|
|
+
|
|
|
+ # reload model because only then the ids of the edges get set anew
|
|
|
+ self._parent._load_model()
|
|
|
+ QApplication.restoreOverrideCursor()
|
|
|
|
|
|
else:
|
|
|
pass
|
|
@@ -361,12 +379,32 @@ class SketchScene(QGraphicsScene):
|
|
|
def _handle_keypress_delete(self, selected):
|
|
|
if len(selected) == 1 and isinstance(selected[0], GraphicsEdgeItem):
|
|
|
# an edge is to be deleted
|
|
|
- # TODO: use evolution code
|
|
|
- self._parent.plainTextEdit.appendPlainText("Deleting edge")
|
|
|
edge = selected[0]
|
|
|
- mvops.delete_node(self._cur_model, edge.edge_id)
|
|
|
- self.removeItem(edge)
|
|
|
- return
|
|
|
+ edge_from_type = edge.from_item.get_type()
|
|
|
+ edge_to_type = edge.to_item.get_type()
|
|
|
+ self._parent.plainTextEdit.appendPlainText("Deleting edge ({},{}),id={}".format(edge_from_type, edge_to_type, edge.edge_id))
|
|
|
+
|
|
|
+ # local or global?
|
|
|
+ scope, ok = QInputDialog.getItem(self._parent, "Select scope", "Scope", ["Local", "Global"])
|
|
|
+ if not ok:
|
|
|
+ return
|
|
|
+
|
|
|
+ del_handler = EdgeDel()
|
|
|
+ QApplication.setOverrideCursor(Qt.WaitCursor)
|
|
|
+ if scope == "Global":
|
|
|
+ del_handler.execute(self._cur_model, edge.edge_id, local=False, check_if_last=False)
|
|
|
+ # delete all edges with same typing in view
|
|
|
+ for item in self.items():
|
|
|
+ if not isinstance(item, GraphicsEdgeItem):
|
|
|
+ continue
|
|
|
+ if item.from_item.get_type() in [edge_from_type, edge_to_type] and item.to_item.get_type() in [edge_from_type, edge_to_type]:
|
|
|
+ self.removeItem(item)
|
|
|
+ else:
|
|
|
+ del_handler.execute(self._cur_model, edge.edge_id, local=True, check_if_last=True)
|
|
|
+ # delete from view
|
|
|
+ self.removeItem(edge)
|
|
|
+
|
|
|
+ QApplication.restoreOverrideCursor()
|
|
|
|
|
|
elif len(selected) == 1 and isinstance(selected[0], GraphicsNodeItem):
|
|
|
del_hander = NodeDelete()
|