def showWorld(self, filename): self.removeWorldView() try: worldEditor = worldeditor.WorldEditor(filename, readonly=True) resLoader = minecraftinstall.getResourceLoaderForFilename(filename) except (EnvironmentError, LevelFormatError, zipfile.BadZipfile) as e: self.errorWidget = QtGui.QWidget() setWidgetError(self.errorWidget, e) self.stackedWidget.addWidget(self.errorWidget) self.stackedWidget.setCurrentWidget(self.errorWidget) else: dim = worldEditor.getDimension() self.setWorldView(MinimapWorldView(dim)) self.chunkLoader = ChunkLoader(dim) self.chunkLoader.addClient(self.worldView) self.chunkLoader.chunkCompleted.connect(self.worldView.update) try: try: player = worldEditor.getPlayer() log.info("Centering on single-player player.") except PlayerNotFound: try: center = worldEditor.getWorldMetadata().Spawn log.info("Centering on spawn position.") except AttributeError: log.info("Centering on world center") center = dim.bounds.origin + (dim.bounds.size * 0.5) else: if player.dimName == dim.dimName: center = Vector(*player.Position) self.worldView.centerOnPoint(center) else: center = dim.bounds.origin + (dim.bounds.size * 0.5) self.worldView.centerOnPoint(center) except Exception as e: log.exception("Error while centering view in world list: %s", e) log.info("Switched world view")
def __init__(self, filename, configuredBlocks, readonly=False, progressCallback=None): """ :param filename: :type filename: str :param configuredBlocks: :type configuredBlocks: dict??? :param readonly: :type readonly: bool :param progressCallback: :type progressCallback: callable :return: :rtype: """ from mcedit2 import __version__ as v progressMax = 8 # fixme if progressCallback is None: def progress(status): pass else: def progress(status): progressCallback(progress.progressCount, progressMax, status) progress.progressCount += 1 progress.progressCount = 0 QtCore.QObject.__init__(self) self.undoStack = MCEUndoStack() self.resourceLoader = minecraftinstall.getResourceLoaderForFilename(filename) self.loader = None self.blockModels = None self.textureAtlas = None self.editorTab = None self.filename = filename self.dockWidgets = [] self.undoBlock = None self.currentTool = None self.dirty = False self.configuredBlocks = None self.copiedSchematic = None # xxx should be app global!! """:type : WorldEditor""" # --- Open world editor --- try: progress("Creating WorldEditor...") self.worldEditor = WorldEditor(filename, readonly=readonly) except UndoFolderExists: msgBox = QtGui.QMessageBox() msgBox.setIcon(QtGui.QMessageBox.Warning) msgBox.setWindowTitle(self.tr("MCEdit %(version)s") % {"version": v}) msgBox.setText(self.tr("This world was not properly closed by MCEdit.")) msgBox.setInformativeText(self.tr( "MCEdit may have crashed. An undo history was found for this world. You may try " "to resume editing with the saved undo history, or start over with the current " "state of the world.")) resumeBtn = msgBox.addButton("Resume Editing", QtGui.QMessageBox.ApplyRole) msgBox.addButton("Discard History", QtGui.QMessageBox.DestructiveRole) # msgBox.exec_() # clicked = msgBox.clickedButton() # xxxxx resume editing not implemented in session - need to restore undo history! clicked = None resume = clicked is resumeBtn try: self.worldEditor = WorldEditor(filename, readonly=readonly, resume=resume) except NotImplementedError: NotImplementedYet() raise IOError("Uh-oh") self.worldEditor.requireRevisions() self.currentDimension = None progress("Creating menus...") # --- Menus --- self.menus = [] # - Edit - self.menuEdit = QtGui.QMenu(self.tr("Edit")) self.menuEdit.setObjectName("menuEdit") self.actionCut = QtGui.QAction(self.tr("Cut"), self, triggered=self.cut, enabled=False) self.actionCut.setShortcut(QtGui.QKeySequence.Cut) self.actionCut.setObjectName("actionCut") self.actionCopy = QtGui.QAction(self.tr("Copy"), self, triggered=self.copy, enabled=False) self.actionCopy.setShortcut(QtGui.QKeySequence.Copy) self.actionCopy.setObjectName("actionCopy") self.actionPaste = QtGui.QAction(self.tr("Paste"), self, triggered=self.paste, enabled=False) self.actionPaste.setShortcut(QtGui.QKeySequence.Paste) self.actionPaste.setObjectName("actionPaste") self.actionPaste_Blocks = QtGui.QAction(self.tr("Paste Blocks"), self, triggered=self.pasteBlocks, enabled=False) self.actionPaste_Blocks.setShortcut(QtGui.QKeySequence("Ctrl+Shift+V")) self.actionPaste_Blocks.setObjectName("actionPaste_Blocks") self.actionPaste_Entities = QtGui.QAction(self.tr("Paste Entities"), self, triggered=self.pasteEntities, enabled=False) self.actionPaste_Entities.setShortcut(QtGui.QKeySequence("Ctrl+Alt+V")) self.actionPaste_Entities.setObjectName("actionPaste_Entities") self.actionClear = QtGui.QAction(self.tr("Delete"), self, triggered=self.deleteSelection, enabled=False) self.actionClear.setShortcut(QtGui.QKeySequence.Delete) self.actionClear.setObjectName("actionClear") self.actionDeleteBlocks = QtGui.QAction(self.tr("Delete Blocks"), self, triggered=self.deleteBlocks, enabled=False) self.actionDeleteBlocks.setShortcut(QtGui.QKeySequence("Shift+Del")) self.actionDeleteBlocks.setObjectName("actionDeleteBlocks") self.actionDeleteEntities = QtGui.QAction(self.tr("Delete Entities"), self, triggered=self.deleteEntities, enabled=False) self.actionDeleteEntities.setShortcut(QtGui.QKeySequence("Shift+Alt+Del")) self.actionDeleteEntities.setObjectName("actionDeleteEntities") self.actionFill = QtGui.QAction(self.tr("Fill"), self, triggered=self.fill, enabled=False) self.actionFill.setShortcut(QtGui.QKeySequence("Shift+Ctrl+F")) self.actionFill.setObjectName("actionFill") self.actionFindReplace = QtGui.QAction(self.tr("Find/Replace"), self, triggered=self.findReplace, enabled=True) self.actionFindReplace.setShortcut(QtGui.QKeySequence.Find) self.actionFindReplace.setObjectName("actionFindReplace") self.actionAnalyze = QtGui.QAction(self.tr("Analyze"), self, triggered=self.analyze, enabled=True) # self.actionAnalyze.setShortcut(QtGui.QKeySequence.Analyze) self.actionAnalyze.setObjectName("actionAnalyze") undoAction = self.undoStack.createUndoAction(self.menuEdit) undoAction.setShortcut(QtGui.QKeySequence.Undo) redoAction = self.undoStack.createRedoAction(self.menuEdit) redoAction.setShortcut(QtGui.QKeySequence.Redo) self.menuEdit.addAction(undoAction) self.menuEdit.addAction(redoAction) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionCut) self.menuEdit.addAction(self.actionCopy) self.menuEdit.addAction(self.actionPaste) self.menuEdit.addAction(self.actionPaste_Blocks) self.menuEdit.addAction(self.actionPaste_Entities) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionClear) self.menuEdit.addAction(self.actionDeleteBlocks) self.menuEdit.addAction(self.actionDeleteEntities) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionFill) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionFindReplace) self.menuEdit.addAction(self.actionAnalyze) self.menus.append(self.menuEdit) # - Select - self.menuSelect = QtGui.QMenu(self.tr("Select")) self.actionSelectAll = QtGui.QAction(self.tr("Select All"), self, triggered=self.selectAll) self.actionSelectAll.setShortcut(QtGui.QKeySequence.SelectAll) self.menuSelect.addAction(self.actionSelectAll) self.actionDeselect = QtGui.QAction(self.tr("Deselect"), self, triggered=self.deselect) self.actionDeselect.setShortcut(QtGui.QKeySequence("Ctrl+D")) self.menuSelect.addAction(self.actionDeselect) self.menus.append(self.menuSelect) # - Import/Export - self.menuImportExport = QtGui.QMenu(self.tr("Import/Export")) self.actionExport = QtGui.QAction(self.tr("Export"), self, triggered=self.export) self.actionExport.setShortcut(QtGui.QKeySequence("Ctrl+Shift+E")) self.menuImportExport.addAction(self.actionExport) self.actionImport = QtGui.QAction(self.tr("Import"), self, triggered=self.import_) self.actionImport.setShortcut(QtGui.QKeySequence("Ctrl+Shift+D")) self.menuImportExport.addAction(self.actionImport) self.actionImport = QtGui.QAction(self.tr("Show Exports Library"), self, triggered=QtGui.qApp.libraryDockWidget.toggleViewAction().trigger) self.actionImport.setShortcut(QtGui.QKeySequence("Ctrl+Shift+L")) self.menuImportExport.addAction(self.actionImport) self.menus.append(self.menuImportExport) # - Chunk - self.menuChunk = QtGui.QMenu(self.tr("Chunk")) self.actionDeleteChunks = QtGui.QAction(self.tr("Delete Chunks"), self, triggered=self.deleteChunks) self.actionCreateChunks = QtGui.QAction(self.tr("Create Chunks"), self, triggered=self.createChunks) self.actionRepopChunks = QtGui.QAction(self.tr("Mark Chunks For Repopulation"), self, triggered=self.repopChunks) self.menuChunk.addAction(self.actionDeleteChunks) self.menuChunk.addAction(self.actionCreateChunks) self.menuChunk.addAction(self.actionRepopChunks) self.menus.append(self.menuChunk) # --- Resources --- self.geometryCache = GeometryCache() progress("Loading textures and models...") self.setConfiguredBlocks(configuredBlocks) # Must be called after resourceLoader is in place self.editorOverlay = scenenode.Node() self.biomeTypes = BiomeTypes() # --- Panels --- progress("Loading panels...") self.playerPanel = PlayerPanel(self) self.mapPanel = MapPanel(self) self.worldInfoPanel = WorldInfoPanel(self) self.panels = [self.playerPanel, self.worldInfoPanel, self.mapPanel] self.panelActions = [] # --- Tools --- progress("Loading tools...") self.toolClasses = list(editortools.ToolClasses()) self.toolActionGroup = QtGui.QActionGroup(self) self.tools = [cls(self) for cls in self.toolClasses] self.toolActions = [tool.pickToolAction() for tool in self.tools] self.actionsByName = {action.toolName: action for action in self.toolActions} for tool in self.tools: tool.toolPicked.connect(self.chooseTool) for action in self.toolActions: self.toolActionGroup.addAction(action) self.selectionTool = self.getTool("Select") self.moveTool = self.getTool("Move") # --- Dimensions --- def _dimChanged(f): def _changed(): self.gotoDimension(f) return _changed dimButton = self.changeDimensionButton = QtGui.QToolButton() dimButton.setText(self.dimensionMenuLabel("")) dimAction = self.changeDimensionAction = QtGui.QWidgetAction(self) dimAction.setDefaultWidget(dimButton) dimMenu = self.dimensionsMenu = QtGui.QMenu() for dimName in self.worldEditor.listDimensions(): displayName = self.dimensionDisplayName(dimName) action = dimMenu.addAction(displayName) action._changed = _dimChanged(dimName) action.triggered.connect(action._changed) dimButton.setMenu(dimMenu) dimButton.setPopupMode(QtGui.QToolButton.InstantPopup) self.panelActions.append(dimAction) mcVersionButton = self.changeMCVersionButton = QtGui.QToolButton() mcVersionButton.setText(self.minecraftVersionLabel()) mcVersionAction = self.changeMCVersionAction = QtGui.QWidgetAction(self) mcVersionAction.setDefaultWidget(mcVersionButton) self.mcVersionMenu = QtGui.QMenu() mcVersionButton.setMenu(self.mcVersionMenu) mcVersionButton.setPopupMode(QtGui.QToolButton.InstantPopup) self.panelActions.append(mcVersionAction) resourcePackButton = self.changeResourcePackButton = QtGui.QToolButton() resourcePackButton.setText(self.resourcePackLabel()) resourcePackAction = self.changeResourcePackAction = QtGui.QWidgetAction(self) resourcePackAction.setDefaultWidget(resourcePackButton) self.resourcePackMenu = QtGui.QMenu() resourcePackButton.setMenu(self.resourcePackMenu) resourcePackButton.setPopupMode(QtGui.QToolButton.InstantPopup) self.panelActions.append(resourcePackAction) self._updateVersionsAndResourcePacks() progress("Loading overworld dimension") self.gotoDimension("") # --- Editor stuff --- progress("Creating EditorTab...") self.editorTab = EditorTab(self) self.toolChanged.connect(self.toolDidChange) self.editorTab.urlsDropped.connect(self.urlsWereDropped) self.editorTab.mapItemDropped.connect(self.mapItemWasDropped) self.undoStack.indexChanged.connect(self.undoIndexChanged) self.findReplaceDialog = FindReplaceDialog(self) for resultsWidget in self.findReplaceDialog.resultsWidgets: self.dockWidgets.append((Qt.BottomDockWidgetArea, resultsWidget)) self.inspectorWidget = InspectorWidget(self) self.inspectorDockWidget = QtGui.QDockWidget(self.tr("Inspector"), objectName="inspector") self.inspectorDockWidget.setWidget(self.inspectorWidget) self.inspectorDockWidget.hide() self.dockWidgets.append((Qt.RightDockWidgetArea, self.inspectorDockWidget)) if len(self.toolActions): # Must be called after toolChanged is connected to editorTab self.toolActions[0].trigger() if hasattr(progress, 'progressCount') and progress.progressCount != progressMax: log.info("Update progressMax to %d, please.", progress.progressCount)
def changeMCVersion(self, version): minecraftinstall.currentVersionOption.setValue(version) self.resourceLoader = minecraftinstall.getResourceLoaderForFilename(self.filename) self.changeMCVersionButton.setText(self.minecraftVersionLabel()) self.reloadModels()
def changeResourcePack(self, packName): minecraftinstall.currentResourcePackOption.setValue(packName or "") self.resourceLoader = minecraftinstall.getResourceLoaderForFilename(self.filename) self.changeResourcePackButton.setText(self.resourcePackLabel()) self.reloadModels()