Ejemplo n.º 1
0
    def reloadList(self):
        try:
            saveFileDir = self.savesFolderComboBox.itemData(
                self.savesFolderComboBox.currentIndex())
            if saveFileDir is None:
                log.error("No item selected in savesFolderComboBox!!(?)")
                return
            if not os.path.isdir(saveFileDir):
                raise IOError(
                    u"Could not find the Minecraft saves directory!\n\n({0} was not found or is not a directory)"
                    .format(saveFileDir))

            log.info("Scanning %s for worlds...", saveFileDir)
            potentialWorlds = os.listdir(saveFileDir)
            potentialWorlds = [
                os.path.join(saveFileDir, p) for p in potentialWorlds
            ]
            worldFiles = [
                p for p in potentialWorlds if isLevel(AnvilWorldAdapter, p)
            ]

            self.worldListModel = WorldListModel(worldFiles)
            self.worldListView.setModel(self.worldListModel)

        except Exception as e:
            setWidgetError(
                self, e, "An error occurred while scanning the saves folder.")
Ejemplo n.º 2
0
    def reloadList(self):
        try:
            itemData = self.savesFolderComboBox.itemData(self.savesFolderComboBox.currentIndex())
            if itemData is None:
                log.error("No item selected in savesFolderComboBox!!(?)")
                return
            saveFileDir, instanceIndex = itemData
            if instanceIndex is not None:
                # disable version selector, update resource packs(?)
                pass
            if not os.path.isdir(saveFileDir):
                raise IOError(u"Could not find the Minecraft saves directory!\n\n({0} was not found or is not a directory)".format(saveFileDir))

            log.info("Scanning %s for worlds...", saveFileDir)
            potentialWorlds = os.listdir(saveFileDir)
            potentialWorlds = [os.path.join(saveFileDir, p) for p in potentialWorlds]
            worldFiles = [p for p in potentialWorlds if isLevel(AnvilWorldAdapter, p)]

            self.worldListModel = WorldListModel(worldFiles)
            self.worldListView.setModel(self.worldListModel)



            if len(self.worldListModel.worlds):
                self.worldListView.setFocus()
                self.worldListView.setCurrentIndex(self.worldListModel.createIndex(0, 0))
                self.showWorld(self.worldListModel.worlds[0][0])

        except EnvironmentError as e:
            setWidgetError(self, e)
Ejemplo n.º 3
0
    def reloadList(self):
        self.selectedWorldIndex = -1

        self.itemWidgets = []

        try:
            if not os.path.isdir(self.saveFileDir):
                raise IOError(
                    u"Could not find the Minecraft saves directory!\n\n({0} was not found or is not a directory)"
                    .format(self.saveFileDir))

            log.info("Scanning %s for worlds...", self.saveFileDir)
            potentialWorlds = os.listdir(self.saveFileDir)
            potentialWorlds = [
                os.path.join(self.saveFileDir, p) for p in potentialWorlds
            ]
            worldFiles = [
                p for p in potentialWorlds if isLevel(AnvilWorldAdapter, p)
            ]
            worldAdapters = []
            for f in worldFiles:
                try:
                    adapter = findAdapter(f, readonly=True)
                except Exception as e:
                    log.exception("Could not find adapter for %s: %r", f, e)
                    continue
                else:
                    worldAdapters.append(adapter)

            if len(worldAdapters) == 0:
                raise IOError(
                    "No worlds found! You should probably play Minecraft to create your first world."
                )

            column = QtGui.QVBoxLayout()
            column.setContentsMargins(0, 0, 0, 0)
            column.setSpacing(0)

            worldGroup = QtGui.QButtonGroup(self)
            #worldGroup.setExclusive(True)

            for adapter in worldAdapters:
                item = WorldListItemWidget(adapter)
                self.itemWidgets.append(item)

            self.itemWidgets.sort(key=lambda i: i.lastPlayed, reverse=True)

            for i, item in enumerate(self.itemWidgets):
                worldGroup.addButton(item, i)
                column.addWidget(item)
                item.doubleClicked.connect(self.worldListItemDoubleClicked)

            worldGroup.buttonClicked[int].connect(self.worldListItemClicked)

            self.scrollAreaWidgetContents.setLayout(column)

        except EnvironmentError as e:
            setWidgetError(self, e)
