diff options
Diffstat (limited to 'api/logic/tools/MCEditTool.cpp')
-rw-r--r-- | api/logic/tools/MCEditTool.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/api/logic/tools/MCEditTool.cpp b/api/logic/tools/MCEditTool.cpp new file mode 100644 index 00000000..f3d550d0 --- /dev/null +++ b/api/logic/tools/MCEditTool.cpp @@ -0,0 +1,124 @@ +#include "MCEditTool.h" + +#include <QDir> +#include <QProcess> +#include <QUrl> + +#include "settings/SettingsObject.h" +#include "BaseInstance.h" +#include "minecraft/MinecraftInstance.h" + +MCEditTool::MCEditTool(SettingsObjectPtr settings, InstancePtr instance, QObject *parent) + : BaseDetachedTool(settings, instance, parent) +{ +} + +QString MCEditTool::getSave() const +{ + auto mcInstance = std::dynamic_pointer_cast<MinecraftInstance>(m_instance); + if(!mcInstance) + { + return QString(); + } + QDir saves(mcInstance->minecraftRoot() + "/saves"); + QStringList worlds = saves.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + QMutableListIterator<QString> it(worlds); + while (it.hasNext()) + { + it.next(); + if (!QDir(saves.absoluteFilePath(it.value())).exists("level.dat")) + { + it.remove(); + } + } + bool ok = true; + // FIXME: mixing logic and UI!!!! + /* + const QString save = QInputDialog::getItem(QApplication::activeWindow(), tr("MCEdit"), tr("Choose which world to open:"), + worlds, 0, false, &ok); + if (ok) + { + return saves.absoluteFilePath(save); + } + */ + return QString(); +} + +void MCEditTool::runImpl() +{ + const QString mceditPath = globalSettings->get("MCEditPath").toString(); + const QString save = getSave(); + if (save.isNull()) + { + return; + } +#ifdef Q_OS_OSX + QProcess *process = new QProcess(); + connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), process, SLOT(deleteLater())); + process->setProgram(mceditPath); + process->setArguments(QStringList() << save); + process->start(); +#else + QDir mceditDir(mceditPath); + QString program; + #ifdef Q_OS_LINUX + if (mceditDir.exists("mcedit.py")) + { + program = mceditDir.absoluteFilePath("mcedit.py"); + } + else if (mceditDir.exists("mcedit.sh")) + { + program = mceditDir.absoluteFilePath("mcedit.sh"); + } + #elif defined(Q_OS_WIN32) + if (mceditDir.exists("mcedit.exe")) + { + program = mceditDir.absoluteFilePath("mcedit.exe"); + } + else if (mceditDir.exists("mcedit2.exe")) + { + program = mceditDir.absoluteFilePath("mcedit2.exe"); + } + #endif + /* + if(program.size()) + { + DesktopServices::openFile(program, save, mceditPath); + } + */ +#endif +} + +void MCEditFactory::registerSettings(SettingsObjectPtr settings) +{ + settings->registerSetting("MCEditPath"); + globalSettings = settings; +} +BaseExternalTool *MCEditFactory::createTool(InstancePtr instance, QObject *parent) +{ + return new MCEditTool(globalSettings, instance, parent); +} +bool MCEditFactory::check(QString *error) +{ + return check(globalSettings->get("MCEditPath").toString(), error); +} +bool MCEditFactory::check(const QString &path, QString *error) +{ + if (path.isEmpty()) + { + *error = QObject::tr("Path is empty"); + return false; + } + const QDir dir(path); + if (!dir.exists()) + { + *error = QObject::tr("Path does not exist"); + return false; + } + if (!dir.exists("mcedit.sh") && !dir.exists("mcedit.py") && !dir.exists("mcedit.exe") && !dir.exists("Contents") && !dir.exists("mcedit2.exe")) + { + *error = QObject::tr("Path does not seem to be a MCEdit path"); + return false; + } + return true; +} |