From ff3078b3a652316eef760386f665d152cbeb8db9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 22 Apr 2013 15:39:41 -0500 Subject: [PATCH] Make the new instance dialog support instance types. --- gui/newinstancedialog.cpp | 99 ++++++++++++++++++++++ gui/newinstancedialog.h | 19 +++++ gui/newinstancedialog.ui | 21 +++++ gui/versionselectdialog.cpp | 10 +++ gui/versionselectdialog.h | 3 + libmultimc/include/instversionlist.h | 12 +++ libmultimc/src/instversionlist.cpp | 11 +++ plugins/stdinstance/stdinstversionlist.cpp | 2 + 8 files changed, 177 insertions(+) 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 +#include 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 +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 @@ -75,6 +75,27 @@ + + + + + + Type: + + + + + + + + 0 + 0 + + + + + + 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 #include +#include #include 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(); + + 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 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())