diff options
Diffstat (limited to 'src/main/python/utils/graphics.py')
-rw-r--r-- | src/main/python/utils/graphics.py | 70 |
1 files changed, 64 insertions, 6 deletions
diff --git a/src/main/python/utils/graphics.py b/src/main/python/utils/graphics.py index 0fe0030..08fc2d5 100644 --- a/src/main/python/utils/graphics.py +++ b/src/main/python/utils/graphics.py @@ -1,8 +1,11 @@ -from PyQt5.QtCore import Qt -from PyQt5.QtGui import QPen -from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsProxyWidget, QGraphicsItem +from PyQt5.QtCore import Qt, QPointF +from PyQt5.QtGui import QPen, QKeySequence +from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsProxyWidget, QGraphicsItem, QUndoStack, QAction, QUndoView from PyQt5 import QtWidgets +from .undo import * +from .dialogs import showUndoDialog + class customView(QGraphicsView): """ Defines custom QGraphicsView with zoom features and drag-drop accept event, overriding wheel event @@ -15,6 +18,10 @@ class customView(QGraphicsView): self._zoom = 1 self.setDragMode(True) #sets pannable using mouse self.setAcceptDrops(True) #sets ability to accept drops + if scene: + self.addAction(scene.undoAction) + self.addAction(scene.redoAction) + self.addAction(scene.deleteAction) #following four functions are required to be overridden for drag-drop functionality def dragEnterEvent(self, QDragEnterEvent): @@ -38,7 +45,7 @@ class customView(QGraphicsView): graphic = getattr(QtWidgets, QDropEvent.mimeData().text())(QDropEvent.pos().x()-150, QDropEvent.pos().y()-150, 300, 300) graphic.setPen(QPen(Qt.black, 2)) graphic.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable) - self.scene().addItem(graphic) + self.scene().addItemPlus(graphic) QDropEvent.acceptProposedAction() def wheelEvent(self, QWheelEvent): @@ -73,5 +80,56 @@ class customScene(QGraphicsScene): re-implement QGraphicsScene for future functionality hint: QUndoFramework """ - pass -
\ No newline at end of file + def __init__(self, *args, parent=None): + super(customScene, self).__init__(*args, parent=parent) + + self.undoStack = QUndoStack(self) + self.createActions() + + + def createActions(self): + self.deleteAction = QAction("Delete Item", self) + self.deleteAction.setShortcut(Qt.Key_Delete) + self.deleteAction.triggered.connect(self.deleteItem) + + self.undoAction = self.undoStack.createUndoAction(self, "Undo") + self.undoAction.setShortcut(QKeySequence.Undo) + self.redoAction = self.undoStack.createRedoAction(self, "Redo") + self.redoAction.setShortcut(QKeySequence.Redo) + + def createUndoView(self, parent): + undoView = QUndoView(self.undoStack, parent) + # undoView.resize(400, 400) + # undoView.show() + # undoView.setAttribute(Qt.WA_QuitOnClose, False) + showUndoDialog(undoView, parent) + + def deleteItem(self): + if self.selectedItems(): + for item in self.selectedItems(): + self.undoStack.push(deleteCommand(item, self)) + + def itemMoved(self, movedItem, lastPos): + self.undoStack.push(moveCommand(movedItem, lastPos)) + + def addItemPlus(self, item): + # returnVal = self.addItem(item) + self.undoStack.push(addCommand(item, self)) + # return returnVal + + def mousePressEvent(self, event): + bdsp = event.buttonDownScenePos(Qt.LeftButton) + point = QPointF(bdsp.x(), bdsp.y()) + itemList = self.items(point) + self.movingItem = itemList[0] if itemList else None + if self.movingItem and event.button() == Qt.LeftButton: + self.oldPos = self.movingItem.pos() + self.clearSelection() + return super(customScene, self).mousePressEvent(event) + + def mouseReleaseEvent(self, event): + if self.movingItem and event.button() == Qt.LeftButton: + if self.oldPos != self.movingItem.pos(): + self.itemMoved(self.movingItem, self.oldPos) + self.movingItem = None + return super(customScene, self).mouseReleaseEvent(event) |