From ff3078b3a652316eef760386f665d152cbeb8db9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 22 Apr 2013 15:39:41 -0500 Subject: 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 ++ 5 files changed, 152 insertions(+) (limited to 'gui') 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(); -- cgit v1.2.3