im_scene.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from enum import Enum
  2. from PyQt5.QtWidgets import QGraphicsScene, QGraphicsItem
  3. from PyQt5.Qt import Qt, QTransform
  4. from sketchUI.graphics_edge_item import GraphicsEdgeItem
  5. from sketchUI import mvops
  6. class Mode(Enum):
  7. SELECT = 0
  8. CONNECT = 1
  9. class CustomScene(QGraphicsScene):
  10. def __init__(self, model):
  11. QGraphicsScene.__init__(self)
  12. self._mode = None # set by mainwindow at start
  13. self._from_item = None # store the item to draw the connecting line from
  14. self._cur_model = model # the mv model we operate on
  15. def set_mode(self, mode):
  16. self._mode = mode
  17. def mousePressEvent(self, event):
  18. if event.button() == Qt.LeftButton and self._mode == Mode.CONNECT:
  19. item = self.itemAt(event.scenePos(), QTransform())
  20. if not item:
  21. return
  22. self._from_item = item
  23. QGraphicsScene.mousePressEvent(self, event)
  24. def mouseReleaseEvent(self, event):
  25. if event.button() == Qt.LeftButton and self._mode == Mode.CONNECT:
  26. item = self.itemAt(event.scenePos(), QTransform())
  27. if not item:
  28. return
  29. self.draw_edge(self._from_item, item, is_new=True)
  30. if event.button() == Qt.LeftButton and self._mode == Mode.SELECT:
  31. item = self.itemAt(event.scenePos(), QTransform())
  32. if not item:
  33. return
  34. for item in self.items():
  35. try:
  36. item.__hack__() # hack to check if item is of edge type
  37. item.redraw()
  38. except AttributeError:
  39. continue
  40. QGraphicsScene.mouseReleaseEvent(self, event)
  41. def draw_edge(self, from_item, to_item, is_new):
  42. from_type = from_item.text()
  43. to_type = to_item.text()
  44. if is_new:
  45. if not mvops.is_edge_supported(from_type, to_type):
  46. print("edge not supported between {} and {}".format(from_type, to_type))
  47. return
  48. line = GraphicsEdgeItem(from_item, to_item)
  49. line.setFlag(QGraphicsItem.ItemIsMovable, False)
  50. line.setFlag(QGraphicsItem.ItemIsSelectable, False)
  51. self.addItem(line)
  52. line.redraw()
  53. if is_new:
  54. mvops.add_edge(self._cur_model, from_item.node_id, to_item.node_id)
  55. self._from_item = None