1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
"""
Contains custom undo commands that can be pushed to undo stack
"""
from PyQt5.QtWidgets import QUndoCommand
from re import compile
def repl(x):
return f"{x[0][0]} {x[0][1].lower()}"
regex = compile(r"([a-z][A-Z])")
def objectName(obj):
name = regex.sub(repl, obj.m_type if obj.__class__.__name__ == 'NodeItem' else obj.__class__.__name__)
# if obj.__class__.__name__ != 'line':
# name = 'Draw ' + name[0].upper() + name[1:]
# else:
# name = 'Add ' +
return name[0].upper() + name[1:] + ' symbol'
class addCommand(QUndoCommand):
"""
QUndoCommand for add item event
"""
def __init__(self, addItem, scene, parent = None):
super(addCommand, self).__init__(parent)
self.scene = scene
self.diagramItem = addItem
self.itemPos = addItem.pos()
self.setText(f"Add {objectName(self.diagramItem)} at {self.itemPos.x()}, {self.itemPos.y()}")
def undo(self):
self.scene.removeItem(self.diagramItem)
self.scene.update()
self.scene.advance()
def redo(self):
self.scene.addItem(self.diagramItem)
self.diagramItem.setPos(self.itemPos)
self.scene.clearSelection()
self.scene.advance()
class deleteCommand(QUndoCommand):
"""
QUndoCommand for delete item event
"""
def __init__(self, item, scene, parent = None):
super(deleteCommand, self).__init__(parent)
self.scene = scene
item.setSelected(False)
self.diagramItem = item
self.setText(f"Delete {objectName(self.diagramItem)} at {self.diagramItem.pos().x()}, {self.diagramItem.y()}")
def undo(self):
self.scene.addItem(self.diagramItem)
self.scene.update()
self.scene.advance()
self.scene.reInsertLines()
def redo(self):
self.scene.removeItem(self.diagramItem)
self.scene.advance()
class moveCommand(QUndoCommand):
"""
QUndoCommand for move item event
"""
def __init__(self, item, lastPos, parent = None):
super(moveCommand, self).__init__(parent)
self.diagramItem = item
self.lastPos = lastPos
self.newPos = item.pos()
def undo(self):
self.diagramItem.setPos(self.lastPos)
self.diagramItem.scene().update()
self.setText(f"Move {objectName(self.diagramItem)} to {self.newPos.x()}, {self.newPos.y()}")
def redo(self):
self.diagramItem.setPos(self.newPos)
self.setText(f"Move {objectName(self.diagramItem)} to {self.newPos.x()}, {self.newPos.y()}")
def mergeWith(self, move):
#merges multiple move commands so that a move event is not added twice.
item = move.diagramItem
if self.diagramItem != item:
return False
self.newPos = item.pos()
self.setText(f"Move {objectName(self.diagramItem)} to {self.newPos.x()}, {self.newPos.y()}")
return True
class resizeCommand(QUndoCommand):
"""
Defines the resize event for the custom scene.
"""
def __init__(self, new, canvas, widget, parent = None):
super(resizeCommand, self).__init__(parent)
self.parent = canvas
self.old = self.parent.canvasSize, self.parent.ppi, self.parent.landscape
self.new = new
self.widget = widget
self.setText(f'Change canvas dimensions to {new[0]} at {new[1]} ppi')
def undo(self):
self.parent.canvasSize, self.parent.ppi, self.parent.landscape = self.old
self.widget.resizeHandler()
def redo(self):
self.parent.canvasSize, self.parent.ppi, self.parent.landscape = self.new
self.widget.resizeHandler()
|