Ejemplo n.º 4
0
    def showWorld(self, filename):
        if filename == self._currentFilename:
            return
        self._currentFilename = filename

        self.removeWorldView()

        try:
            worldEditor = worldeditor.WorldEditor(filename, readonly=True)

        except Exception as e:
            self.errorWidget = QtGui.QWidget()
            setWidgetError(
                self.errorWidget, e,
                "An error occurred while reading the file %s. This file might not be a Minecraft world. If it is, please file a bug report."
                % filename)
            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, NBTFormatError):
                    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")
Ejemplo n.º 5
0
    def __init__(self, worldAdapter, parent=None):
        QtGui.QPushButton.__init__(self, parent)
        self.filename = worldAdapter.filename
        self.setCheckable(True)
        self.setFlat(True)

        try:
            # mapLabel = QtGui.QLabel()
            # mapLabel.setFixedSize(72, 72)
            displayNameLimit = 50
            name = displayName(worldAdapter.filename)
            if len(name) > displayNameLimit:
                name = name[:displayNameLimit] + "..."
            self.displayNameLabel = QtGui.QLabel(name)
            self.lastPlayed = lastPlayedTime(worldAdapter)
            lastPlayedText = self.lastPlayed.humanize(
            ) if self.lastPlayed else "Unknown"
            self.lastPlayedLabel = QtGui.QLabel(lastPlayedText)
            #self.sizeLabel = QtGui.QLabel(self.tr("Calculating area..."))
            # areaText = self.tr("%.02f million square meters") % (world.chunkCount * 0.25)
            # diskSize = 0
            # if hasattr(worldAdapter, 'worldFolder'):
            #     folder = worldAdapter.worldFolder
            #     for rf in folder.findRegionFiles():
            #         diskSize += os.stat(rf).st_size
            # else:
            #     diskSize = os.stat(worldAdapter.filename).st_size
            #
            # self.diskSizeLabel = QtGui.QLabel(self.tr("%0.2f MB") % (diskSize / 1000000.0))

            infoColumn = Column(
                self.displayNameLabel,
                self.lastPlayedLabel,
                #self.diskSizeLabel,
                None)

            #layout = Row(mapLabel, (infoColumn, 1), None)
            layout = infoColumn
            #if usefulFilename(world) == world.displayName:
            #    boxLabelText = world.displayName
            #else:
            #    boxLabelText = self.tr("%s (%s)" % (world.displayName, usefulFilename(world)))

            self.setLayout(layout)
            self.setMinimumSize(layout.sizeHint())
            self.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding,
                               QtGui.QSizePolicy.MinimumExpanding)

        except EnvironmentError as e:
            setWidgetError(self, e)
Ejemplo n.º 6
0
    def worldListItemClicked(self, i):
        if self.selectedWorldIndex == i:
            return
        self.selectedWorldIndex = i
        import gc
        gc.collect()
        models = {}
        try:
            worldEditor = worldeditor.WorldEditor(self.itemWidgets[i].filename,
                                                  readonly=True)
        except (EnvironmentError, LevelFormatError) as e:
            setWidgetError(self.errorWidget, e)
            while self.stackedWidget.count():
                self.stackedWidget.removeWidget(self.stackedWidget.widget(0))

            self.worldViewBox.addWidget(self.errorWidget)
        else:
            i, v, p = self.getSelectedIVP()
            blockModels = models.get(worldEditor.blocktypes)
            resLoader = i.getResourceLoader(v, p)
            if blockModels is None:
                models[worldEditor.blocktypes] = blockModels = BlockModels(
                    worldEditor.blocktypes, resLoader)
            textureAtlas = TextureAtlas(worldEditor, resLoader, blockModels)

            dim = worldEditor.getDimension()
            self.setWorldView(MinimapWorldView(dim, textureAtlas))
            self.chunkLoader = ChunkLoader(dim)
            self.chunkLoader.addClient(self.worldView)
            self.chunkLoader.chunkCompleted.connect(self.worldView.update)

            try:
                player = worldEditor.getPlayer()
                log.info("Centering on single-player player.")
            except PlayerNotFound:
                try:
                    center = worldEditor.worldSpawnPosition()
                    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)
            log.info("Switched world view")
Ejemplo n.º 7
0
    def showWorld(self, filename):
        if filename == self._currentFilename:
            return
        self._currentFilename = filename

        self.removeWorldView()

        try:
            worldEditor = worldeditor.WorldEditor(filename, readonly=True)

        except (EnvironmentError, LevelFormatError, zipfile.BadZipfile) as e:
            self.errorWidget = QtGui.QWidget()
            setWidgetError(self.errorWidget, e, "An error occurred while reading the world %s." % filename)
            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")
