diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-07-07 18:07:10 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-07-10 20:45:37 -0400 |
| commit | ea7ad772bbd971e398869d9b74b38d62c814bb02 (patch) | |
| tree | c5c1cd6d5de4bb9f62f71b401cecb01480a021ad /src | |
| parent | c38e864c92b7958099d74048fdfc88a5d3b40dcc (diff) | |
moved progress dialog to its own class
Diffstat (limited to 'src')
| -rw-r--r-- | src/nxmaccessmanager.cpp | 111 | ||||
| -rw-r--r-- | src/nxmaccessmanager.h | 22 |
2 files changed, 82 insertions, 51 deletions
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index 5c72d3e2..4d9b2a92 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -41,19 +41,64 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. using namespace MOBase; -namespace { - QString const nexusBaseUrl("https://api.nexusmods.com/v1"); +const QString NexusBaseUrl("https://api.nexusmods.com/v1"); +const std::chrono::seconds ValidationTimeout(10); + + +ValidationProgressDialog::ValidationProgressDialog() + : m_dialogHolder(new QDialog), m_dialog(nullptr), m_bar(nullptr) +{ + m_dialog = m_dialogHolder.get(); + m_bar = new QProgressBar; + + auto* label = new QLabel(tr("Validating Nexus Connection")); + label->setAlignment(Qt::AlignHCenter); + + auto* vbox = new QVBoxLayout(m_dialog); + vbox->addWidget(label); + vbox->addWidget(m_bar); + + auto* buttons = new QDialogButtonBox(QDialogButtonBox::Cancel); + connect(buttons, &QDialogButtonBox::clicked, [&](auto* b){ onButton(b); }); + vbox->addWidget(buttons); +} + +void ValidationProgressDialog::setParentWidget(QWidget* w) +{ + // will be deleted by the parent + m_dialogHolder.release(); + + const auto wasVisible = m_dialog->isVisible(); + + m_dialog->hide(); + m_dialog->setParent(w, m_dialog->windowFlags() | Qt::Dialog); + m_dialog->setModal(false); + m_dialog->setVisible(wasVisible); +} + +void ValidationProgressDialog::show() +{ + m_dialog->show(); +} + +void ValidationProgressDialog::hide() +{ + m_dialog->hide(); +} + +void ValidationProgressDialog::onButton(QAbstractButton* b) +{ } + NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion) : QNetworkAccessManager(parent) - , m_TopLevel(nullptr) , m_ValidateReply(nullptr) - , m_ProgressDialog(nullptr) , m_MOVersion(moVersion) { m_ValidateTimeout.setSingleShot(true); - m_ValidateTimeout.setInterval(30000); + m_ValidateTimeout.setInterval(ValidationTimeout); + connect(&m_ValidateTimeout, SIGNAL(timeout()), this, SLOT(validateTimeout())); setCookieJar(new PersistentCookieJar( QDir::fromNativeSeparators(Settings::instance().getCacheDirectory() + "/nexus_cookies.dat"))); @@ -74,16 +119,7 @@ NXMAccessManager::~NXMAccessManager() void NXMAccessManager::setTopLevelWidget(QWidget* w) { - m_TopLevel = w; - - if (m_ProgressDialog) { - const auto wasVisible = m_ProgressDialog->isVisible(); - - m_ProgressDialog->hide(); - m_ProgressDialog->setParent(w, m_ProgressDialog->windowFlags() | Qt::Dialog); - m_ProgressDialog->setModal(false); - m_ProgressDialog->setVisible(wasVisible); - } + m_ProgressDialog.setParentWidget(w); } QNetworkReply *NXMAccessManager::createRequest( @@ -109,7 +145,7 @@ QNetworkReply *NXMAccessManager::createRequest( void NXMAccessManager::showCookies() const { - QUrl url(nexusBaseUrl + "/"); + QUrl url(NexusBaseUrl + "/"); for (const QNetworkCookie &cookie : cookieJar()->cookiesForUrl(url)) { qDebug("%s - %s (expires: %s)", cookie.name().constData(), cookie.value().constData(), @@ -130,7 +166,7 @@ void NXMAccessManager::clearCookies() void NXMAccessManager::startValidationCheck() { qDebug("Checking Nexus API Key..."); - QString requestString = nexusBaseUrl + "/users/validate"; + QString requestString = NexusBaseUrl + "/users/validate"; QNetworkRequest request(requestString); request.setRawHeader("APIKEY", m_ApiKey.toUtf8()); @@ -140,15 +176,8 @@ void NXMAccessManager::startValidationCheck() request.setRawHeader("Application-Name", "MO2"); request.setRawHeader("Application-Version", m_MOVersion.toUtf8()); - if (!m_ProgressDialog) { - m_ProgressDialog = new QProgressDialog(m_TopLevel); - m_ProgressDialog->setModal(false); - } + m_ProgressDialog.show(); - m_ProgressDialog->setLabelText(tr("Validating Nexus Connection")); - QList<QPushButton*> buttons = m_ProgressDialog->findChildren<QPushButton*>(); - buttons.at(0)->setEnabled(false); - m_ProgressDialog->show(); QCoreApplication::processEvents(); // for some reason the whole app hangs during the login. This way the user has at least a little feedback m_ValidateReply = get(request); @@ -162,23 +191,14 @@ void NXMAccessManager::startValidationCheck() bool NXMAccessManager::validated() const { if (m_ValidateState == VALIDATE_CHECKING) { - if (!m_ProgressDialog) { - m_ProgressDialog = new QProgressDialog(m_TopLevel); - m_ProgressDialog->setModal(false); - } + m_ProgressDialog.show(); - m_ProgressDialog->setLabelText(tr("Validating Nexus Connection")); - QList<QPushButton*> buttons = m_ProgressDialog->findChildren<QPushButton*>(); - buttons.at(0)->setEnabled(false); - m_ProgressDialog->show(); while (m_ValidateState == VALIDATE_CHECKING) { QCoreApplication::processEvents(); QThread::msleep(100); } - m_ProgressDialog->hide(); - m_ProgressDialog->deleteLater(); - m_ProgressDialog = nullptr; + m_ProgressDialog.hide(); } return m_ValidateState == VALIDATE_VALID; @@ -257,11 +277,8 @@ void NXMAccessManager::clearApiKey() void NXMAccessManager::validateTimeout() { m_ValidateTimeout.stop(); - if (m_ProgressDialog != nullptr) { - m_ProgressDialog->hide(); - m_ProgressDialog->deleteLater(); - m_ProgressDialog = nullptr; - } + m_ProgressDialog.hide(); + m_ApiKey.clear(); m_ValidateState = VALIDATE_NOT_VALID; @@ -277,11 +294,8 @@ void NXMAccessManager::validateTimeout() void NXMAccessManager::validateError(QNetworkReply::NetworkError) { m_ValidateTimeout.stop(); - if (m_ProgressDialog != nullptr) { - m_ProgressDialog->hide(); - m_ProgressDialog->deleteLater(); - m_ProgressDialog = nullptr; - } + m_ProgressDialog.hide(); + m_ApiKey.clear(); m_ValidateState = VALIDATE_NOT_VALID; @@ -300,10 +314,7 @@ void NXMAccessManager::validateError(QNetworkReply::NetworkError) void NXMAccessManager::validateFinished() { m_ValidateTimeout.stop(); - if (m_ProgressDialog != nullptr) { - m_ProgressDialog->deleteLater(); - m_ProgressDialog = nullptr; - } + m_ProgressDialog.hide(); if (m_ValidateReply != nullptr) { QJsonDocument jdoc = QJsonDocument::fromJson(m_ValidateReply->readAll()); diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h index 16dde612..89438316 100644 --- a/src/nxmaccessmanager.h +++ b/src/nxmaccessmanager.h @@ -29,6 +29,26 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. namespace MOBase { class IPluginGame; } +class ValidationProgressDialog : QObject +{ + Q_OBJECT; + +public: + ValidationProgressDialog(); + + void setParentWidget(QWidget* w); + void show(); + void hide(); + +private: + std::unique_ptr<QDialog> m_dialogHolder; + QDialog* m_dialog; + QProgressBar* m_bar; + + void onButton(QAbstractButton* b); +}; + + /** * @brief access manager extended to handle nxm links **/ @@ -99,7 +119,7 @@ private: QWidget* m_TopLevel; QTimer m_ValidateTimeout; QNetworkReply *m_ValidateReply; - mutable QProgressDialog* m_ProgressDialog; + mutable ValidationProgressDialog m_ProgressDialog; QString m_MOVersion; |
