summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gui/newinstancedialog.cpp99
-rw-r--r--gui/newinstancedialog.h19
-rw-r--r--gui/newinstancedialog.ui21
-rw-r--r--gui/versionselectdialog.cpp10
-rw-r--r--gui/versionselectdialog.h3
-rw-r--r--libmultimc/include/instversionlist.h12
-rw-r--r--libmultimc/src/instversionlist.cpp11
-rw-r--r--plugins/stdinstance/stdinstversionlist.cpp2
8 files changed, 177 insertions, 0 deletions
diff --git a/gui/newinstancedialog.cpp b/gui/newinstancedialog.cpp
index 400b42d8..f4d57367 100644
--- a/gui/newinstancedialog.cpp
+++ b/gui/newinstancedialog.cpp
@@ -16,18 +16,117 @@
#include "newinstancedialog.h"
#include "ui_newinstancedialog.h"
+#include "instanceloader.h"
+#include "instancetypeinterface.h"
+
+#include "instversionlist.h"
+#include "instversion.h"
+
+#include "task.h"
+
+#include "versionselectdialog.h"
+#include "taskdialog.h"
+
#include <QLayout>
+#include <QPushButton>
NewInstanceDialog::NewInstanceDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::NewInstanceDialog)
{
+ m_selectedType = NULL;
+ m_selectedVersion = NULL;
+
ui->setupUi(this);
resize(minimumSizeHint());
layout()->setSizeConstraint(QLayout::SetFixedSize);
+
+ loadTypeList();
}
NewInstanceDialog::~NewInstanceDialog()
{
delete ui;
}
+
+void NewInstanceDialog::loadTypeList()
+{
+ InstTypeList typeList = InstanceLoader::get().typeList();
+
+ for (int i = 0; i < typeList.length(); i++)
+ {
+ ui->instTypeComboBox->addItem(typeList.at(i)->displayName(), typeList.at(i)->typeID());
+ }
+
+ updateSelectedType();
+}
+
+void NewInstanceDialog::updateSelectedType()
+{
+ QString typeID = ui->instTypeComboBox->itemData(ui->instTypeComboBox->currentIndex()).toString();
+
+ const InstanceTypeInterface *type = InstanceLoader::get().findType(typeID);
+ m_selectedType = type;
+
+ updateDialogState();
+
+ if (m_selectedType)
+ {
+ if (!m_selectedType->versionList()->isLoaded())
+ loadVersionList();
+ }
+}
+
+void NewInstanceDialog::updateDialogState()
+{
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(m_selectedType && m_selectedVersion);
+ ui->btnChangeVersion->setEnabled(m_selectedType && m_selectedVersion);
+}
+
+void NewInstanceDialog::setSelectedVersion(const InstVersion *version)
+{
+ m_selectedVersion = version;
+
+ if (m_selectedVersion)
+ {
+ ui->versionTextBox->setText(version->name());
+ }
+ else
+ {
+ ui->versionTextBox->setText("");
+ }
+
+ updateDialogState();
+}
+
+void NewInstanceDialog::loadVersionList()
+{
+ if (!m_selectedType)
+ return;
+
+ TaskDialog *taskDlg = new TaskDialog(this);
+ Task *loadTask = m_selectedType->versionList()->getLoadTask();
+ loadTask->setParent(taskDlg);
+ taskDlg->exec(loadTask);
+
+ setSelectedVersion(m_selectedType->versionList()->getLatestStable());
+}
+
+void NewInstanceDialog::on_btnChangeVersion_clicked()
+{
+ if (m_selectedType)
+ {
+ VersionSelectDialog *vselect = new VersionSelectDialog(m_selectedType->versionList(), this);
+ if (vselect->exec())
+ {
+ const InstVersion *version = vselect->selectedVersion();
+ if (version)
+ setSelectedVersion(version);
+ }
+ }
+}
+
+void NewInstanceDialog::on_instTypeComboBox_activated(int index)
+{
+ updateSelectedType();
+}
diff --git a/gui/newinstancedialog.h b/gui/newinstancedialog.h
index 263136f1..da689c41 100644
--- a/gui/newinstancedialog.h
+++ b/gui/newinstancedialog.h
@@ -18,6 +18,9 @@
#include <QDialog>
+class InstanceTypeInterface;
+class InstVersion;
+
namespace Ui {
class NewInstanceDialog;
}
@@ -30,8 +33,24 @@ public:
explicit NewInstanceDialog(QWidget *parent = 0);
~NewInstanceDialog();
+ void loadTypeList();
+ void updateSelectedType();
+ void updateDialogState();
+
+ void setSelectedVersion(const InstVersion *version);
+
+ void loadVersionList();
+
+private slots:
+ void on_btnChangeVersion_clicked();
+
+ void on_instTypeComboBox_activated(int index);
+
private:
Ui::NewInstanceDialog *ui;
+
+ const InstVersion *m_selectedVersion;
+ const InstanceTypeInterface *m_selectedType;
};
#endif // NEWINSTANCEDIALOG_H
diff --git a/gui/newinstancedialog.ui b/gui/newinstancedialog.ui
index 865f6301..6f96f167 100644
--- a/gui/newinstancedialog.ui
+++ b/gui/newinstancedialog.ui
@@ -76,6 +76,27 @@
</widget>
</item>
<item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="typeLabel">
+ <property name="text">
+ <string>Type:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="instTypeComboBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
diff --git a/gui/versionselectdialog.cpp b/gui/versionselectdialog.cpp
index b55c106c..6ead83c0 100644
--- a/gui/versionselectdialog.cpp
+++ b/gui/versionselectdialog.cpp
@@ -21,6 +21,7 @@
#include <gui/taskdialog.h>
#include <instversionlist.h>
+#include <instversion.h>
#include <task.h>
VersionSelectDialog::VersionSelectDialog(InstVersionList *vlist, QWidget *parent) :
@@ -56,6 +57,15 @@ void VersionSelectDialog::loadList()
taskDlg->exec(loadTask);
}
+const InstVersion *VersionSelectDialog::selectedVersion() const
+{
+ const InstVersion *versionPtr = (const InstVersion *)
+ m_vlist->data(ui->listView->selectionModel()->currentIndex(),
+ InstVersionList::VersionPointerRole).value<void *>();
+
+ return versionPtr;
+}
+
void VersionSelectDialog::on_refreshButton_clicked()
{
loadList();
diff --git a/gui/versionselectdialog.h b/gui/versionselectdialog.h
index ad28b720..097be93f 100644
--- a/gui/versionselectdialog.h
+++ b/gui/versionselectdialog.h
@@ -19,6 +19,7 @@
#include <QDialog>
class InstVersionList;
+class InstVersion;
namespace Ui
{
@@ -38,6 +39,8 @@ public:
//! Starts a task that loads the list.
void loadList();
+ const InstVersion *selectedVersion() const;
+
private slots:
void on_refreshButton_clicked();
diff --git a/libmultimc/include/instversionlist.h b/libmultimc/include/instversionlist.h
index 24dd1a28..b5a9f254 100644
--- a/libmultimc/include/instversionlist.h
+++ b/libmultimc/include/instversionlist.h
@@ -41,6 +41,11 @@ class LIBMULTIMC_EXPORT InstVersionList : public QAbstractListModel
{
Q_OBJECT
public:
+ enum ModelRoles
+ {
+ VersionPointerRole = 0x34B1CB48
+ };
+
explicit InstVersionList(QObject *parent = 0);
/*!
@@ -75,6 +80,13 @@ public:
* one doesn't exist.
*/
virtual const InstVersion *findVersion(const QString &descriptor);
+
+ /*!
+ * \brief Gets the latest stable version of this instance type.
+ * This is the version that will be selected by default.
+ * By default, this is simply the first version in the list.
+ */
+ virtual const InstVersion *getLatestStable();
};
#endif // INSTVERSIONLIST_H
diff --git a/libmultimc/src/instversionlist.cpp b/libmultimc/src/instversionlist.cpp
index 6c7b44bb..85734e48 100644
--- a/libmultimc/src/instversionlist.cpp
+++ b/libmultimc/src/instversionlist.cpp
@@ -31,6 +31,14 @@ const InstVersion *InstVersionList::findVersion(const QString &descriptor)
return NULL;
}
+const InstVersion *InstVersionList::getLatestStable()
+{
+ if (count() <= 0)
+ return NULL;
+ else
+ return at(0);
+}
+
// Column Enum
enum VListColumns
{
@@ -73,6 +81,9 @@ QVariant InstVersionList::data(const QModelIndex &index, int role) const
case Qt::ToolTipRole:
return version->descriptor();
+ case VersionPointerRole:
+ return qVariantFromValue((void *) version);
+
default:
return QVariant();
}
diff --git a/plugins/stdinstance/stdinstversionlist.cpp b/plugins/stdinstance/stdinstversionlist.cpp
index b271fa65..214edbe7 100644
--- a/plugins/stdinstance/stdinstversionlist.cpp
+++ b/plugins/stdinstance/stdinstversionlist.cpp
@@ -162,6 +162,8 @@ void StdInstVListLoadTask::finalize()
m_list->m_vlist.swap(tempList);
m_list->endResetModel();
+ m_list->loaded = true;
+
// We called swap, so all the data that was in the version list previously is now in
// tempList (and vice-versa). Now we just free the memory.
while (!tempList.isEmpty())