Refactor editorcommands.find_replace to a package with one module for each find/replace action

This commit is contained in:
David Vierra 2015-10-23 22:40:35 -10:00
parent 46ba2e3d7c
commit 0856fe6a2f
3 changed files with 208 additions and 183 deletions

View File

@ -0,0 +1,60 @@
"""
replace
"""
from __future__ import absolute_import, division, print_function
import logging
from PySide import QtGui
from mcedit2.editorcommands.find_replace.blocks import FindReplaceBlocks
from mcedit2.editorcommands.find_replace.nbt import FindReplaceNBT
from mcedit2.util.load_ui import load_ui
from mcedit2.widgets.layout import Column
log = logging.getLogger(__name__)
class FindReplaceDialog(QtGui.QDialog):
def __init__(self, editorSession, *args, **kwargs):
super(FindReplaceDialog, self).__init__(*args, **kwargs)
self.editorSession = editorSession
self.blocktypes = editorSession.worldEditor.blocktypes
load_ui("find_replace.ui", baseinstance=self)
self.findReplaceBlocks = FindReplaceBlocks(editorSession, self)
self.findReplaceNBT = FindReplaceNBT(editorSession, self)
self.nbtTab.setLayout(Column(self.findReplaceNBT.widget, margin=0))
self.resultsWidgets = [
# self.findReplaceBlocks.resultsDockWidget,
self.findReplaceNBT.resultsDockWidget,
]
def execFindBlocks(self):
self.execTab(0)
def execFindReplaceBlocks(self):
self.execTab(1)
def execFindReplaceItems(self):
self.execTab(2)
def execFindReplaceCommands(self):
self.execTab(3)
def execFindReplaceNBT(self):
self.execTab(4)
def execTab(self, tabIndex):
self.tabWidget.setCurrentIndex(tabIndex)
self.exec_()
def exec_(self):
self.findReplaceNBT.dialogOpened()
# self.findReplaceBlocks.dialogOpened()
super(FindReplaceDialog, self).exec_()

View File

