diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-10-05 10:11:55 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-10-05 10:11:55 -0400 |
| commit | 3fe54c8431b9c1e792a235b9b370267447c3210c (patch) | |
| tree | 15949037523cda7304888278955b5fdf7ba9e06a /src | |
| parent | 73556ad0845ee6dea2ec9f1fa50903de0448fa91 (diff) | |
now using ui file for validation progress dialog
moved elapsed timer to NexusKeyValidator, progress dialog now just shows what the validator is doing, which allows for hiding and showing it at any time
recreate the dialog when the parent changes, avoids theme errors
Diffstat (limited to 'src')
| -rw-r--r-- | src/nxmaccessmanager.cpp | 92 | ||||
| -rw-r--r-- | src/nxmaccessmanager.h | 65 | ||||
| -rw-r--r-- | src/validationprogressdialog.ui | 117 |
3 files changed, 204 insertions, 70 deletions
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index 3cc1b7d9..731feafb 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -18,6 +18,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. */ #include "nxmaccessmanager.h" +#include "ui_validationprogressdialog.h" #include "iplugingame.h" #include "nexusinterface.h" #include "nxmurl.h" @@ -48,24 +49,14 @@ const QString NexusSSO("wss://sso.nexusmods.com"); const QString NexusSSOPage("https://www.nexusmods.com/sso?id=%1&application=modorganizer2"); -ValidationProgressDialog::ValidationProgressDialog(std::chrono::seconds t) : - m_timeout(t), m_bar(nullptr), m_buttons(nullptr), m_timer(nullptr), - m_first(true) +ValidationProgressDialog::ValidationProgressDialog(const NexusKeyValidator& v) + : m_validator(v), m_updateTimer(nullptr), m_first(true) { - m_bar = new QProgressBar; - m_bar->setTextVisible(false); + ui.reset(new Ui::ValidationProgressDialog); + ui->setupUi(this); - auto* label = new QLabel(tr("Validating Nexus Connection")); - label->setAlignment(Qt::AlignHCenter); - - auto* vbox = new QVBoxLayout(this); - vbox->addWidget(label); - vbox->addWidget(m_bar); - - m_buttons = new QDialogButtonBox; - m_buttons->addButton(tr("Hide"), QDialogButtonBox::RejectRole); - connect(m_buttons, &QDialogButtonBox::clicked, [&](auto* b){ onButton(b); }); - vbox->addWidget(m_buttons); + connect(ui->hide, &QPushButton::clicked, [&]{ onHide(); }); + connect(ui->cancel, &QPushButton::clicked, [&]{ onCancel(); }); } void ValidationProgressDialog::setParentWidget(QWidget* w) @@ -75,30 +66,32 @@ void ValidationProgressDialog::setParentWidget(QWidget* w) hide(); setParent(w, windowFlags() | Qt::Dialog); setModal(false); - setVisible(wasVisible); + + if (w && wasVisible) { + setVisible(true); + } } void ValidationProgressDialog::start() { - if (!m_timer) { - m_timer = new QTimer(this); - connect(m_timer, &QTimer::timeout, [&]{ onTimer(); }); - m_timer->setInterval(100ms); + if (!m_updateTimer) { + m_updateTimer = new QTimer(this); + connect(m_updateTimer, &QTimer::timeout, [&]{ onTimer(); }); + m_updateTimer->setInterval(100ms); } - m_bar->setRange(0, m_timeout.count()); - m_bar->setValue(0); + ui->progress->setRange(0, m_validator.timeout().count()); + ui->progress->setValue(0); - m_elapsed.start(); - m_timer->start(); + m_updateTimer->start(); show(); } void ValidationProgressDialog::stop() { - if (m_timer) { - m_timer->stop(); + if (m_updateTimer) { + m_updateTimer->stop(); } hide(); @@ -118,18 +111,18 @@ void ValidationProgressDialog::closeEvent(QCloseEvent* e) e->ignore(); } -void ValidationProgressDialog::onButton(QAbstractButton* b) +void ValidationProgressDialog::onHide() +{ + hide(); +} + +void ValidationProgressDialog::onCancel() { - if (m_buttons->buttonRole(b) == QDialogButtonBox::RejectRole) { - hide(); - } else { - qCritical() << "validation dialog: unknown button pressed"; - } } void ValidationProgressDialog::onTimer() { - m_bar->setValue(m_elapsed.elapsed() / 1000); + ui->progress->setValue(m_validator.elapsed().elapsed() / 1000); } @@ -395,6 +388,7 @@ void NexusKeyValidator::start(const QString& key) m_active = true; setState(Connecting); + m_elapsed.start(); const QString requestUrl(NexusBaseUrl + "/users/validate"); QNetworkRequest request(requestUrl); @@ -437,6 +431,16 @@ bool NexusKeyValidator::isActive() const return m_active; } +QElapsedTimer NexusKeyValidator::elapsed() const +{ + return m_elapsed; +} + +std::chrono::seconds NexusKeyValidator::timeout() const +{ + return NXMAccessManager::ValidationTimeout; +} + void NexusKeyValidator::close() { m_active = false; @@ -563,11 +567,12 @@ void NexusKeyValidator::handleError( NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion) : QNetworkAccessManager(parent) - , m_ProgressDialog(new ValidationProgressDialog(ValidationTimeout)) , m_MOVersion(moVersion) , m_validator(*this) , m_validationState(NotChecked) { + m_ProgressDialog.reset(new ValidationProgressDialog(m_validator)); + m_validator.stateChanged = [&](auto&& s, auto&& e){ onValidatorState(s, e); }; m_validator.finished = [&](auto&& user){ onValidatorFinished(user); }; @@ -582,7 +587,13 @@ NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion) void NXMAccessManager::setTopLevelWidget(QWidget* w) { - m_ProgressDialog->setParentWidget(w); + if (w) { + m_ProgressDialog->setParentWidget(w); + } else { + const auto v = m_ProgressDialog->isVisible(); + m_ProgressDialog.reset(new ValidationProgressDialog(m_validator)); + m_validator.cancel(); + } } QNetworkReply *NXMAccessManager::createRequest( @@ -641,8 +652,13 @@ void NXMAccessManager::onValidatorState( } m_ProgressDialog->stop(); - m_validationState = Invalid; - emit validateFailed(NexusKeyValidator::stateToString(s, e)); + + if (s == NexusKeyValidator::Cancelled) { + m_validationState = NotChecked; + } else { + m_validationState = Invalid; + emit validateFailed(NexusKeyValidator::stateToString(s, e)); + } } void NXMAccessManager::onValidatorFinished(const APIUserAccount& user) diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h index 0c85153b..2a4c066c 100644 --- a/src/nxmaccessmanager.h +++ b/src/nxmaccessmanager.h @@ -31,39 +31,9 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <set> namespace MOBase { class IPluginGame; } +namespace Ui { class ValidationProgressDialog; } class NXMAccessManager; -class ValidationProgressDialog : private QDialog -{ - Q_OBJECT; - -public: - ValidationProgressDialog(std::chrono::seconds timeout); - - void setParentWidget(QWidget* w); - - void start(); - void stop(); - - using QDialog::show; - -protected: - void showEvent(QShowEvent* e) override; - void closeEvent(QCloseEvent* e) override; - -private: - std::chrono::seconds m_timeout; - QProgressBar* m_bar; - QDialogButtonBox* m_buttons; - QTimer* m_timer; - QElapsedTimer m_elapsed; - bool m_first; - - void onButton(QAbstractButton* b); - void onTimer(); -}; - - class NexusSSOLogin { public: @@ -138,12 +108,15 @@ public: void cancel(); bool isActive() const; + QElapsedTimer elapsed() const; + std::chrono::seconds timeout() const; private: NXMAccessManager& m_manager; QNetworkReply* m_reply; QTimer m_timeout; bool m_active; + QElapsedTimer m_elapsed; void setState(States s, const QString& error={}); @@ -159,6 +132,34 @@ private: }; +class ValidationProgressDialog : public QDialog +{ + Q_OBJECT; + +public: + ValidationProgressDialog(const NexusKeyValidator& v); + + void setParentWidget(QWidget* w); + + void start(); + void stop(); + +protected: + void showEvent(QShowEvent* e) override; + void closeEvent(QCloseEvent* e) override; + +private: + std::unique_ptr<Ui::ValidationProgressDialog> ui; + const NexusKeyValidator& m_validator; + QTimer* m_updateTimer; + bool m_first; + + void onHide(); + void onCancel(); + void onTimer(); +}; + + /** * @brief access manager extended to handle nxm links **/ @@ -224,7 +225,7 @@ private: }; QWidget* m_TopLevel; - mutable ValidationProgressDialog* m_ProgressDialog; + mutable std::unique_ptr<ValidationProgressDialog> m_ProgressDialog; QString m_MOVersion; NexusKeyValidator m_validator; States m_validationState; diff --git a/src/validationprogressdialog.ui b/src/validationprogressdialog.ui new file mode 100644 index 00000000..1c0cbcb8 --- /dev/null +++ b/src/validationprogressdialog.ui @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ValidationProgressDialog</class> + <widget class="QDialog" name="ValidationProgressDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>305</width> + <height>93</height> + </rect> + </property> + <property name="windowTitle"> + <string>Validating Nexus Connection</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QWidget" name="widget" native="true"> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Connecting to Nexus...</string> + </property> + </widget> + </item> + <item> + <widget class="QProgressBar" name="progress"> + <property name="value"> + <number>24</number> + </property> + <property name="textVisible"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QWidget" name="widget_2" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QPushButton" name="cancel"> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>122</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="hide"> + <property name="text"> + <string>Hide</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> |
