|
@@ -1,4 +1,4 @@
|
|
|
-from PyQt5.QtWidgets import QMainWindow, QGraphicsItem, QAction, QActionGroup, QGraphicsView
|
|
|
+from PyQt5.QtWidgets import QMainWindow, QGraphicsItem, QAction, QActionGroup, QGraphicsView, QTableWidgetItem
|
|
|
from PyQt5.QtGui import QIcon
|
|
|
from PyQt5.QtCore import QStateMachine, QState
|
|
|
from PyQt5.Qt import QApplication, Qt
|
|
@@ -35,6 +35,12 @@ class IMMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
# setup log viewer
|
|
|
self.plainTextEdit.setReadOnly(True)
|
|
|
|
|
|
+ # setup table view for attributes
|
|
|
+ self.tableWidget.setColumnCount(2)
|
|
|
+ self.tableWidget.setHorizontalHeaderLabels(["Key", "Value"])
|
|
|
+ self.tableWidget.horizontalHeader().setStretchLastSection(True)
|
|
|
+ self.tableWidget.itemChanged.connect(self._on_attribute_edited)
|
|
|
+
|
|
|
#lastly, start the state machine
|
|
|
self._statemachine.start()
|
|
|
|
|
@@ -127,6 +133,10 @@ class IMMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
self.graphicsView.setDragMode(QGraphicsView.NoDrag)
|
|
|
|
|
|
def _add_node_to_scene(self, node_id, node_type, x=0, y=0):
|
|
|
+ """
|
|
|
+ Render a node with id and type to the canvas by getting its concrete syntax
|
|
|
+ from the modelverse.
|
|
|
+ """
|
|
|
consyn = mvops.get_consyn_of(node_type)
|
|
|
item = GraphicsNodeItem(node_id, node_type, consyn)
|
|
|
item.setPos(x, y)
|
|
@@ -164,3 +174,42 @@ class IMMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
ret = verify(self._cur_model)
|
|
|
self.plainTextEdit.appendPlainText("Result: {}".format(str(ret)))
|
|
|
QApplication.restoreOverrideCursor()
|
|
|
+
|
|
|
+ def _on_attribute_edited(self, item):
|
|
|
+ # type: (QTableWidgetItem) -> None
|
|
|
+ """ An attribute was edited, change it in the model but do not check (too expensive so
|
|
|
+ checking is done by verify method on demand).
|
|
|
+ If the new entered value is empty, delete the attribute.
|
|
|
+ """
|
|
|
+ row = self.tableWidget.row(item)
|
|
|
+ attr_key = self.tableWidget.item(row, 0).text()
|
|
|
+ attr_val = self.tableWidget.item(row, 1).text()
|
|
|
+ node = self._scene.selectedItems()[0]
|
|
|
+
|
|
|
+ if not attr_val:
|
|
|
+ self.plainTextEdit.appendPlainText("Deleting attribute {}".format(attr_key))
|
|
|
+ mvops.delete_attribute_from_node(self._cur_model, node.node_id, attr_key)
|
|
|
+ self.tableWidget.removeRow(row)
|
|
|
+ else:
|
|
|
+ self.plainTextEdit.appendPlainText("Updating value of attribute {} to {}".format(attr_key, attr_val))
|
|
|
+ mvops.update_attribute_val(self._cur_model, node.node_id, attr_key, attr_val)
|
|
|
+
|
|
|
+ def add_new_attribute(self, key, val="unknown"):
|
|
|
+ """
|
|
|
+ Adds a new attribute to the view with key "key" and optional val. Also adds this attribute to the modelverse
|
|
|
+ model.
|
|
|
+ """
|
|
|
+ selected_node = self._scene.selectedItems()[0]
|
|
|
+ self.plainTextEdit.appendPlainText("Adding new attribute with key {} to node {}".format(key, selected_node.get_type()))
|
|
|
+ self.tableWidget.blockSignals(True)
|
|
|
+ table_item_key = QTableWidgetItem(key)
|
|
|
+ table_item_key.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
|
|
|
+ table_item_val = QTableWidgetItem(val)
|
|
|
+ cur_row_cnt = self.tableWidget.rowCount()
|
|
|
+ self.tableWidget.insertRow(cur_row_cnt)
|
|
|
+ self.tableWidget.setItem(cur_row_cnt, 0, table_item_key)
|
|
|
+ self.tableWidget.setItem(cur_row_cnt, 1, table_item_val)
|
|
|
+ self.tableWidget.blockSignals(False)
|
|
|
+
|
|
|
+ # add to modelverse
|
|
|
+ mvops.add_attribute(self._cur_model, selected_node.node_id, key, val)
|