|
@@ -1,19 +1,20 @@
|
|
|
-from PyQt5.QtWidgets import QMainWindow, QGraphicsItem,\
|
|
|
- QGraphicsSimpleTextItem, QAction, QActionGroup, QAbstractItemView
|
|
|
+from PyQt5.QtWidgets import QMainWindow, QGraphicsItem, QAction, QActionGroup
|
|
|
from PyQt5.QtGui import QIcon
|
|
|
from PyQt5.QtCore import QStateMachine, QState
|
|
|
-from ui import Ui_MainWindow
|
|
|
-from custom_scene import CustomScene, Mode
|
|
|
-from custom_edge import GraphicsEdgeItem
|
|
|
-import mvops
|
|
|
+from sketchUI.ui import Ui_MainWindow
|
|
|
+from sketchUI.im_scene import CustomScene, Mode
|
|
|
+from sketchUI import mvops
|
|
|
+from sketchUI.graphics_node_item import GraphicsNodeItem
|
|
|
+from wrappers.modelverse import element_list_nice
|
|
|
|
|
|
|
|
|
-class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
- def __init__(self):
|
|
|
+class IMMainWindow(QMainWindow, Ui_MainWindow):
|
|
|
+ def __init__(self, model):
|
|
|
QMainWindow.__init__(self)
|
|
|
self.setupUi(self)
|
|
|
+ self._cur_model = model
|
|
|
|
|
|
- self._scene = CustomScene()
|
|
|
+ self._scene = CustomScene(model)
|
|
|
self._scene.set_mode(Mode.SELECT)
|
|
|
self._scene.setSceneRect(0, 0, 200, 200)
|
|
|
self.graphicsView.setScene(self._scene)
|
|
@@ -24,7 +25,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
self.setup_toolbar()
|
|
|
self.setup_state_machine()
|
|
|
|
|
|
- self._cur_model = mvops.new_instance_model()
|
|
|
+ # load the model
|
|
|
+ self._load_model()
|
|
|
|
|
|
#lastly, start the state machine
|
|
|
self._statemachine.start()
|
|
@@ -58,6 +60,34 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
self._statemachine.addState(state_connect)
|
|
|
self._statemachine.setInitialState(state_select)
|
|
|
|
|
|
+ def _load_model(self):
|
|
|
+ """
|
|
|
+ Load the model from the mv and render to screen
|
|
|
+ Likely to be replaced later since rendering ideally already happens in the mv
|
|
|
+ """
|
|
|
+ model = element_list_nice(self._cur_model)
|
|
|
+ if not model:
|
|
|
+ # emtpy model
|
|
|
+ return
|
|
|
+
|
|
|
+ for item in model:
|
|
|
+ typ = item["type"]
|
|
|
+ if typ == "Node":
|
|
|
+ # first, draw all nodes
|
|
|
+ node_type = item["typeID"]
|
|
|
+ # workaround since get_attrs returns strings with " and list_nice doesnt
|
|
|
+ if not node_type.startswith("\""):
|
|
|
+ node_type = "\"" + node_type + "\""
|
|
|
+ self._add_node_to_scene(item["id"], node_type)
|
|
|
+
|
|
|
+ for item in model:
|
|
|
+ typ = item["type"]
|
|
|
+ if typ == "Edge":
|
|
|
+ target = item["__target"]
|
|
|
+ src = item["__source"]
|
|
|
+ self._add_edge_to_scene(src, target)
|
|
|
+
|
|
|
+
|
|
|
def _state_connect_entered(self):
|
|
|
self._scene.set_mode(Mode.CONNECT)
|
|
|
self._make_items_movable(False)
|
|
@@ -75,6 +105,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
for item in self._scene.items():
|
|
|
try:
|
|
|
# hacky hack because of pythons isinstance fails due to import chaos
|
|
|
+ # edges are not selectable or movable
|
|
|
item.__hack__()
|
|
|
item.setFlag(QGraphicsItem.ItemIsMovable, False)
|
|
|
item.setFlag(QGraphicsItem.ItemIsSelectable, False)
|
|
@@ -84,14 +115,33 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
item.setFlag(QGraphicsItem.ItemIsMovable, movable)
|
|
|
item.setFlag(QGraphicsItem.ItemIsSelectable, movable)
|
|
|
|
|
|
- def _add_text_to_scene(self, text):
|
|
|
- item = self._scene.addSimpleText(text)
|
|
|
- item.setPos(0, 0)
|
|
|
+ def _add_node_to_scene(self, node_id, node_type, x=0, y=0):
|
|
|
+ item = GraphicsNodeItem(node_id)
|
|
|
+ item.setText(node_type)
|
|
|
+ item.setPos(x, y)
|
|
|
item.setFlag(QGraphicsItem.ItemIsMovable, True)
|
|
|
item.setFlag(QGraphicsItem.ItemIsSelectable, True)
|
|
|
+ self._scene.addItem(item)
|
|
|
+
|
|
|
+ def _add_edge_to_scene(self, from_id, to_id):
|
|
|
+ from_item = None
|
|
|
+ to_item = None
|
|
|
+ for item in self._scene.items():
|
|
|
+ try:
|
|
|
+ node_id = item.node_id
|
|
|
+ except AttributeError:
|
|
|
+ # no node item, continue
|
|
|
+ continue
|
|
|
+ if node_id == from_id:
|
|
|
+ from_item = item
|
|
|
+ continue
|
|
|
+ if node_id == to_id:
|
|
|
+ to_item = item
|
|
|
+
|
|
|
+ self._scene.draw_edge(from_item, to_item, is_new=False)
|
|
|
|
|
|
def _on_list_item_clicked(self, action):
|
|
|
- # render to scene
|
|
|
- self._add_text_to_scene(action.text())
|
|
|
# add new node to model in mv
|
|
|
- mvops.add_node(self._cur_model, action.text())
|
|
|
+ node_id = mvops.add_node(self._cur_model, action.text())
|
|
|
+ # render to scene
|
|
|
+ self._add_node_to_scene(node_id, action.text())
|