@ -0,0 +1,122 @@
"""
blocks
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
from PySide import QtCore, QtGui
from mcedit2.command import SimpleRevisionCommand
from mcedit2.util.resources import resourcePath
from mcedit2.util.showprogress import showProgress
from mcedit2.widgets.blockpicker import BlockTypeButton
from mcedit2.widgets.layout import Row
log = logging.getLogger(__name__)
class FindReplaceBlocks(QtCore.QObject):
def __init__(self, editorSession, dialog, *args, **kwargs):
super(FindReplaceBlocks, self).__init__(*args, **kwargs)
self.editorSession = editorSession
self.dialog = dialog
header = dialog.findReplaceTable.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.Stretch)
header.setResizeMode(1, QtGui.QHeaderView.Stretch)
dialog.findReplaceTable.setRowCount(1)
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())
dialog.findReplaceTable.setItem(0, 0, addItem)
dialog.findReplaceTable.setSpan(0, 0, 1, 2)
dialog.findReplaceTable.setCellWidget(0, 0, addButton)
dialog.findReplaceTable.resizeRowsToContents()
dialog.findReplaceTable.resizeColumnsToContents()
dialog.blocksReplaceButton.clicked.connect(self.doReplace)
@property
def blocktypes(self):
return self.editorSession.worldEditor.blocktypes
def addNewRow(self):
self.addRow([self.blocktypes["air"]], self.blocktypes["air"])
def addRow(self, oldBlocks, newBlock):
row = self.dialog.findReplaceTable.rowCount() - 1
self.dialog.findReplaceTable.insertRow(row)
log.info("Row inserted")
left = QtGui.QTableWidgetItem()
right = QtGui.QTableWidgetItem()
log.info("Items created")
def frameButton(button, withRemove=False):
frame = QtGui.QFrame()
frame.button = button
layout = QtGui.QVBoxLayout()
layout.addStretch(1)
if withRemove:
removeButton = QtGui.QPushButton("", flat=True)
removeButton.setIcon(QtGui.QIcon(resourcePath("mcedit2/assets/mcedit2/icons/remove.png")))
removeButton.setIconSize(QtCore.QSize(24, 24))
def _clicked():
self.removeRow(self.dialog.findReplaceTable.row(left))
removeButton.__clicked = _clicked
removeButton.clicked.connect(_clicked)
layout.addLayout(Row((button, 1), removeButton))
else:
layout.addWidget(button)
layout.addStretch(1)
frame.setLayout(layout)
return frame
leftButton = BlockTypeButton(flat=True, multipleSelect=True)
leftButton.editorSession = self.editorSession
leftButton.blocks = oldBlocks
leftFramedButton = frameButton(leftButton)
left.setSizeHint(leftFramedButton.sizeHint())
log.info("Left button")
rightButton = BlockTypeButton(flat=True)
rightButton.editorSession = self.editorSession
rightButton.block = newBlock
rightFramedButton = frameButton(rightButton, True)
right.setSizeHint(rightFramedButton.sizeHint())
log.info("Right button")
self.dialog.findReplaceTable.setItem(row, 0, left)
self.dialog.findReplaceTable.setItem(row, 1, right)
self.dialog.findReplaceTable.setCellWidget(row, 0, leftFramedButton)
self.dialog.findReplaceTable.setCellWidget(row, 1, rightFramedButton)
self.dialog.findReplaceTable.resizeRowsToContents()
#self.findReplaceTable.resizeColumnsToContents()
log.info("Done")
def removeRow(self, row):
self.dialog.findReplaceTable.removeRow(row)
def getReplacements(self):
def _get():
for row in range(self.dialog.findReplaceTable.rowCount()-1):
left = self.dialog.findReplaceTable.cellWidget(row, 0).button
right = self.dialog.findReplaceTable.cellWidget(row, 1).button
yield left.blocks, right.block
return list(_get())
def doReplace(self):
replacements = self.getReplacements()
command = SimpleRevisionCommand(self.editorSession, "Replace")
if self.dialog.replaceBlocksInSelectionCheckbox.isChecked():
selection = self.editorSession.currentSelection
else:
selection = self.editorSession.currentDimension.bounds
with command.begin():
task = self.editorSession.currentDimension.fillBlocksIter(selection, replacements, updateLights=False)
showProgress("Replacing...", task)
self.editorSession.pushCommand(command)

View File

@ -1,32 +1,45 @@
""" """
replace nbt
""" """
from __future__ import absolute_import, division, print_function from __future__ import absolute_import, division, print_function, unicode_literals
from collections import namedtuple
from mcedit2.widgets.mcedockwidget import MCEDockWidget
from mceditlib import nbt
from PySide import QtGui, QtCore
import logging import logging
from PySide import QtCore
from PySide.QtCore import Qt from PySide.QtCore import Qt
from mcedit2.command import SimpleRevisionCommand from mcedit2.command import SimpleRevisionCommand
from mcedit2.util import settings from mcedit2.util import settings
from mcedit2.util.load_ui import load_ui from mcedit2.util.load_ui import load_ui
from mcedit2.util.resources import resourcePath
from mcedit2.util.showprogress import showProgress from mcedit2.util.showprogress import showProgress
from mcedit2.widgets.blockpicker import BlockTypeButton from mcedit2.widgets.mcedockwidget import MCEDockWidget
from mcedit2.widgets.layout import Row, Column from mceditlib import nbt
from mceditlib.selection import BoundingBox from mceditlib.selection import BoundingBox
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
nbtReplaceSettings = settings.Settings().getNamespace("findreplace/nbt")
nbtReplaceSettings.nameField = nbtReplaceSettings.getOption("nameField", unicode, "")
nbtReplaceSettings.valueField = nbtReplaceSettings.getOption("valueField", unicode, "")
nbtReplaceSettings.entityIDField = nbtReplaceSettings.getOption("entityIDField", unicode, "")
nbtReplaceSettings.searchEntitiesChecked = nbtReplaceSettings.getOption("searchEntitiesChecked", bool, False)
nbtReplaceSettings.tileEntityIDField = nbtReplaceSettings.getOption("tileEntityIDField", unicode, "")
nbtReplaceSettings.searchTileEntitiesChecked = nbtReplaceSettings.getOption("searchTileEntitiesChecked", bool, False)
nbtReplaceSettings.replaceNameField = nbtReplaceSettings.getOption("replaceNameField", unicode, "")
nbtReplaceSettings.replaceValueField = nbtReplaceSettings.getOption("replaceValueField", unicode, "")
nbtReplaceSettings.replaceValueTagType = nbtReplaceSettings.getOption("replaceValueTagType", int, 0)
class NBTResultsEntry(object): class NBTResultsEntry(object):
# namedtuple("NBTResultsEntry", "tagName value id path position uuid resultType")): # namedtuple("NBTResultsEntry", "tagName value id path position uuid resultType")):
def __init__(self, model, tagNameIndex, tagName, value, id, path, position, uuid, resultType): def __init__(self, model, tagNameIndex, tagName, value, ID, path, position, uuid, resultType):
self.model = model self.model = model
self.tagNameIndex = tagNameIndex # xxx REALLY SHOULD change model data through the model itself self.tagNameIndex = tagNameIndex # xxx REALLY SHOULD change model data through the model itself
self.tagName = tagName self.tagName = tagName
self.value = value self.value = value
self.id = id self.id = ID
self.path = path self.path = path
self.position = position self.position = position
self.uuid = uuid self.uuid = uuid
@ -151,125 +164,6 @@ class NBTResultsModel(QtCore.QAbstractItemModel):
# self.propertyChanged.emit(entry.tagName, value) # self.propertyChanged.emit(entry.tagName, value)
# self.dataChanged.emit(index, index) # self.dataChanged.emit(index, index)
class FindReplaceBlocks(QtCore.QObject):
def __init__(self, editorSession, dialog, *args, **kwargs):
super(FindReplaceBlocks, self).__init__(*args, **kwargs)
self.editorSession = editorSession
self.dialog = dialog
header = dialog.findReplaceTable.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.Stretch)
header.setResizeMode(1, QtGui.QHeaderView.Stretch)
dialog.findReplaceTable.setRowCount(1)
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())
dialog.findReplaceTable.setItem(0, 0, addItem)
dialog.findReplaceTable.setSpan(0, 0, 1, 2)
dialog.findReplaceTable.setCellWidget(0, 0, addButton)
dialog.findReplaceTable.resizeRowsToContents()
dialog.findReplaceTable.resizeColumnsToContents()
dialog.blocksReplaceButton.clicked.connect(self.doReplace)
@property
def blocktypes(self):
return self.editorSession.worldEditor.blocktypes
def addNewRow(self):
self.addRow([self.blocktypes["air"]], self.blocktypes["air"])
def addRow(self, oldBlocks, newBlock):
row = self.dialog.findReplaceTable.rowCount() - 1
self.dialog.findReplaceTable.insertRow(row)
log.info("Row inserted")
left = QtGui.QTableWidgetItem()
right = QtGui.QTableWidgetItem()
log.info("Items created")
def frameButton(button, withRemove=False):
frame = QtGui.QFrame()
frame.button = button
layout = QtGui.QVBoxLayout()
layout.addStretch(1)
if withRemove:
removeButton = QtGui.QPushButton("", flat=True)
removeButton.setIcon(QtGui.QIcon(resourcePath("mcedit2/assets/mcedit2/icons/remove.png")))
removeButton.setIconSize(QtCore.QSize(24, 24))
def _clicked():
self.removeRow(self.dialog.findReplaceTable.row(left))
removeButton.__clicked = _clicked
removeButton.clicked.connect(_clicked)
layout.addLayout(Row((button, 1), removeButton))
else:
layout.addWidget(button)
layout.addStretch(1)
frame.setLayout(layout)
return frame
leftButton = BlockTypeButton(flat=True, multipleSelect=True)
leftButton.editorSession = self.editorSession
leftButton.blocks = oldBlocks
leftFramedButton = frameButton(leftButton)
left.setSizeHint(leftFramedButton.sizeHint())
log.info("Left button")
rightButton = BlockTypeButton(flat=True)
rightButton.editorSession = self.editorSession
rightButton.block = newBlock
rightFramedButton = frameButton(rightButton, True)
right.setSizeHint(rightFramedButton.sizeHint())
log.info("Right button")
self.dialog.findReplaceTable.setItem(row, 0, left)
self.dialog.findReplaceTable.setItem(row, 1, right)
self.dialog.findReplaceTable.setCellWidget(row, 0, leftFramedButton)
self.dialog.findReplaceTable.setCellWidget(row, 1, rightFramedButton)
self.dialog.findReplaceTable.resizeRowsToContents()
#self.findReplaceTable.resizeColumnsToContents()
log.info("Done")
def removeRow(self, row):
self.dialog.findReplaceTable.removeRow(row)
def getReplacements(self):
def _get():
for row in range(self.dialog.findReplaceTable.rowCount()-1):
left = self.dialog.findReplaceTable.cellWidget(row, 0).button
right = self.dialog.findReplaceTable.cellWidget(row, 1).button
yield left.blocks, right.block
return list(_get())
def doReplace(self):
replacements = self.getReplacements()
command = SimpleRevisionCommand(self.editorSession, "Replace")
if self.dialog.replaceBlocksInSelectionCheckbox.isChecked():
selection = self.editorSession.currentSelection
else:
selection = self.editorSession.currentDimension.bounds
with command.begin():
task = self.editorSession.currentDimension.fillBlocksIter(selection, replacements, updateLights=False)
showProgress("Replacing...", task)
self.editorSession.pushCommand(command)
nbtReplaceSettings = settings.Settings().getNamespace("findreplace/nbt")
nbtReplaceSettings.nameField = nbtReplaceSettings.getOption("nameField", unicode, "")
nbtReplaceSettings.valueField = nbtReplaceSettings.getOption("valueField", unicode, "")
nbtReplaceSettings.entityIDField = nbtReplaceSettings.getOption("entityIDField", unicode, "")
nbtReplaceSettings.searchEntitiesChecked = nbtReplaceSettings.getOption("searchEntitiesChecked", bool, False)
nbtReplaceSettings.tileEntityIDField = nbtReplaceSettings.getOption("tileEntityIDField", unicode, "")
nbtReplaceSettings.searchTileEntitiesChecked = nbtReplaceSettings.getOption("searchTileEntitiesChecked", bool, False)
nbtReplaceSettings.replaceNameField = nbtReplaceSettings.getOption("replaceNameField", unicode, "")
nbtReplaceSettings.replaceValueField = nbtReplaceSettings.getOption("replaceValueField", unicode, "")
nbtReplaceSettings.replaceValueTagType = nbtReplaceSettings.getOption("replaceValueTagType", int, 0)
class ReplaceValueTagType(object): class ReplaceValueTagType(object):
""" """
@ -284,9 +178,11 @@ class ReplaceValueTagType(object):
FLOAT = 6 FLOAT = 6
DOUBLE = 7 DOUBLE = 7
class NBTReplaceCommand(SimpleRevisionCommand): class NBTReplaceCommand(SimpleRevisionCommand):
pass pass
class FindReplaceNBT(QtCore.QObject): class FindReplaceNBT(QtCore.QObject):
def __init__(self, editorSession, dialog): def __init__(self, editorSession, dialog):
super(FindReplaceNBT, self).__init__() super(FindReplaceNBT, self).__init__()
@ -422,8 +318,6 @@ class FindReplaceNBT(QtCore.QObject):
if result.resultType == result.TileEntityResult: if result.resultType == result.TileEntityResult:
self.editorSession.zoomAndInspectBlock(result.position) self.editorSession.zoomAndInspectBlock(result.position)
def find(self): def find(self):
searchNames = self.widget.searchNameCheckbox.isChecked() searchNames = self.widget.searchNameCheckbox.isChecked()
targetName = self.widget.nameField.text() targetName = self.widget.nameField.text()
@ -444,7 +338,6 @@ class FindReplaceNBT(QtCore.QObject):
# Nothing to find # Nothing to find
return return
dim = self.editorSession.currentDimension dim = self.editorSession.currentDimension
inSelection = self.widget.inSelectionCheckbox.isChecked() inSelection = self.widget.inSelectionCheckbox.isChecked()
if inSelection: if inSelection:
@ -513,8 +406,6 @@ class FindReplaceNBT(QtCore.QObject):
uuid=uuid, uuid=uuid,
resultType=NBTResultsEntry.EntityResult) resultType=NBTResultsEntry.EntityResult)
def _findTileEntitiesInChunk(chunk): def _findTileEntitiesInChunk(chunk):
for tileEntity in chunk.TileEntities: for tileEntity in chunk.TileEntities:
if tileEntity.Position not in selection: if tileEntity.Position not in selection:
@ -547,7 +438,6 @@ class FindReplaceNBT(QtCore.QObject):
uuid=None, uuid=None,
resultType=NBTResultsEntry.TileEntityResult) resultType=NBTResultsEntry.TileEntityResult)
def _find(): def _find():
self.resultsDockWidget.show() self.resultsDockWidget.show()
self.resultsModel.clear() self.resultsModel.clear()
@ -653,50 +543,3 @@ class FindReplaceNBT(QtCore.QObject):
def replaceSelected(self): def replaceSelected(self):
pass pass
class FindReplaceDialog(QtGui.QDialog):
def __init__(self, editorSession, *args, **kwargs):
super(FindReplaceDialog, self).__init__(*args, **kwargs)
self.editorSession = editorSession
self.blocktypes = editorSession.worldEditor.blocktypes
load_ui("find_replace.ui", baseinstance=self)
self.findReplaceBlocks = FindReplaceBlocks(editorSession, self)
self.findReplaceNBT = FindReplaceNBT(editorSession, self)
self.nbtTab.setLayout(Column(self.findReplaceNBT.widget, margin=0))
self.resultsWidgets = [
# self.findReplaceBlocks.resultsDockWidget,
self.findReplaceNBT.resultsDockWidget,
]
def execFindBlocks(self):
self.execTab(0)
def execFindReplaceBlocks(self):
self.execTab(1)
def execFindReplaceItems(self):
self.execTab(2)
def execFindReplaceCommands(self):
self.execTab(3)
def execFindReplaceNBT(self):
self.execTab(4)
def execTab(self, tabIndex):
self.tabWidget.setCurrentIndex(tabIndex)
self.exec_()
def exec_(self):
self.findReplaceNBT.dialogOpened()
# self.findReplaceBlocks.dialogOpened()
super(FindReplaceDialog, self).exec_()