|
@@ -1,12 +1,12 @@
|
|
|
from enum import Enum
|
|
|
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsRectItem, \
|
|
|
- QGraphicsEllipseItem, QInputDialog, QGraphicsItemGroup
|
|
|
+ QGraphicsEllipseItem, QInputDialog, QGraphicsItemGroup, QTableWidgetItem
|
|
|
from PyQt5.Qt import Qt, QPointF, QPen, QTransform, QApplication
|
|
|
from sketchUI.graphics_edge_item import GraphicsEdgeItem
|
|
|
from sketchUI.graphics_node_item import GraphicsNodeItem, IconType
|
|
|
from sketchUI import mvops
|
|
|
from evolution.node_ops import NodeAdd, NodeDelete, NodeRetype
|
|
|
-from commons import all_nodes_with_type
|
|
|
+import commons
|
|
|
|
|
|
|
|
|
class Mode(Enum):
|
|
@@ -57,12 +57,35 @@ class SketchScene(QGraphicsScene):
|
|
|
# start drawing, save click point
|
|
|
self._orig_point = event.scenePos()
|
|
|
self._cur_drawing = True
|
|
|
+
|
|
|
elif event.button() == Qt.LeftButton and self._mode == Mode.CONNECT:
|
|
|
+ # store clicked item to connect it later
|
|
|
item = self.itemAt(event.scenePos(), QTransform())
|
|
|
if not item or not isinstance(item, GraphicsNodeItem):
|
|
|
return
|
|
|
else:
|
|
|
self._connect_from_item = item
|
|
|
+
|
|
|
+ elif event.button() == Qt.LeftButton and self._mode == Mode.SELECT:
|
|
|
+ # load attributes for selected item (if it is a typed node)
|
|
|
+ item = self.itemAt(event.scenePos(), QTransform())
|
|
|
+ if not item or not isinstance(item, GraphicsNodeItem):
|
|
|
+ return
|
|
|
+
|
|
|
+ self._parent.tableWidget.setRowCount(0)
|
|
|
+ self._parent.tableWidget.blockSignals(True)
|
|
|
+ self._parent.plainTextEdit.appendPlainText("Selected node of type {}".format(item.get_type()))
|
|
|
+ attrs = commons.get_attributes_of_node(self._cur_model, item.node_id)
|
|
|
+ for attr in attrs:
|
|
|
+ table_item_key = QTableWidgetItem(attr.key)
|
|
|
+ table_item_key.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
|
|
|
+ table_item_val = QTableWidgetItem(attr.val)
|
|
|
+ cur_row_cnt = self._parent.tableWidget.rowCount()
|
|
|
+ self._parent.tableWidget.insertRow(cur_row_cnt)
|
|
|
+ self._parent.tableWidget.setItem(cur_row_cnt, 0, table_item_key)
|
|
|
+ self._parent.tableWidget.setItem(cur_row_cnt, 1, table_item_val)
|
|
|
+ self._parent.tableWidget.blockSignals(False)
|
|
|
+
|
|
|
else:
|
|
|
pass
|
|
|
|
|
@@ -182,9 +205,11 @@ class SketchScene(QGraphicsScene):
|
|
|
else:
|
|
|
self._parent.plainTextEdit.appendPlainText("Error: Cannot type element {}".format(item))
|
|
|
|
|
|
+ # "A" attributes a node
|
|
|
+ elif event.key() == Qt.Key_A:
|
|
|
+ self._handle_keypress_attribute(self.selectedItems())
|
|
|
else:
|
|
|
QGraphicsScene.keyPressEvent(self, event)
|
|
|
- self.clearSelection()
|
|
|
|
|
|
def _handle_keypress_type_on_node(self, item):
|
|
|
# type: (GraphicsNodeItem) -> None
|
|
@@ -258,7 +283,7 @@ class SketchScene(QGraphicsScene):
|
|
|
else:
|
|
|
add_handler.execute(self._cur_model, node_type, local=True)
|
|
|
# Get node id of newly added node in current model
|
|
|
- nodeid = all_nodes_with_type(self._cur_model, node_type)[0]
|
|
|
+ nodeid = commons.all_nodes_with_type(self._cur_model, node_type)[0]
|
|
|
|
|
|
self._parent.plainTextEdit.appendPlainText("Capturing concrete syntax of group ...")
|
|
|
# create concrete syntax model for the sketched elements
|
|
@@ -323,3 +348,24 @@ class SketchScene(QGraphicsScene):
|
|
|
self._parent.populate_types()
|
|
|
|
|
|
QApplication.restoreOverrideCursor()
|
|
|
+
|
|
|
+ def _handle_keypress_attribute(self, selected):
|
|
|
+ if not len(selected) == 1:
|
|
|
+ return
|
|
|
+ item = selected[0]
|
|
|
+ if not isinstance(item, GraphicsNodeItem):
|
|
|
+ return
|
|
|
+
|
|
|
+ # ask user for key value
|
|
|
+ key, ok = QInputDialog.getText(self._parent, "New attribute", "Key value")
|
|
|
+ if not ok or not key:
|
|
|
+ return
|
|
|
+
|
|
|
+ # check if key value already used for this node
|
|
|
+ attrs = commons.get_attributes_of_node(self._cur_model, item.node_id)
|
|
|
+ for attr in attrs:
|
|
|
+ if attr.key == key:
|
|
|
+ self._parent.plainTextEdit.appendPlainText("Error: Already such a key for the node: {}".format(key))
|
|
|
+ return
|
|
|
+
|
|
|
+ self._parent.add_new_attribute(key)
|