Ejemplo n.º 8
0
    def showWorld(self, filename):
        self.removeWorldView()

        try:
            worldEditor = worldeditor.WorldEditor(filename, readonly=True)
            resLoader = QtGui.qApp.getResourceLoaderForFilename(filename)
            blockModels = BlockModels(worldEditor.blocktypes, resLoader)
            textureAtlas = TextureAtlas(worldEditor, resLoader, blockModels)

        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, textureAtlas))
            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")
Ejemplo n.º 9
0
    def loadFile(self, filename, readonly=False):
        filename = os.path.normpath(filename)

        for s in self.sessions:
            if s.filename == filename:
                self.tabWidget.setCurrentWidget(s.editorTab)
                return

        self.hideWorldList()
        fileLoadingDialog = MCEProgressDialog(self.tr("Loading world..."),
                                              None, 0, 1, self.mainWindow)
        fileLoadingDialog.setAutoReset(False)
        fileLoadingDialog.setWindowModality(Qt.WindowModal)
        fileLoadingDialog.setMinimumDuration(0)
        fileLoadingDialog.setValue(0)
        fileLoadingDialog.setWindowTitle(self.tr("Loading world..."))
        self.processEvents()

        def callback(current, max, status):
            fileLoadingDialog.setValue(current)
            fileLoadingDialog.setMaximum(max)
            fileLoadingDialog.setLabelText(status)

        try:
            configuredBlocks = self.configureBlocksDialog.getConfiguredBlocks()
            session = EditorSession(filename,
                                    configuredBlocks,
                                    readonly=readonly,
                                    progressCallback=callback)
            self.undoGroup.addStack(session.undoStack)

            self.tabWidget.addTab(session.editorTab, session.tabCaption())
            self.tabWidget.setCurrentWidget(session.editorTab)
            self.sessions.append(session)
            self.addRecentFile(filename)

            session.loadDone()

        except Exception as e:
            log.exception("EditorSession failed to open %s: %r", filename, e)
            errorTab = QtGui.QWidget()
            setWidgetError(errorTab, e,
                           "An error occurred while opening %s" % filename)
            self.tabWidget.addTab(errorTab, "Failed to open %s" % filename)

        fileLoadingDialog.reset()
Ejemplo n.º 10
0
    def showWorld(self, filename):
        self.removeWorldView()

        try:
            worldEditor = worldeditor.WorldEditor(filename, readonly=True)
            resLoader = QtGui.qApp.getResourceLoaderForFilename(filename)
            blockModels = BlockModels(worldEditor.blocktypes, resLoader)
            textureAtlas = TextureAtlas(worldEditor, resLoader, blockModels)

        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, textureAtlas))
            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")
Ejemplo n.º 11
0
    def loadFile(self, filename, readonly=False):
        self.hideWorldList()
        try:
            session = EditorSession(filename,
                                    self.worldList.getSelectedIVP(),
                                    readonly=readonly)
            self.undoGroup.addStack(session.undoStack)

            self.tabWidget.addTab(session.editorTab, session.tabCaption())
            self.tabWidget.setCurrentWidget(session.editorTab)
            self.sessions.append(session)
            session.loadDone()

        except EnvironmentError as e:
            log.exception("EditorSession failed to open %s: %r", filename, e)
            errorTab = QtGui.QWidget()
            setWidgetError(errorTab, e)
            self.tabWidget.addTab(errorTab, "Failed to open %s" % filename)
Ejemplo n.º 12
0
    def reloadList(self):
        try:
            saveFileDir = self.savesFolderComboBox.itemData(self.savesFolderComboBox.currentIndex())
            if saveFileDir is None:
                log.error("No item selected in savesFolderComboBox!!(?)")
                return
            if not os.path.isdir(saveFileDir):
                raise IOError(u"Could not find the Minecraft saves directory!\n\n({0} was not found or is not a directory)".format(saveFileDir))

            log.info("Scanning %s for worlds...", saveFileDir)
            potentialWorlds = os.listdir(saveFileDir)
            potentialWorlds = [os.path.join(saveFileDir, p) for p in potentialWorlds]
            worldFiles = [p for p in potentialWorlds if isLevel(AnvilWorldAdapter, p)]

            self.worldListModel = WorldListModel(worldFiles)
            self.worldListView.setModel(self.worldListModel)

        except Exception as e:
            setWidgetError(self, e, "An error occurred while scanning the saves folder.")
