From 1626fa013c86dc9f30254f57b3518211f6d0c65a Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 22 Apr 2013 17:15:18 -0500 Subject: Implement instance creation. --- gui/mainwindow.cpp | 45 ++++++++++++++++++++++++++++++++- gui/newinstancedialog.cpp | 23 +++++++++++++++++ gui/newinstancedialog.h | 5 ++++ libutil/include/pathutils.h | 4 +++ libutil/src/pathutils.cpp | 30 ++++++++++++++++++++++ plugins/stdinstance/stdinstancetype.cpp | 7 +++-- 6 files changed, 109 insertions(+), 5 deletions(-) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 7761afe8..7f05c745 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -147,7 +147,50 @@ void MainWindow::instanceActivated ( QModelIndex index ) void MainWindow::on_actionAddInstance_triggered() { NewInstanceDialog *newInstDlg = new NewInstanceDialog ( this ); - newInstDlg->exec(); + if (newInstDlg->exec()) + { + Instance *newInstance = NULL; + + QString instDirName = DirNameFromString(newInstDlg->instName()); + QString instDir = PathCombine(globalSettings->get("InstanceDir").toString(), + instDirName); + + InstanceLoader::InstTypeError error = InstanceLoader::get(). + createInstance(newInstance, newInstDlg->selectedType(), instDir); + + if (error == InstanceLoader::NoError) + { + newInstance->setName(newInstDlg->instName()); + instList.add(InstancePtr(newInstance)); + } + else + { + QString errorMsg = QString("Failed to create instance %1: "). + arg(instDirName); + + switch (error) + { + case InstanceLoader::TypeNotRegistered: + errorMsg += "Instance type not found."; + break; + + case InstanceLoader::InstExists: + errorMsg += "An instance with the given directory name already exists."; + break; + + case InstanceLoader::CantCreateDir: + errorMsg += "Failed to create the instance directory."; + break; + + default: + errorMsg += QString("Unknown instance loader error %1"). + arg(error); + break; + } + + QMessageBox::warning(this, "Error", errorMsg); + } + } } void MainWindow::on_actionChangeInstGroup_triggered() diff --git a/gui/newinstancedialog.cpp b/gui/newinstancedialog.cpp index f4d57367..3cbfabb0 100644 --- a/gui/newinstancedialog.cpp +++ b/gui/newinstancedialog.cpp @@ -74,6 +74,8 @@ void NewInstanceDialog::updateSelectedType() { if (!m_selectedType->versionList()->isLoaded()) loadVersionList(); + + setSelectedVersion(m_selectedType->versionList()->getLatestStable()); } } @@ -112,6 +114,27 @@ void NewInstanceDialog::loadVersionList() setSelectedVersion(m_selectedType->versionList()->getLatestStable()); } +QString NewInstanceDialog::instName() const +{ + return ui->instNameTextBox->text(); +} + +QString NewInstanceDialog::iconKey() const +{ + // TODO: Implement icon stuff. + return "default"; +} + +const InstanceTypeInterface *NewInstanceDialog::selectedType() const +{ + return m_selectedType; +} + +const InstVersion *NewInstanceDialog::selectedVersion() const +{ + return m_selectedVersion; +} + void NewInstanceDialog::on_btnChangeVersion_clicked() { if (m_selectedType) diff --git a/gui/newinstancedialog.h b/gui/newinstancedialog.h index da689c41..93d94575 100644 --- a/gui/newinstancedialog.h +++ b/gui/newinstancedialog.h @@ -41,6 +41,11 @@ public: void loadVersionList(); + QString instName() const; + QString iconKey() const; + const InstanceTypeInterface *selectedType() const; + const InstVersion *selectedVersion() const; + private slots: void on_btnChangeVersion_clicked(); diff --git a/libutil/include/pathutils.h b/libutil/include/pathutils.h index be6c8917..c04330a9 100644 --- a/libutil/include/pathutils.h +++ b/libutil/include/pathutils.h @@ -25,4 +25,8 @@ LIBUTIL_EXPORT QString PathCombine(QString path1, QString path2, QString path3); LIBUTIL_EXPORT QString AbsolutePath(QString path); +LIBUTIL_EXPORT QString RemoveInvalidFilenameChars(QString string, QChar replaceWith = '-'); + +LIBUTIL_EXPORT QString DirNameFromString(QString string, QString inDir = "."); + #endif // PATHUTILS_H diff --git a/libutil/src/pathutils.cpp b/libutil/src/pathutils.cpp index 8e91bf31..7ba7397c 100644 --- a/libutil/src/pathutils.cpp +++ b/libutil/src/pathutils.cpp @@ -35,3 +35,33 @@ QString AbsolutePath(QString path) { return QFileInfo(path).absolutePath(); } + +QString badFilenameChars = "\"\\/?<>:*|!"; + +QString RemoveInvalidFilenameChars(QString string, QChar replaceWith) +{ + for (int i = 0; i < string.length(); i++) + { + if (badFilenameChars.contains(string[i])) + { + string[i] = replaceWith; + } + } + return string; +} + +QString DirNameFromString(QString string, QString inDir) +{ + int num = 0; + QString dirName = RemoveInvalidFilenameChars(string, '-'); + while (QFileInfo(PathCombine(inDir, dirName)).exists()) + { + num++; + dirName = RemoveInvalidFilenameChars(dirName, '-') + QString::number(num); + + // If it's over 9000 + if (num > 9000) + return ""; + } + return dirName; +} diff --git a/plugins/stdinstance/stdinstancetype.cpp b/plugins/stdinstance/stdinstancetype.cpp index 8ad7fd40..624c1a8d 100644 --- a/plugins/stdinstance/stdinstancetype.cpp +++ b/plugins/stdinstance/stdinstancetype.cpp @@ -35,17 +35,16 @@ InstVersionList *StdInstanceType::versionList() const InstanceLoader::InstTypeError StdInstanceType::createInstance(Instance *&inst, const QString &instDir) const { - QFileInfo rootDir(instDir); + QDir rootDir(instDir); - if (!rootDir.exists() && !QDir().mkdir(rootDir.path())) + qDebug(instDir.toUtf8()); + if (!rootDir.exists() && !rootDir.mkpath(".")) { return InstanceLoader::CantCreateDir; } StdInstance *stdInst = new StdInstance(instDir, this); - // TODO: Verify that the instance is valid. - inst = stdInst; return InstanceLoader::NoError; -- cgit v1.2.3