class GUI(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.setFixedSize(self.size()) self.show() self.points = QtGui.QPolygon() self.undoStack = Stack() self.redoStack = Stack() create_shortcut(self, self.openShortcutEditor, 'Open Shortcut Editor', 'ctrl+f') create_shortcut(self, self.undo, 'Undo', 'ctrl+z') create_shortcut(self, self.redo, 'Redo', 'ctrl+y') self.defaultShortcuts = shortcutEditor.windowActionsToDict(self) shortcutEditor.loadSavedActions(self) def openShortcutEditor(self): self.editor = shortcutEditor(self, self.defaultShortcuts) self.editor.show() def undo(self): try: self.redoStack.push(self.undoStack.top()) self.points.remove(self.points.indexOf(self.undoStack.pop())) self.repaint() except EmptyStackException: pass def redo(self): try: self.undoStack.push(self.redoStack.top()) self.points.append(self.redoStack.pop()) self.repaint() except EmptyStackException: pass def mousePressEvent(self, e): if e.button() == 1: # left click self.points.append(e.pos()) self.undoStack.push(e.pos()) self.redoStack.clear() self.update() elif e.button() == 2: self.openShortcutEditor() def paintEvent(self, ev): qp = QtGui.QPainter(self) qp.setRenderHint(QtGui.QPainter.Antialiasing) pen = QtGui.QPen(QtCore.Qt.red, 5) brush = QtGui.QBrush(QtCore.Qt.red) qp.setPen(pen) qp.setBrush(brush) for i in range(self.points.count()): qp.drawEllipse(self.points.point(i), 5, 5)
def test_stack(): t = Stack([54, 27]) print(t.peek()) t.clear() # t.peek() t.push(10) t.push(15) t.push(20) print(t) t.clear() print(t) t.push(2) print(t) print(t.peek())
class Drawer: def __init__(self, getColor, screenshot, parent, offset): self.getColor = getColor self.parent = parent self.offset = offset self.resetDrawing(screenshot, offset) def resetDrawing(self, screenshot: QtGui.QPixmap, offset: QtCore.QPoint): """Called every time the user creates a new AOI.""" self.image = screenshot.toImage() self.offset = offset self.drawing = False # drawing right now self.ableToDraw = False # can drow (is the draw button pressed?) self.previousImages = Stack(self.image.copy()) self.nextImages = Stack() self.brushSize = 2 self.startingPoint = None self.lastPoint = QtCore.QPoint() def undo(self): try: self.nextImages.push(self.image.copy()) self.image = self.previousImages.pop() self.parent.repaint() except EmptyStackException: pass def redo(self): try: old = self.image.copy() self.image = self.nextImages.pop().copy() self.previousImages.push(old) self.parent.repaint() except EmptyStackException: pass def setDrawing(self, value: bool): self.drawing = value def setAbleToDraw(self, value: bool): self.ableToDraw = value def startDrawing(self, position): if self.ableToDraw: self.startingPoint = position self.previousImages.push(self.image.copy()) self.nextImages.clear() self.drawing = True self.lastPoint = position - self.offset def keepDrawing(self, position): if self.drawing and self.ableToDraw: painter = QPainter(self.image) painter.setPen( QtGui.QPen(self.getColor(), self.brushSize, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) if self.startingPoint == position: painter.setBrush(self.getColor()) painter.drawEllipse(position - self.offset, self.brushSize, self.brushSize) else: painter.drawLine(self.lastPoint, position - self.offset) self.lastPoint = position - self.offset self.parent.update() def stopDrawing(self, position): if self.startingPoint == position: self.keepDrawing(position) # draw a circle self.drawing = False self.startingPoint = None def drawingNow(self): return self.drawing and self.ableToDraw