Flood fill tool now has hover and flood direction options.

This commit is contained in:
David Vierra 2015-10-06 17:11:35 -10:00
parent dbbacea7a8
commit 7bdcd2c044

View File

@ -8,6 +8,7 @@ import collections
import time import time
from mcedit2.editortools import EditorTool from mcedit2.editortools import EditorTool
from mcedit2.command import SimplePerformCommand from mcedit2.command import SimplePerformCommand
from mcedit2.editortools.select import SelectionCursor
from mcedit2.util.showprogress import showProgress from mcedit2.util.showprogress import showProgress
from mcedit2.widgets.blockpicker import BlockTypeButton from mcedit2.widgets.blockpicker import BlockTypeButton
from mcedit2.widgets.layout import Column, Row from mcedit2.widgets.layout import Column, Row
@ -20,15 +21,49 @@ class FloodFillTool(EditorTool):
iconName = "flood_fill" iconName = "flood_fill"
def mousePress(self, event): def mousePress(self, event):
command = FloodFillCommand(self.editorSession, event.blockPosition, self.blockTypeWidget.block, self.indiscriminateCheckBox.isChecked()) pos = event.blockPosition
if self.hoverCheckbox.isChecked():
pos = pos + event.blockFace.vector
command = FloodFillCommand(self.editorSession,
pos,
self.blockTypeWidget.block,
self.indiscriminateCheckBox.isChecked(),
self.getFloodDirs())
self.editorSession.pushCommand(command) self.editorSession.pushCommand(command)
def mouseMove(self, event):
self.mouseDrag(event)
def mouseDrag(self, event):
self.cursorNode.point = event.blockPosition
self.cursorNode.face = event.blockFace
def __init__(self, editorSession, *args, **kwargs): def __init__(self, editorSession, *args, **kwargs):
super(FloodFillTool, self).__init__(editorSession, *args, **kwargs) super(FloodFillTool, self).__init__(editorSession, *args, **kwargs)
toolWidget = QtGui.QWidget() toolWidget = QtGui.QWidget()
self.toolWidget = toolWidget self.toolWidget = toolWidget
self.cursorNode = SelectionCursor()
self.floodXPosCheckbox = QtGui.QCheckBox(self.tr("X+"), checked=True)
self.floodXNegCheckbox = QtGui.QCheckBox(self.tr("X-"), checked=True)
self.floodYPosCheckbox = QtGui.QCheckBox(self.tr("Y+"), checked=True)
self.floodYNegCheckbox = QtGui.QCheckBox(self.tr("Y-"), checked=True)
self.floodZPosCheckbox = QtGui.QCheckBox(self.tr("Z+"), checked=True)
self.floodZNegCheckbox = QtGui.QCheckBox(self.tr("Z-"), checked=True)
floodDirsLayout = Column(Row(
self.floodXPosCheckbox,
self.floodYPosCheckbox,
self.floodZPosCheckbox,
), Row(
self.floodXNegCheckbox,
self.floodYNegCheckbox,
self.floodZNegCheckbox,
), )
self.blockTypeWidget = BlockTypeButton() self.blockTypeWidget = BlockTypeButton()
self.blockTypeWidget.block = self.editorSession.worldEditor.blocktypes["stone"] self.blockTypeWidget.block = self.editorSession.worldEditor.blocktypes["stone"]
self.blockTypeWidget.editorSession = self.editorSession self.blockTypeWidget.editorSession = self.editorSession
@ -36,19 +71,30 @@ class FloodFillTool(EditorTool):
self.indiscriminateCheckBox = QtGui.QCheckBox("Ignore block meta") self.indiscriminateCheckBox = QtGui.QCheckBox("Ignore block meta")
self.indiscriminateCheckBox.setChecked(False) self.indiscriminateCheckBox.setChecked(False)
self.hoverCheckbox = QtGui.QCheckBox("Hover")
toolWidget.setLayout(Column(Row(QtGui.QLabel("Block:"), toolWidget.setLayout(Column(Row(QtGui.QLabel("Block:"),
self.blockTypeWidget), self.blockTypeWidget),
self.indiscriminateCheckBox, Row(self.hoverCheckbox, self.indiscriminateCheckBox),
floodDirsLayout,
None)) None))
def getFloodDirs(self):
return {f: c.isChecked() for f, c in
((faces.FaceXIncreasing, self.floodXPosCheckbox),
(faces.FaceYIncreasing, self.floodYPosCheckbox),
(faces.FaceZIncreasing, self.floodZPosCheckbox),
(faces.FaceXDecreasing, self.floodXNegCheckbox),
(faces.FaceYDecreasing, self.floodYNegCheckbox),
(faces.FaceZDecreasing, self.floodZNegCheckbox))}
class FloodFillCommand(SimplePerformCommand): class FloodFillCommand(SimplePerformCommand):
def __init__(self, editorSession, point, blockInfo, indiscriminate): def __init__(self, editorSession, point, blockInfo, indiscriminate, floodDirs):
super(FloodFillCommand, self).__init__(editorSession) super(FloodFillCommand, self).__init__(editorSession)
self.blockInfo = blockInfo self.blockInfo = blockInfo
self.point = point self.point = point
self.indiscriminate = indiscriminate self.indiscriminate = indiscriminate
self.floodDirs = floodDirs
def perform(self): def perform(self):
dim = self.editorSession.currentDimension dim = self.editorSession.currentDimension
@ -58,6 +104,7 @@ class FloodFillCommand(SimplePerformCommand):
doomedBlockData = dim.getBlockData(*point) doomedBlockData = dim.getBlockData(*point)
checkData = (doomedBlock not in (8, 9, 10, 11)) # always ignore data when replacing water/lava xxx forge fluids? checkData = (doomedBlock not in (8, 9, 10, 11)) # always ignore data when replacing water/lava xxx forge fluids?
indiscriminate = self.indiscriminate indiscriminate = self.indiscriminate
floodDirs = self.floodDirs
log.info("Flood fill: replacing %s with %s", (doomedBlock, doomedBlockData), self.blockInfo) log.info("Flood fill: replacing %s with %s", (doomedBlock, doomedBlockData), self.blockInfo)
@ -79,6 +126,8 @@ class FloodFillCommand(SimplePerformCommand):
for (x, y, z) in coords: for (x, y, z) in coords:
for face, offsets in faces.faceDirections: for face, offsets in faces.faceDirections:
if not floodDirs[face]:
continue
dx, dy, dz = offsets dx, dy, dz = offsets
p = (x + dx, y + dy, z + dz) p = (x + dx, y + dy, z + dz)