From d9003f9e5407396fdd552c5df3d0be76ab9a16a3 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Sun, 7 Jul 2019 19:00:34 -0400
Subject: made ValidationProgressDialog a QDialog to handle close events allow
hiding dialog and make it appear again if needed don't use an event loop in
validated(), it causes all sorts of problems because it can be reentrant if
another logged in action is done while the dialog is visible
---
src/nxmaccessmanager.cpp | 58 +++++++++++++++++++++++++-----------------------
src/nxmaccessmanager.h | 12 +++++++---
2 files changed, 39 insertions(+), 31 deletions(-)
(limited to 'src')
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index d6f6290e..a68dea54 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -46,63 +46,72 @@ const QString NexusBaseUrl("https://api.nexusmods.com/v1");
const auto ValidationTimeout = 10s;
-ValidationProgressDialog::ValidationProgressDialog(std::chrono::seconds t)
- : m_timeout(t), m_dialog(nullptr), m_bar(nullptr), m_timer(nullptr)
+ValidationProgressDialog::ValidationProgressDialog(std::chrono::seconds t) :
+ m_timeout(t), m_bar(nullptr), m_buttons(nullptr),
+ m_timer(nullptr)
{
- m_dialogHolder.reset(new QDialog);
- m_dialog = m_dialogHolder.get();
-
m_bar = new QProgressBar;
m_bar->setTextVisible(false);
auto* label = new QLabel(tr("Validating Nexus Connection"));
label->setAlignment(Qt::AlignHCenter);
- auto* vbox = new QVBoxLayout(m_dialog);
+ auto* vbox = new QVBoxLayout(this);
vbox->addWidget(label);
vbox->addWidget(m_bar);
- auto* buttons = new QDialogButtonBox(QDialogButtonBox::Cancel);
- connect(buttons, &QDialogButtonBox::clicked, [&](auto* b){ onButton(b); });
- vbox->addWidget(buttons);
+ m_buttons = new QDialogButtonBox;
+ m_buttons->addButton(tr("Hide"), QDialogButtonBox::RejectRole);
+ connect(m_buttons, &QDialogButtonBox::clicked, [&](auto* b){ onButton(b); });
+ vbox->addWidget(m_buttons);
}
void ValidationProgressDialog::setParentWidget(QWidget* w)
{
- // will be deleted by the parent
- m_dialogHolder.release();
-
- const auto wasVisible = m_dialog->isVisible();
+ const auto wasVisible = isVisible();
- m_dialog->hide();
- m_dialog->setParent(w, m_dialog->windowFlags() | Qt::Dialog);
- m_dialog->setModal(false);
- m_dialog->setVisible(wasVisible);
+ hide();
+ setParent(w, windowFlags() | Qt::Dialog);
+ setModal(false);
+ setVisible(wasVisible);
}
void ValidationProgressDialog::start()
{
if (!m_timer) {
- m_timer = new QTimer(m_dialog);
+ m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, [&]{ onTimer(); });
m_timer->setInterval(100ms);
}
m_bar->setRange(0, m_timeout.count());
+ m_bar->setValue(0);
+
m_elapsed.start();
m_timer->start();
- m_dialog->show();
+ show();
}
void ValidationProgressDialog::stop()
{
m_timer->stop();
- m_dialog->hide();
+ hide();
+}
+
+void ValidationProgressDialog::closeEvent(QCloseEvent* e)
+{
+ hide();
+ e->ignore();
}
void ValidationProgressDialog::onButton(QAbstractButton* b)
{
+ if (m_buttons->buttonRole(b) == QDialogButtonBox::RejectRole) {
+ hide();
+ } else {
+ qCritical() << "validation dialog: unknown button pressed";
+ }
}
void ValidationProgressDialog::onTimer()
@@ -212,14 +221,7 @@ void NXMAccessManager::startValidationCheck()
bool NXMAccessManager::validated() const
{
if (m_ValidateState == VALIDATE_CHECKING) {
- m_ProgressDialog.start();
-
- while (m_ValidateState == VALIDATE_CHECKING) {
- QCoreApplication::processEvents();
- QThread::msleep(100);
- }
-
- m_ProgressDialog.stop();
+ m_ProgressDialog.show();
}
return m_ValidateState == VALIDATE_VALID;
diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h
index b20cb6e8..4467ea8d 100644
--- a/src/nxmaccessmanager.h
+++ b/src/nxmaccessmanager.h
@@ -26,11 +26,12 @@ along with Mod Organizer. If not, see .
#include
#include
#include
+#include
#include
namespace MOBase { class IPluginGame; }
-class ValidationProgressDialog : QObject
+class ValidationProgressDialog : private QDialog
{
Q_OBJECT;
@@ -38,14 +39,19 @@ public:
ValidationProgressDialog(std::chrono::seconds timeout);
void setParentWidget(QWidget* w);
+
void start();
void stop();
+ using QDialog::show;
+
+protected:
+ void closeEvent(QCloseEvent* e) override;
+
private:
std::chrono::seconds m_timeout;
- std::unique_ptr m_dialogHolder;
- QDialog* m_dialog;
QProgressBar* m_bar;
+ QDialogButtonBox* m_buttons;
QTimer* m_timer;
QElapsedTimer m_elapsed;
--
cgit v1.3.1