From 106623f240db7c72719670e87be23bcdf6f63bab Mon Sep 17 00:00:00 2001 From: David Vierra Date: Tue, 9 Feb 2016 16:40:20 -1000 Subject: [PATCH] Add a button widget for selecting block replacements --- src/mcedit2/widgets/block_replacement_list.py | 116 +++++++++++++++++- 1 file changed, 112 insertions(+), 4 deletions(-) diff --git a/src/mcedit2/widgets/block_replacement_list.py b/src/mcedit2/widgets/block_replacement_list.py index be9fe2c..1465695 100644 --- a/src/mcedit2/widgets/block_replacement_list.py +++ b/src/mcedit2/widgets/block_replacement_list.py @@ -9,33 +9,132 @@ from PySide import QtCore, QtGui from mcedit2.ui.block_replacements import Ui_BlockReplacements from mcedit2.util.resources import resourcePath from mcedit2.widgets.blockpicker import BlockTypeButton -from mcedit2.widgets.layout import Row +from mcedit2.widgets.layout import Row, Column log = logging.getLogger(__name__) +class BlockReplacementButton(QtGui.QWidget): + def __init__(self, parent=None): + super(BlockReplacementButton, self).__init__() + + self.replacementList = BlockReplacementList() + self.replacementDialog = QtGui.QDialog(QtGui.qApp.mainWindow) + + self.replacementOk = QtGui.QPushButton(self.tr("OK")) + self.replacementOk.clicked.connect(self.replacementDialog.accept) + + self.replacementDialog.setWindowTitle(self.tr("Choose blocks to replace")) + self.replacementDialog.setLayout(Column(self.replacementList, + Row(None, self.replacementOk))) + + self.oldBlockButton = BlockTypeButton(multipleSelect=True) + self.newBlockButton = BlockTypeButton() + self.advancedButton = QtGui.QPushButton(self.tr("Advanced...")) + + self.simpleButton = QtGui.QPushButton(self.tr("No, simple!")) + self.simpleButton.setVisible(False) + self.simpleButton.clicked.connect(self.goSimple) + + self.setLayout(Column(self.oldBlockButton, + self.newBlockButton, + self.advancedButton, + self.simpleButton, + margin=0)) + + self.oldBlockButton.blocksChanged.connect(self.simpleBlocksChanged) + self.newBlockButton.blocksChanged.connect(self.simpleBlocksChanged) + self.advancedButton.clicked.connect(self.displayDialog) + + replacementsChanged = QtCore.Signal() + + _editorSession = None + + @property + def editorSession(self): + return self._editorSession + + @editorSession.setter + def editorSession(self, session): + self._editorSession = session + self.oldBlockButton.editorSession = session + self.newBlockButton.editorSession = session + self.replacementList.editorSession = session + + def displayDialog(self): + self.replacementDialog.exec_() + replacements = self.replacementList.getReplacements() + if len(replacements) == 0: + self.oldBlockButton.blocks = [] + self.newBlockButton.blocks = [] + elif len(replacements) == 1: + old, new = replacements[0] + self.oldBlockButton.blocks = old + self.newBlockButton.block = new + + if len(replacements) > 1: + self.oldBlockButton.blocks = [] + self.newBlockButton.blocks = [] + self.oldBlockButton.setEnabled(False) + self.newBlockButton.setEnabled(False) + self.simpleButton.setVisible(True) + else: + self.oldBlockButton.setEnabled(True) + self.newBlockButton.setEnabled(True) + self.simpleButton.setVisible(False) + + self.replacementsChanged.emit() + + def goSimple(self): + self.oldBlockButton.blocks = [] + self.newBlockButton.blocks = [] + self.simpleButton.setVisible(False) + + def simpleBlocksChanged(self): + old = self.oldBlockButton.blocks + new = self.newBlockButton.block + if new is not None: + replacements = [(old, new)] + else: + replacements = [] + log.info("Replacements button: %s", replacements) + self.replacementList.setReplacements(replacements) + self.replacementsChanged.emit() + + def getReplacements(self): + return self.replacementList.getReplacements() + + class BlockReplacementList(QtGui.QWidget, Ui_BlockReplacements): - def __init__(self, parent): + def __init__(self, parent=None): super(BlockReplacementList, self).__init__(parent) self.setupUi(self) header = self.findReplaceTable.horizontalHeader() header.setResizeMode(0, QtGui.QHeaderView.Stretch) header.setResizeMode(1, QtGui.QHeaderView.Stretch) - self.findReplaceTable.setRowCount(1) + + self.editorSession = None + + self.clearTable() + + def clearTable(self): addButton = QtGui.QPushButton("Add...", flat=True, clicked=self.addNewRow) addButton.setIcon(QtGui.QIcon(resourcePath("mcedit2/assets/mcedit2/icons/add.png"))) addButton.setMinimumHeight(48) addButton.setIconSize(QtCore.QSize(32, 32)) + addItem = QtGui.QTableWidgetItem(text="Add...") addItem.setSizeHint(addButton.sizeHint()) + + self.findReplaceTable.clear() + self.findReplaceTable.setRowCount(1) self.findReplaceTable.setItem(0, 0, addItem) self.findReplaceTable.setSpan(0, 0, 1, 2) self.findReplaceTable.setCellWidget(0, 0, addButton) self.findReplaceTable.resizeRowsToContents() self.findReplaceTable.resizeColumnsToContents() - self.editorSession = None @property def blocktypes(self): @@ -109,3 +208,12 @@ class BlockReplacementList(QtGui.QWidget, Ui_BlockReplacements): yield left.blocks, right.block return list(_get()) + + def setReplacements(self, replacements): + if replacements == self.getReplacements(): + return + + self.clearTable() + for old, new in replacements: + self.addRow(old, new) +