summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gui/mainwindow.cpp45
-rw-r--r--gui/newinstancedialog.cpp23
-rw-r--r--gui/newinstancedialog.h5
-rw-r--r--libutil/include/pathutils.h4
-rw-r--r--libutil/src/pathutils.cpp30
-rw-r--r--plugins/stdinstance/stdinstancetype.cpp7
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;