diff options
author | timoreo22 <timo.oreo34@gmail.com> | 2022-02-26 07:33:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-26 07:33:11 +0100 |
commit | ae354688c96927e95db8c06c53ada0b5d7e77f26 (patch) | |
tree | 5d864de33438ce4d82af03928b3d632f055a0490 /launcher/ui/dialogs | |
parent | 27f37315f84536d75d95bc1879e8a4513fcfc831 (diff) | |
parent | c4f4e9e620ee4a7094542190bc18cc167d00a7ff (diff) | |
download | PrismLauncher-ae354688c96927e95db8c06c53ada0b5d7e77f26.tar.gz PrismLauncher-ae354688c96927e95db8c06c53ada0b5d7e77f26.tar.bz2 PrismLauncher-ae354688c96927e95db8c06c53ada0b5d7e77f26.zip |
Merge pull request #193 from flowln/develop
Allow for downloading multiple mods at once
Diffstat (limited to 'launcher/ui/dialogs')
-rw-r--r-- | launcher/ui/dialogs/ModDownloadDialog.cpp | 64 | ||||
-rw-r--r-- | launcher/ui/dialogs/ModDownloadDialog.h | 9 |
2 files changed, 64 insertions, 9 deletions
diff --git a/launcher/ui/dialogs/ModDownloadDialog.cpp b/launcher/ui/dialogs/ModDownloadDialog.cpp index 6b807b8c..23ca8731 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.cpp +++ b/launcher/ui/dialogs/ModDownloadDialog.cpp @@ -5,6 +5,7 @@ #include <InstanceList.h> #include "ProgressDialog.h" +#include "CustomMessageBox.h" #include <QLayout> #include <QPushButton> @@ -39,9 +40,10 @@ ModDownloadDialog::ModDownloadDialog(const std::shared_ptr<ModFolderModel> &mods // Bonk Qt over its stupid head and make sure it understands which button is the default one... // See: https://stackoverflow.com/questions/24556831/qbuttonbox-set-default-button auto OkButton = m_buttons->button(QDialogButtonBox::Ok); + OkButton->setEnabled(false); OkButton->setDefault(true); OkButton->setAutoDefault(true); - connect(OkButton, &QPushButton::clicked, this, &ModDownloadDialog::accept); + connect(OkButton, &QPushButton::clicked, this, &ModDownloadDialog::confirm); auto CancelButton = m_buttons->button(QDialogButtonBox::Cancel); CancelButton->setDefault(false); @@ -52,6 +54,7 @@ ModDownloadDialog::ModDownloadDialog(const std::shared_ptr<ModFolderModel> &mods HelpButton->setDefault(false); HelpButton->setAutoDefault(false); connect(HelpButton, &QPushButton::clicked, m_container, &PageContainer::help); + QMetaObject::connectSlotsByName(this); setWindowModality(Qt::WindowModal); setWindowTitle("Download mods"); @@ -67,6 +70,36 @@ void ModDownloadDialog::reject() QDialog::reject(); } +void ModDownloadDialog::confirm() +{ + auto keys = modTask.keys(); + keys.sort(Qt::CaseInsensitive); + + auto info = QString(tr("You're about to download the following mods:")); + info.append("\n\n"); + for(auto task : keys){ + info.append(task); + info.append("\n --> "); + info.append(tr("File name: ")); + info.append(modTask.find(task).value()->getFilename()); + info.append('\n'); + } + + auto confirm_dialog = CustomMessageBox::selectable( + this, + tr("Confirm mods to download"), + info, + QMessageBox::NoIcon, + QMessageBox::Cancel | QMessageBox::Ok, + QMessageBox::Ok + ); + + auto AcceptButton = confirm_dialog->button(QMessageBox::Ok); + connect(AcceptButton, &QPushButton::clicked, this, &ModDownloadDialog::accept); + + confirm_dialog->open(); +} + void ModDownloadDialog::accept() { QDialog::accept(); @@ -83,16 +116,35 @@ QList<BasePage *> ModDownloadDialog::getPages() }; } -void ModDownloadDialog::setSuggestedMod(const QString& name, ModDownloadTask* task) +void ModDownloadDialog::addSelectedMod(const QString& name, ModDownloadTask* task) +{ + removeSelectedMod(name); + modTask.insert(name, task); + + m_buttons->button(QDialogButtonBox::Ok)->setEnabled(!modTask.isEmpty()); +} + +void ModDownloadDialog::removeSelectedMod(const QString &name) +{ + if(modTask.contains(name)) + delete modTask.find(name).value(); + modTask.remove(name); + + m_buttons->button(QDialogButtonBox::Ok)->setEnabled(!modTask.isEmpty()); +} + +bool ModDownloadDialog::isModSelected(const QString &name, const QString& filename) const { - modTask.reset(task); - m_buttons->button(QDialogButtonBox::Ok)->setEnabled(task); + // FIXME: Is there a way to check for versions without checking the filename + // as a heuristic, other than adding such info to ModDownloadTask itself? + auto iter = modTask.find(name); + return iter != modTask.end() && (iter.value()->getFilename() == filename); } ModDownloadDialog::~ModDownloadDialog() { } -ModDownloadTask *ModDownloadDialog::getTask() { - return modTask.release(); +const QList<ModDownloadTask*> ModDownloadDialog::getTasks() { + return modTask.values(); } diff --git a/launcher/ui/dialogs/ModDownloadDialog.h b/launcher/ui/dialogs/ModDownloadDialog.h index ece8e328..309d89d0 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.h +++ b/launcher/ui/dialogs/ModDownloadDialog.h @@ -29,12 +29,15 @@ public: QString dialogTitle() override; QList<BasePage *> getPages() override; - void setSuggestedMod(const QString & name = QString(), ModDownloadTask * task = nullptr); + void addSelectedMod(const QString & name = QString(), ModDownloadTask * task = nullptr); + void removeSelectedMod(const QString & name = QString()); + bool isModSelected(const QString & name, const QString & filename) const; - ModDownloadTask * getTask(); + const QList<ModDownloadTask*> getTasks(); const std::shared_ptr<ModFolderModel> &mods; public slots: + void confirm(); void accept() override; void reject() override; @@ -49,6 +52,6 @@ private: ModrinthPage *modrinthPage = nullptr; FlameModPage *flameModPage = nullptr; - std::unique_ptr<ModDownloadTask> modTask; + QHash<QString, ModDownloadTask*> modTask; BaseInstance *m_instance; }; |