192 lines
6.2 KiB
Python
192 lines
6.2 KiB
Python
'''
|
|
QCommand classes for every undoable user action performed in the MainWindow
|
|
'''
|
|
from PyQt5.QtWidgets import QUndoCommand
|
|
import os
|
|
from copy import copy
|
|
|
|
from core import Core
|
|
|
|
|
|
# =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
# COMPONENT ACTIONS
|
|
# =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
|
|
class AddComponent(QUndoCommand):
|
|
def __init__(self, parent, compI, moduleI):
|
|
super().__init__(
|
|
"create new %s component" %
|
|
parent.core.modules[moduleI].Component.name
|
|
)
|
|
self.parent = parent
|
|
self.moduleI = moduleI
|
|
self.compI = compI
|
|
self.comp = None
|
|
|
|
def redo(self):
|
|
if self.comp is None:
|
|
self.parent.core.insertComponent(
|
|
self.compI, self.moduleI, self.parent)
|
|
else:
|
|
# inserting previously-created component
|
|
self.parent.core.insertComponent(
|
|
self.compI, self.comp, self.parent)
|
|
|
|
def undo(self):
|
|
self.comp = self.parent.core.selectedComponents[self.compI]
|
|
self.parent._removeComponent(self.compI)
|
|
|
|
|
|
class RemoveComponent(QUndoCommand):
|
|
def __init__(self, parent, selectedRows):
|
|
super().__init__('remove component')
|
|
self.parent = parent
|
|
componentList = self.parent.window.listWidget_componentList
|
|
self.selectedRows = [
|
|
componentList.row(selected) for selected in selectedRows
|
|
]
|
|
self.components = [
|
|
parent.core.selectedComponents[i] for i in self.selectedRows
|
|
]
|
|
|
|
def redo(self):
|
|
self.parent._removeComponent(self.selectedRows[0])
|
|
|
|
def undo(self):
|
|
componentList = self.parent.window.listWidget_componentList
|
|
for index, comp in zip(self.selectedRows, self.components):
|
|
self.parent.core.insertComponent(
|
|
index, comp, self.parent
|
|
)
|
|
self.parent.drawPreview()
|
|
|
|
|
|
class MoveComponent(QUndoCommand):
|
|
def __init__(self, parent, row, newRow, tag):
|
|
super().__init__("move component %s" % tag)
|
|
self.parent = parent
|
|
self.row = row
|
|
self.newRow = newRow
|
|
self.id_ = ord(tag[0])
|
|
|
|
def id(self):
|
|
'''If 2 consecutive updates have same id, Qt will call mergeWith()'''
|
|
return self.id_
|
|
|
|
def mergeWith(self, other):
|
|
self.newRow = other.newRow
|
|
return True
|
|
|
|
def do(self, rowa, rowb):
|
|
componentList = self.parent.window.listWidget_componentList
|
|
|
|
page = self.parent.pages.pop(rowa)
|
|
self.parent.pages.insert(rowb, page)
|
|
|
|
item = componentList.takeItem(rowa)
|
|
componentList.insertItem(rowb, item)
|
|
|
|
stackedWidget = self.parent.window.stackedWidget
|
|
widget = stackedWidget.removeWidget(page)
|
|
stackedWidget.insertWidget(rowb, page)
|
|
componentList.setCurrentRow(rowb)
|
|
stackedWidget.setCurrentIndex(rowb)
|
|
self.parent.core.moveComponent(rowa, rowb)
|
|
self.parent.drawPreview(True)
|
|
|
|
def redo(self):
|
|
self.do(self.row, self.newRow)
|
|
|
|
def undo(self):
|
|
self.do(self.newRow, self.row)
|
|
|
|
|
|
# =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
# PRESET ACTIONS
|
|
# =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
|
|
class ClearPreset(QUndoCommand):
|
|
def __init__(self, parent, compI):
|
|
super().__init__("clear preset")
|
|
self.parent = parent
|
|
self.compI = compI
|
|
self.component = self.parent.core.selectedComponents[compI]
|
|
self.store = self.component.savePreset()
|
|
self.store['preset'] = self.component.currentPreset
|
|
|
|
def redo(self):
|
|
self.parent.core.clearPreset(self.compI)
|
|
self.parent.updateComponentTitle(self.compI, False)
|
|
|
|
def undo(self):
|
|
self.parent.core.selectedComponents[self.compI].loadPreset(self.store)
|
|
self.parent.updateComponentTitle(self.compI, self.store)
|
|
|
|
|
|
class OpenPreset(QUndoCommand):
|
|
def __init__(self, parent, presetName, compI):
|
|
super().__init__("open %s preset" % presetName)
|
|
self.parent = parent
|
|
self.presetName = presetName
|
|
self.compI = compI
|
|
|
|
comp = self.parent.core.selectedComponents[compI]
|
|
self.store = comp.savePreset()
|
|
self.store['preset'] = copy(comp.currentPreset)
|
|
|
|
def redo(self):
|
|
self.parent._openPreset(self.presetName, self.compI)
|
|
|
|
def undo(self):
|
|
self.parent.core.selectedComponents[self.compI].loadPreset(
|
|
self.store)
|
|
self.parent.parent.updateComponentTitle(self.compI, self.store)
|
|
|
|
|
|
class RenamePreset(QUndoCommand):
|
|
def __init__(self, parent, path, oldName, newName):
|
|
super().__init__('rename preset')
|
|
self.parent = parent
|
|
self.path = path
|
|
self.oldName = oldName
|
|
self.newName = newName
|
|
|
|
def redo(self):
|
|
self.parent.renamePreset(self.path, self.oldName, self.newName)
|
|
|
|
def undo(self):
|
|
self.parent.renamePreset(self.path, self.newName, self.oldName)
|
|
|
|
|
|
class DeletePreset(QUndoCommand):
|
|
def __init__(self, parent, compName, vers, presetFile):
|
|
self.parent = parent
|
|
self.preset = (compName, vers, presetFile)
|
|
self.path = os.path.join(
|
|
Core.presetDir, compName, str(vers), presetFile
|
|
)
|
|
self.store = self.parent.core.getPreset(self.path)
|
|
self.presetName = self.store['preset']
|
|
super().__init__('delete %s preset (%s)' % (self.presetName, compName))
|
|
self.loadedPresets = [
|
|
i for i, comp in enumerate(self.parent.core.selectedComponents)
|
|
if self.presetName == str(comp.currentPreset)
|
|
]
|
|
|
|
def redo(self):
|
|
os.remove(self.path)
|
|
for i in self.loadedPresets:
|
|
self.parent.core.clearPreset(i)
|
|
self.parent.parent.updateComponentTitle(i, False)
|
|
self.parent.findPresets()
|
|
self.parent.drawPresetList()
|
|
|
|
def undo(self):
|
|
self.parent.createNewPreset(*self.preset, self.store)
|
|
selectedComponents = self.parent.core.selectedComponents
|
|
for i in self.loadedPresets:
|
|
selectedComponents[i].currentPreset = self.presetName
|
|
self.parent.parent.updateComponentTitle(i)
|
|
self.parent.findPresets()
|
|
self.parent.drawPresetList()
|