From db762662045e13aca416f7adddba21d363a9aad5 Mon Sep 17 00:00:00 2001 From: David Vierra Date: Tue, 27 Oct 2015 19:00:31 -1000 Subject: [PATCH] Add crude, half-implemented "Go To" buttons to the CommandBlock inspector --- .../widgets/inspector/tileentities/command.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/mcedit2/widgets/inspector/tileentities/command.py b/src/mcedit2/widgets/inspector/tileentities/command.py index 1e7c0bd..f8845d9 100644 --- a/src/mcedit2/widgets/inspector/tileentities/command.py +++ b/src/mcedit2/widgets/inspector/tileentities/command.py @@ -4,6 +4,8 @@ from __future__ import absolute_import, division, print_function, unicode_literals import logging from PySide import QtGui + +from mcedit2.util.commandblock import ParseCommand from mcedit2.widgets.layout import Column, Row log = logging.getLogger(__name__) @@ -15,6 +17,8 @@ class CommandBlockEditorWidget(QtGui.QWidget): super(CommandBlockEditorWidget, self).__init__() assert tileEntityRef.id == self.tileEntityID + self.editorSession = editorSession + self.customNameLabel = QtGui.QLabel(self.tr("Custom Name: ")) self.customNameField = QtGui.QLineEdit() @@ -22,6 +26,9 @@ class CommandBlockEditorWidget(QtGui.QWidget): self.successCountLabel = QtGui.QLabel(self.tr("Success Count: ")) self.successCountSpinBox = QtGui.QSpinBox() + self.gotoCommandButton = QtGui.QPushButton(self.tr("Go To Command"), clicked=self.gotoCommand) + self.gotoTargetButton = QtGui.QPushButton(self.tr("Go To Target"), clicked=self.gotoTarget) + self.gotoIndirectTargetButton = QtGui.QPushButton(self.tr("Go To Indirect Target"), clicked=self.gotoIndirectTarget) self.commandTextEdit = QtGui.QTextEdit() self.commandTextEdit.setAcceptRichText(False) @@ -31,6 +38,7 @@ class CommandBlockEditorWidget(QtGui.QWidget): self.setLayout(Column(Row(self.customNameLabel, self.customNameField), Row(self.trackOutputCheckbox, None, self.successCountLabel, self.successCountSpinBox), + Row(self.gotoCommandButton, self.gotoTargetButton, self.gotoIndirectTargetButton), self.commandGroup)) self.tileEntityRef = tileEntityRef @@ -40,4 +48,47 @@ class CommandBlockEditorWidget(QtGui.QWidget): self.trackOutputCheckbox.setChecked(tileEntityRef.TrackOutput != 0) self.successCountSpinBox.setValue(tileEntityRef.SuccessCount) + try: + self.parsedCommand = ParseCommand(tileEntityRef.Command) + except Exception: + log.warn("Failed to parse command block.", exc_info=1) + self.parsedCommand = None + + self.gotoTargetButton.setEnabled(False) + self.gotoIndirectTarget.setEnabled(False) + + self.adjustSize() + + def gotoCommand(self): + self.editorSession.zoomToPoint(self.tileEntityRef.Position) + + def gotoTarget(self): + if self.parsedCommand.name == "setblock": + targetPos = self.parsedCommand.resolvePosition(self.tileEntityRef.Position) + self.editorSession.zoomToPoint(targetPos) + elif self.parsedCommand.name == "execute": + selector = self.parsedCommand.targetSelector + if selector.playerName is not None: + return + + x, y, z = [selector.getArg(a) for a in 'xyz'] + + if None in (x, y, z): + log.warn("No selector coordinates for command %s", self.parsedCommand) + return + self.editorSession.zoomToPoint((x, y, z)) + + def gotoIndirectTarget(self): + if self.parsedCommand.name == "execute": + targetPos = self.parsedCommand.resolvePosition(self.tileEntityRef.Position) + subcommand = self.parsedCommand.subcommand + + if hasattr(subcommand, 'resolvePosition'): + indirectPos = subcommand.resolvePosition(targetPos) + self.editorSession.zoomToPoint(indirectPos) + + if hasattr(subcommand, 'resolveBoundingBox'): + sourceBounds = subcommand.resolveBoundingBox(targetPos) + self.editorSession.zoomToPoint(sourceBounds.center) +