Ejemplo n.º 13
0
    def loadFile(self, filename, readonly=False):
        self.hideWorldList()
        fileLoadingDialog = QtGui.QProgressDialog(self.tr("Loading world..."),
                                                  None,
                                                  0,
                                                  1,
                                                  self.mainWindow)
        fileLoadingDialog.setAutoReset(False)
        fileLoadingDialog.setWindowModality(Qt.WindowModal)
        fileLoadingDialog.setMinimumDuration(0)
        fileLoadingDialog.setValue(0)
        fileLoadingDialog.setWindowTitle(self.tr("Loading world..."))
        self.processEvents()

        def callback(current, max, status):
            fileLoadingDialog.setValue(current)
            fileLoadingDialog.setMaximum(max)
            fileLoadingDialog.setLabelText(status)


        try:
            resourceLoader = self.getResourceLoaderForFilename(filename)
            configuredBlocks = self.configureBlocksDialog.getConfiguredBlocks()
            session = EditorSession(filename, resourceLoader, configuredBlocks, readonly=readonly, progressCallback=callback)
            self.undoGroup.addStack(session.undoStack)

            self.tabWidget.addTab(session.editorTab, session.tabCaption())
            self.tabWidget.setCurrentWidget(session.editorTab)
            self.sessions.append(session)
            self.addRecentFile(filename)

            session.loadDone()

        except EnvironmentError as e:
            log.exception("EditorSession failed to open %s: %r", filename, e)
            errorTab = QtGui.QWidget()
            setWidgetError(errorTab, e)
            self.tabWidget.addTab(errorTab, "Failed to open %s" % filename)

        fileLoadingDialog.reset()
Ejemplo n.º 14
0
    def loadFile(self, filename, readonly=False):
        self.hideWorldList()
        fileLoadingDialog = QtGui.QProgressDialog(self.tr("Loading world..."),
                                                  None,
                                                  0,
                                                  1,
                                                  self.mainWindow)
        fileLoadingDialog.setAutoReset(False)
        fileLoadingDialog.setWindowModality(Qt.WindowModal)
        fileLoadingDialog.setMinimumDuration(0)
        fileLoadingDialog.setValue(0)
        fileLoadingDialog.setWindowTitle(self.tr("Loading world..."))
        self.processEvents()

        def callback(current, max, status):
            fileLoadingDialog.setValue(current)
            fileLoadingDialog.setMaximum(max)
            fileLoadingDialog.setLabelText(status)


        try:
            session = EditorSession(filename, self.worldList.getSelectedIVP(), readonly=readonly, progressCallback=callback)
            self.undoGroup.addStack(session.undoStack)

            self.tabWidget.addTab(session.editorTab, session.tabCaption())
            self.tabWidget.setCurrentWidget(session.editorTab)
            self.sessions.append(session)
            self.addRecentFile(filename)
            session.loadDone()

        except EnvironmentError as e:
            log.exception("EditorSession failed to open %s: %r", filename, e)
            errorTab = QtGui.QWidget()
            setWidgetError(errorTab, e)
            self.tabWidget.addTab(errorTab, "Failed to open %s" % filename)

        fileLoadingDialog.reset()
Ejemplo n.º 15
0
    def reloadList(self):
        try:
            itemData = self.savesFolderComboBox.itemData(
                self.savesFolderComboBox.currentIndex())
            if itemData is None:
                log.error("No item selected in savesFolderComboBox!!(?)")
                return
            saveFileDir, instanceIndex = itemData
            if instanceIndex is not None:
                # disable version selector, update resource packs(?)
                pass
            if not os.path.isdir(saveFileDir):
                raise IOError(
                    u"Could not find the Minecraft saves directory!\n\n({0} was not found or is not a directory)"
                    .format(saveFileDir))

            log.info("Scanning %s for worlds...", saveFileDir)
            potentialWorlds = os.listdir(saveFileDir)
            potentialWorlds = [
                os.path.join(saveFileDir, p) for p in potentialWorlds
            ]
            worldFiles = [
                p for p in potentialWorlds if isLevel(AnvilWorldAdapter, p)
            ]

            self.worldListModel = WorldListModel(worldFiles)
            self.worldListView.setModel(self.worldListModel)

            if len(self.worldListModel.worlds):
                self.worldListView.setFocus()
                self.worldListView.setCurrentIndex(
                    self.worldListModel.createIndex(0, 0))
                self.showWorld(self.worldListModel.worlds[0][0])

        except EnvironmentError as e:
            setWidgetError(self, e)