From 5e5681709ab878f3aa6cf1344af44e8ae9544987 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Thu, 11 Jul 2019 01:55:31 -0400
Subject: reworked the nexus connection panel moved most of the stuff into a
new NexusSSOLogin class
---
src/settingsdialog.cpp | 321 ++++++++++++++++++++++++++++++++++++-------------
1 file changed, 237 insertions(+), 84 deletions(-)
(limited to 'src/settingsdialog.cpp')
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 95e4ceb0..d1ace6a5 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -49,6 +49,8 @@ along with Mod Organizer. If not, see .
using namespace MOBase;
+const QString NexusSSO("wss://sso.nexusmods.com");
+const QString NexusSSOPage("https://www.nexusmods.com/sso?id=%1&application=modorganizer2");
class NexusManualKeyDialog : public QDialog
{
@@ -98,35 +100,177 @@ private:
};
+
+NexusSSOLogin::NexusSSOLogin()
+ : m_keyReceived(false), m_active(false)
+{
+ QObject::connect(
+ &m_socket, &QWebSocket::connected,
+ [&]{ onConnected(); });
+
+ QObject::connect(
+ &m_socket, qOverload(&QWebSocket::error),
+ [&](auto&& e){ onError(e); });
+
+ QObject::connect(
+ &m_socket, &QWebSocket::textMessageReceived,
+ [&](auto&& s){ onMessage(s); });
+
+ QObject::connect(
+ &m_socket, &QWebSocket::disconnected,
+ [&]{ onDisconnected(); });
+
+ QObject::connect(&m_timeout, &QTimer::timeout, [&]{ onTimeout(); });
+}
+
+void NexusSSOLogin::start()
+{
+ m_active = true;
+ setState(ConnectingToSSO);
+ m_timeout.start(NXMAccessManager::ValidationTimeout);
+ m_socket.open(NexusSSO);
+}
+
+void NexusSSOLogin::cancel()
+{
+ abort();
+ setState(Cancelled);
+}
+
+void NexusSSOLogin::close()
+{
+ m_active = false;
+ m_timeout.stop();
+ m_socket.close();
+}
+
+void NexusSSOLogin::abort()
+{
+ m_active = false;
+ m_timeout.stop();
+ m_socket.abort();
+}
+
+bool NexusSSOLogin::isActive() const
+{
+ return m_active;
+}
+
+void NexusSSOLogin::setState(States s, const QString& error)
+{
+ if (stateChanged) {
+ stateChanged(s, error);
+ }
+}
+
+void NexusSSOLogin::onConnected()
+{
+ setState(WaitingForToken);
+
+ m_keyReceived = false;
+
+ //if (m_guid.isEmpty()) {
+ boost::uuids::random_generator generator;
+ boost::uuids::uuid sessionId = generator();
+ m_guid = boost::uuids::to_string(sessionId).c_str();
+ //}
+
+ QJsonObject data;
+ data.insert(QString("id"), QJsonValue(m_guid));
+ //data.insert(QString("token"), QJsonValue(m_token));
+ data.insert(QString("protocol"), 2);
+
+ const QString message = QJsonDocument(data).toJson();
+ m_socket.sendTextMessage(message);
+}
+
+void NexusSSOLogin::onMessage(const QString& s)
+{
+ const QJsonDocument doc = QJsonDocument::fromJson(s.toUtf8());
+ const QVariantMap root = doc.object().toVariantMap();
+
+ if (!root["success"].toBool()) {
+ close();
+
+ setState(Error, QString("There was a problem with SSO initialization: %1")
+ .arg(root["error"].toString()));
+
+ return;
+ }
+
+ const QVariantMap data = root["data"].toMap();
+
+ if (data.contains("connection_token")) {
+ // first answer
+ m_token = data["connection_token"].toString();
+
+ // open browser
+ const auto url = NexusSSOPage.arg(m_guid);
+ shell::OpenLink(url);
+
+ m_timeout.stop();
+ setState(WaitingForBrowser);
+ } else {
+ // second answer
+ const auto key = data["api_key"].toString();
+ close();
+
+ if (keyChanged) {
+ keyChanged(key);
+ }
+
+ setState(Finished);
+ }
+}
+
+void NexusSSOLogin::onDisconnected()
+{
+ if (m_active) {
+ m_active = false;
+
+ if (!m_keyReceived) {
+ setState(ClosedByRemote);
+ }
+ }
+}
+
+void NexusSSOLogin::onError(QAbstractSocket::SocketError e)
+{
+ if (m_active) {
+ setState(Error, m_socket.errorString());
+ }
+}
+
+void NexusSSOLogin::onTimeout()
+{
+ abort();
+ setState(Timeout);
+}
+
+
SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* settings, QWidget *parent)
: TutorableDialog("SettingsDialog", parent)
, ui(new Ui::SettingsDialog)
, m_settings(settings)
, m_PluginContainer(pluginContainer)
- , m_nexusLogin(new QWebSocket)
- , m_KeyReceived(false)
- , m_KeyCleared(false)
+ , m_keyChanged(false)
, m_GeometriesReset(false)
{
+ m_nexusLogin.keyChanged = [&](auto&& s){ onKeyChanged(s); };
+ m_nexusLogin.stateChanged = [&](auto&& s, auto&& e){ onStateChanged(s, e); };
+
ui->setupUi(this);
ui->pluginSettingsList->setStyleSheet("QTreeWidget::item {padding-right: 10px;}");
QShortcut *delShortcut
= new QShortcut(QKeySequence(Qt::Key_Delete), ui->pluginBlacklist);
connect(delShortcut, SIGNAL(activated()), this, SLOT(deleteBlacklistItem()));
- connect(m_nexusLogin, SIGNAL(connected()), this, SLOT(dispatchLogin()));
- connect(m_nexusLogin, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(authError(QAbstractSocket::SocketError)));
- connect(m_nexusLogin, SIGNAL(textMessageReceived(const QString &)), this, SLOT(receiveApiKey(const QString &)));
- connect(m_nexusLogin, SIGNAL(disconnected()), this, SLOT(completeApiConnection()));
- m_loginTimer.callOnTimeout(this, &SettingsDialog::loginPing);
updateNexusButtons();
}
SettingsDialog::~SettingsDialog()
{
- m_loginTimer.stop();
- m_nexusLogin->close();
disconnect(this);
delete ui;
}
@@ -188,7 +332,7 @@ bool SettingsDialog::getResetGeometries()
bool SettingsDialog::getApiKeyChanged()
{
- return m_KeyReceived || m_KeyCleared;
+ return m_keyChanged;
}
void SettingsDialog::on_categoriesBtn_clicked()
@@ -391,7 +535,11 @@ void SettingsDialog::on_resetDialogsButton_clicked()
void SettingsDialog::on_nexusConnect_clicked()
{
- fetchNexusApiKey();
+ if (m_nexusLogin.isActive()) {
+ m_nexusLogin.cancel();
+ } else {
+ fetchNexusApiKey();
+ }
}
void SettingsDialog::on_nexusManualKey_clicked()
@@ -415,92 +563,95 @@ void SettingsDialog::on_nexusManualKey_clicked()
void SettingsDialog::fetchNexusApiKey()
{
- QUrl url = QUrl("wss://sso.nexusmods.com");
- m_nexusLogin->open(url);
+ ui->nexusLog->clear();
+ m_nexusLogin.start();
updateNexusButtons();
}
-void SettingsDialog::dispatchLogin()
+void SettingsDialog::onKeyChanged(const QString& key)
{
- m_KeyReceived = false;
- QJsonObject login;
- if (m_UUID.isEmpty()) {
- boost::uuids::random_generator generator;
- boost::uuids::uuid sessionId = generator();
- m_UUID = boost::uuids::to_string(sessionId).c_str();
+ if (key.isEmpty()) {
+ clearKey();
+ } else {
+ setKey(key);
}
- login.insert(QString("id"), QJsonValue(m_UUID));
- login.insert(QString("token"), QJsonValue(m_AuthToken));
- login.insert(QString("protocol"), 2);
- QJsonDocument loginDoc(login);
- QString finalMessage(loginDoc.toJson());
- m_nexusLogin->sendTextMessage(finalMessage);
- QDesktopServices::openUrl(QUrl(QString("https://www.nexusmods.com/sso?id=%1&application=%2").arg(m_UUID).arg("modorganizer2")));
- m_loginTimer.start(30000);
}
-void SettingsDialog::loginPing()
+void SettingsDialog::onStateChanged(NexusSSOLogin::States s, const QString& e)
{
- if (m_nexusLogin->isValid()) {
- m_nexusLogin->ping();
- m_totalPings++;
- }
- if (m_totalPings >= 60) {
- m_loginTimer.stop();
- m_totalPings = 0;
- m_nexusLogin->close(QWebSocketProtocol::CloseCodeGoingAway, "Timeout: No response received after thirty minutes. Cancelling request.");
- }
-}
+ QString log;
-void SettingsDialog::authError(QAbstractSocket::SocketError error)
-{
- auto errorInfo = m_nexusLogin->errorString();
- qCritical() << "An error occurred: " << errorInfo;
-}
+ switch (s)
+ {
+ case NexusSSOLogin::Idle:
+ {
+ break;
+ }
-void SettingsDialog::receiveApiKey(const QString &response)
-{
- QJsonDocument responseDoc = QJsonDocument::fromJson(response.toUtf8());
- QVariantMap responseData = responseDoc.object().toVariantMap();
- if (responseData["success"].toBool()) {
- QVariantMap data = responseData["data"].toMap();
- if (data.contains("connection_token")) {
- m_AuthToken = data["connection_token"].toString();
- } else {
- const auto key = data["api_key"].toString();
+ case NexusSSOLogin::ConnectingToSSO:
+ {
+ log = tr("Connecting to Nexus...");
+ break;
+ }
+
+ case NexusSSOLogin::WaitingForToken:
+ {
+ log = tr("Waiting for Nexus...");
+ break;
+ }
- m_nexusLogin->close();
- m_loginTimer.stop();
- m_totalPings = 0;
+ case NexusSSOLogin::WaitingForBrowser:
+ {
+ log = tr("Opened browser, waiting for user...");
+ break;
+ }
- if (key.isEmpty()) {
- clearKey();
- } else {
- setKey(key);
- }
+ case NexusSSOLogin::Finished:
+ {
+ log = tr("Connected.");
+ break;
}
- } else {
- QString error("There was a problem with SSO initialization: %1");
- qCritical() << error.arg(responseData["error"].toString());
- m_nexusLogin->close();
- }
-}
-void SettingsDialog::completeApiConnection()
-{
- if (!m_KeyReceived && !m_loginTimer.isActive()) {
- QMessageBox::warning(qApp->activeWindow(), tr("Error"),
- tr("Failed to retrieve a Nexus API key! Please try again. "
- "A browser window should open asking you to authorize."));
+ case NexusSSOLogin::Timeout:
+ {
+ log = QObject::tr(
+ "No answer from Nexus.\n"
+ "A firewall might be blocking Mod Organizer.");
- // try again
- fetchNexusApiKey();
+ break;
+ }
+
+ case NexusSSOLogin::ClosedByRemote:
+ {
+ log = QObject::tr("Nexus closed the connection.");
+ break;
+ }
+
+ case NexusSSOLogin::Cancelled:
+ {
+ log = QObject::tr("Cancelled.");
+ break;
+ }
+
+ case NexusSSOLogin::Error:
+ {
+ log = tr("Error: %1.").arg(e);
+ break;
+ }
}
+
+ if (!log.isEmpty()) {
+ for (auto&& line : log.split("\n")) {
+ ui->nexusLog->addItem(line);
+ }
+ }
+
+ updateNexusButtons();
}
bool SettingsDialog::setKey(const QString& key)
{
- m_KeyReceived = true;
+ m_keyChanged = true;
const bool ret = m_settings->setNexusApiKey(key);
updateNexusButtons();
return ret;
@@ -508,7 +659,7 @@ bool SettingsDialog::setKey(const QString& key)
bool SettingsDialog::clearKey()
{
- m_KeyCleared = true;
+ m_keyChanged = true;
const auto ret = m_settings->clearNexusApiKey();
updateNexusButtons();
@@ -530,22 +681,22 @@ void SettingsDialog::testApiKey()
void SettingsDialog::updateNexusButtons()
{
- if (m_nexusLogin->state() != QAbstractSocket::UnconnectedState) {
+ if (m_nexusLogin.isActive()) {
// api key is in the process of being retrieved
- ui->nexusConnect->setText("Connecting the API. Please login within the browser and accept the request. This will time out after 30 minutes.");
- ui->nexusConnect->setEnabled(false);
+ ui->nexusConnect->setText(tr("Cancel"));
+ ui->nexusConnect->setEnabled(true);
ui->nexusDisconnect->setEnabled(false);
ui->nexusManualKey->setEnabled(false);
}
else if (m_settings->hasNexusApiKey()) {
// api key is present
- ui->nexusConnect->setText("Nexus API Key Stored");
+ ui->nexusConnect->setText(tr("Connect to Nexus"));
ui->nexusConnect->setEnabled(false);
ui->nexusDisconnect->setEnabled(true);
ui->nexusManualKey->setEnabled(false);
} else {
// api key not present
- ui->nexusConnect->setText("Connect to Nexus");
+ ui->nexusConnect->setText(tr("Connect to Nexus"));
ui->nexusConnect->setEnabled(true);
ui->nexusDisconnect->setEnabled(false);
ui->nexusManualKey->setEnabled(true);
@@ -622,6 +773,8 @@ void SettingsDialog::on_clearCacheButton_clicked()
void SettingsDialog::on_nexusDisconnect_clicked()
{
clearKey();
+ ui->nexusLog->clear();
+ ui->nexusLog->addItem(tr("Disconnected."));
}
void SettingsDialog::normalizePath(QLineEdit *lineEdit)
--
cgit v1.3.1
From ad29525e982f83343dbd70e17b914e0a30adb662 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Thu, 11 Jul 2019 02:31:59 -0400
Subject: moved NexusSSOLogin to nxmaccessmanager added logs for manual key
validation, will need to rewrite a few things
---
src/nxmaccessmanager.cpp | 166 +++++++++++++++++++++++++++++++++++++--
src/nxmaccessmanager.h | 64 ++++++++++++++-
src/settingsdialog.cpp | 198 +++++++----------------------------------------
src/settingsdialog.h | 52 +------------
4 files changed, 250 insertions(+), 230 deletions(-)
(limited to 'src/settingsdialog.cpp')
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index 8bbfd536..a274261d 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -44,6 +44,8 @@ using namespace std::chrono_literals;
const QString NexusBaseUrl("https://api.nexusmods.com/v1");
const std::chrono::seconds NXMAccessManager::ValidationTimeout = 10s;
+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)
@@ -94,7 +96,10 @@ void ValidationProgressDialog::start()
void ValidationProgressDialog::stop()
{
- m_timer->stop();
+ if (m_timer) {
+ m_timer->stop();
+ }
+
hide();
}
@@ -119,6 +124,153 @@ void ValidationProgressDialog::onTimer()
}
+NexusSSOLogin::NexusSSOLogin()
+ : m_keyReceived(false), m_active(false)
+{
+ QObject::connect(
+ &m_socket, &QWebSocket::connected,
+ [&]{ onConnected(); });
+
+ QObject::connect(
+ &m_socket, qOverload(&QWebSocket::error),
+ [&](auto&& e){ onError(e); });
+
+ QObject::connect(
+ &m_socket, &QWebSocket::textMessageReceived,
+ [&](auto&& s){ onMessage(s); });
+
+ QObject::connect(
+ &m_socket, &QWebSocket::disconnected,
+ [&]{ onDisconnected(); });
+
+ QObject::connect(&m_timeout, &QTimer::timeout, [&]{ onTimeout(); });
+}
+
+void NexusSSOLogin::start()
+{
+ m_active = true;
+ setState(ConnectingToSSO);
+ m_timeout.start(NXMAccessManager::ValidationTimeout);
+ m_socket.open(NexusSSO);
+}
+
+void NexusSSOLogin::cancel()
+{
+ abort();
+ setState(Cancelled);
+}
+
+void NexusSSOLogin::close()
+{
+ m_active = false;
+ m_timeout.stop();
+ m_socket.close();
+}
+
+void NexusSSOLogin::abort()
+{
+ m_active = false;
+ m_timeout.stop();
+ m_socket.abort();
+}
+
+bool NexusSSOLogin::isActive() const
+{
+ return m_active;
+}
+
+void NexusSSOLogin::setState(States s, const QString& error)
+{
+ if (stateChanged) {
+ stateChanged(s, error);
+ }
+}
+
+void NexusSSOLogin::onConnected()
+{
+ setState(WaitingForToken);
+
+ m_keyReceived = false;
+
+ //if (m_guid.isEmpty()) {
+ boost::uuids::random_generator generator;
+ boost::uuids::uuid sessionId = generator();
+ m_guid = boost::uuids::to_string(sessionId).c_str();
+ //}
+
+ QJsonObject data;
+ data.insert(QString("id"), QJsonValue(m_guid));
+ //data.insert(QString("token"), QJsonValue(m_token));
+ data.insert(QString("protocol"), 2);
+
+ const QString message = QJsonDocument(data).toJson();
+ m_socket.sendTextMessage(message);
+}
+
+void NexusSSOLogin::onMessage(const QString& s)
+{
+ const QJsonDocument doc = QJsonDocument::fromJson(s.toUtf8());
+ const QVariantMap root = doc.object().toVariantMap();
+
+ if (!root["success"].toBool()) {
+ close();
+
+ setState(Error, QString("There was a problem with SSO initialization: %1")
+ .arg(root["error"].toString()));
+
+ return;
+ }
+
+ const QVariantMap data = root["data"].toMap();
+
+ if (data.contains("connection_token")) {
+ // first answer
+ m_token = data["connection_token"].toString();
+
+ // open browser
+ const auto url = NexusSSOPage.arg(m_guid);
+ shell::OpenLink(url);
+
+ m_timeout.stop();
+ setState(WaitingForBrowser);
+ } else {
+ // second answer
+ const auto key = data["api_key"].toString();
+ close();
+
+ if (keyChanged) {
+ keyChanged(key);
+ }
+
+ setState(Finished);
+ }
+}
+
+void NexusSSOLogin::onDisconnected()
+{
+ if (m_active) {
+ m_active = false;
+
+ if (!m_keyReceived) {
+ setState(ClosedByRemote);
+ }
+ }
+}
+
+void NexusSSOLogin::onError(QAbstractSocket::SocketError e)
+{
+ if (m_active) {
+ setState(Error, m_socket.errorString());
+ }
+}
+
+void NexusSSOLogin::onTimeout()
+{
+ abort();
+ setState(Timeout);
+}
+
+
NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion)
: QNetworkAccessManager(parent)
, m_ValidateReply(nullptr)
@@ -192,7 +344,7 @@ void NXMAccessManager::clearCookies()
}
}
-void NXMAccessManager::startValidationCheck()
+void NXMAccessManager::startValidationCheck(bool showProgress)
{
qDebug("Checking Nexus API Key...");
QString requestString = NexusBaseUrl + "/users/validate";
@@ -205,7 +357,9 @@ void NXMAccessManager::startValidationCheck()
request.setRawHeader("Application-Name", "MO2");
request.setRawHeader("Application-Version", m_MOVersion.toUtf8());
- m_ProgressDialog->start();
+ if (showProgress) {
+ m_ProgressDialog->start();
+ }
QCoreApplication::processEvents(); // for some reason the whole app hangs during the login. This way the user has at least a little feedback
@@ -245,13 +399,13 @@ bool NXMAccessManager::validateWaiting() const
}
-void NXMAccessManager::apiCheck(const QString &apiKey, bool force)
+void NXMAccessManager::apiCheck(const QString &apiKey, ApiCheckFlags flags)
{
if (m_ValidateReply != nullptr) {
return;
}
- if (force) {
+ if (flags & Force) {
m_ValidateState = VALIDATE_NOT_CHECKED;
}
@@ -261,7 +415,7 @@ void NXMAccessManager::apiCheck(const QString &apiKey, bool force)
}
m_ApiKey = apiKey;
- startValidationCheck();
+ startValidationCheck((flags & HideProgress) == 0);
}
diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h
index cbec0530..08a799f9 100644
--- a/src/nxmaccessmanager.h
+++ b/src/nxmaccessmanager.h
@@ -27,6 +27,7 @@ along with Mod Organizer. If not, see .
#include
#include
#include
+#include
#include
namespace MOBase { class IPluginGame; }
@@ -60,6 +61,52 @@ private:
};
+class NexusSSOLogin
+{
+public:
+ enum States
+ {
+ ConnectingToSSO,
+ WaitingForToken,
+ WaitingForBrowser,
+ Finished,
+ Timeout,
+ ClosedByRemote,
+ Cancelled,
+ Error
+ };
+
+ std::function keyChanged;
+ std::function stateChanged;
+
+ NexusSSOLogin();
+
+ void start();
+ void cancel();
+
+ bool isActive() const;
+
+private:
+ QWebSocket m_socket;
+ QString m_guid;
+ bool m_keyReceived;
+ QString m_token;
+ bool m_active;
+ QTimer m_timeout;
+
+ void setState(States s, const QString& error={});
+
+ void close();
+ void abort();
+
+ void onConnected();
+ void onMessage(const QString& s);
+ void onDisconnected();
+ void onError(QAbstractSocket::SocketError e);
+ void onTimeout();
+};
+
+
/**
* @brief access manager extended to handle nxm links
**/
@@ -67,6 +114,15 @@ class NXMAccessManager : public QNetworkAccessManager
{
Q_OBJECT
public:
+ enum ApiCheckFlagsEnum
+ {
+ NoFlags = 0,
+ Force,
+ HideProgress
+ };
+
+ Q_DECLARE_FLAGS(ApiCheckFlags, ApiCheckFlagsEnum)
+
static const std::chrono::seconds ValidationTimeout;
explicit NXMAccessManager(QObject *parent, const QString &moVersion);
@@ -80,7 +136,7 @@ public:
bool validateAttempted() const;
bool validateWaiting() const;
- void apiCheck(const QString &apiKey, bool force=false);
+ void apiCheck(const QString &apiKey, ApiCheckFlags flags=NoFlags);
void showCookies() const;
@@ -91,8 +147,6 @@ public:
QString apiKey() const;
void clearApiKey();
- void startValidationCheck();
-
void refuseValidation();
signals:
@@ -145,6 +199,10 @@ private:
VALIDATE_REFUSED,
VALIDATE_VALID
} m_ValidateState = VALIDATE_NOT_CHECKED;
+
+ void startValidationCheck(bool showProgress);
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(NXMAccessManager::ApiCheckFlags);
+
#endif // NXMACCESSMANAGER_H
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index d1ace6a5..0131d20b 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -28,7 +28,6 @@ along with Mod Organizer. If not, see .
#include "settings.h"
#include "instancemanager.h"
#include "nexusinterface.h"
-#include "nxmaccessmanager.h"
#include "plugincontainer.h"
#include
@@ -49,9 +48,6 @@ along with Mod Organizer. If not, see .
using namespace MOBase;
-const QString NexusSSO("wss://sso.nexusmods.com");
-const QString NexusSSOPage("https://www.nexusmods.com/sso?id=%1&application=modorganizer2");
-
class NexusManualKeyDialog : public QDialog
{
public:
@@ -100,154 +96,6 @@ private:
};
-
-NexusSSOLogin::NexusSSOLogin()
- : m_keyReceived(false), m_active(false)
-{
- QObject::connect(
- &m_socket, &QWebSocket::connected,
- [&]{ onConnected(); });
-
- QObject::connect(
- &m_socket, qOverload(&QWebSocket::error),
- [&](auto&& e){ onError(e); });
-
- QObject::connect(
- &m_socket, &QWebSocket::textMessageReceived,
- [&](auto&& s){ onMessage(s); });
-
- QObject::connect(
- &m_socket, &QWebSocket::disconnected,
- [&]{ onDisconnected(); });
-
- QObject::connect(&m_timeout, &QTimer::timeout, [&]{ onTimeout(); });
-}
-
-void NexusSSOLogin::start()
-{
- m_active = true;
- setState(ConnectingToSSO);
- m_timeout.start(NXMAccessManager::ValidationTimeout);
- m_socket.open(NexusSSO);
-}
-
-void NexusSSOLogin::cancel()
-{
- abort();
- setState(Cancelled);
-}
-
-void NexusSSOLogin::close()
-{
- m_active = false;
- m_timeout.stop();
- m_socket.close();
-}
-
-void NexusSSOLogin::abort()
-{
- m_active = false;
- m_timeout.stop();
- m_socket.abort();
-}
-
-bool NexusSSOLogin::isActive() const
-{
- return m_active;
-}
-
-void NexusSSOLogin::setState(States s, const QString& error)
-{
- if (stateChanged) {
- stateChanged(s, error);
- }
-}
-
-void NexusSSOLogin::onConnected()
-{
- setState(WaitingForToken);
-
- m_keyReceived = false;
-
- //if (m_guid.isEmpty()) {
- boost::uuids::random_generator generator;
- boost::uuids::uuid sessionId = generator();
- m_guid = boost::uuids::to_string(sessionId).c_str();
- //}
-
- QJsonObject data;
- data.insert(QString("id"), QJsonValue(m_guid));
- //data.insert(QString("token"), QJsonValue(m_token));
- data.insert(QString("protocol"), 2);
-
- const QString message = QJsonDocument(data).toJson();
- m_socket.sendTextMessage(message);
-}
-
-void NexusSSOLogin::onMessage(const QString& s)
-{
- const QJsonDocument doc = QJsonDocument::fromJson(s.toUtf8());
- const QVariantMap root = doc.object().toVariantMap();
-
- if (!root["success"].toBool()) {
- close();
-
- setState(Error, QString("There was a problem with SSO initialization: %1")
- .arg(root["error"].toString()));
-
- return;
- }
-
- const QVariantMap data = root["data"].toMap();
-
- if (data.contains("connection_token")) {
- // first answer
- m_token = data["connection_token"].toString();
-
- // open browser
- const auto url = NexusSSOPage.arg(m_guid);
- shell::OpenLink(url);
-
- m_timeout.stop();
- setState(WaitingForBrowser);
- } else {
- // second answer
- const auto key = data["api_key"].toString();
- close();
-
- if (keyChanged) {
- keyChanged(key);
- }
-
- setState(Finished);
- }
-}
-
-void NexusSSOLogin::onDisconnected()
-{
- if (m_active) {
- m_active = false;
-
- if (!m_keyReceived) {
- setState(ClosedByRemote);
- }
- }
-}
-
-void NexusSSOLogin::onError(QAbstractSocket::SocketError e)
-{
- if (m_active) {
- setState(Error, m_socket.errorString());
- }
-}
-
-void NexusSSOLogin::onTimeout()
-{
- abort();
- setState(Timeout);
-}
-
-
SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* settings, QWidget *parent)
: TutorableDialog("SettingsDialog", parent)
, ui(new Ui::SettingsDialog)
@@ -259,11 +107,22 @@ SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* setti
m_nexusLogin.keyChanged = [&](auto&& s){ onKeyChanged(s); };
m_nexusLogin.stateChanged = [&](auto&& s, auto&& e){ onStateChanged(s, e); };
+ connect(
+ NexusInterface::instance(m_PluginContainer)->getAccessManager(),
+ &NXMAccessManager::validateSuccessful,
+ [&]{ onManualKeyValidation(true, ""); });
+
+ connect(
+ NexusInterface::instance(m_PluginContainer)->getAccessManager(),
+ &NXMAccessManager::validateFailed,
+ [&](auto&& e){ onManualKeyValidation(false, e); });
+
+
ui->setupUi(this);
ui->pluginSettingsList->setStyleSheet("QTreeWidget::item {padding-right: 10px;}");
- QShortcut *delShortcut
- = new QShortcut(QKeySequence(Qt::Key_Delete), ui->pluginBlacklist);
+ QShortcut *delShortcut = new QShortcut(
+ QKeySequence(Qt::Key_Delete), ui->pluginBlacklist);
connect(delShortcut, SIGNAL(activated()), this, SLOT(deleteBlacklistItem()));
updateNexusButtons();
@@ -556,7 +415,11 @@ void SettingsDialog::on_nexusManualKey_clicked()
clearKey();
} else {
if (setKey(key)) {
- testApiKey();
+ ui->nexusLog->clear();
+ ui->nexusLog->addItem(tr("Checking API key..."));
+
+ NexusInterface::instance(m_PluginContainer)->getAccessManager()->apiCheck(
+ key, NXMAccessManager::Force | NXMAccessManager::HideProgress);
}
}
}
@@ -583,11 +446,6 @@ void SettingsDialog::onStateChanged(NexusSSOLogin::States s, const QString& e)
switch (s)
{
- case NexusSSOLogin::Idle:
- {
- break;
- }
-
case NexusSSOLogin::ConnectingToSSO:
{
log = tr("Connecting to Nexus...");
@@ -649,6 +507,15 @@ void SettingsDialog::onStateChanged(NexusSSOLogin::States s, const QString& e)
updateNexusButtons();
}
+void SettingsDialog::onManualKeyValidation(bool success, const QString& e)
+{
+ if (success) {
+ ui->nexusLog->addItem("Connected.");
+ } else {
+ ui->nexusLog->addItem("Error: " + e);
+ }
+}
+
bool SettingsDialog::setKey(const QString& key)
{
m_keyChanged = true;
@@ -668,17 +535,6 @@ bool SettingsDialog::clearKey()
return ret;
}
-void SettingsDialog::testApiKey()
-{
- QString key;
- if (!m_settings->getNexusApiKey(key)) {
- qWarning().nospace() << "can't test API key, nothing stored";
- return;
- }
-
- NexusInterface::instance(m_PluginContainer)->getAccessManager()->apiCheck(key, true);
-}
-
void SettingsDialog::updateNexusButtons()
{
if (m_nexusLogin.isActive()) {
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index aee447d7..507214dd 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -21,12 +21,9 @@ along with Mod Organizer. If not, see .
#define SETTINGSDIALOG_H
#include "tutorabledialog.h"
+#include "nxmaccessmanager.h"
#include
-#include
-#include
-#include
#include
-#include
class PluginContainer;
class Settings;
@@ -35,51 +32,6 @@ namespace Ui {
class SettingsDialog;
}
-class NexusSSOLogin
-{
-public:
- enum States
- {
- Idle,
- ConnectingToSSO,
- WaitingForToken,
- WaitingForBrowser,
- Finished,
- Timeout,
- ClosedByRemote,
- Cancelled,
- Error
- };
-
- std::function keyChanged;
- std::function stateChanged;
-
- NexusSSOLogin();
-
- void start();
- void cancel();
-
- bool isActive() const;
-
-private:
- QWebSocket m_socket;
- QString m_guid;
- bool m_keyReceived;
- QString m_token;
- bool m_active;
- QTimer m_timeout;
-
- void setState(States s, const QString& error={});
-
- void close();
- void abort();
-
- void onConnected();
- void onMessage(const QString& s);
- void onDisconnected();
- void onError(QAbstractSocket::SocketError e);
- void onTimeout();
-};
/**
* dialog used to change settings for Mod Organizer. On top of the
@@ -197,9 +149,9 @@ private:
void updateNexusButtons();
void fetchNexusApiKey();
- void testApiKey();
void onKeyChanged(const QString& key);
void onStateChanged(NexusSSOLogin::States s, const QString& e);
+ void onManualKeyValidation(bool success, const QString& e);
};
#endif // SETTINGSDIALOG_H
--
cgit v1.3.1
From 226372dba2f8a06ef2349a331da91010d97e72bf Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Thu, 11 Jul 2019 05:33:35 -0400
Subject: api key validator in settings
---
src/nxmaccessmanager.cpp | 4 +-
src/settingsdialog.cpp | 161 +++++++++++++++++++++++++++++++++++------------
src/settingsdialog.h | 12 ++--
3 files changed, 129 insertions(+), 48 deletions(-)
(limited to 'src/settingsdialog.cpp')
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index c0a6c227..40ab19b9 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -313,7 +313,7 @@ void NexusKeyValidator::start(const QString& key)
return;
}
- qDebug("Checking Nexus API Key...");
+ m_active = true;
setState(Connecting);
const QString requestUrl(NexusBaseUrl + "/users/validate");
@@ -328,11 +328,11 @@ void NexusKeyValidator::start(const QString& key)
m_reply = m_manager.get(request);
if (!m_reply) {
+ close();
setState(Error, QObject::tr("Failed to request %1").arg(requestUrl));
return;
}
- m_active = true;
m_timeout.start(NXMAccessManager::ValidationTimeout);
QObject::connect(
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 0131d20b..12dbc482 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -104,20 +104,6 @@ SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* setti
, m_keyChanged(false)
, m_GeometriesReset(false)
{
- m_nexusLogin.keyChanged = [&](auto&& s){ onKeyChanged(s); };
- m_nexusLogin.stateChanged = [&](auto&& s, auto&& e){ onStateChanged(s, e); };
-
- connect(
- NexusInterface::instance(m_PluginContainer)->getAccessManager(),
- &NXMAccessManager::validateSuccessful,
- [&]{ onManualKeyValidation(true, ""); });
-
- connect(
- NexusInterface::instance(m_PluginContainer)->getAccessManager(),
- &NXMAccessManager::validateFailed,
- [&](auto&& e){ onManualKeyValidation(false, e); });
-
-
ui->setupUi(this);
ui->pluginSettingsList->setStyleSheet("QTreeWidget::item {padding-right: 10px;}");
@@ -394,44 +380,66 @@ void SettingsDialog::on_resetDialogsButton_clicked()
void SettingsDialog::on_nexusConnect_clicked()
{
- if (m_nexusLogin.isActive()) {
- m_nexusLogin.cancel();
- } else {
- fetchNexusApiKey();
+ if (m_nexusLogin && m_nexusLogin->isActive()) {
+ m_nexusLogin->cancel();
+ return;
}
+
+ if (!m_nexusLogin) {
+ m_nexusLogin.reset(new NexusSSOLogin);
+
+ m_nexusLogin->keyChanged = [&](auto&& s){
+ onSSOKeyChanged(s);
+ };
+
+ m_nexusLogin->stateChanged = [&](auto&& s, auto&& e){
+ onSSOStateChanged(s, e);
+ };
+ }
+
+ ui->nexusLog->clear();
+ m_nexusLogin->start();
+ updateNexusButtons();
}
void SettingsDialog::on_nexusManualKey_clicked()
{
- NexusManualKeyDialog dialog(this);
+ if (m_nexusValidator && m_nexusValidator->isActive()) {
+ m_nexusValidator->cancel();
+ return;
+ }
+ NexusManualKeyDialog dialog(this);
if (dialog.exec() != QDialog::Accepted) {
return;
}
const auto key = dialog.key();
-
if (key.isEmpty()) {
clearKey();
- } else {
- if (setKey(key)) {
- ui->nexusLog->clear();
- ui->nexusLog->addItem(tr("Checking API key..."));
-
- NexusInterface::instance(m_PluginContainer)->getAccessManager()->apiCheck(
- key, NXMAccessManager::Force | NXMAccessManager::HideProgress);
- }
+ return;
}
-}
-void SettingsDialog::fetchNexusApiKey()
-{
ui->nexusLog->clear();
- m_nexusLogin.start();
- updateNexusButtons();
+ ui->nexusLog->addItem(tr("Checking API key..."));
+
+ if (!m_nexusValidator) {
+ m_nexusValidator.reset(new NexusKeyValidator(
+ *NexusInterface::instance(m_PluginContainer)->getAccessManager()));
+
+ m_nexusValidator->stateChanged = [&](auto&& s, auto&& e){
+ onValidatorStateChanged(s, e);
+ };
+
+ m_nexusValidator->finished = [&](auto&& user) {
+ onValidatorFinished(user);
+ };
+ }
+
+ m_nexusValidator->start(key);
}
-void SettingsDialog::onKeyChanged(const QString& key)
+void SettingsDialog::onSSOKeyChanged(const QString& key)
{
if (key.isEmpty()) {
clearKey();
@@ -440,7 +448,7 @@ void SettingsDialog::onKeyChanged(const QString& key)
}
}
-void SettingsDialog::onStateChanged(NexusSSOLogin::States s, const QString& e)
+void SettingsDialog::onSSOStateChanged(NexusSSOLogin::States s, const QString& e)
{
QString log;
@@ -507,12 +515,72 @@ void SettingsDialog::onStateChanged(NexusSSOLogin::States s, const QString& e)
updateNexusButtons();
}
-void SettingsDialog::onManualKeyValidation(bool success, const QString& e)
+void SettingsDialog::onValidatorStateChanged(
+ NexusKeyValidator::States s, const QString& e)
{
- if (success) {
- ui->nexusLog->addItem("Connected.");
- } else {
- ui->nexusLog->addItem("Error: " + e);
+ QString log;
+
+ switch (s)
+ {
+ case NexusKeyValidator::Connecting:
+ {
+ log = tr("Connecting to Nexus...");
+ break;
+ }
+
+ case NexusKeyValidator::Finished:
+ {
+ log = tr("Connected.");
+ break;
+ }
+
+ case NexusKeyValidator::InvalidJson:
+ {
+ log = tr("Invalid JSON");
+ break;
+ }
+
+ case NexusKeyValidator::BadResponse:
+ {
+ log = tr("Bad response");
+ break;
+ }
+
+ case NexusKeyValidator::Timeout:
+ {
+ log = QObject::tr(
+ "No answer from Nexus.\n"
+ "A firewall might be blocking Mod Organizer.");
+
+ break;
+ }
+
+ case NexusKeyValidator::Cancelled:
+ {
+ log = QObject::tr("Cancelled.");
+ break;
+ }
+
+ case NexusKeyValidator::Error:
+ {
+ log = tr("Error: %1.").arg(e);
+ break;
+ }
+ }
+
+ if (!log.isEmpty()) {
+ for (auto&& line : log.split("\n")) {
+ ui->nexusLog->addItem(line);
+ }
+ }
+
+ updateNexusButtons();
+}
+
+void SettingsDialog::onValidatorFinished(const APIUserAccount& user)
+{
+ if (!user.apiKey().isEmpty()) {
+ setKey(user.apiKey());
}
}
@@ -537,24 +605,35 @@ bool SettingsDialog::clearKey()
void SettingsDialog::updateNexusButtons()
{
- if (m_nexusLogin.isActive()) {
+ if (m_nexusLogin && m_nexusLogin->isActive()) {
// api key is in the process of being retrieved
ui->nexusConnect->setText(tr("Cancel"));
ui->nexusConnect->setEnabled(true);
ui->nexusDisconnect->setEnabled(false);
+ ui->nexusManualKey->setText(tr("Enter API Key Manually"));
ui->nexusManualKey->setEnabled(false);
}
+ else if (m_nexusValidator && m_nexusValidator->isActive()) {
+ // api key is in the process of being tested
+ ui->nexusConnect->setText(tr("Connect to Nexus"));
+ ui->nexusConnect->setEnabled(false);
+ ui->nexusDisconnect->setEnabled(false);
+ ui->nexusManualKey->setText(tr("Cancel"));
+ ui->nexusManualKey->setEnabled(true);
+ }
else if (m_settings->hasNexusApiKey()) {
// api key is present
ui->nexusConnect->setText(tr("Connect to Nexus"));
ui->nexusConnect->setEnabled(false);
ui->nexusDisconnect->setEnabled(true);
+ ui->nexusManualKey->setText(tr("Enter API Key Manually"));
ui->nexusManualKey->setEnabled(false);
} else {
// api key not present
ui->nexusConnect->setText(tr("Connect to Nexus"));
ui->nexusConnect->setEnabled(true);
ui->nexusDisconnect->setEnabled(false);
+ ui->nexusManualKey->setText(tr("Enter API Key Manually"));
ui->nexusManualKey->setEnabled(true);
}
}
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index 507214dd..1741fc13 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -142,16 +142,18 @@ private:
bool m_keyChanged;
QString m_ExecutableBlacklist;
- NexusSSOLogin m_nexusLogin;
+ std::unique_ptr m_nexusLogin;
+ std::unique_ptr m_nexusValidator;
bool setKey(const QString& key);
bool clearKey();
void updateNexusButtons();
- void fetchNexusApiKey();
- void onKeyChanged(const QString& key);
- void onStateChanged(NexusSSOLogin::States s, const QString& e);
- void onManualKeyValidation(bool success, const QString& e);
+ void onSSOKeyChanged(const QString& key);
+ void onSSOStateChanged(NexusSSOLogin::States s, const QString& e);
+
+ void onValidatorStateChanged(NexusKeyValidator::States s, const QString& e);
+ void onValidatorFinished(const APIUserAccount& user);
};
#endif // SETTINGSDIALOG_H
--
cgit v1.3.1
From be1ee2a97c867a80c07c4b865c306977d96249dc Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Thu, 11 Jul 2019 05:49:12 -0400
Subject: refactored state messages
---
src/nxmaccessmanager.cpp | 125 ++++++++++++++++++++++++++++++-----------------
src/nxmaccessmanager.h | 5 +-
src/settingsdialog.cpp | 118 +++-----------------------------------------
3 files changed, 90 insertions(+), 158 deletions(-)
(limited to 'src/settingsdialog.cpp')
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index 40ab19b9..a331b2e8 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -153,6 +153,45 @@ NexusSSOLogin::NexusSSOLogin()
QObject::connect(&m_timeout, &QTimer::timeout, [&]{ onTimeout(); });
}
+QString NexusSSOLogin::stateToString(States s, const QString& e)
+{
+ switch (s)
+ {
+ case ConnectingToSSO:
+ return QObject::tr("Connecting to Nexus...");
+
+ case WaitingForToken:
+ return QObject::tr("Waiting for Nexus...");
+
+ case WaitingForBrowser:
+ return QObject::tr("Opened browser, waiting for user...");
+
+ case Finished:
+ return QObject::tr("Connected.");
+
+ case Timeout:
+ return QObject::tr(
+ "No answer from Nexus.\n"
+ "A firewall might be blocking Mod Organizer.");
+
+ case ClosedByRemote:
+ return QObject::tr("Nexus closed the connection.");
+
+ case Cancelled:
+ return QObject::tr("Cancelled.");
+
+ case Error: // fall-through
+ default:
+ {
+ if (e.isEmpty()) {
+ return QString("%1").arg(s);
+ } else {
+ return e;
+ }
+ }
+ }
+}
+
void NexusSSOLogin::start()
{
m_active = true;
@@ -306,6 +345,40 @@ NexusKeyValidator::~NexusKeyValidator()
abort();
}
+QString NexusKeyValidator::stateToString(States s, const QString& e)
+{
+ switch (s)
+ {
+ case NexusKeyValidator::Connecting:
+ return QObject::tr("Connecting to Nexus...");
+
+ case NexusKeyValidator::Finished:
+ return QObject::tr("Finished.");
+
+ case NexusKeyValidator::InvalidJson:
+ return QObject::tr("Invalid JSON");
+
+ case NexusKeyValidator::BadResponse:
+ return QObject::tr("Bad response");
+
+ case NexusKeyValidator::Timeout:
+ return QObject::tr("There was a timeout during the request");
+
+ case NexusKeyValidator::Cancelled:
+ return QObject::tr("Cancelled");
+
+ case NexusKeyValidator::Error: // fall-through
+ default:
+ {
+ if (e.isEmpty()) {
+ return QString("%1").arg(s);
+ } else {
+ return e;
+ }
+ }
+ }
+}
+
void NexusKeyValidator::start(const QString& key)
{
if (m_reply) {
@@ -558,45 +631,14 @@ void NXMAccessManager::startValidationCheck(const QString& key, bool showProgres
void NXMAccessManager::onValidatorState(
NexusKeyValidator::States s, const QString& e)
{
- switch (s)
- {
- case NexusKeyValidator::Connecting: // fall-through
- case NexusKeyValidator::Finished:
- {
- // no-op, success is handled in onValidatorFinished()
- break;
- }
-
- case NexusKeyValidator::InvalidJson:
- {
- onValidatorError(tr("Invalid JSON"));
- break;
- }
-
- case NexusKeyValidator::BadResponse:
- {
- onValidatorError(tr("Bad response"));
- break;
- }
-
- case NexusKeyValidator::Timeout:
- {
- onValidatorError(tr("There was a timeout during the request"));
- break;
- }
-
- case NexusKeyValidator::Cancelled:
- {
- onValidatorError(tr("Cancelled"));
- break;
- }
-
- case NexusKeyValidator::Error:
- {
- onValidatorError(e);
- break;
- }
+ if (s == NexusKeyValidator::Connecting || s == NexusKeyValidator::Finished) {
+ // no-op, success is handled in onValidatorFinished()
+ return;
}
+
+ m_ProgressDialog->stop();
+ m_validationState = Invalid;
+ emit validateFailed(NexusKeyValidator::stateToString(s, e));
}
void NXMAccessManager::onValidatorFinished(const APIUserAccount& user)
@@ -608,13 +650,6 @@ void NXMAccessManager::onValidatorFinished(const APIUserAccount& user)
emit validateSuccessful(true);
}
-void NXMAccessManager::onValidatorError(const QString& e)
-{
- m_ProgressDialog->stop();
- m_validationState = Invalid;
- emit validateFailed(e);
-}
-
bool NXMAccessManager::validated() const
{
if (m_validator.isActive()) {
diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h
index 11370d65..c633ae3b 100644
--- a/src/nxmaccessmanager.h
+++ b/src/nxmaccessmanager.h
@@ -80,6 +80,8 @@ public:
std::function keyChanged;
std::function stateChanged;
+ static QString stateToString(States s, const QString& e);
+
NexusSSOLogin();
void start();
@@ -126,6 +128,8 @@ public:
std::function finished;
std::function stateChanged;
+ static QString stateToString(States s, const QString& e);
+
NexusKeyValidator(NXMAccessManager& am);
~NexusKeyValidator();
@@ -236,7 +240,6 @@ private:
void startValidationCheck(const QString& key, bool showProgress);
void onValidatorState(NexusKeyValidator::States s, const QString& e);
void onValidatorFinished(const APIUserAccount& user);
- void onValidatorError(const QString& e);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(NXMAccessManager::ApiCheckFlags);
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 12dbc482..df957f87 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -450,66 +450,10 @@ void SettingsDialog::onSSOKeyChanged(const QString& key)
void SettingsDialog::onSSOStateChanged(NexusSSOLogin::States s, const QString& e)
{
- QString log;
+ const auto log = NexusSSOLogin::stateToString(s, e);
- switch (s)
- {
- case NexusSSOLogin::ConnectingToSSO:
- {
- log = tr("Connecting to Nexus...");
- break;
- }
-
- case NexusSSOLogin::WaitingForToken:
- {
- log = tr("Waiting for Nexus...");
- break;
- }
-
- case NexusSSOLogin::WaitingForBrowser:
- {
- log = tr("Opened browser, waiting for user...");
- break;
- }
-
- case NexusSSOLogin::Finished:
- {
- log = tr("Connected.");
- break;
- }
-
- case NexusSSOLogin::Timeout:
- {
- log = QObject::tr(
- "No answer from Nexus.\n"
- "A firewall might be blocking Mod Organizer.");
-
- break;
- }
-
- case NexusSSOLogin::ClosedByRemote:
- {
- log = QObject::tr("Nexus closed the connection.");
- break;
- }
-
- case NexusSSOLogin::Cancelled:
- {
- log = QObject::tr("Cancelled.");
- break;
- }
-
- case NexusSSOLogin::Error:
- {
- log = tr("Error: %1.").arg(e);
- break;
- }
- }
-
- if (!log.isEmpty()) {
- for (auto&& line : log.split("\n")) {
- ui->nexusLog->addItem(line);
- }
+ for (auto&& line : log.split("\n")) {
+ ui->nexusLog->addItem(line);
}
updateNexusButtons();
@@ -518,60 +462,10 @@ void SettingsDialog::onSSOStateChanged(NexusSSOLogin::States s, const QString& e
void SettingsDialog::onValidatorStateChanged(
NexusKeyValidator::States s, const QString& e)
{
- QString log;
-
- switch (s)
- {
- case NexusKeyValidator::Connecting:
- {
- log = tr("Connecting to Nexus...");
- break;
- }
-
- case NexusKeyValidator::Finished:
- {
- log = tr("Connected.");
- break;
- }
-
- case NexusKeyValidator::InvalidJson:
- {
- log = tr("Invalid JSON");
- break;
- }
-
- case NexusKeyValidator::BadResponse:
- {
- log = tr("Bad response");
- break;
- }
-
- case NexusKeyValidator::Timeout:
- {
- log = QObject::tr(
- "No answer from Nexus.\n"
- "A firewall might be blocking Mod Organizer.");
+ const auto log = NexusKeyValidator::stateToString(s, e);
- break;
- }
-
- case NexusKeyValidator::Cancelled:
- {
- log = QObject::tr("Cancelled.");
- break;
- }
-
- case NexusKeyValidator::Error:
- {
- log = tr("Error: %1.").arg(e);
- break;
- }
- }
-
- if (!log.isEmpty()) {
- for (auto&& line : log.split("\n")) {
- ui->nexusLog->addItem(line);
- }
+ for (auto&& line : log.split("\n")) {
+ ui->nexusLog->addItem(line);
}
updateNexusButtons();
--
cgit v1.3.1
From 45f0a9e78ac876a2a956bc538c6d34358703e338 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Fri, 12 Jul 2019 02:46:31 -0400
Subject: nexus info and stats in settings cleaned up double logging for github
reset validation progress dialog parent just before the main window dies
removed unused APIStats from APIUserAccount, added isValid()
---
src/apiuseraccount.cpp | 22 +++++
src/apiuseraccount.h | 8 +-
src/main.cpp | 8 +-
src/nxmaccessmanager.cpp | 2 +-
src/organizercore.cpp | 2 +-
src/selfupdater.cpp | 2 +-
src/settingsdialog.cpp | 98 ++++++++++++++++-----
src/settingsdialog.h | 6 ++
src/settingsdialog.ui | 218 +++++++++++++++++++++++------------------------
9 files changed, 226 insertions(+), 140 deletions(-)
(limited to 'src/settingsdialog.cpp')
diff --git a/src/apiuseraccount.cpp b/src/apiuseraccount.cpp
index 596f8aa7..35a868d5 100644
--- a/src/apiuseraccount.cpp
+++ b/src/apiuseraccount.cpp
@@ -1,10 +1,32 @@
#include "apiuseraccount.h"
+QString localizedUserAccountType(APIUserAccountTypes t)
+{
+ switch (t)
+ {
+ case APIUserAccountTypes::Regular:
+ return QObject::tr("Regular");
+
+ case APIUserAccountTypes::Premium:
+ return QObject::tr("Premium");
+
+ case APIUserAccountTypes::None: // fall-through
+ default:
+ return QObject::tr("None");
+ }
+}
+
+
APIUserAccount::APIUserAccount()
: m_type(APIUserAccountTypes::None)
{
}
+bool APIUserAccount::isValid() const
+{
+ return !m_key.isEmpty();
+}
+
const QString& APIUserAccount::apiKey() const
{
return m_key;
diff --git a/src/apiuseraccount.h b/src/apiuseraccount.h
index 7dd16128..ea4e8685 100644
--- a/src/apiuseraccount.h
+++ b/src/apiuseraccount.h
@@ -18,6 +18,8 @@ enum class APIUserAccountTypes
Premium
};
+QString localizedUserAccountType(APIUserAccountTypes t);
+
/**
* current limits imposed on the user account
@@ -61,6 +63,11 @@ public:
APIUserAccount();
+ /**
+ * whether the user is logged in
+ */
+ bool isValid() const;
+
/**
* api key
*/
@@ -134,7 +141,6 @@ private:
QString m_key, m_id, m_name;
APIUserAccountTypes m_type;
APILimits m_limits;
- APIStats m_stats;
};
#endif // APIUSERACCOUNT_H
diff --git a/src/main.cpp b/src/main.cpp
index 0b078f03..4359c645 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -713,7 +713,13 @@ int runApplication(MOApplication &application, SingleInstance &instance,
mainWindow.activateWindow();
splash.finish(&mainWindow);
- return application.exec();
+
+ const auto ret = application.exec();
+
+ NexusInterface::instance(&pluginContainer)
+ ->getAccessManager()->setTopLevelWidget(nullptr);
+
+ return ret;
}
} catch (const std::exception &e) {
reportError(e.what());
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index a331b2e8..196368fd 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -167,7 +167,7 @@ QString NexusSSOLogin::stateToString(States s, const QString& e)
return QObject::tr("Opened browser, waiting for user...");
case Finished:
- return QObject::tr("Connected.");
+ return QObject::tr("Finished.");
case Timeout:
return QObject::tr(
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 87668f4b..eeb69e61 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -2484,7 +2484,7 @@ void OrganizerCore::loginSuccessfulUpdate(bool necessary)
void OrganizerCore::loginFailed(const QString &message)
{
- qDebug().nospace().noquote()
+ qCritical().nospace().noquote()
<< "Nexus API validation failed: " << message;
if (QMessageBox::question(qApp->activeWindow(), tr("Login failed"),
diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp
index 271c621b..e967b27c 100644
--- a/src/selfupdater.cpp
+++ b/src/selfupdater.cpp
@@ -130,7 +130,7 @@ void SelfUpdater::testForUpdate()
m_GitHub.releases(GitHub::Repository("Modorganizer2", "modorganizer"),
[this](const QJsonArray &releases) {
if (releases.isEmpty()) {
- qDebug("Unable to connect to github.com to check version");
+ // error message already logged
return;
}
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index df957f87..0dae31ac 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -55,6 +55,7 @@ public:
: QDialog(parent), ui(new Ui::NexusManualKeyDialog)
{
ui->setupUi(this);
+ ui->key->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
connect(ui->openBrowser, &QPushButton::clicked, [&]{ openBrowser(); });
connect(ui->paste, &QPushButton::clicked, [&]{ paste(); });
@@ -111,7 +112,7 @@ SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* setti
QKeySequence(Qt::Key_Delete), ui->pluginBlacklist);
connect(delShortcut, SIGNAL(activated()), this, SLOT(deleteBlacklistItem()));
- updateNexusButtons();
+ updateNexusState();
}
SettingsDialog::~SettingsDialog()
@@ -399,7 +400,7 @@ void SettingsDialog::on_nexusConnect_clicked()
ui->nexusLog->clear();
m_nexusLogin->start();
- updateNexusButtons();
+ updateNexusState();
}
void SettingsDialog::on_nexusManualKey_clicked()
@@ -421,8 +422,18 @@ void SettingsDialog::on_nexusManualKey_clicked()
}
ui->nexusLog->clear();
- ui->nexusLog->addItem(tr("Checking API key..."));
+ validateKey(key);
+}
+
+void SettingsDialog::on_nexusDisconnect_clicked()
+{
+ clearKey();
+ ui->nexusLog->clear();
+ addNexusLog(tr("Disconnected."));
+}
+void SettingsDialog::validateKey(const QString& key)
+{
if (!m_nexusValidator) {
m_nexusValidator.reset(new NexusKeyValidator(
*NexusInterface::instance(m_PluginContainer)->getAccessManager()));
@@ -436,6 +447,7 @@ void SettingsDialog::on_nexusManualKey_clicked()
};
}
+ addNexusLog(tr("Checking API key..."));
m_nexusValidator->start(key);
}
@@ -444,45 +456,62 @@ void SettingsDialog::onSSOKeyChanged(const QString& key)
if (key.isEmpty()) {
clearKey();
} else {
- setKey(key);
+ addNexusLog(tr("Received API key."));
+ validateKey(key);
}
}
void SettingsDialog::onSSOStateChanged(NexusSSOLogin::States s, const QString& e)
{
- const auto log = NexusSSOLogin::stateToString(s, e);
+ if (s != NexusSSOLogin::Finished) {
+ // finished state is handled in onSSOKeyChanged()
+ const auto log = NexusSSOLogin::stateToString(s, e);
- for (auto&& line : log.split("\n")) {
- ui->nexusLog->addItem(line);
+ for (auto&& line : log.split("\n")) {
+ addNexusLog(line);
+ }
}
- updateNexusButtons();
+ updateNexusState();
}
void SettingsDialog::onValidatorStateChanged(
NexusKeyValidator::States s, const QString& e)
{
- const auto log = NexusKeyValidator::stateToString(s, e);
+ if (s != NexusKeyValidator::Finished) {
+ // finished state is handled in onValidatorFinished()
+ const auto log = NexusKeyValidator::stateToString(s, e);
- for (auto&& line : log.split("\n")) {
- ui->nexusLog->addItem(line);
+ for (auto&& line : log.split("\n")) {
+ addNexusLog(line);
+ }
}
- updateNexusButtons();
+ updateNexusState();
}
void SettingsDialog::onValidatorFinished(const APIUserAccount& user)
{
+ NexusInterface::instance(m_PluginContainer)->setUserAccount(user);
+
if (!user.apiKey().isEmpty()) {
- setKey(user.apiKey());
+ if (setKey(user.apiKey())) {
+ addNexusLog(tr("Linked with Nexus successfully."));
+ }
}
}
+void SettingsDialog::addNexusLog(const QString& s)
+{
+ ui->nexusLog->addItem(s);
+ ui->nexusLog->scrollToBottom();
+}
+
bool SettingsDialog::setKey(const QString& key)
{
m_keyChanged = true;
const bool ret = m_settings->setNexusApiKey(key);
- updateNexusButtons();
+ updateNexusState();
return ret;
}
@@ -490,13 +519,19 @@ bool SettingsDialog::clearKey()
{
m_keyChanged = true;
const auto ret = m_settings->clearNexusApiKey();
- updateNexusButtons();
NexusInterface::instance(m_PluginContainer)->getAccessManager()->clearApiKey();
+ updateNexusState();
return ret;
}
+void SettingsDialog::updateNexusState()
+{
+ updateNexusButtons();
+ updateNexusData();
+}
+
void SettingsDialog::updateNexusButtons()
{
if (m_nexusLogin && m_nexusLogin->isActive()) {
@@ -532,6 +567,32 @@ void SettingsDialog::updateNexusButtons()
}
}
+void SettingsDialog::updateNexusData()
+{
+ const auto user = NexusInterface::instance(m_PluginContainer)
+ ->getAPIUserAccount();
+
+ if (user.isValid()) {
+ ui->nexusUserID->setText(user.id());
+ ui->nexusName->setText(user.name());
+ ui->nexusAccount->setText(localizedUserAccountType(user.type()));
+
+ ui->nexusDailyRequests->setText(QString("%1/%2")
+ .arg(user.limits().remainingDailyRequests)
+ .arg(user.limits().maxDailyRequests));
+
+ ui->nexusHourlyRequests->setText(QString("%1/%2")
+ .arg(user.limits().remainingHourlyRequests)
+ .arg(user.limits().maxHourlyRequests));
+ } else {
+ ui->nexusUserID->setText(tr("N/A"));
+ ui->nexusName->setText(tr("N/A"));
+ ui->nexusAccount->setText(tr("N/A"));
+ ui->nexusDailyRequests->setText(tr("N/A"));
+ ui->nexusHourlyRequests->setText(tr("N/A"));
+ }
+}
+
void SettingsDialog::storeSettings(QListWidgetItem *pluginItem)
{
if (pluginItem != nullptr) {
@@ -599,13 +660,6 @@ void SettingsDialog::on_clearCacheButton_clicked()
NexusInterface::instance(m_PluginContainer)->clearCache();
}
-void SettingsDialog::on_nexusDisconnect_clicked()
-{
- clearKey();
- ui->nexusLog->clear();
- ui->nexusLog->addItem(tr("Disconnected."));
-}
-
void SettingsDialog::normalizePath(QLineEdit *lineEdit)
{
QString text = lineEdit->text();
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index 1741fc13..c5f487fd 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -145,15 +145,21 @@ private:
std::unique_ptr m_nexusLogin;
std::unique_ptr m_nexusValidator;
+ void validateKey(const QString& key);
bool setKey(const QString& key);
bool clearKey();
+
+ void updateNexusState();
void updateNexusButtons();
+ void updateNexusData();
void onSSOKeyChanged(const QString& key);
void onSSOStateChanged(NexusSSOLogin::States s, const QString& e);
void onValidatorStateChanged(NexusKeyValidator::States s, const QString& e);
void onValidatorFinished(const APIUserAccount& user);
+
+ void addNexusLog(const QString& s);
};
#endif // SETTINGSDIALOG_H
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index dfbde943..fccc8be0 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -451,103 +451,7 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
Nexus
-
- -
-
-
- Nexus Connection
-
-
-
-
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- Connect to Nexus
-
-
-
- -
-
-
- Manually enter the API key and try to login
-
-
- Enter API Key Manually
-
-
-
- -
-
-
- Clear the stored Nexus API key and force reauthorization.
-
-
- Disconnect from Nexus
-
-
-
- :/MO/gui/edit_clear:/MO/gui/edit_clear
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 0
- 0
-
-
-
-
-
-
-
- -
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- QAbstractScrollArea::AdjustToContents
-
-
-
-
-
-
-
-
-
+
-
@@ -569,10 +473,13 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
Nexus Account
+
+ 10
+
-
- User ID
+ User ID:
Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
@@ -589,21 +496,21 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
-
- Username
+ Name:
-
-
+
- username
+ name
-
- Account
+ Account:
@@ -623,17 +530,27 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
Statistics
+
+ 10
+
-
- Daily requests
+ Daily requests:
+
+
+
+ -
+
+
+ daily requests
-
- Hourly requests
+ Hourly requests:
@@ -644,24 +561,99 @@ If you use pre-releases, never contact me directly by e-mail or via private mess
- -
-
+
+
+
+
+
+
+ -
+
+
+ Nexus Connection
+
+
+
-
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
- Requests queued
+ Connect to Nexus
- -
-
+
-
+
+
+ Manually enter the API key and try to login
+
- queued
+ Enter API Key Manually
- -
-
+
-
+
+
+ Clear the stored Nexus API key and force reauthorization.
+
- daily requests
+ Disconnect from Nexus
+
+
+
+ :/MO/gui/edit_clear:/MO/gui/edit_clear
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ QAbstractScrollArea::AdjustToContents
--
cgit v1.3.1
From 6b5c9675ae1e8b343dcbc9192d43c63e482a30bd Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Sat, 20 Jul 2019 08:43:46 -0400
Subject: moved SettingsTab out of Settings split general tab
---
src/CMakeLists.txt | 3 +
src/settings.cpp | 204 ++++---------------------------
src/settings.h | 65 ++++------
src/settingsdialog.cpp | 105 ----------------
src/settingsdialog.h | 63 +++-------
src/settingsdialoggeneral.cpp | 274 ++++++++++++++++++++++++++++++++++++++++++
src/settingsdialoggeneral.h | 53 ++++++++
7 files changed, 392 insertions(+), 375 deletions(-)
create mode 100644 src/settingsdialoggeneral.cpp
create mode 100644 src/settingsdialoggeneral.h
(limited to 'src/settingsdialog.cpp')
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9785dc3d..29c419b5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -37,6 +37,7 @@ SET(organizer_SRCS
spawn.cpp
singleinstance.cpp
settingsdialog.cpp
+ settingsdialoggeneral.cpp
settings.cpp
selfupdater.cpp
selectiondialog.cpp
@@ -151,6 +152,7 @@ SET(organizer_HDRS
spawn.h
singleinstance.h
settingsdialog.h
+ settingsdialoggeneral.h
settings.h
selfupdater.h
selectiondialog.h
@@ -431,6 +433,7 @@ set(profiles
set(settings
settings
settingsdialog
+ settingsdialoggeneral
)
set(utilities
diff --git a/src/settings.cpp b/src/settings.cpp
index 5ad066b2..0911b155 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -22,6 +22,7 @@ along with Mod Organizer. If not, see .
#include "pluginsetting.h"
#include "serverinfo.h"
#include "settingsdialog.h"
+#include "settingsdialoggeneral.h"
#include "versioninfo.h"
#include "appconfig.h"
#include "organizercore.h"
@@ -81,6 +82,23 @@ private:
};
+SettingsTab::SettingsTab(Settings *m_parent, SettingsDialog &m_dialog)
+ : m_parent(m_parent)
+ , m_Settings(m_parent->settingsRef())
+ , m_dialog(m_dialog)
+ , ui(m_dialog.ui)
+{
+}
+
+SettingsTab::~SettingsTab()
+{}
+
+QWidget* SettingsTab::parentWidget()
+{
+ return &m_dialog;
+}
+
+
Settings *Settings::s_Instance = nullptr;
@@ -663,63 +681,9 @@ void Settings::writePluginBlacklist()
m_Settings.endArray();
}
-void Settings::addLanguages(QComboBox *languageBox)
-{
- std::vector> languages;
-
- QDirIterator langIter(QCoreApplication::applicationDirPath() + "/translations", QDir::Files);
- QString pattern = ToQString(AppConfig::translationPrefix()) + "_([a-z]{2,3}(_[A-Z]{2,2})?).qm";
- QRegExp exp(pattern);
- while (langIter.hasNext()) {
- langIter.next();
- QString file = langIter.fileName();
- if (exp.exactMatch(file)) {
- QString languageCode = exp.cap(1);
- QLocale locale(languageCode);
- QString languageString = QString("%1 (%2)").arg(locale.nativeLanguageName()).arg(locale.nativeCountryName()); //QLocale::languageToString(locale.language());
- if (locale.language() == QLocale::Chinese) {
- if (languageCode == "zh_TW") {
- languageString = "Chinese (traditional)";
- } else {
- languageString = "Chinese (simplified)";
- }
- }
- languages.push_back(std::make_pair(QString("%1").arg(languageString), exp.cap(1)));
- //languageBox->addItem(QString("%1").arg(languageString), exp.cap(1));
- }
- }
- if (!languageBox->findText("English")) {
- languages.push_back(std::make_pair(QString("English"), QString("en_US")));
- //languageBox->addItem("English", "en_US");
- }
- std::sort(languages.begin(), languages.end());
- for (const auto &lang : languages) {
- languageBox->addItem(lang.first, lang.second);
- }
-}
-
-void Settings::addStyles(QComboBox *styleBox)
-{
- styleBox->addItem("None", "");
- styleBox->addItem("Fusion", "Fusion");
-
- QDirIterator langIter(QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::stylesheetsPath()), QStringList("*.qss"), QDir::Files);
- while (langIter.hasNext()) {
- langIter.next();
- QString style = langIter.fileName();
- styleBox->addItem(style, style);
- }
-}
-
-void Settings::resetDialogs()
-{
- QuestionBoxMemory::resetDialogs();
-}
-
void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
{
SettingsDialog dialog(pluginContainer, this, parent);
- connect(&dialog, SIGNAL(resetDialogs()), this, SLOT(resetDialogs()));
std::vector> tabs;
@@ -787,128 +751,6 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
}
-Settings::SettingsTab::SettingsTab(Settings *m_parent, SettingsDialog &m_dialog)
- : m_parent(m_parent)
- , m_Settings(m_parent->m_Settings)
- , m_dialog(m_dialog)
-{
-}
-
-Settings::SettingsTab::~SettingsTab()
-{}
-
-Settings::GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog)
- : Settings::SettingsTab(m_parent, m_dialog)
- , m_languageBox(m_dialog.findChild("languageBox"))
- , m_styleBox(m_dialog.findChild("styleBox"))
- , m_compactBox(m_dialog.findChild("compactBox"))
- , m_showMetaBox(m_dialog.findChild("showMetaBox"))
- , m_usePrereleaseBox(m_dialog.findChild("usePrereleaseBox"))
- , m_overwritingBtn(m_dialog.findChild("overwritingBtn"))
- , m_overwrittenBtn(m_dialog.findChild("overwrittenBtn"))
- , m_overwritingArchiveBtn(m_dialog.findChild("overwritingArchiveBtn"))
- , m_overwrittenArchiveBtn(m_dialog.findChild("overwrittenArchiveBtn"))
- , m_containsBtn(m_dialog.findChild("containsBtn"))
- , m_containedBtn(m_dialog.findChild("containedBtn"))
- , m_colorSeparatorsBox(m_dialog.findChild("colorSeparatorsBox"))
-{
- // FIXME I think 'addLanguages' lives in here not in parent
- m_parent->addLanguages(m_languageBox);
- {
- QString languageCode = m_parent->language();
- int currentID = m_languageBox->findData(languageCode);
- // I made a mess. :( Most languages are stored with only the iso country
- // code (2 characters like "de") but chinese
- // with the exact language variant (zh_TW) so I have to search for both
- // variants
- if (currentID == -1) {
- currentID = m_languageBox->findData(languageCode.mid(0, 2));
- }
- if (currentID != -1) {
- m_languageBox->setCurrentIndex(currentID);
- }
- }
-
- // FIXME I think addStyles lives in here not in parent
- m_parent->addStyles(m_styleBox);
- {
- int currentID = m_styleBox->findData(
- m_Settings.value("Settings/style", "").toString());
- if (currentID != -1) {
- m_styleBox->setCurrentIndex(currentID);
- }
- }
- /* verision using palette only works with fusion theme for some stupid reason...
- m_overwritingBtn->setAutoFillBackground(true);
- m_overwrittenBtn->setAutoFillBackground(true);
- m_containsBtn->setAutoFillBackground(true);
- m_containedBtn->setAutoFillBackground(true);
- m_overwritingBtn->setPalette(QPalette(m_parent->modlistOverwritingLooseColor()));
- m_overwrittenBtn->setPalette(QPalette(m_parent->modlistOverwrittenLooseColor()));
- m_containsBtn->setPalette(QPalette(m_parent->modlistContainsPluginColor()));
- m_containedBtn->setPalette(QPalette(m_parent->pluginListContainedColor()));
- QPalette palette1 = m_overwritingBtn->palette();
- QPalette palette2 = m_overwrittenBtn->palette();
- QPalette palette3 = m_containsBtn->palette();
- QPalette palette4 = m_containedBtn->palette();
- palette1.setColor(QPalette::Background, m_parent->modlistOverwritingLooseColor());
- palette2.setColor(QPalette::Background, m_parent->modlistOverwrittenLooseColor());
- palette3.setColor(QPalette::Background, m_parent->modlistContainsPluginColor());
- palette4.setColor(QPalette::Background, m_parent->pluginListContainedColor());
- m_overwritingBtn->setPalette(palette1);
- m_overwrittenBtn->setPalette(palette2);
- m_containsBtn->setPalette(palette3);
- m_containedBtn->setPalette(palette4);
- */
-
- //version with stylesheet
- m_dialog.setButtonColor(m_overwritingBtn, m_parent->modlistOverwritingLooseColor());
- m_dialog.setButtonColor(m_overwrittenBtn, m_parent->modlistOverwrittenLooseColor());
- m_dialog.setButtonColor(m_overwritingArchiveBtn, m_parent->modlistOverwritingArchiveColor());
- m_dialog.setButtonColor(m_overwrittenArchiveBtn, m_parent->modlistOverwrittenArchiveColor());
- m_dialog.setButtonColor(m_containsBtn, m_parent->modlistContainsPluginColor());
- m_dialog.setButtonColor(m_containedBtn, m_parent->pluginListContainedColor());
-
- m_dialog.setOverwritingColor(m_parent->modlistOverwritingLooseColor());
- m_dialog.setOverwrittenColor(m_parent->modlistOverwrittenLooseColor());
- m_dialog.setOverwritingArchiveColor(m_parent->modlistOverwritingArchiveColor());
- m_dialog.setOverwrittenArchiveColor(m_parent->modlistOverwrittenArchiveColor());
- m_dialog.setContainsColor(m_parent->modlistContainsPluginColor());
- m_dialog.setContainedColor(m_parent->pluginListContainedColor());
-
- m_compactBox->setChecked(m_parent->compactDownloads());
- m_showMetaBox->setChecked(m_parent->metaDownloads());
- m_usePrereleaseBox->setChecked(m_parent->usePrereleases());
- m_colorSeparatorsBox->setChecked(m_parent->colorSeparatorScrollbar());
-}
-
-void Settings::GeneralTab::update()
-{
- QString oldLanguage = m_parent->language();
- QString newLanguage = m_languageBox->itemData(m_languageBox->currentIndex()).toString();
- if (newLanguage != oldLanguage) {
- m_Settings.setValue("Settings/language", newLanguage);
- emit m_parent->languageChanged(newLanguage);
- }
-
- QString oldStyle = m_Settings.value("Settings/style", "").toString();
- QString newStyle = m_styleBox->itemData(m_styleBox->currentIndex()).toString();
- if (oldStyle != newStyle) {
- m_Settings.setValue("Settings/style", newStyle);
- emit m_parent->styleChanged(newStyle);
- }
-
- m_Settings.setValue("Settings/overwritingLooseFilesColor", m_dialog.getOverwritingColor());
- m_Settings.setValue("Settings/overwrittenLooseFilesColor", m_dialog.getOverwrittenColor());
- m_Settings.setValue("Settings/overwritingArchiveFilesColor", m_dialog.getOverwritingArchiveColor());
- m_Settings.setValue("Settings/overwrittenArchiveFilesColor", m_dialog.getOverwrittenArchiveColor());
- m_Settings.setValue("Settings/containsPluginColor", m_dialog.getContainsColor());
- m_Settings.setValue("Settings/containedColor", m_dialog.getContainedColor());
- m_Settings.setValue("Settings/compact_downloads", m_compactBox->isChecked());
- m_Settings.setValue("Settings/meta_downloads", m_showMetaBox->isChecked());
- m_Settings.setValue("Settings/use_prereleases", m_usePrereleaseBox->isChecked());
- m_Settings.setValue("Settings/colorSeparatorScrollbars", m_colorSeparatorsBox->isChecked());
-}
Settings::PathsTab::PathsTab(Settings *parent, SettingsDialog &dialog)
: SettingsTab(parent, dialog)
@@ -991,7 +833,7 @@ void Settings::PathsTab::update()
}
Settings::DiagnosticsTab::DiagnosticsTab(Settings *m_parent, SettingsDialog &m_dialog)
- : Settings::SettingsTab(m_parent, m_dialog)
+ : SettingsTab(m_parent, m_dialog)
, m_logLevelBox(m_dialog.findChild("logLevelBox"))
, m_dumpsTypeBox(m_dialog.findChild("dumpsTypeBox"))
, m_dumpsMaxEdit(m_dialog.findChild("dumpsMaxEdit"))
@@ -1036,7 +878,7 @@ void Settings::DiagnosticsTab::setLevelsBox()
}
Settings::NexusTab::NexusTab(Settings *parent, SettingsDialog &dialog)
- : Settings::SettingsTab(parent, dialog)
+ : SettingsTab(parent, dialog)
, m_offlineBox(dialog.findChild("offlineBox"))
, m_proxyBox(dialog.findChild("proxyBox"))
, m_knownServersList(dialog.findChild("knownServersList"))
@@ -1114,7 +956,7 @@ void Settings::NexusTab::update()
}
Settings::SteamTab::SteamTab(Settings *m_parent, SettingsDialog &m_dialog)
- : Settings::SettingsTab(m_parent, m_dialog)
+ : SettingsTab(m_parent, m_dialog)
, m_steamUserEdit(m_dialog.findChild("steamUserEdit"))
, m_steamPassEdit(m_dialog.findChild("steamPassEdit"))
{
@@ -1134,7 +976,7 @@ void Settings::SteamTab::update()
}
Settings::PluginsTab::PluginsTab(Settings *m_parent, SettingsDialog &m_dialog)
- : Settings::SettingsTab(m_parent, m_dialog)
+ : SettingsTab(m_parent, m_dialog)
, m_pluginsList(m_dialog.findChild("pluginsList"))
, m_pluginBlacklistList(m_dialog.findChild("pluginBlacklist"))
{
@@ -1181,7 +1023,7 @@ void Settings::PluginsTab::update()
Settings::WorkaroundsTab::WorkaroundsTab(Settings *m_parent,
SettingsDialog &m_dialog)
- : Settings::SettingsTab(m_parent, m_dialog)
+ : SettingsTab(m_parent, m_dialog)
, m_appIDEdit(m_dialog.findChild("appIDEdit"))
, m_mechanismBox(m_dialog.findChild("mechanismBox"))
, m_hideUncheckedBox(m_dialog.findChild("hideUncheckedBox"))
diff --git a/src/settings.h b/src/settings.h
index c66eb94c..e88080ba 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -55,8 +55,30 @@ namespace MOBase {
class IPluginGame;
}
+namespace Ui {
+ class SettingsDialog;
+}
+
class SettingsDialog;
class PluginContainer;
+class Settings;
+
+class SettingsTab
+{
+public:
+ SettingsTab(Settings *m_parent, SettingsDialog &m_dialog);
+ virtual ~SettingsTab();
+
+ virtual void update() = 0;
+
+protected:
+ Settings *m_parent;
+ QSettings &m_Settings;
+ SettingsDialog &m_dialog;
+ Ui::SettingsDialog* ui;
+
+ QWidget* parentWidget();
+};
/**
* manages the settings for Mod Organizer. The settings are not cached
@@ -404,6 +426,8 @@ public:
*/
bool colorSeparatorScrollbar() const;
+ QSettings& settingsRef() { return m_Settings; }
+
public slots:
void managedGameChanged(MOBase::IPluginGame const *gamePlugin);
@@ -414,49 +438,10 @@ private:
static bool obfuscate(const QString key, const QString data);
static QString deObfuscate(const QString key);
- void addLanguages(QComboBox *languageBox);
- void addStyles(QComboBox *styleBox);
void readPluginBlacklist();
void writePluginBlacklist();
QString getConfigurablePath(const QString &key, const QString &def, bool resolve) const;
- class SettingsTab
- {
- public:
- SettingsTab(Settings *m_parent, SettingsDialog &m_dialog);
- virtual ~SettingsTab();
-
- virtual void update() = 0;
-
- protected:
- Settings *m_parent;
- QSettings &m_Settings;
- SettingsDialog &m_dialog;
-
- };
-
- /** Display/store the configuration in the 'general' tab of the settings dialogue */
- class GeneralTab : public SettingsTab
- {
- public:
- GeneralTab(Settings *m_parent, SettingsDialog &m_dialog);
-
- void update();
-
- private:
- QComboBox *m_languageBox;
- QComboBox *m_styleBox;
- QCheckBox *m_compactBox;
- QCheckBox *m_showMetaBox;
- QCheckBox *m_usePrereleaseBox;
- QPushButton *m_overwritingBtn;
- QPushButton *m_overwrittenBtn;
- QPushButton *m_overwritingArchiveBtn;
- QPushButton *m_overwrittenArchiveBtn;
- QPushButton *m_containsBtn;
- QPushButton *m_containedBtn;
- QCheckBox *m_colorSeparatorsBox;
- };
class PathsTab : public SettingsTab
{
@@ -554,8 +539,6 @@ private:
private slots:
- void resetDialogs();
-
signals:
void languageChanged(const QString &newLanguage);
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 0dae31ac..f922cfb9 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -131,23 +131,6 @@ QString SettingsDialog::getColoredButtonStyleSheet() const
"}");
}
-void SettingsDialog::setButtonColor(QPushButton *button, const QColor &color)
-{
- button->setStyleSheet(
- QString("QPushButton {"
- "background-color: rgba(%1, %2, %3, %4);"
- "color: %5;"
- "border: 1px solid;"
- "padding: 3px;"
- "}")
- .arg(color.red())
- .arg(color.green())
- .arg(color.blue())
- .arg(color.alpha())
- .arg(Settings::getIdealTextColor(color).name())
- );
-};
-
void SettingsDialog::accept()
{
QString newModPath = ui->modDirEdit->text();
@@ -181,14 +164,6 @@ bool SettingsDialog::getApiKeyChanged()
return m_keyChanged;
}
-void SettingsDialog::on_categoriesBtn_clicked()
-{
- CategoriesDialog dialog(this);
- if (dialog.exec() == QDialog::Accepted) {
- dialog.commitChanges();
- }
-}
-
void SettingsDialog::on_execBlacklistBtn_clicked()
{
bool ok = false;
@@ -299,86 +274,6 @@ void SettingsDialog::on_browseGameDirBtn_clicked()
}
}
-void SettingsDialog::on_containsBtn_clicked()
-{
- QColor result = QColorDialog::getColor(m_ContainsColor, this, "Color Picker: Mod contains selected plugin", QColorDialog::ShowAlphaChannel);
- if (result.isValid()) {
- m_ContainsColor = result;
- setButtonColor(ui->containsBtn, result);
- }
-}
-
-void SettingsDialog::on_containedBtn_clicked()
-{
- QColor result = QColorDialog::getColor(m_ContainedColor, this, "ColorPicker: Plugin is Contained in selected Mod", QColorDialog::ShowAlphaChannel);
- if (result.isValid()) {
- m_ContainedColor = result;
- setButtonColor(ui->containedBtn, result);
- }
-}
-
-void SettingsDialog::on_overwrittenBtn_clicked()
-{
- QColor result = QColorDialog::getColor(m_OverwrittenColor, this, "ColorPicker: Is overwritten (loose files)", QColorDialog::ShowAlphaChannel);
- if (result.isValid()) {
- m_OverwrittenColor = result;
- setButtonColor(ui->overwrittenBtn, result);
- }
-}
-
-void SettingsDialog::on_overwritingBtn_clicked()
-{
- QColor result = QColorDialog::getColor(m_OverwritingColor, this, "ColorPicker: Is overwriting (loose files)", QColorDialog::ShowAlphaChannel);
- if (result.isValid()) {
- m_OverwritingColor = result;
- setButtonColor(ui->overwritingBtn, result);
- }
-}
-
-void SettingsDialog::on_overwrittenArchiveBtn_clicked()
-{
- QColor result = QColorDialog::getColor(m_OverwrittenArchiveColor, this, "ColorPicker: Is overwritten (archive files)", QColorDialog::ShowAlphaChannel);
- if (result.isValid()) {
- m_OverwrittenArchiveColor = result;
- setButtonColor(ui->overwrittenArchiveBtn, result);
- }
-}
-
-void SettingsDialog::on_overwritingArchiveBtn_clicked()
-{
- QColor result = QColorDialog::getColor(m_OverwritingArchiveColor, this, "ColorPicker: Is overwriting (archive files)", QColorDialog::ShowAlphaChannel);
- if (result.isValid()) {
- m_OverwritingArchiveColor = result;
- setButtonColor(ui->overwritingArchiveBtn, result);
- }
-}
-
-void SettingsDialog::on_resetColorsBtn_clicked()
-{
- m_OverwritingColor = QColor(255, 0, 0, 64);
- m_OverwrittenColor = QColor(0, 255, 0, 64);
- m_OverwritingArchiveColor = QColor(255, 0, 255, 64);
- m_OverwrittenArchiveColor = QColor(0, 255, 255, 64);
- m_ContainsColor = QColor(0, 0, 255, 64);
- m_ContainedColor = QColor(0, 0, 255, 64);
-
- setButtonColor(ui->overwritingBtn, m_OverwritingColor);
- setButtonColor(ui->overwrittenBtn, m_OverwrittenColor);
- setButtonColor(ui->overwritingArchiveBtn, m_OverwritingArchiveColor);
- setButtonColor(ui->overwrittenArchiveBtn, m_OverwrittenArchiveColor);
- setButtonColor(ui->containsBtn, m_ContainsColor);
- setButtonColor(ui->containedBtn, m_ContainedColor);
-}
-
-void SettingsDialog::on_resetDialogsButton_clicked()
-{
- if (QMessageBox::question(this, tr("Confirm?"),
- tr("This will make all dialogs show up again where you checked the \"Remember selection\"-box. Continue?"),
- QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
- emit resetDialogs();
- }
-}
-
void SettingsDialog::on_nexusConnect_clicked()
{
if (m_nexusLogin && m_nexusLogin->isActive()) {
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index c5f487fd..01a0afa2 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -54,7 +54,7 @@ public:
*/
QString getColoredButtonStyleSheet() const;
- void setButtonColor(QPushButton *button, const QColor &color);
+ Ui::SettingsDialog *ui;
public slots:
@@ -62,7 +62,6 @@ public slots:
signals:
- void resetDialogs();
void retryApiConnection();
private:
@@ -71,73 +70,41 @@ private:
void normalizePath(QLineEdit *lineEdit);
public:
-
- QColor getOverwritingColor() { return m_OverwritingColor; }
- QColor getOverwrittenColor() { return m_OverwrittenColor; }
- QColor getOverwritingArchiveColor() { return m_OverwritingArchiveColor; }
- QColor getOverwrittenArchiveColor() { return m_OverwrittenArchiveColor; }
- QColor getContainsColor() { return m_ContainsColor; }
- QColor getContainedColor() { return m_ContainedColor; }
QString getExecutableBlacklist() { return m_ExecutableBlacklist; }
+ void setExecutableBlacklist(QString blacklist) { m_ExecutableBlacklist = blacklist; }
bool getResetGeometries();
bool getApiKeyChanged();
- void setOverwritingColor(QColor col) { m_OverwritingColor = col; }
- void setOverwrittenColor(QColor col) { m_OverwrittenColor = col; }
- void setOverwritingArchiveColor(QColor col) { m_OverwritingArchiveColor = col; }
- void setOverwrittenArchiveColor(QColor col) { m_OverwrittenArchiveColor = col; }
- void setContainsColor(QColor col) { m_ContainsColor = col; }
- void setContainedColor(QColor col) { m_ContainedColor = col; }
- void setExecutableBlacklist(QString blacklist) { m_ExecutableBlacklist = blacklist; }
-
-
private slots:
- void on_categoriesBtn_clicked();
- void on_execBlacklistBtn_clicked();
- void on_bsaDateBtn_clicked();
- void on_browseDownloadDirBtn_clicked();
- void on_browseModDirBtn_clicked();
- void on_browseCacheDirBtn_clicked();
- void on_resetDialogsButton_clicked();
- void on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
void on_associateButton_clicked();
- void on_clearCacheButton_clicked();
- void on_nexusDisconnect_clicked();
+ void on_baseDirEdit_editingFinished();
void on_browseBaseDirBtn_clicked();
+ void on_browseCacheDirBtn_clicked();
+ void on_browseDownloadDirBtn_clicked();
+ void on_browseGameDirBtn_clicked();
+ void on_browseModDirBtn_clicked();
void on_browseOverwriteDirBtn_clicked();
void on_browseProfilesDirBtn_clicked();
- void on_browseGameDirBtn_clicked();
- void on_overwritingBtn_clicked();
- void on_overwrittenBtn_clicked();
- void on_overwritingArchiveBtn_clicked();
- void on_overwrittenArchiveBtn_clicked();
- void on_containsBtn_clicked();
- void on_containedBtn_clicked();
- void on_resetColorsBtn_clicked();
- void on_baseDirEdit_editingFinished();
+ void on_bsaDateBtn_clicked();
+ void on_cacheDirEdit_editingFinished();
+ void on_clearCacheButton_clicked();
void on_downloadDirEdit_editingFinished();
+ void on_execBlacklistBtn_clicked();
void on_modDirEdit_editingFinished();
- void on_cacheDirEdit_editingFinished();
- void on_profilesDirEdit_editingFinished();
- void on_overwriteDirEdit_editingFinished();
void on_nexusConnect_clicked();
+ void on_nexusDisconnect_clicked();
void on_nexusManualKey_clicked();
+ void on_overwriteDirEdit_editingFinished();
+ void on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
+ void on_profilesDirEdit_editingFinished();
void on_resetGeometryBtn_clicked();
void deleteBlacklistItem();
private:
- Ui::SettingsDialog *ui;
Settings* m_settings;
PluginContainer *m_PluginContainer;
- QColor m_OverwritingColor;
- QColor m_OverwrittenColor;
- QColor m_OverwritingArchiveColor;
- QColor m_OverwrittenArchiveColor;
- QColor m_ContainsColor;
- QColor m_ContainedColor;
-
bool m_GeometriesReset;
bool m_keyChanged;
diff --git a/src/settingsdialoggeneral.cpp b/src/settingsdialoggeneral.cpp
new file mode 100644
index 00000000..b22b04fd
--- /dev/null
+++ b/src/settingsdialoggeneral.cpp
@@ -0,0 +1,274 @@
+#include "settingsdialoggeneral.h"
+#include "ui_settingsdialog.h"
+#include "appconfig.h"
+#include "categoriesdialog.h"
+#include
+
+using MOBase::QuestionBoxMemory;
+
+GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog)
+ : SettingsTab(m_parent, m_dialog)
+{
+ addLanguages();
+ {
+ QString languageCode = m_parent->language();
+ int currentID = ui->languageBox->findData(languageCode);
+ // I made a mess. :( Most languages are stored with only the iso country
+ // code (2 characters like "de") but chinese
+ // with the exact language variant (zh_TW) so I have to search for both
+ // variants
+ if (currentID == -1) {
+ currentID = ui->languageBox->findData(languageCode.mid(0, 2));
+ }
+ if (currentID != -1) {
+ ui->languageBox->setCurrentIndex(currentID);
+ }
+ }
+
+ addStyles();
+ {
+ int currentID = ui->styleBox->findData(
+ m_Settings.value("Settings/style", "").toString());
+ if (currentID != -1) {
+ ui->styleBox->setCurrentIndex(currentID);
+ }
+ }
+ /* verision using palette only works with fusion theme for some stupid reason...
+ m_overwritingBtn->setAutoFillBackground(true);
+ m_overwrittenBtn->setAutoFillBackground(true);
+ m_containsBtn->setAutoFillBackground(true);
+ m_containedBtn->setAutoFillBackground(true);
+ m_overwritingBtn->setPalette(QPalette(m_parent->modlistOverwritingLooseColor()));
+ m_overwrittenBtn->setPalette(QPalette(m_parent->modlistOverwrittenLooseColor()));
+ m_containsBtn->setPalette(QPalette(m_parent->modlistContainsPluginColor()));
+ m_containedBtn->setPalette(QPalette(m_parent->pluginListContainedColor()));
+ QPalette palette1 = m_overwritingBtn->palette();
+ QPalette palette2 = m_overwrittenBtn->palette();
+ QPalette palette3 = m_containsBtn->palette();
+ QPalette palette4 = m_containedBtn->palette();
+ palette1.setColor(QPalette::Background, m_parent->modlistOverwritingLooseColor());
+ palette2.setColor(QPalette::Background, m_parent->modlistOverwrittenLooseColor());
+ palette3.setColor(QPalette::Background, m_parent->modlistContainsPluginColor());
+ palette4.setColor(QPalette::Background, m_parent->pluginListContainedColor());
+ m_overwritingBtn->setPalette(palette1);
+ m_overwrittenBtn->setPalette(palette2);
+ m_containsBtn->setPalette(palette3);
+ m_containedBtn->setPalette(palette4);
+ */
+
+ //version with stylesheet
+ setButtonColor(ui->overwritingBtn, m_parent->modlistOverwritingLooseColor());
+ setButtonColor(ui->overwrittenBtn, m_parent->modlistOverwrittenLooseColor());
+ setButtonColor(ui->overwritingArchiveBtn, m_parent->modlistOverwritingArchiveColor());
+ setButtonColor(ui->overwrittenArchiveBtn, m_parent->modlistOverwrittenArchiveColor());
+ setButtonColor(ui->containsBtn, m_parent->modlistContainsPluginColor());
+ setButtonColor(ui->containedBtn, m_parent->pluginListContainedColor());
+
+ setOverwritingColor(m_parent->modlistOverwritingLooseColor());
+ setOverwrittenColor(m_parent->modlistOverwrittenLooseColor());
+ setOverwritingArchiveColor(m_parent->modlistOverwritingArchiveColor());
+ setOverwrittenArchiveColor(m_parent->modlistOverwrittenArchiveColor());
+ setContainsColor(m_parent->modlistContainsPluginColor());
+ setContainedColor(m_parent->pluginListContainedColor());
+
+ ui->compactBox->setChecked(m_parent->compactDownloads());
+ ui->showMetaBox->setChecked(m_parent->metaDownloads());
+ ui->usePrereleaseBox->setChecked(m_parent->usePrereleases());
+ ui->colorSeparatorsBox->setChecked(m_parent->colorSeparatorScrollbar());
+
+ QObject::connect(ui->overwritingArchiveBtn, &QPushButton::clicked, [&]{ on_overwritingArchiveBtn_clicked(); });
+ QObject::connect(ui->overwritingBtn, &QPushButton::clicked, [&]{ on_overwritingBtn_clicked(); });
+ QObject::connect(ui->overwrittenArchiveBtn, &QPushButton::clicked, [&]{ on_overwrittenArchiveBtn_clicked(); });
+ QObject::connect(ui->overwrittenBtn, &QPushButton::clicked, [&]{ on_overwrittenBtn_clicked(); });
+ QObject::connect(ui->containedBtn, &QPushButton::clicked, [&]{ on_containedBtn_clicked(); });
+ QObject::connect(ui->containsBtn, &QPushButton::clicked, [&]{ on_containsBtn_clicked(); });
+ QObject::connect(ui->categoriesBtn, &QPushButton::clicked, [&]{ on_categoriesBtn_clicked(); });
+ QObject::connect(ui->resetColorsBtn, &QPushButton::clicked, [&]{ on_resetColorsBtn_clicked(); });
+ QObject::connect(ui->resetDialogsButton, &QPushButton::clicked, [&]{ on_resetDialogsButton_clicked(); });
+}
+
+void GeneralTab::update()
+{
+ QString oldLanguage = m_parent->language();
+ QString newLanguage = ui->languageBox->itemData(ui->languageBox->currentIndex()).toString();
+ if (newLanguage != oldLanguage) {
+ m_Settings.setValue("Settings/language", newLanguage);
+ emit m_parent->languageChanged(newLanguage);
+ }
+
+ QString oldStyle = m_Settings.value("Settings/style", "").toString();
+ QString newStyle = ui->styleBox->itemData(ui->styleBox->currentIndex()).toString();
+ if (oldStyle != newStyle) {
+ m_Settings.setValue("Settings/style", newStyle);
+ emit m_parent->styleChanged(newStyle);
+ }
+
+ m_Settings.setValue("Settings/overwritingLooseFilesColor", getOverwritingColor());
+ m_Settings.setValue("Settings/overwrittenLooseFilesColor", getOverwrittenColor());
+ m_Settings.setValue("Settings/overwritingArchiveFilesColor", getOverwritingArchiveColor());
+ m_Settings.setValue("Settings/overwrittenArchiveFilesColor", getOverwrittenArchiveColor());
+ m_Settings.setValue("Settings/containsPluginColor", getContainsColor());
+ m_Settings.setValue("Settings/containedColor", getContainedColor());
+ m_Settings.setValue("Settings/compact_downloads", ui->compactBox->isChecked());
+ m_Settings.setValue("Settings/meta_downloads", ui->showMetaBox->isChecked());
+ m_Settings.setValue("Settings/use_prereleases", ui->usePrereleaseBox->isChecked());
+ m_Settings.setValue("Settings/colorSeparatorScrollbars", ui->colorSeparatorsBox->isChecked());
+}
+
+void GeneralTab::addLanguages()
+{
+ std::vector> languages;
+
+ QDirIterator langIter(QCoreApplication::applicationDirPath() + "/translations", QDir::Files);
+ QString pattern = QString::fromStdWString(AppConfig::translationPrefix()) + "_([a-z]{2,3}(_[A-Z]{2,2})?).qm";
+ QRegExp exp(pattern);
+ while (langIter.hasNext()) {
+ langIter.next();
+ QString file = langIter.fileName();
+ if (exp.exactMatch(file)) {
+ QString languageCode = exp.cap(1);
+ QLocale locale(languageCode);
+ QString languageString = QString("%1 (%2)").arg(locale.nativeLanguageName()).arg(locale.nativeCountryName()); //QLocale::languageToString(locale.language());
+ if (locale.language() == QLocale::Chinese) {
+ if (languageCode == "zh_TW") {
+ languageString = "Chinese (traditional)";
+ } else {
+ languageString = "Chinese (simplified)";
+ }
+ }
+ languages.push_back(std::make_pair(QString("%1").arg(languageString), exp.cap(1)));
+ //languageBox->addItem(QString("%1").arg(languageString), exp.cap(1));
+ }
+ }
+ if (!ui->languageBox->findText("English")) {
+ languages.push_back(std::make_pair(QString("English"), QString("en_US")));
+ //languageBox->addItem("English", "en_US");
+ }
+ std::sort(languages.begin(), languages.end());
+ for (const auto &lang : languages) {
+ ui->languageBox->addItem(lang.first, lang.second);
+ }
+}
+
+void GeneralTab::addStyles()
+{
+ ui->styleBox->addItem("None", "");
+ ui->styleBox->addItem("Fusion", "Fusion");
+
+ QDirIterator langIter(QCoreApplication::applicationDirPath() + "/" + QString::fromStdWString(AppConfig::stylesheetsPath()), QStringList("*.qss"), QDir::Files);
+ while (langIter.hasNext()) {
+ langIter.next();
+ QString style = langIter.fileName();
+ ui->styleBox->addItem(style, style);
+ }
+}
+
+void GeneralTab::resetDialogs()
+{
+ QuestionBoxMemory::resetDialogs();
+}
+
+void GeneralTab::setButtonColor(QPushButton *button, const QColor &color)
+{
+ button->setStyleSheet(
+ QString("QPushButton {"
+ "background-color: rgba(%1, %2, %3, %4);"
+ "color: %5;"
+ "border: 1px solid;"
+ "padding: 3px;"
+ "}")
+ .arg(color.red())
+ .arg(color.green())
+ .arg(color.blue())
+ .arg(color.alpha())
+ .arg(Settings::getIdealTextColor(color).name())
+ );
+};
+
+void GeneralTab::on_containsBtn_clicked()
+{
+ QColor result = QColorDialog::getColor(m_ContainsColor, parentWidget(), "Color Picker: Mod contains selected plugin", QColorDialog::ShowAlphaChannel);
+ if (result.isValid()) {
+ m_ContainsColor = result;
+ setButtonColor(ui->containsBtn, result);
+ }
+}
+
+void GeneralTab::on_containedBtn_clicked()
+{
+ QColor result = QColorDialog::getColor(m_ContainedColor, parentWidget(), "ColorPicker: Plugin is Contained in selected Mod", QColorDialog::ShowAlphaChannel);
+ if (result.isValid()) {
+ m_ContainedColor = result;
+ setButtonColor(ui->containedBtn, result);
+ }
+}
+
+void GeneralTab::on_overwrittenBtn_clicked()
+{
+ QColor result = QColorDialog::getColor(m_OverwrittenColor, parentWidget(), "ColorPicker: Is overwritten (loose files)", QColorDialog::ShowAlphaChannel);
+ if (result.isValid()) {
+ m_OverwrittenColor = result;
+ setButtonColor(ui->overwrittenBtn, result);
+ }
+}
+
+void GeneralTab::on_overwritingBtn_clicked()
+{
+ QColor result = QColorDialog::getColor(m_OverwritingColor, parentWidget(), "ColorPicker: Is overwriting (loose files)", QColorDialog::ShowAlphaChannel);
+ if (result.isValid()) {
+ m_OverwritingColor = result;
+ setButtonColor(ui->overwritingBtn, result);
+ }
+}
+
+void GeneralTab::on_overwrittenArchiveBtn_clicked()
+{
+ QColor result = QColorDialog::getColor(m_OverwrittenArchiveColor, parentWidget(), "ColorPicker: Is overwritten (archive files)", QColorDialog::ShowAlphaChannel);
+ if (result.isValid()) {
+ m_OverwrittenArchiveColor = result;
+ setButtonColor(ui->overwrittenArchiveBtn, result);
+ }
+}
+
+void GeneralTab::on_overwritingArchiveBtn_clicked()
+{
+ QColor result = QColorDialog::getColor(m_OverwritingArchiveColor, parentWidget(), "ColorPicker: Is overwriting (archive files)", QColorDialog::ShowAlphaChannel);
+ if (result.isValid()) {
+ m_OverwritingArchiveColor = result;
+ setButtonColor(ui->overwritingArchiveBtn, result);
+ }
+}
+
+void GeneralTab::on_resetColorsBtn_clicked()
+{
+ m_OverwritingColor = QColor(255, 0, 0, 64);
+ m_OverwrittenColor = QColor(0, 255, 0, 64);
+ m_OverwritingArchiveColor = QColor(255, 0, 255, 64);
+ m_OverwrittenArchiveColor = QColor(0, 255, 255, 64);
+ m_ContainsColor = QColor(0, 0, 255, 64);
+ m_ContainedColor = QColor(0, 0, 255, 64);
+
+ setButtonColor(ui->overwritingBtn, m_OverwritingColor);
+ setButtonColor(ui->overwrittenBtn, m_OverwrittenColor);
+ setButtonColor(ui->overwritingArchiveBtn, m_OverwritingArchiveColor);
+ setButtonColor(ui->overwrittenArchiveBtn, m_OverwrittenArchiveColor);
+ setButtonColor(ui->containsBtn, m_ContainsColor);
+ setButtonColor(ui->containedBtn, m_ContainedColor);
+}
+
+void GeneralTab::on_resetDialogsButton_clicked()
+{
+ if (QMessageBox::question(parentWidget(), QObject::tr("Confirm?"),
+ QObject::tr("This will make all dialogs show up again where you checked the \"Remember selection\"-box. Continue?"),
+ QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
+ resetDialogs();
+ }
+}
+
+void GeneralTab::on_categoriesBtn_clicked()
+{
+ CategoriesDialog dialog(parentWidget());
+ if (dialog.exec() == QDialog::Accepted) {
+ dialog.commitChanges();
+ }
+}
diff --git a/src/settingsdialoggeneral.h b/src/settingsdialoggeneral.h
new file mode 100644
index 00000000..1f1b4637
--- /dev/null
+++ b/src/settingsdialoggeneral.h
@@ -0,0 +1,53 @@
+#ifndef SETTINGSDIALOGGENERAL_H
+#define SETTINGSDIALOGGENERAL_H
+
+#include "settingsdialog.h"
+#include "settings.h"
+
+class GeneralTab : public SettingsTab
+{
+public:
+ GeneralTab(Settings *m_parent, SettingsDialog &m_dialog);
+
+ void update();
+
+private:
+ QColor m_OverwritingColor;
+ QColor m_OverwrittenColor;
+ QColor m_OverwritingArchiveColor;
+ QColor m_OverwrittenArchiveColor;
+ QColor m_ContainsColor;
+ QColor m_ContainedColor;
+
+ void addLanguages();
+ void addStyles();
+ void resetDialogs();
+ void setButtonColor(QPushButton *button, const QColor &color);
+
+ QColor getOverwritingColor() { return m_OverwritingColor; }
+ QColor getOverwrittenColor() { return m_OverwrittenColor; }
+ QColor getOverwritingArchiveColor() { return m_OverwritingArchiveColor; }
+ QColor getOverwrittenArchiveColor() { return m_OverwrittenArchiveColor; }
+ QColor getContainsColor() { return m_ContainsColor; }
+ QColor getContainedColor() { return m_ContainedColor; }
+
+ void setOverwritingColor(QColor col) { m_OverwritingColor = col; }
+ void setOverwrittenColor(QColor col) { m_OverwrittenColor = col; }
+ void setOverwritingArchiveColor(QColor col) { m_OverwritingArchiveColor = col; }
+ void setOverwrittenArchiveColor(QColor col) { m_OverwrittenArchiveColor = col; }
+ void setContainsColor(QColor col) { m_ContainsColor = col; }
+ void setContainedColor(QColor col) { m_ContainedColor = col; }
+
+ void on_overwritingArchiveBtn_clicked();
+ void on_overwritingBtn_clicked();
+ void on_overwrittenArchiveBtn_clicked();
+ void on_overwrittenBtn_clicked();
+ void on_containedBtn_clicked();
+ void on_containsBtn_clicked();
+
+ void on_categoriesBtn_clicked();
+ void on_resetColorsBtn_clicked();
+ void on_resetDialogsButton_clicked();
+};
+
+#endif // SETTINGSDIALOGGENERAL_H
--
cgit v1.3.1
From 0a5ce34b1a80694fbfe6a4d6b4f032b9c11a5376 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Sat, 20 Jul 2019 09:02:03 -0400
Subject: split paths tab
---
src/CMakeLists.txt | 3 +
src/settings.cpp | 81 +----------------
src/settings.h | 17 +---
src/settingsdialog.cpp | 113 ------------------------
src/settingsdialog.h | 14 ---
src/settingsdialogpaths.cpp | 205 ++++++++++++++++++++++++++++++++++++++++++++
src/settingsdialogpaths.h | 33 +++++++
7 files changed, 243 insertions(+), 223 deletions(-)
create mode 100644 src/settingsdialogpaths.cpp
create mode 100644 src/settingsdialogpaths.h
(limited to 'src/settingsdialog.cpp')
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 29c419b5..98d59996 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -38,6 +38,7 @@ SET(organizer_SRCS
singleinstance.cpp
settingsdialog.cpp
settingsdialoggeneral.cpp
+ settingsdialogpaths.cpp
settings.cpp
selfupdater.cpp
selectiondialog.cpp
@@ -153,6 +154,7 @@ SET(organizer_HDRS
singleinstance.h
settingsdialog.h
settingsdialoggeneral.h
+ settingsdialogpaths.h
settings.h
selfupdater.h
selectiondialog.h
@@ -434,6 +436,7 @@ set(settings
settings
settingsdialog
settingsdialoggeneral
+ settingsdialogpaths
)
set(utilities
diff --git a/src/settings.cpp b/src/settings.cpp
index 0911b155..bed8e789 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -23,6 +23,7 @@ along with Mod Organizer. If not, see .
#include "serverinfo.h"
#include "settingsdialog.h"
#include "settingsdialoggeneral.h"
+#include "settingsdialogpaths.h"
#include "versioninfo.h"
#include "appconfig.h"
#include "organizercore.h"
@@ -752,86 +753,6 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
}
-Settings::PathsTab::PathsTab(Settings *parent, SettingsDialog &dialog)
- : SettingsTab(parent, dialog)
- , m_baseDirEdit(m_dialog.findChild("baseDirEdit"))
- , m_downloadDirEdit(m_dialog.findChild("downloadDirEdit"))
- , m_modDirEdit(m_dialog.findChild("modDirEdit"))
- , m_cacheDirEdit(m_dialog.findChild("cacheDirEdit"))
- , m_profilesDirEdit(m_dialog.findChild("profilesDirEdit"))
- , m_overwriteDirEdit(m_dialog.findChild("overwriteDirEdit"))
- , m_managedGameDirEdit(m_dialog.findChild("managedGameDirEdit"))
-{
- m_baseDirEdit->setText(m_parent->getBaseDirectory());
- m_managedGameDirEdit->setText(m_parent->m_GamePlugin->gameDirectory().absoluteFilePath(m_parent->m_GamePlugin->binaryName()));
- QString basePath = parent->getBaseDirectory();
- QDir baseDir(basePath);
- for (const auto &dir : {
- std::make_pair(m_downloadDirEdit, m_parent->getDownloadDirectory(false)),
- std::make_pair(m_modDirEdit, m_parent->getModDirectory(false)),
- std::make_pair(m_cacheDirEdit, m_parent->getCacheDirectory(false)),
- std::make_pair(m_profilesDirEdit, m_parent->getProfileDirectory(false)),
- std::make_pair(m_overwriteDirEdit, m_parent->getOverwriteDirectory(false))
- }) {
- QString storePath = baseDir.relativeFilePath(dir.second);
- storePath = dir.second;
- dir.first->setText(storePath);
- }
-}
-
-void Settings::PathsTab::update()
-{
- typedef std::tuple Directory;
-
- QString basePath = m_parent->getBaseDirectory();
-
- for (const Directory &dir :{
- Directory{m_downloadDirEdit->text(), "download_directory", AppConfig::downloadPath()},
- Directory{m_cacheDirEdit->text(), "cache_directory", AppConfig::cachePath()},
- Directory{m_modDirEdit->text(), "mod_directory", AppConfig::modsPath()},
- Directory{m_overwriteDirEdit->text(), "overwrite_directory", AppConfig::overwritePath()},
- Directory{m_profilesDirEdit->text(), "profiles_directory", AppConfig::profilesPath()}
- }) {
- QString path, settingsKey;
- std::wstring defaultName;
- std::tie(path, settingsKey, defaultName) = dir;
-
- settingsKey = QString("Settings/%1").arg(settingsKey);
-
- QString realPath = path;
- realPath.replace("%BASE_DIR%", m_baseDirEdit->text());
-
- if (!QDir(realPath).exists()) {
- if (!QDir().mkpath(realPath)) {
- QMessageBox::warning(qApp->activeWindow(), tr("Error"),
- tr("Failed to create \"%1\", you may not have the "
- "necessary permission. path remains unchanged.")
- .arg(realPath));
- }
- }
-
- if (QFileInfo(realPath)
- != QFileInfo(basePath + "/" + QString::fromStdWString(defaultName))) {
- m_Settings.setValue(settingsKey, path);
- } else {
- m_Settings.remove(settingsKey);
- }
- }
-
- if (QFileInfo(m_baseDirEdit->text()) !=
- QFileInfo(qApp->property("dataPath").toString())) {
- m_Settings.setValue("Settings/base_directory", m_baseDirEdit->text());
- } else {
- m_Settings.remove("Settings/base_directory");
- }
-
- QFileInfo oldGameExe(m_parent->m_GamePlugin->gameDirectory().absoluteFilePath(m_parent->m_GamePlugin->binaryName()));
- QFileInfo newGameExe(m_managedGameDirEdit->text());
- if (oldGameExe != newGameExe) {
- m_Settings.setValue("gamePath", newGameExe.absolutePath());
- }
-}
-
Settings::DiagnosticsTab::DiagnosticsTab(Settings *m_parent, SettingsDialog &m_dialog)
: SettingsTab(m_parent, m_dialog)
, m_logLevelBox(m_dialog.findChild("logLevelBox"))
diff --git a/src/settings.h b/src/settings.h
index e88080ba..6f75562b 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -427,6 +427,7 @@ public:
bool colorSeparatorScrollbar() const;
QSettings& settingsRef() { return m_Settings; }
+ MOBase::IPluginGame const *gamePlugin() { return m_GamePlugin; }
public slots:
@@ -443,22 +444,6 @@ private:
QString getConfigurablePath(const QString &key, const QString &def, bool resolve) const;
- class PathsTab : public SettingsTab
- {
- public:
- PathsTab(Settings *parent, SettingsDialog &dialog);
-
- void update();
-
- private:
- QLineEdit *m_baseDirEdit;
- QLineEdit *m_downloadDirEdit;
- QLineEdit *m_modDirEdit;
- QLineEdit *m_cacheDirEdit;
- QLineEdit *m_profilesDirEdit;
- QLineEdit *m_overwriteDirEdit;
- QLineEdit *m_managedGameDirEdit;
- };
class DiagnosticsTab : public SettingsTab
{
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index f922cfb9..bfa285bf 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -200,80 +200,6 @@ void SettingsDialog::on_bsaDateBtn_clicked()
dir.absolutePath().toStdWString());
}
-void SettingsDialog::on_browseBaseDirBtn_clicked()
-{
- QString temp = QFileDialog::getExistingDirectory(
- this, tr("Select base directory"), ui->baseDirEdit->text());
- if (!temp.isEmpty()) {
- ui->baseDirEdit->setText(temp);
- }
-}
-
-void SettingsDialog::on_browseDownloadDirBtn_clicked()
-{
- QString searchPath = ui->downloadDirEdit->text();
- searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
-
- QString temp = QFileDialog::getExistingDirectory(this, tr("Select download directory"), searchPath);
- if (!temp.isEmpty()) {
- ui->downloadDirEdit->setText(temp);
- }
-}
-
-void SettingsDialog::on_browseModDirBtn_clicked()
-{
- QString searchPath = ui->modDirEdit->text();
- searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
-
- QString temp = QFileDialog::getExistingDirectory(this, tr("Select mod directory"), searchPath);
- if (!temp.isEmpty()) {
- ui->modDirEdit->setText(temp);
- }
-}
-
-void SettingsDialog::on_browseCacheDirBtn_clicked()
-{
- QString searchPath = ui->cacheDirEdit->text();
- searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
-
- QString temp = QFileDialog::getExistingDirectory(this, tr("Select cache directory"), searchPath);
- if (!temp.isEmpty()) {
- ui->cacheDirEdit->setText(temp);
- }
-}
-
-void SettingsDialog::on_browseProfilesDirBtn_clicked()
-{
- QString searchPath = ui->profilesDirEdit->text();
- searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
-
- QString temp = QFileDialog::getExistingDirectory(this, tr("Select profiles directory"), searchPath);
- if (!temp.isEmpty()) {
- ui->profilesDirEdit->setText(temp);
- }
-}
-
-void SettingsDialog::on_browseOverwriteDirBtn_clicked()
-{
- QString searchPath = ui->overwriteDirEdit->text();
- searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
-
- QString temp = QFileDialog::getExistingDirectory(this, tr("Select overwrite directory"), searchPath);
- if (!temp.isEmpty()) {
- ui->overwriteDirEdit->setText(temp);
- }
-}
-
-void SettingsDialog::on_browseGameDirBtn_clicked()
-{
- QFileInfo oldGameExe(ui->managedGameDirEdit->text());
-
- QString temp = QFileDialog::getOpenFileName(this, tr("Select game executable"), oldGameExe.absolutePath(), oldGameExe.fileName());
- if (!temp.isEmpty()) {
- ui->managedGameDirEdit->setText(temp);
- }
-}
-
void SettingsDialog::on_nexusConnect_clicked()
{
if (m_nexusLogin && m_nexusLogin->isActive()) {
@@ -555,45 +481,6 @@ void SettingsDialog::on_clearCacheButton_clicked()
NexusInterface::instance(m_PluginContainer)->clearCache();
}
-void SettingsDialog::normalizePath(QLineEdit *lineEdit)
-{
- QString text = lineEdit->text();
- while (text.endsWith('/') || text.endsWith('\\')) {
- text.chop(1);
- }
- lineEdit->setText(text);
-}
-
-void SettingsDialog::on_baseDirEdit_editingFinished()
-{
- normalizePath(ui->baseDirEdit);
-}
-
-void SettingsDialog::on_downloadDirEdit_editingFinished()
-{
- normalizePath(ui->downloadDirEdit);
-}
-
-void SettingsDialog::on_modDirEdit_editingFinished()
-{
- normalizePath(ui->modDirEdit);
-}
-
-void SettingsDialog::on_cacheDirEdit_editingFinished()
-{
- normalizePath(ui->cacheDirEdit);
-}
-
-void SettingsDialog::on_profilesDirEdit_editingFinished()
-{
- normalizePath(ui->profilesDirEdit);
-}
-
-void SettingsDialog::on_overwriteDirEdit_editingFinished()
-{
- normalizePath(ui->overwriteDirEdit);
-}
-
void SettingsDialog::on_resetGeometryBtn_clicked()
{
m_GeometriesReset = true;
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index 01a0afa2..68e72529 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -67,7 +67,6 @@ signals:
private:
void storeSettings(QListWidgetItem *pluginItem);
- void normalizePath(QLineEdit *lineEdit);
public:
QString getExecutableBlacklist() { return m_ExecutableBlacklist; }
@@ -77,26 +76,13 @@ public:
private slots:
void on_associateButton_clicked();
- void on_baseDirEdit_editingFinished();
- void on_browseBaseDirBtn_clicked();
- void on_browseCacheDirBtn_clicked();
- void on_browseDownloadDirBtn_clicked();
- void on_browseGameDirBtn_clicked();
- void on_browseModDirBtn_clicked();
- void on_browseOverwriteDirBtn_clicked();
- void on_browseProfilesDirBtn_clicked();
void on_bsaDateBtn_clicked();
- void on_cacheDirEdit_editingFinished();
void on_clearCacheButton_clicked();
- void on_downloadDirEdit_editingFinished();
void on_execBlacklistBtn_clicked();
- void on_modDirEdit_editingFinished();
void on_nexusConnect_clicked();
void on_nexusDisconnect_clicked();
void on_nexusManualKey_clicked();
- void on_overwriteDirEdit_editingFinished();
void on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
- void on_profilesDirEdit_editingFinished();
void on_resetGeometryBtn_clicked();
void deleteBlacklistItem();
diff --git a/src/settingsdialogpaths.cpp b/src/settingsdialogpaths.cpp
new file mode 100644
index 00000000..303d1562
--- /dev/null
+++ b/src/settingsdialogpaths.cpp
@@ -0,0 +1,205 @@
+#include "settingsdialogpaths.h"
+#include "ui_settingsdialog.h"
+#include "appconfig.h"
+#include
+
+PathsTab::PathsTab(Settings *parent, SettingsDialog &dialog)
+ : SettingsTab(parent, dialog)
+{
+ ui->baseDirEdit->setText(m_parent->getBaseDirectory());
+ ui->managedGameDirEdit->setText(m_parent->gamePlugin()->gameDirectory().absoluteFilePath(m_parent->gamePlugin()->binaryName()));
+ QString basePath = parent->getBaseDirectory();
+ QDir baseDir(basePath);
+ for (const auto &dir : {
+ std::make_pair(ui->downloadDirEdit, m_parent->getDownloadDirectory(false)),
+ std::make_pair(ui->modDirEdit, m_parent->getModDirectory(false)),
+ std::make_pair(ui->cacheDirEdit, m_parent->getCacheDirectory(false)),
+ std::make_pair(ui->profilesDirEdit, m_parent->getProfileDirectory(false)),
+ std::make_pair(ui->overwriteDirEdit, m_parent->getOverwriteDirectory(false))
+ }) {
+ QString storePath = baseDir.relativeFilePath(dir.second);
+ storePath = dir.second;
+ dir.first->setText(storePath);
+ }
+
+ QObject::connect(ui->browseBaseDirBtn, &QPushButton::clicked, [&]{ on_browseBaseDirBtn_clicked(); });
+ QObject::connect(ui->browseCacheDirBtn, &QPushButton::clicked, [&]{ on_browseCacheDirBtn_clicked(); });
+ QObject::connect(ui->browseDownloadDirBtn, &QPushButton::clicked, [&]{ on_browseDownloadDirBtn_clicked(); });
+ QObject::connect(ui->browseGameDirBtn, &QPushButton::clicked, [&]{ on_browseGameDirBtn_clicked(); });
+ QObject::connect(ui->browseModDirBtn, &QPushButton::clicked, [&]{ on_browseModDirBtn_clicked(); });
+ QObject::connect(ui->browseOverwriteDirBtn, &QPushButton::clicked, [&]{ on_browseOverwriteDirBtn_clicked(); });
+ QObject::connect(ui->browseProfilesDirBtn, &QPushButton::clicked, [&]{ on_browseProfilesDirBtn_clicked(); });
+
+ QObject::connect(ui->baseDirEdit, &QLineEdit::editingFinished, [&]{ on_baseDirEdit_editingFinished(); });
+ QObject::connect(ui->cacheDirEdit, &QLineEdit::editingFinished, [&]{ on_cacheDirEdit_editingFinished(); });
+ QObject::connect(ui->downloadDirEdit, &QLineEdit::editingFinished, [&]{ on_downloadDirEdit_editingFinished(); });
+ QObject::connect(ui->modDirEdit, &QLineEdit::editingFinished, [&]{ on_modDirEdit_editingFinished(); });
+ QObject::connect(ui->overwriteDirEdit, &QLineEdit::editingFinished, [&]{ on_overwriteDirEdit_editingFinished(); });
+ QObject::connect(ui->profilesDirEdit, &QLineEdit::editingFinished, [&]{ on_profilesDirEdit_editingFinished(); });
+}
+
+void PathsTab::update()
+{
+ typedef std::tuple Directory;
+
+ QString basePath = m_parent->getBaseDirectory();
+
+ for (const Directory &dir :{
+ Directory{ui->downloadDirEdit->text(), "download_directory", AppConfig::downloadPath()},
+ Directory{ui->cacheDirEdit->text(), "cache_directory", AppConfig::cachePath()},
+ Directory{ui->modDirEdit->text(), "mod_directory", AppConfig::modsPath()},
+ Directory{ui->overwriteDirEdit->text(), "overwrite_directory", AppConfig::overwritePath()},
+ Directory{ui->profilesDirEdit->text(), "profiles_directory", AppConfig::profilesPath()}
+ }) {
+ QString path, settingsKey;
+ std::wstring defaultName;
+ std::tie(path, settingsKey, defaultName) = dir;
+
+ settingsKey = QString("Settings/%1").arg(settingsKey);
+
+ QString realPath = path;
+ realPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
+
+ if (!QDir(realPath).exists()) {
+ if (!QDir().mkpath(realPath)) {
+ QMessageBox::warning(qApp->activeWindow(), QObject::tr("Error"),
+ QObject::tr("Failed to create \"%1\", you may not have the "
+ "necessary permission. path remains unchanged.")
+ .arg(realPath));
+ }
+ }
+
+ if (QFileInfo(realPath)
+ != QFileInfo(basePath + "/" + QString::fromStdWString(defaultName))) {
+ m_Settings.setValue(settingsKey, path);
+ } else {
+ m_Settings.remove(settingsKey);
+ }
+ }
+
+ if (QFileInfo(ui->baseDirEdit->text()) !=
+ QFileInfo(qApp->property("dataPath").toString())) {
+ m_Settings.setValue("Settings/base_directory", ui->baseDirEdit->text());
+ } else {
+ m_Settings.remove("Settings/base_directory");
+ }
+
+ QFileInfo oldGameExe(m_parent->gamePlugin()->gameDirectory().absoluteFilePath(m_parent->gamePlugin()->binaryName()));
+ QFileInfo newGameExe(ui->managedGameDirEdit->text());
+ if (oldGameExe != newGameExe) {
+ m_Settings.setValue("gamePath", newGameExe.absolutePath());
+ }
+}
+
+void PathsTab::on_browseBaseDirBtn_clicked()
+{
+ QString temp = QFileDialog::getExistingDirectory(
+ parentWidget(), QObject::tr("Select base directory"), ui->baseDirEdit->text());
+ if (!temp.isEmpty()) {
+ ui->baseDirEdit->setText(temp);
+ }
+}
+
+void PathsTab::on_browseDownloadDirBtn_clicked()
+{
+ QString searchPath = ui->downloadDirEdit->text();
+ searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
+
+ QString temp = QFileDialog::getExistingDirectory(parentWidget(), QObject::tr("Select download directory"), searchPath);
+ if (!temp.isEmpty()) {
+ ui->downloadDirEdit->setText(temp);
+ }
+}
+
+void PathsTab::on_browseModDirBtn_clicked()
+{
+ QString searchPath = ui->modDirEdit->text();
+ searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
+
+ QString temp = QFileDialog::getExistingDirectory(parentWidget(), QObject::tr("Select mod directory"), searchPath);
+ if (!temp.isEmpty()) {
+ ui->modDirEdit->setText(temp);
+ }
+}
+
+void PathsTab::on_browseCacheDirBtn_clicked()
+{
+ QString searchPath = ui->cacheDirEdit->text();
+ searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
+
+ QString temp = QFileDialog::getExistingDirectory(parentWidget(), QObject::tr("Select cache directory"), searchPath);
+ if (!temp.isEmpty()) {
+ ui->cacheDirEdit->setText(temp);
+ }
+}
+
+void PathsTab::on_browseProfilesDirBtn_clicked()
+{
+ QString searchPath = ui->profilesDirEdit->text();
+ searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
+
+ QString temp = QFileDialog::getExistingDirectory(parentWidget(), QObject::tr("Select profiles directory"), searchPath);
+ if (!temp.isEmpty()) {
+ ui->profilesDirEdit->setText(temp);
+ }
+}
+
+void PathsTab::on_browseOverwriteDirBtn_clicked()
+{
+ QString searchPath = ui->overwriteDirEdit->text();
+ searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
+
+ QString temp = QFileDialog::getExistingDirectory(parentWidget(), QObject::tr("Select overwrite directory"), searchPath);
+ if (!temp.isEmpty()) {
+ ui->overwriteDirEdit->setText(temp);
+ }
+}
+
+void PathsTab::on_browseGameDirBtn_clicked()
+{
+ QFileInfo oldGameExe(ui->managedGameDirEdit->text());
+
+ QString temp = QFileDialog::getOpenFileName(parentWidget(), QObject::tr("Select game executable"), oldGameExe.absolutePath(), oldGameExe.fileName());
+ if (!temp.isEmpty()) {
+ ui->managedGameDirEdit->setText(temp);
+ }
+}
+
+void PathsTab::on_baseDirEdit_editingFinished()
+{
+ normalizePath(ui->baseDirEdit);
+}
+
+void PathsTab::on_downloadDirEdit_editingFinished()
+{
+ normalizePath(ui->downloadDirEdit);
+}
+
+void PathsTab::on_modDirEdit_editingFinished()
+{
+ normalizePath(ui->modDirEdit);
+}
+
+void PathsTab::on_cacheDirEdit_editingFinished()
+{
+ normalizePath(ui->cacheDirEdit);
+}
+
+void PathsTab::on_profilesDirEdit_editingFinished()
+{
+ normalizePath(ui->profilesDirEdit);
+}
+
+void PathsTab::on_overwriteDirEdit_editingFinished()
+{
+ normalizePath(ui->overwriteDirEdit);
+}
+
+void PathsTab::normalizePath(QLineEdit *lineEdit)
+{
+ QString text = lineEdit->text();
+ while (text.endsWith('/') || text.endsWith('\\')) {
+ text.chop(1);
+ }
+ lineEdit->setText(text);
+}
diff --git a/src/settingsdialogpaths.h b/src/settingsdialogpaths.h
new file mode 100644
index 00000000..dac402b1
--- /dev/null
+++ b/src/settingsdialogpaths.h
@@ -0,0 +1,33 @@
+#ifndef SETTINGSDIALOGPATHS_H
+#define SETTINGSDIALOGPATHS_H
+
+#include "settings.h"
+#include "settingsdialog.h"
+
+class PathsTab : public SettingsTab
+{
+public:
+ PathsTab(Settings *parent, SettingsDialog &dialog);
+
+ void update();
+
+private:
+ void on_browseBaseDirBtn_clicked();
+ void on_browseCacheDirBtn_clicked();
+ void on_browseDownloadDirBtn_clicked();
+ void on_browseGameDirBtn_clicked();
+ void on_browseModDirBtn_clicked();
+ void on_browseOverwriteDirBtn_clicked();
+ void on_browseProfilesDirBtn_clicked();
+
+ void on_baseDirEdit_editingFinished();
+ void on_cacheDirEdit_editingFinished();
+ void on_downloadDirEdit_editingFinished();
+ void on_modDirEdit_editingFinished();
+ void on_overwriteDirEdit_editingFinished();
+ void on_profilesDirEdit_editingFinished();
+
+ void normalizePath(QLineEdit *lineEdit);
+};
+
+#endif // SETTINGSDIALOGPATHS_H
--
cgit v1.3.1
From af95b3b8637d28517f69a70f13b901cc7f43d121 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Sat, 20 Jul 2019 09:31:38 -0400
Subject: renamed tab classes, clashing with mod info dialog split nexus tab
---
src/CMakeLists.txt | 3 +
src/settings.cpp | 114 +------------
src/settings.h | 16 --
src/settingsdialog.cpp | 278 +------------------------------
src/settingsdialog.h | 34 +---
src/settingsdialoggeneral.cpp | 30 ++--
src/settingsdialoggeneral.h | 4 +-
src/settingsdialognexus.cpp | 374 ++++++++++++++++++++++++++++++++++++++++++
src/settingsdialognexus.h | 40 +++++
src/settingsdialogpaths.cpp | 32 ++--
src/settingsdialogpaths.h | 4 +-
11 files changed, 460 insertions(+), 469 deletions(-)
create mode 100644 src/settingsdialognexus.cpp
create mode 100644 src/settingsdialognexus.h
(limited to 'src/settingsdialog.cpp')
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 98d59996..b2407e17 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -38,6 +38,7 @@ SET(organizer_SRCS
singleinstance.cpp
settingsdialog.cpp
settingsdialoggeneral.cpp
+ settingsdialognexus.cpp
settingsdialogpaths.cpp
settings.cpp
selfupdater.cpp
@@ -154,6 +155,7 @@ SET(organizer_HDRS
singleinstance.h
settingsdialog.h
settingsdialoggeneral.h
+ settingsdialognexus.h
settingsdialogpaths.h
settings.h
selfupdater.h
@@ -436,6 +438,7 @@ set(settings
settings
settingsdialog
settingsdialoggeneral
+ settingsdialognexus
settingsdialogpaths
)
diff --git a/src/settings.cpp b/src/settings.cpp
index bed8e789..bded470c 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -23,6 +23,7 @@ along with Mod Organizer. If not, see .
#include "serverinfo.h"
#include "settingsdialog.h"
#include "settingsdialoggeneral.h"
+#include "settingsdialognexus.h"
#include "settingsdialogpaths.h"
#include "versioninfo.h"
#include "appconfig.h"
@@ -69,19 +70,6 @@ along with Mod Organizer. If not, see .
using namespace MOBase;
-template
-class QListWidgetItemEx : public QListWidgetItem {
-public:
- QListWidgetItemEx(const QString &text, int sortRole = Qt::DisplayRole, QListWidget *parent = 0, int type = Type)
- : QListWidgetItem(text, parent, type), m_SortRole(sortRole) {}
-
- virtual bool operator< ( const QListWidgetItem & other ) const {
- return this->data(m_SortRole).value() < other.data(m_SortRole).value();
- }
-private:
- int m_SortRole;
-};
-
SettingsTab::SettingsTab(Settings *m_parent, SettingsDialog &m_dialog)
: m_parent(m_parent)
@@ -688,10 +676,10 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
std::vector> tabs;
- tabs.push_back(std::unique_ptr(new GeneralTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new PathsTab(this, dialog)));
+ tabs.push_back(std::unique_ptr(new GeneralSettingsTab(this, dialog)));
+ tabs.push_back(std::unique_ptr(new PathsSettingsTab(this, dialog)));
tabs.push_back(std::unique_ptr(new DiagnosticsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new NexusTab(this, dialog)));
+ tabs.push_back(std::unique_ptr(new NexusSettingsTab(this, dialog)));
tabs.push_back(std::unique_ptr(new SteamTab(this, dialog)));
tabs.push_back(std::unique_ptr(new PluginsTab(this, dialog)));
tabs.push_back(std::unique_ptr(new WorkaroundsTab(this, dialog)));
@@ -781,100 +769,6 @@ void Settings::DiagnosticsTab::update()
m_Settings.setValue("Settings/crash_dumps_max", m_dumpsMaxEdit->value());
}
-void Settings::DiagnosticsTab::setLevelsBox()
-{
- m_logLevelBox->clear();
-
- m_logLevelBox->addItem(tr("Debug"), log::Debug);
- m_logLevelBox->addItem(tr("Info (recommended)"), log::Info);
- m_logLevelBox->addItem(tr("Warning"), log::Warning);
- m_logLevelBox->addItem(tr("Error"), log::Error);
-
- for (int i=0; icount(); ++i) {
- if (m_logLevelBox->itemData(i) == m_parent->logLevel()) {
- m_logLevelBox->setCurrentIndex(i);
- break;
- }
- }
-}
-
-Settings::NexusTab::NexusTab(Settings *parent, SettingsDialog &dialog)
- : SettingsTab(parent, dialog)
- , m_offlineBox(dialog.findChild("offlineBox"))
- , m_proxyBox(dialog.findChild("proxyBox"))
- , m_knownServersList(dialog.findChild("knownServersList"))
- , m_preferredServersList(
- dialog.findChild("preferredServersList"))
- , m_endorsementBox(dialog.findChild("endorsementBox"))
- , m_hideAPICounterBox(dialog.findChild("hideAPICounterBox"))
-{
- m_offlineBox->setChecked(parent->offlineMode());
- m_proxyBox->setChecked(parent->useProxy());
- m_endorsementBox->setChecked(parent->endorsementIntegration());
- m_hideAPICounterBox->setChecked(parent->hideAPICounter());
-
- // display server preferences
- m_Settings.beginGroup("Servers");
- for (const QString &key : m_Settings.childKeys()) {
- QVariantMap val = m_Settings.value(key).toMap();
- QString descriptor = key;
- if (!descriptor.compare("CDN", Qt::CaseInsensitive)) {
- descriptor += QStringLiteral(" (automatic)");
- }
- if (val.contains("downloadSpeed") && val.contains("downloadCount") && (val["downloadCount"].toInt() > 0)) {
- int bps = static_cast(val["downloadSpeed"].toDouble() / val["downloadCount"].toInt());
- descriptor += QString(" (%1 kbps)").arg(bps / 1024);
- }
-
- QListWidgetItem *newItem = new QListWidgetItemEx(descriptor, Qt::UserRole + 1);
-
- newItem->setData(Qt::UserRole, key);
- newItem->setData(Qt::UserRole + 1, val["preferred"].toInt());
- if (val["preferred"].toInt() > 0) {
- m_preferredServersList->addItem(newItem);
- } else {
- m_knownServersList->addItem(newItem);
- }
- m_preferredServersList->sortItems(Qt::DescendingOrder);
- }
- m_Settings.endGroup();
-}
-
-void Settings::NexusTab::update()
-{
- /*
- if (m_loginCheckBox->isChecked()) {
- m_Settings.setValue("Settings/nexus_login", true);
- m_Settings.setValue("Settings/nexus_username", m_usernameEdit->text());
- m_Settings.setValue("Settings/nexus_password", obfuscate(m_passwordEdit->text()));
- } else {
- m_Settings.setValue("Settings/nexus_login", false);
- m_Settings.remove("Settings/nexus_username");
- m_Settings.remove("Settings/nexus_password");
- }
- */
- m_Settings.setValue("Settings/offline_mode", m_offlineBox->isChecked());
- m_Settings.setValue("Settings/use_proxy", m_proxyBox->isChecked());
- m_Settings.setValue("Settings/endorsement_integration", m_endorsementBox->isChecked());
- m_Settings.setValue("Settings/hide_api_counter", m_hideAPICounterBox->isChecked());
-
- // store server preference
- m_Settings.beginGroup("Servers");
- for (int i = 0; i < m_knownServersList->count(); ++i) {
- QString key = m_knownServersList->item(i)->data(Qt::UserRole).toString();
- QVariantMap val = m_Settings.value(key).toMap();
- val["preferred"] = 0;
- m_Settings.setValue(key, val);
- }
- int count = m_preferredServersList->count();
- for (int i = 0; i < count; ++i) {
- QString key = m_preferredServersList->item(i)->data(Qt::UserRole).toString();
- QVariantMap val = m_Settings.value(key).toMap();
- val["preferred"] = count - i;
- m_Settings.setValue(key, val);
- }
- m_Settings.endGroup();
-}
Settings::SteamTab::SteamTab(Settings *m_parent, SettingsDialog &m_dialog)
: SettingsTab(m_parent, m_dialog)
diff --git a/src/settings.h b/src/settings.h
index 6f75562b..b9383ce4 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -461,22 +461,6 @@ private:
void setLevelsBox();
};
- /** Display/store the configuration in the 'nexus' tab of the settings dialogue */
- class NexusTab : public SettingsTab
- {
- public:
- NexusTab(Settings *m_parent, SettingsDialog &m_dialog);
- void update();
-
- private:
- QCheckBox *m_offlineBox;
- QCheckBox *m_proxyBox;
- QListWidget *m_knownServersList;
- QListWidget *m_preferredServersList;
- QCheckBox *m_endorsementBox;
- QCheckBox *m_hideAPICounterBox;
- };
-
/** Display/store the configuration in the 'steam' tab of the settings dialogue */
class SteamTab : public SettingsTab
{
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index bfa285bf..6d5a8cc0 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -20,7 +20,6 @@ along with Mod Organizer. If not, see .
#include "settingsdialog.h"
#include "ui_settingsdialog.h"
-#include "ui_nexusmanualkey.h"
#include "categoriesdialog.h"
#include "helper.h"
#include "noeditdelegate.h"
@@ -48,62 +47,14 @@ along with Mod Organizer. If not, see .
using namespace MOBase;
-class NexusManualKeyDialog : public QDialog
-{
-public:
- NexusManualKeyDialog(QWidget* parent)
- : QDialog(parent), ui(new Ui::NexusManualKeyDialog)
- {
- ui->setupUi(this);
- ui->key->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
-
- connect(ui->openBrowser, &QPushButton::clicked, [&]{ openBrowser(); });
- connect(ui->paste, &QPushButton::clicked, [&]{ paste(); });
- connect(ui->clear, &QPushButton::clicked, [&]{ clear(); });
- }
-
- void accept() override
- {
- m_key = ui->key->toPlainText();
- QDialog::accept();
- }
-
- const QString& key() const
- {
- return m_key;
- }
-
- void openBrowser()
- {
- shell::OpenLink(QUrl("https://www.nexusmods.com/users/myaccount?tab=api"));
- }
-
- void paste()
- {
- const auto text = QApplication::clipboard()->text();
- if (!text.isEmpty()) {
- ui->key->setPlainText(text);
- }
- }
-
- void clear()
- {
- ui->key->clear();
- }
-
-private:
- std::unique_ptr ui;
- QString m_key;
-};
-
SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* settings, QWidget *parent)
: TutorableDialog("SettingsDialog", parent)
, ui(new Ui::SettingsDialog)
, m_settings(settings)
, m_PluginContainer(pluginContainer)
- , m_keyChanged(false)
, m_GeometriesReset(false)
+ , m_keyChanged(false)
{
ui->setupUi(this);
ui->pluginSettingsList->setStyleSheet("QTreeWidget::item {padding-right: 10px;}");
@@ -111,8 +62,6 @@ SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* setti
QShortcut *delShortcut = new QShortcut(
QKeySequence(Qt::Key_Delete), ui->pluginBlacklist);
connect(delShortcut, SIGNAL(activated()), this, SLOT(deleteBlacklistItem()));
-
- updateNexusState();
}
SettingsDialog::~SettingsDialog()
@@ -200,220 +149,6 @@ void SettingsDialog::on_bsaDateBtn_clicked()
dir.absolutePath().toStdWString());
}
-void SettingsDialog::on_nexusConnect_clicked()
-{
- if (m_nexusLogin && m_nexusLogin->isActive()) {
- m_nexusLogin->cancel();
- return;
- }
-
- if (!m_nexusLogin) {
- m_nexusLogin.reset(new NexusSSOLogin);
-
- m_nexusLogin->keyChanged = [&](auto&& s){
- onSSOKeyChanged(s);
- };
-
- m_nexusLogin->stateChanged = [&](auto&& s, auto&& e){
- onSSOStateChanged(s, e);
- };
- }
-
- ui->nexusLog->clear();
- m_nexusLogin->start();
- updateNexusState();
-}
-
-void SettingsDialog::on_nexusManualKey_clicked()
-{
- if (m_nexusValidator && m_nexusValidator->isActive()) {
- m_nexusValidator->cancel();
- return;
- }
-
- NexusManualKeyDialog dialog(this);
- if (dialog.exec() != QDialog::Accepted) {
- return;
- }
-
- const auto key = dialog.key();
- if (key.isEmpty()) {
- clearKey();
- return;
- }
-
- ui->nexusLog->clear();
- validateKey(key);
-}
-
-void SettingsDialog::on_nexusDisconnect_clicked()
-{
- clearKey();
- ui->nexusLog->clear();
- addNexusLog(tr("Disconnected."));
-}
-
-void SettingsDialog::validateKey(const QString& key)
-{
- if (!m_nexusValidator) {
- m_nexusValidator.reset(new NexusKeyValidator(
- *NexusInterface::instance(m_PluginContainer)->getAccessManager()));
-
- m_nexusValidator->stateChanged = [&](auto&& s, auto&& e){
- onValidatorStateChanged(s, e);
- };
-
- m_nexusValidator->finished = [&](auto&& user) {
- onValidatorFinished(user);
- };
- }
-
- addNexusLog(tr("Checking API key..."));
- m_nexusValidator->start(key);
-}
-
-void SettingsDialog::onSSOKeyChanged(const QString& key)
-{
- if (key.isEmpty()) {
- clearKey();
- } else {
- addNexusLog(tr("Received API key."));
- validateKey(key);
- }
-}
-
-void SettingsDialog::onSSOStateChanged(NexusSSOLogin::States s, const QString& e)
-{
- if (s != NexusSSOLogin::Finished) {
- // finished state is handled in onSSOKeyChanged()
- const auto log = NexusSSOLogin::stateToString(s, e);
-
- for (auto&& line : log.split("\n")) {
- addNexusLog(line);
- }
- }
-
- updateNexusState();
-}
-
-void SettingsDialog::onValidatorStateChanged(
- NexusKeyValidator::States s, const QString& e)
-{
- if (s != NexusKeyValidator::Finished) {
- // finished state is handled in onValidatorFinished()
- const auto log = NexusKeyValidator::stateToString(s, e);
-
- for (auto&& line : log.split("\n")) {
- addNexusLog(line);
- }
- }
-
- updateNexusState();
-}
-
-void SettingsDialog::onValidatorFinished(const APIUserAccount& user)
-{
- NexusInterface::instance(m_PluginContainer)->setUserAccount(user);
-
- if (!user.apiKey().isEmpty()) {
- if (setKey(user.apiKey())) {
- addNexusLog(tr("Linked with Nexus successfully."));
- }
- }
-}
-
-void SettingsDialog::addNexusLog(const QString& s)
-{
- ui->nexusLog->addItem(s);
- ui->nexusLog->scrollToBottom();
-}
-
-bool SettingsDialog::setKey(const QString& key)
-{
- m_keyChanged = true;
- const bool ret = m_settings->setNexusApiKey(key);
- updateNexusState();
- return ret;
-}
-
-bool SettingsDialog::clearKey()
-{
- m_keyChanged = true;
- const auto ret = m_settings->clearNexusApiKey();
-
- NexusInterface::instance(m_PluginContainer)->getAccessManager()->clearApiKey();
- updateNexusState();
-
- return ret;
-}
-
-void SettingsDialog::updateNexusState()
-{
- updateNexusButtons();
- updateNexusData();
-}
-
-void SettingsDialog::updateNexusButtons()
-{
- if (m_nexusLogin && m_nexusLogin->isActive()) {
- // api key is in the process of being retrieved
- ui->nexusConnect->setText(tr("Cancel"));
- ui->nexusConnect->setEnabled(true);
- ui->nexusDisconnect->setEnabled(false);
- ui->nexusManualKey->setText(tr("Enter API Key Manually"));
- ui->nexusManualKey->setEnabled(false);
- }
- else if (m_nexusValidator && m_nexusValidator->isActive()) {
- // api key is in the process of being tested
- ui->nexusConnect->setText(tr("Connect to Nexus"));
- ui->nexusConnect->setEnabled(false);
- ui->nexusDisconnect->setEnabled(false);
- ui->nexusManualKey->setText(tr("Cancel"));
- ui->nexusManualKey->setEnabled(true);
- }
- else if (m_settings->hasNexusApiKey()) {
- // api key is present
- ui->nexusConnect->setText(tr("Connect to Nexus"));
- ui->nexusConnect->setEnabled(false);
- ui->nexusDisconnect->setEnabled(true);
- ui->nexusManualKey->setText(tr("Enter API Key Manually"));
- ui->nexusManualKey->setEnabled(false);
- } else {
- // api key not present
- ui->nexusConnect->setText(tr("Connect to Nexus"));
- ui->nexusConnect->setEnabled(true);
- ui->nexusDisconnect->setEnabled(false);
- ui->nexusManualKey->setText(tr("Enter API Key Manually"));
- ui->nexusManualKey->setEnabled(true);
- }
-}
-
-void SettingsDialog::updateNexusData()
-{
- const auto user = NexusInterface::instance(m_PluginContainer)
- ->getAPIUserAccount();
-
- if (user.isValid()) {
- ui->nexusUserID->setText(user.id());
- ui->nexusName->setText(user.name());
- ui->nexusAccount->setText(localizedUserAccountType(user.type()));
-
- ui->nexusDailyRequests->setText(QString("%1/%2")
- .arg(user.limits().remainingDailyRequests)
- .arg(user.limits().maxDailyRequests));
-
- ui->nexusHourlyRequests->setText(QString("%1/%2")
- .arg(user.limits().remainingHourlyRequests)
- .arg(user.limits().maxHourlyRequests));
- } else {
- ui->nexusUserID->setText(tr("N/A"));
- ui->nexusName->setText(tr("N/A"));
- ui->nexusAccount->setText(tr("N/A"));
- ui->nexusDailyRequests->setText(tr("N/A"));
- ui->nexusHourlyRequests->setText(tr("N/A"));
- }
-}
-
void SettingsDialog::storeSettings(QListWidgetItem *pluginItem)
{
if (pluginItem != nullptr) {
@@ -470,17 +205,6 @@ void SettingsDialog::deleteBlacklistItem()
ui->pluginBlacklist->takeItem(ui->pluginBlacklist->currentIndex().row());
}
-void SettingsDialog::on_associateButton_clicked()
-{
- Settings::instance().registerAsNXMHandler(true);
-}
-
-void SettingsDialog::on_clearCacheButton_clicked()
-{
- QDir(Settings::instance().getCacheDirectory()).removeRecursively();
- NexusInterface::instance(m_PluginContainer)->clearCache();
-}
-
void SettingsDialog::on_resetGeometryBtn_clicked()
{
m_GeometriesReset = true;
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index 68e72529..df5d0ad8 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -54,18 +54,15 @@ public:
*/
QString getColoredButtonStyleSheet() const;
+ // temp
Ui::SettingsDialog *ui;
+ bool m_keyChanged;
+ PluginContainer *m_PluginContainer;
public slots:
-
virtual void accept();
-signals:
-
- void retryApiConnection();
-
private:
-
void storeSettings(QListWidgetItem *pluginItem);
public:
@@ -75,13 +72,8 @@ public:
bool getApiKeyChanged();
private slots:
- void on_associateButton_clicked();
void on_bsaDateBtn_clicked();
- void on_clearCacheButton_clicked();
void on_execBlacklistBtn_clicked();
- void on_nexusConnect_clicked();
- void on_nexusDisconnect_clicked();
- void on_nexusManualKey_clicked();
void on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
void on_resetGeometryBtn_clicked();
@@ -89,30 +81,10 @@ private slots:
private:
Settings* m_settings;
- PluginContainer *m_PluginContainer;
bool m_GeometriesReset;
- bool m_keyChanged;
QString m_ExecutableBlacklist;
- std::unique_ptr m_nexusLogin;
- std::unique_ptr m_nexusValidator;
-
- void validateKey(const QString& key);
- bool setKey(const QString& key);
- bool clearKey();
-
- void updateNexusState();
- void updateNexusButtons();
- void updateNexusData();
-
- void onSSOKeyChanged(const QString& key);
- void onSSOStateChanged(NexusSSOLogin::States s, const QString& e);
-
- void onValidatorStateChanged(NexusKeyValidator::States s, const QString& e);
- void onValidatorFinished(const APIUserAccount& user);
-
- void addNexusLog(const QString& s);
};
#endif // SETTINGSDIALOG_H
diff --git a/src/settingsdialoggeneral.cpp b/src/settingsdialoggeneral.cpp
index b22b04fd..cd98dfdc 100644
--- a/src/settingsdialoggeneral.cpp
+++ b/src/settingsdialoggeneral.cpp
@@ -6,7 +6,7 @@
using MOBase::QuestionBoxMemory;
-GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog)
+GeneralSettingsTab::GeneralSettingsTab(Settings *m_parent, SettingsDialog &m_dialog)
: SettingsTab(m_parent, m_dialog)
{
addLanguages();
@@ -87,7 +87,7 @@ GeneralTab::GeneralTab(Settings *m_parent, SettingsDialog &m_dialog)
QObject::connect(ui->resetDialogsButton, &QPushButton::clicked, [&]{ on_resetDialogsButton_clicked(); });
}
-void GeneralTab::update()
+void GeneralSettingsTab::update()
{
QString oldLanguage = m_parent->language();
QString newLanguage = ui->languageBox->itemData(ui->languageBox->currentIndex()).toString();
@@ -115,7 +115,7 @@ void GeneralTab::update()
m_Settings.setValue("Settings/colorSeparatorScrollbars", ui->colorSeparatorsBox->isChecked());
}
-void GeneralTab::addLanguages()
+void GeneralSettingsTab::addLanguages()
{
std::vector> languages;
@@ -150,7 +150,7 @@ void GeneralTab::addLanguages()
}
}
-void GeneralTab::addStyles()
+void GeneralSettingsTab::addStyles()
{
ui->styleBox->addItem("None", "");
ui->styleBox->addItem("Fusion", "Fusion");
@@ -163,12 +163,12 @@ void GeneralTab::addStyles()
}
}
-void GeneralTab::resetDialogs()
+void GeneralSettingsTab::resetDialogs()
{
QuestionBoxMemory::resetDialogs();
}
-void GeneralTab::setButtonColor(QPushButton *button, const QColor &color)
+void GeneralSettingsTab::setButtonColor(QPushButton *button, const QColor &color)
{
button->setStyleSheet(
QString("QPushButton {"
@@ -185,7 +185,7 @@ void GeneralTab::setButtonColor(QPushButton *button, const QColor &color)
);
};
-void GeneralTab::on_containsBtn_clicked()
+void GeneralSettingsTab::on_containsBtn_clicked()
{
QColor result = QColorDialog::getColor(m_ContainsColor, parentWidget(), "Color Picker: Mod contains selected plugin", QColorDialog::ShowAlphaChannel);
if (result.isValid()) {
@@ -194,7 +194,7 @@ void GeneralTab::on_containsBtn_clicked()
}
}
-void GeneralTab::on_containedBtn_clicked()
+void GeneralSettingsTab::on_containedBtn_clicked()
{
QColor result = QColorDialog::getColor(m_ContainedColor, parentWidget(), "ColorPicker: Plugin is Contained in selected Mod", QColorDialog::ShowAlphaChannel);
if (result.isValid()) {
@@ -203,7 +203,7 @@ void GeneralTab::on_containedBtn_clicked()
}
}
-void GeneralTab::on_overwrittenBtn_clicked()
+void GeneralSettingsTab::on_overwrittenBtn_clicked()
{
QColor result = QColorDialog::getColor(m_OverwrittenColor, parentWidget(), "ColorPicker: Is overwritten (loose files)", QColorDialog::ShowAlphaChannel);
if (result.isValid()) {
@@ -212,7 +212,7 @@ void GeneralTab::on_overwrittenBtn_clicked()
}
}
-void GeneralTab::on_overwritingBtn_clicked()
+void GeneralSettingsTab::on_overwritingBtn_clicked()
{
QColor result = QColorDialog::getColor(m_OverwritingColor, parentWidget(), "ColorPicker: Is overwriting (loose files)", QColorDialog::ShowAlphaChannel);
if (result.isValid()) {
@@ -221,7 +221,7 @@ void GeneralTab::on_overwritingBtn_clicked()
}
}
-void GeneralTab::on_overwrittenArchiveBtn_clicked()
+void GeneralSettingsTab::on_overwrittenArchiveBtn_clicked()
{
QColor result = QColorDialog::getColor(m_OverwrittenArchiveColor, parentWidget(), "ColorPicker: Is overwritten (archive files)", QColorDialog::ShowAlphaChannel);
if (result.isValid()) {
@@ -230,7 +230,7 @@ void GeneralTab::on_overwrittenArchiveBtn_clicked()
}
}
-void GeneralTab::on_overwritingArchiveBtn_clicked()
+void GeneralSettingsTab::on_overwritingArchiveBtn_clicked()
{
QColor result = QColorDialog::getColor(m_OverwritingArchiveColor, parentWidget(), "ColorPicker: Is overwriting (archive files)", QColorDialog::ShowAlphaChannel);
if (result.isValid()) {
@@ -239,7 +239,7 @@ void GeneralTab::on_overwritingArchiveBtn_clicked()
}
}
-void GeneralTab::on_resetColorsBtn_clicked()
+void GeneralSettingsTab::on_resetColorsBtn_clicked()
{
m_OverwritingColor = QColor(255, 0, 0, 64);
m_OverwrittenColor = QColor(0, 255, 0, 64);
@@ -256,7 +256,7 @@ void GeneralTab::on_resetColorsBtn_clicked()
setButtonColor(ui->containedBtn, m_ContainedColor);
}
-void GeneralTab::on_resetDialogsButton_clicked()
+void GeneralSettingsTab::on_resetDialogsButton_clicked()
{
if (QMessageBox::question(parentWidget(), QObject::tr("Confirm?"),
QObject::tr("This will make all dialogs show up again where you checked the \"Remember selection\"-box. Continue?"),
@@ -265,7 +265,7 @@ void GeneralTab::on_resetDialogsButton_clicked()
}
}
-void GeneralTab::on_categoriesBtn_clicked()
+void GeneralSettingsTab::on_categoriesBtn_clicked()
{
CategoriesDialog dialog(parentWidget());
if (dialog.exec() == QDialog::Accepted) {
diff --git a/src/settingsdialoggeneral.h b/src/settingsdialoggeneral.h
index 1f1b4637..c7fcae36 100644
--- a/src/settingsdialoggeneral.h
+++ b/src/settingsdialoggeneral.h
@@ -4,10 +4,10 @@
#include "settingsdialog.h"
#include "settings.h"
-class GeneralTab : public SettingsTab
+class GeneralSettingsTab : public SettingsTab
{
public:
- GeneralTab(Settings *m_parent, SettingsDialog &m_dialog);
+ GeneralSettingsTab(Settings *m_parent, SettingsDialog &m_dialog);
void update();
diff --git a/src/settingsdialognexus.cpp b/src/settingsdialognexus.cpp
new file mode 100644
index 00000000..7d4414fd
--- /dev/null
+++ b/src/settingsdialognexus.cpp
@@ -0,0 +1,374 @@
+#include "settingsdialognexus.h"
+#include "ui_settingsdialog.h"
+#include "ui_nexusmanualkey.h"
+#include "nexusinterface.h"
+#include
+
+namespace shell = MOBase::shell;
+
+template
+class ServerItem : public QListWidgetItem {
+public:
+ ServerItem(const QString &text, int sortRole = Qt::DisplayRole, QListWidget *parent = 0, int type = Type)
+ : QListWidgetItem(text, parent, type), m_SortRole(sortRole) {}
+
+ virtual bool operator< ( const QListWidgetItem & other ) const {
+ return this->data(m_SortRole).value() < other.data(m_SortRole).value();
+ }
+private:
+ int m_SortRole;
+};
+
+
+class NexusManualKeyDialog : public QDialog
+{
+public:
+ NexusManualKeyDialog(QWidget* parent)
+ : QDialog(parent), ui(new Ui::NexusManualKeyDialog)
+ {
+ ui->setupUi(this);
+ ui->key->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
+
+ connect(ui->openBrowser, &QPushButton::clicked, [&]{ openBrowser(); });
+ connect(ui->paste, &QPushButton::clicked, [&]{ paste(); });
+ connect(ui->clear, &QPushButton::clicked, [&]{ clear(); });
+ }
+
+ void accept() override
+ {
+ m_key = ui->key->toPlainText();
+ QDialog::accept();
+ }
+
+ const QString& key() const
+ {
+ return m_key;
+ }
+
+ void openBrowser()
+ {
+ shell::OpenLink(QUrl("https://www.nexusmods.com/users/myaccount?tab=api"));
+ }
+
+ void paste()
+ {
+ const auto text = QApplication::clipboard()->text();
+ if (!text.isEmpty()) {
+ ui->key->setPlainText(text);
+ }
+ }
+
+ void clear()
+ {
+ ui->key->clear();
+ }
+
+private:
+ std::unique_ptr ui;
+ QString m_key;
+};
+
+
+NexusSettingsTab::NexusSettingsTab(Settings *parent, SettingsDialog &dialog)
+ : SettingsTab(parent, dialog)
+{
+ ui->offlineBox->setChecked(parent->offlineMode());
+ ui->proxyBox->setChecked(parent->useProxy());
+ ui->endorsementBox->setChecked(parent->endorsementIntegration());
+ ui->hideAPICounterBox->setChecked(parent->hideAPICounter());
+
+ // display server preferences
+ m_Settings.beginGroup("Servers");
+ for (const QString &key : m_Settings.childKeys()) {
+ QVariantMap val = m_Settings.value(key).toMap();
+ QString descriptor = key;
+ if (!descriptor.compare("CDN", Qt::CaseInsensitive)) {
+ descriptor += QStringLiteral(" (automatic)");
+ }
+ if (val.contains("downloadSpeed") && val.contains("downloadCount") && (val["downloadCount"].toInt() > 0)) {
+ int bps = static_cast(val["downloadSpeed"].toDouble() / val["downloadCount"].toInt());
+ descriptor += QString(" (%1 kbps)").arg(bps / 1024);
+ }
+
+ QListWidgetItem *newItem = new ServerItem(descriptor, Qt::UserRole + 1);
+
+ newItem->setData(Qt::UserRole, key);
+ newItem->setData(Qt::UserRole + 1, val["preferred"].toInt());
+ if (val["preferred"].toInt() > 0) {
+ ui->preferredServersList->addItem(newItem);
+ } else {
+ ui->knownServersList->addItem(newItem);
+ }
+ ui->preferredServersList->sortItems(Qt::DescendingOrder);
+ }
+ m_Settings.endGroup();
+
+ QObject::connect(ui->nexusConnect, &QPushButton::clicked, [&]{ on_nexusConnect_clicked(); });
+ QObject::connect(ui->nexusManualKey, &QPushButton::clicked, [&]{ on_nexusManualKey_clicked(); });
+ QObject::connect(ui->nexusDisconnect, &QPushButton::clicked, [&]{ on_nexusDisconnect_clicked(); });
+ QObject::connect(ui->clearCacheButton, &QPushButton::clicked, [&]{ on_clearCacheButton_clicked(); });
+ QObject::connect(ui->associateButton, &QPushButton::clicked, [&]{ on_associateButton_clicked(); });
+
+ updateNexusState();
+}
+
+void NexusSettingsTab::update()
+{
+ /*
+ if (m_loginCheckBox->isChecked()) {
+ m_Settings.setValue("Settings/nexus_login", true);
+ m_Settings.setValue("Settings/nexus_username", m_usernameEdit->text());
+ m_Settings.setValue("Settings/nexus_password", obfuscate(m_passwordEdit->text()));
+ } else {
+ m_Settings.setValue("Settings/nexus_login", false);
+ m_Settings.remove("Settings/nexus_username");
+ m_Settings.remove("Settings/nexus_password");
+ }
+ */
+ m_Settings.setValue("Settings/offline_mode", ui->offlineBox->isChecked());
+ m_Settings.setValue("Settings/use_proxy", ui->proxyBox->isChecked());
+ m_Settings.setValue("Settings/endorsement_integration", ui->endorsementBox->isChecked());
+ m_Settings.setValue("Settings/hide_api_counter", ui->hideAPICounterBox->isChecked());
+
+ // store server preference
+ m_Settings.beginGroup("Servers");
+ for (int i = 0; i < ui->knownServersList->count(); ++i) {
+ QString key = ui->knownServersList->item(i)->data(Qt::UserRole).toString();
+ QVariantMap val = m_Settings.value(key).toMap();
+ val["preferred"] = 0;
+ m_Settings.setValue(key, val);
+ }
+ int count = ui->preferredServersList->count();
+ for (int i = 0; i < count; ++i) {
+ QString key = ui->preferredServersList->item(i)->data(Qt::UserRole).toString();
+ QVariantMap val = m_Settings.value(key).toMap();
+ val["preferred"] = count - i;
+ m_Settings.setValue(key, val);
+ }
+ m_Settings.endGroup();
+}
+
+void NexusSettingsTab::on_nexusConnect_clicked()
+{
+ if (m_nexusLogin && m_nexusLogin->isActive()) {
+ m_nexusLogin->cancel();
+ return;
+ }
+
+ if (!m_nexusLogin) {
+ m_nexusLogin.reset(new NexusSSOLogin);
+
+ m_nexusLogin->keyChanged = [&](auto&& s){
+ onSSOKeyChanged(s);
+ };
+
+ m_nexusLogin->stateChanged = [&](auto&& s, auto&& e){
+ onSSOStateChanged(s, e);
+ };
+ }
+
+ ui->nexusLog->clear();
+ m_nexusLogin->start();
+ updateNexusState();
+}
+
+void NexusSettingsTab::on_nexusManualKey_clicked()
+{
+ if (m_nexusValidator && m_nexusValidator->isActive()) {
+ m_nexusValidator->cancel();
+ return;
+ }
+
+ NexusManualKeyDialog dialog(parentWidget());
+ if (dialog.exec() != QDialog::Accepted) {
+ return;
+ }
+
+ const auto key = dialog.key();
+ if (key.isEmpty()) {
+ clearKey();
+ return;
+ }
+
+ ui->nexusLog->clear();
+ validateKey(key);
+}
+
+void NexusSettingsTab::on_nexusDisconnect_clicked()
+{
+ clearKey();
+ ui->nexusLog->clear();
+ addNexusLog(QObject::tr("Disconnected."));
+}
+
+void NexusSettingsTab::on_clearCacheButton_clicked()
+{
+ QDir(Settings::instance().getCacheDirectory()).removeRecursively();
+ NexusInterface::instance(m_dialog.m_PluginContainer)->clearCache();
+}
+
+void NexusSettingsTab::on_associateButton_clicked()
+{
+ Settings::instance().registerAsNXMHandler(true);
+}
+
+void NexusSettingsTab::validateKey(const QString& key)
+{
+ if (!m_nexusValidator) {
+ m_nexusValidator.reset(new NexusKeyValidator(
+ *NexusInterface::instance(m_dialog.m_PluginContainer)->getAccessManager()));
+
+ m_nexusValidator->stateChanged = [&](auto&& s, auto&& e){
+ onValidatorStateChanged(s, e);
+ };
+
+ m_nexusValidator->finished = [&](auto&& user) {
+ onValidatorFinished(user);
+ };
+ }
+
+ addNexusLog(QObject::tr("Checking API key..."));
+ m_nexusValidator->start(key);
+}
+
+void NexusSettingsTab::onSSOKeyChanged(const QString& key)
+{
+ if (key.isEmpty()) {
+ clearKey();
+ } else {
+ addNexusLog(QObject::tr("Received API key."));
+ validateKey(key);
+ }
+}
+
+void NexusSettingsTab::onSSOStateChanged(NexusSSOLogin::States s, const QString& e)
+{
+ if (s != NexusSSOLogin::Finished) {
+ // finished state is handled in onSSOKeyChanged()
+ const auto log = NexusSSOLogin::stateToString(s, e);
+
+ for (auto&& line : log.split("\n")) {
+ addNexusLog(line);
+ }
+ }
+
+ updateNexusState();
+}
+
+void NexusSettingsTab::onValidatorStateChanged(
+ NexusKeyValidator::States s, const QString& e)
+{
+ if (s != NexusKeyValidator::Finished) {
+ // finished state is handled in onValidatorFinished()
+ const auto log = NexusKeyValidator::stateToString(s, e);
+
+ for (auto&& line : log.split("\n")) {
+ addNexusLog(line);
+ }
+ }
+
+ updateNexusState();
+}
+
+void NexusSettingsTab::onValidatorFinished(const APIUserAccount& user)
+{
+ NexusInterface::instance(m_dialog.m_PluginContainer)->setUserAccount(user);
+
+ if (!user.apiKey().isEmpty()) {
+ if (setKey(user.apiKey())) {
+ addNexusLog(QObject::tr("Linked with Nexus successfully."));
+ }
+ }
+}
+
+void NexusSettingsTab::addNexusLog(const QString& s)
+{
+ ui->nexusLog->addItem(s);
+ ui->nexusLog->scrollToBottom();
+}
+
+bool NexusSettingsTab::setKey(const QString& key)
+{
+ m_dialog.m_keyChanged = true;
+ const bool ret = m_parent->setNexusApiKey(key);
+ updateNexusState();
+ return ret;
+}
+
+bool NexusSettingsTab::clearKey()
+{
+ m_dialog.m_keyChanged = true;
+ const auto ret = m_parent->clearNexusApiKey();
+
+ NexusInterface::instance(m_dialog.m_PluginContainer)->getAccessManager()->clearApiKey();
+ updateNexusState();
+
+ return ret;
+}
+
+void NexusSettingsTab::updateNexusState()
+{
+ updateNexusButtons();
+ updateNexusData();
+}
+
+void NexusSettingsTab::updateNexusButtons()
+{
+ if (m_nexusLogin && m_nexusLogin->isActive()) {
+ // api key is in the process of being retrieved
+ ui->nexusConnect->setText(QObject::tr("Cancel"));
+ ui->nexusConnect->setEnabled(true);
+ ui->nexusDisconnect->setEnabled(false);
+ ui->nexusManualKey->setText(QObject::tr("Enter API Key Manually"));
+ ui->nexusManualKey->setEnabled(false);
+ }
+ else if (m_nexusValidator && m_nexusValidator->isActive()) {
+ // api key is in the process of being tested
+ ui->nexusConnect->setText(QObject::tr("Connect to Nexus"));
+ ui->nexusConnect->setEnabled(false);
+ ui->nexusDisconnect->setEnabled(false);
+ ui->nexusManualKey->setText(QObject::tr("Cancel"));
+ ui->nexusManualKey->setEnabled(true);
+ }
+ else if (m_parent->hasNexusApiKey()) {
+ // api key is present
+ ui->nexusConnect->setText(QObject::tr("Connect to Nexus"));
+ ui->nexusConnect->setEnabled(false);
+ ui->nexusDisconnect->setEnabled(true);
+ ui->nexusManualKey->setText(QObject::tr("Enter API Key Manually"));
+ ui->nexusManualKey->setEnabled(false);
+ } else {
+ // api key not present
+ ui->nexusConnect->setText(QObject::tr("Connect to Nexus"));
+ ui->nexusConnect->setEnabled(true);
+ ui->nexusDisconnect->setEnabled(false);
+ ui->nexusManualKey->setText(QObject::tr("Enter API Key Manually"));
+ ui->nexusManualKey->setEnabled(true);
+ }
+}
+
+void NexusSettingsTab::updateNexusData()
+{
+ const auto user = NexusInterface::instance(m_dialog.m_PluginContainer)
+ ->getAPIUserAccount();
+
+ if (user.isValid()) {
+ ui->nexusUserID->setText(user.id());
+ ui->nexusName->setText(user.name());
+ ui->nexusAccount->setText(localizedUserAccountType(user.type()));
+
+ ui->nexusDailyRequests->setText(QString("%1/%2")
+ .arg(user.limits().remainingDailyRequests)
+ .arg(user.limits().maxDailyRequests));
+
+ ui->nexusHourlyRequests->setText(QString("%1/%2")
+ .arg(user.limits().remainingHourlyRequests)
+ .arg(user.limits().maxHourlyRequests));
+ } else {
+ ui->nexusUserID->setText(QObject::tr("N/A"));
+ ui->nexusName->setText(QObject::tr("N/A"));
+ ui->nexusAccount->setText(QObject::tr("N/A"));
+ ui->nexusDailyRequests->setText(QObject::tr("N/A"));
+ ui->nexusHourlyRequests->setText(QObject::tr("N/A"));
+ }
+}
diff --git a/src/settingsdialognexus.h b/src/settingsdialognexus.h
new file mode 100644
index 00000000..5c01f61f
--- /dev/null
+++ b/src/settingsdialognexus.h
@@ -0,0 +1,40 @@
+#ifndef SETTINGSDIALOGNEXUS_H
+#define SETTINGSDIALOGNEXUS_H
+
+#include "settings.h"
+#include "settingsdialog.h"
+
+class NexusSettingsTab : public SettingsTab
+{
+public:
+ NexusSettingsTab(Settings *m_parent, SettingsDialog &m_dialog);
+ void update();
+
+private:
+ std::unique_ptr m_nexusLogin;
+ std::unique_ptr m_nexusValidator;
+
+ void on_nexusConnect_clicked();
+ void on_nexusManualKey_clicked();
+ void on_nexusDisconnect_clicked();
+ void on_clearCacheButton_clicked();
+ void on_associateButton_clicked();
+
+ void validateKey(const QString& key);
+ bool setKey(const QString& key);
+ bool clearKey();
+
+ void updateNexusState();
+ void updateNexusButtons();
+ void updateNexusData();
+
+ void onSSOKeyChanged(const QString& key);
+ void onSSOStateChanged(NexusSSOLogin::States s, const QString& e);
+
+ void onValidatorStateChanged(NexusKeyValidator::States s, const QString& e);
+ void onValidatorFinished(const APIUserAccount& user);
+
+ void addNexusLog(const QString& s);
+};
+
+#endif // SETTINGSDIALOGNEXUS_H
diff --git a/src/settingsdialogpaths.cpp b/src/settingsdialogpaths.cpp
index 303d1562..6e8fe994 100644
--- a/src/settingsdialogpaths.cpp
+++ b/src/settingsdialogpaths.cpp
@@ -3,7 +3,7 @@
#include "appconfig.h"
#include
-PathsTab::PathsTab(Settings *parent, SettingsDialog &dialog)
+PathsSettingsTab::PathsSettingsTab(Settings *parent, SettingsDialog &dialog)
: SettingsTab(parent, dialog)
{
ui->baseDirEdit->setText(m_parent->getBaseDirectory());
@@ -38,7 +38,7 @@ PathsTab::PathsTab(Settings *parent, SettingsDialog &dialog)
QObject::connect(ui->profilesDirEdit, &QLineEdit::editingFinished, [&]{ on_profilesDirEdit_editingFinished(); });
}
-void PathsTab::update()
+void PathsSettingsTab::update()
{
typedef std::tuple Directory;
@@ -91,7 +91,7 @@ void PathsTab::update()
}
}
-void PathsTab::on_browseBaseDirBtn_clicked()
+void PathsSettingsTab::on_browseBaseDirBtn_clicked()
{
QString temp = QFileDialog::getExistingDirectory(
parentWidget(), QObject::tr("Select base directory"), ui->baseDirEdit->text());
@@ -100,7 +100,7 @@ void PathsTab::on_browseBaseDirBtn_clicked()
}
}
-void PathsTab::on_browseDownloadDirBtn_clicked()
+void PathsSettingsTab::on_browseDownloadDirBtn_clicked()
{
QString searchPath = ui->downloadDirEdit->text();
searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
@@ -111,7 +111,7 @@ void PathsTab::on_browseDownloadDirBtn_clicked()
}
}
-void PathsTab::on_browseModDirBtn_clicked()
+void PathsSettingsTab::on_browseModDirBtn_clicked()
{
QString searchPath = ui->modDirEdit->text();
searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
@@ -122,7 +122,7 @@ void PathsTab::on_browseModDirBtn_clicked()
}
}
-void PathsTab::on_browseCacheDirBtn_clicked()
+void PathsSettingsTab::on_browseCacheDirBtn_clicked()
{
QString searchPath = ui->cacheDirEdit->text();
searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
@@ -133,7 +133,7 @@ void PathsTab::on_browseCacheDirBtn_clicked()
}
}
-void PathsTab::on_browseProfilesDirBtn_clicked()
+void PathsSettingsTab::on_browseProfilesDirBtn_clicked()
{
QString searchPath = ui->profilesDirEdit->text();
searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
@@ -144,7 +144,7 @@ void PathsTab::on_browseProfilesDirBtn_clicked()
}
}
-void PathsTab::on_browseOverwriteDirBtn_clicked()
+void PathsSettingsTab::on_browseOverwriteDirBtn_clicked()
{
QString searchPath = ui->overwriteDirEdit->text();
searchPath.replace("%BASE_DIR%", ui->baseDirEdit->text());
@@ -155,7 +155,7 @@ void PathsTab::on_browseOverwriteDirBtn_clicked()
}
}
-void PathsTab::on_browseGameDirBtn_clicked()
+void PathsSettingsTab::on_browseGameDirBtn_clicked()
{
QFileInfo oldGameExe(ui->managedGameDirEdit->text());
@@ -165,37 +165,37 @@ void PathsTab::on_browseGameDirBtn_clicked()
}
}
-void PathsTab::on_baseDirEdit_editingFinished()
+void PathsSettingsTab::on_baseDirEdit_editingFinished()
{
normalizePath(ui->baseDirEdit);
}
-void PathsTab::on_downloadDirEdit_editingFinished()
+void PathsSettingsTab::on_downloadDirEdit_editingFinished()
{
normalizePath(ui->downloadDirEdit);
}
-void PathsTab::on_modDirEdit_editingFinished()
+void PathsSettingsTab::on_modDirEdit_editingFinished()
{
normalizePath(ui->modDirEdit);
}
-void PathsTab::on_cacheDirEdit_editingFinished()
+void PathsSettingsTab::on_cacheDirEdit_editingFinished()
{
normalizePath(ui->cacheDirEdit);
}
-void PathsTab::on_profilesDirEdit_editingFinished()
+void PathsSettingsTab::on_profilesDirEdit_editingFinished()
{
normalizePath(ui->profilesDirEdit);
}
-void PathsTab::on_overwriteDirEdit_editingFinished()
+void PathsSettingsTab::on_overwriteDirEdit_editingFinished()
{
normalizePath(ui->overwriteDirEdit);
}
-void PathsTab::normalizePath(QLineEdit *lineEdit)
+void PathsSettingsTab::normalizePath(QLineEdit *lineEdit)
{
QString text = lineEdit->text();
while (text.endsWith('/') || text.endsWith('\\')) {
diff --git a/src/settingsdialogpaths.h b/src/settingsdialogpaths.h
index dac402b1..f661b624 100644
--- a/src/settingsdialogpaths.h
+++ b/src/settingsdialogpaths.h
@@ -4,10 +4,10 @@
#include "settings.h"
#include "settingsdialog.h"
-class PathsTab : public SettingsTab
+class PathsSettingsTab : public SettingsTab
{
public:
- PathsTab(Settings *parent, SettingsDialog &dialog);
+ PathsSettingsTab(Settings *parent, SettingsDialog &dialog);
void update();
--
cgit v1.3.1
From 55eafd62dd3c96f363cde4537061e7f03ae8fd0a Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Sat, 20 Jul 2019 10:10:49 -0400
Subject: split plugins tab
---
src/CMakeLists.txt | 3 ++
src/settings.cpp | 54 +++------------------
src/settings.h | 25 +++-------
src/settingsdialog.cpp | 52 --------------------
src/settingsdialog.h | 4 --
src/settingsdialogplugins.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++
src/settingsdialogplugins.h | 20 ++++++++
7 files changed, 146 insertions(+), 122 deletions(-)
create mode 100644 src/settingsdialogplugins.cpp
create mode 100644 src/settingsdialogplugins.h
(limited to 'src/settingsdialog.cpp')
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a1adf2db..a8ded510 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -40,6 +40,7 @@ SET(organizer_SRCS
settingsdialoggeneral.cpp
settingsdialognexus.cpp
settingsdialogpaths.cpp
+ settingsdialogplugins.cpp
settingsdialogsteam.cpp
settings.cpp
selfupdater.cpp
@@ -158,6 +159,7 @@ SET(organizer_HDRS
settingsdialoggeneral.h
settingsdialognexus.h
settingsdialogpaths.h
+ settingsdialogplugins.h
settingsdialogsteam.h
settings.h
selfupdater.h
@@ -442,6 +444,7 @@ set(settings
settingsdialoggeneral
settingsdialognexus
settingsdialogpaths
+ settingsdialogplugins
settingsdialogsteam
)
diff --git a/src/settings.cpp b/src/settings.cpp
index 26c9720a..bc45b720 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -25,6 +25,7 @@ along with Mod Organizer. If not, see .
#include "settingsdialoggeneral.h"
#include "settingsdialognexus.h"
#include "settingsdialogpaths.h"
+#include "settingsdialogplugins.h"
#include "settingsdialogsteam.h"
#include "versioninfo.h"
#include "appconfig.h"
@@ -677,7 +678,7 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
tabs.push_back(std::unique_ptr(new DiagnosticsTab(this, dialog)));
tabs.push_back(std::unique_ptr(new NexusSettingsTab(this, dialog)));
tabs.push_back(std::unique_ptr(new SteamSettingsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new PluginsTab(this, dialog)));
+ tabs.push_back(std::unique_ptr(new PluginsSettingsTab(this, dialog)));
tabs.push_back(std::unique_ptr(new WorkaroundsTab(this, dialog)));
@@ -687,6 +688,11 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
}
if (dialog.exec() == QDialog::Accepted) {
+
+ for (auto&& tab : tabs) {
+ tab->closing();
+ }
+
// remember settings before change
QMap before;
m_Settings.beginGroup("Settings");
@@ -766,52 +772,6 @@ void Settings::DiagnosticsTab::update()
}
-Settings::PluginsTab::PluginsTab(Settings *m_parent, SettingsDialog &m_dialog)
- : SettingsTab(m_parent, m_dialog)
- , m_pluginsList(m_dialog.findChild("pluginsList"))
- , m_pluginBlacklistList(m_dialog.findChild("pluginBlacklist"))
-{
- // display plugin settings
- QSet handledNames;
- for (IPlugin *plugin : m_parent->m_Plugins) {
- if (handledNames.contains(plugin->name()))
- continue;
- QListWidgetItem *listItem = new QListWidgetItem(plugin->name(), m_pluginsList);
- listItem->setData(Qt::UserRole, QVariant::fromValue((void*)plugin));
- listItem->setData(Qt::UserRole + 1, m_parent->m_PluginSettings[plugin->name()]);
- listItem->setData(Qt::UserRole + 2, m_parent->m_PluginDescriptions[plugin->name()]);
- m_pluginsList->addItem(listItem);
- handledNames.insert(plugin->name());
- }
-
- // display plugin blacklist
- for (const QString &pluginName : m_parent->m_PluginBlacklist) {
- m_pluginBlacklistList->addItem(pluginName);
- }
-}
-
-void Settings::PluginsTab::update()
-{
- // transfer plugin settings to in-memory structure
- for (int i = 0; i < m_pluginsList->count(); ++i) {
- QListWidgetItem *item = m_pluginsList->item(i);
- m_parent->m_PluginSettings[item->text()] = item->data(Qt::UserRole + 1).toMap();
- }
- // store plugin settings on disc
- for (auto iterPlugins = m_parent->m_PluginSettings.begin(); iterPlugins != m_parent->m_PluginSettings.end(); ++iterPlugins) {
- for (auto iterSettings = iterPlugins->begin(); iterSettings != iterPlugins->end(); ++iterSettings) {
- m_Settings.setValue("Plugins/" + iterPlugins.key() + "/" + iterSettings.key(), iterSettings.value());
- }
- }
-
- // store plugin blacklist
- m_parent->m_PluginBlacklist.clear();
- for (QListWidgetItem *item : m_pluginBlacklistList->findItems("*", Qt::MatchWildcard)) {
- m_parent->m_PluginBlacklist.insert(item->text());
- }
- m_parent->writePluginBlacklist();
-}
-
Settings::WorkaroundsTab::WorkaroundsTab(Settings *m_parent,
SettingsDialog &m_dialog)
: SettingsTab(m_parent, m_dialog)
diff --git a/src/settings.h b/src/settings.h
index 5bf705d1..5298103a 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -70,6 +70,7 @@ public:
virtual ~SettingsTab();
virtual void update() = 0;
+ virtual void closing() {}
protected:
Settings *m_parent;
@@ -426,8 +427,13 @@ public:
*/
bool colorSeparatorScrollbar() const;
+ // temp
QSettings& settingsRef() { return m_Settings; }
MOBase::IPluginGame const *gamePlugin() { return m_GamePlugin; }
+ QMap m_PluginSettings;
+ QMap m_PluginDescriptions;
+ QSet m_PluginBlacklist;
+ void writePluginBlacklist();
public slots:
@@ -440,7 +446,6 @@ private:
static QString deObfuscate(const QString key);
void readPluginBlacklist();
- void writePluginBlacklist();
QString getConfigurablePath(const QString &key, const QString &def, bool resolve) const;
@@ -461,19 +466,6 @@ private:
void setLevelsBox();
};
- /** Display/store the configuration in the 'plugins' tab of the settings dialogue */
- class PluginsTab : public SettingsTab
- {
- public:
- PluginsTab(Settings *m_parent, SettingsDialog &m_dialog);
-
- void update();
-
- private:
- QListWidget *m_pluginsList;
- QListWidget *m_pluginBlacklistList;
- };
-
/** Display/store the configuration in the 'workarounds' tab of the settings dialogue */
class WorkaroundsTab : public SettingsTab
{
@@ -512,11 +504,6 @@ private:
std::vector m_Plugins;
- QMap m_PluginSettings;
- QMap m_PluginDescriptions;
-
- QSet m_PluginBlacklist;
-
};
#endif // SETTINGS_H
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index 6d5a8cc0..f43f7ae8 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -99,7 +99,6 @@ void SettingsDialog::accept()
return;
}
- storeSettings(ui->pluginsList->currentItem());
TutorableDialog::accept();
}
@@ -149,57 +148,6 @@ void SettingsDialog::on_bsaDateBtn_clicked()
dir.absolutePath().toStdWString());
}
-void SettingsDialog::storeSettings(QListWidgetItem *pluginItem)
-{
- if (pluginItem != nullptr) {
- QVariantMap settings = pluginItem->data(Qt::UserRole + 1).toMap();
-
- for (int i = 0; i < ui->pluginSettingsList->topLevelItemCount(); ++i) {
- const QTreeWidgetItem *item = ui->pluginSettingsList->topLevelItem(i);
- settings[item->text(0)] = item->data(1, Qt::DisplayRole);
- }
-
- pluginItem->setData(Qt::UserRole + 1, settings);
- }
-}
-
-void SettingsDialog::on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
-{
- storeSettings(previous);
-
- ui->pluginSettingsList->clear();
- IPlugin *plugin = static_cast(current->data(Qt::UserRole).value());
- ui->authorLabel->setText(plugin->author());
- ui->versionLabel->setText(plugin->version().canonicalString());
- ui->descriptionLabel->setText(plugin->description());
-
- QVariantMap settings = current->data(Qt::UserRole + 1).toMap();
- QVariantMap descriptions = current->data(Qt::UserRole + 2).toMap();
- ui->pluginSettingsList->setEnabled(settings.count() != 0);
- for (auto iter = settings.begin(); iter != settings.end(); ++iter) {
- QTreeWidgetItem *newItem = new QTreeWidgetItem(QStringList(iter.key()));
- QVariant value = *iter;
- QString description;
- {
- auto descriptionIter = descriptions.find(iter.key());
- if (descriptionIter != descriptions.end()) {
- description = descriptionIter->toString();
- }
- }
-
- ui->pluginSettingsList->setItemDelegateForColumn(0, new NoEditDelegate());
- newItem->setData(1, Qt::DisplayRole, value);
- newItem->setData(1, Qt::EditRole, value);
- newItem->setToolTip(1, description);
-
- newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
- ui->pluginSettingsList->addTopLevelItem(newItem);
- }
-
- ui->pluginSettingsList->resizeColumnToContents(0);
- ui->pluginSettingsList->resizeColumnToContents(1);
-}
-
void SettingsDialog::deleteBlacklistItem()
{
ui->pluginBlacklist->takeItem(ui->pluginBlacklist->currentIndex().row());
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index df5d0ad8..319e6ed8 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -62,9 +62,6 @@ public:
public slots:
virtual void accept();
-private:
- void storeSettings(QListWidgetItem *pluginItem);
-
public:
QString getExecutableBlacklist() { return m_ExecutableBlacklist; }
void setExecutableBlacklist(QString blacklist) { m_ExecutableBlacklist = blacklist; }
@@ -74,7 +71,6 @@ public:
private slots:
void on_bsaDateBtn_clicked();
void on_execBlacklistBtn_clicked();
- void on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
void on_resetGeometryBtn_clicked();
void deleteBlacklistItem();
diff --git a/src/settingsdialogplugins.cpp b/src/settingsdialogplugins.cpp
new file mode 100644
index 00000000..32269344
--- /dev/null
+++ b/src/settingsdialogplugins.cpp
@@ -0,0 +1,110 @@
+#include "settingsdialogplugins.h"
+#include "ui_settingsdialog.h"
+#include "noeditdelegate.h"
+#include
+
+using MOBase::IPlugin;
+
+PluginsSettingsTab::PluginsSettingsTab(Settings *m_parent, SettingsDialog &m_dialog)
+ : SettingsTab(m_parent, m_dialog)
+{
+ // display plugin settings
+ QSet handledNames;
+ for (IPlugin *plugin : m_parent->plugins()) {
+ if (handledNames.contains(plugin->name()))
+ continue;
+ QListWidgetItem *listItem = new QListWidgetItem(plugin->name(), ui->pluginsList);
+ listItem->setData(Qt::UserRole, QVariant::fromValue((void*)plugin));
+ listItem->setData(Qt::UserRole + 1, m_parent->m_PluginSettings[plugin->name()]);
+ listItem->setData(Qt::UserRole + 2, m_parent->m_PluginDescriptions[plugin->name()]);
+ ui->pluginsList->addItem(listItem);
+ handledNames.insert(plugin->name());
+ }
+
+ // display plugin blacklist
+ for (const QString &pluginName : m_parent->m_PluginBlacklist) {
+ ui->pluginBlacklist->addItem(pluginName);
+ }
+
+ QObject::connect(
+ ui->pluginsList, &QListWidget::currentItemChanged,
+ [&](auto* current, auto* previous) { on_pluginsList_currentItemChanged(current, previous); });
+}
+
+void PluginsSettingsTab::update()
+{
+ // transfer plugin settings to in-memory structure
+ for (int i = 0; i < ui->pluginsList->count(); ++i) {
+ QListWidgetItem *item = ui->pluginsList->item(i);
+ m_parent->m_PluginSettings[item->text()] = item->data(Qt::UserRole + 1).toMap();
+ }
+ // store plugin settings on disc
+ for (auto iterPlugins = m_parent->m_PluginSettings.begin(); iterPlugins != m_parent->m_PluginSettings.end(); ++iterPlugins) {
+ for (auto iterSettings = iterPlugins->begin(); iterSettings != iterPlugins->end(); ++iterSettings) {
+ m_Settings.setValue("Plugins/" + iterPlugins.key() + "/" + iterSettings.key(), iterSettings.value());
+ }
+ }
+
+ // store plugin blacklist
+ m_parent->m_PluginBlacklist.clear();
+ for (QListWidgetItem *item : ui->pluginBlacklist->findItems("*", Qt::MatchWildcard)) {
+ m_parent->m_PluginBlacklist.insert(item->text());
+ }
+ m_parent->writePluginBlacklist();
+}
+
+void PluginsSettingsTab::closing()
+{
+ storeSettings(ui->pluginsList->currentItem());
+}
+
+void PluginsSettingsTab::on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
+{
+ storeSettings(previous);
+
+ ui->pluginSettingsList->clear();
+ IPlugin *plugin = static_cast(current->data(Qt::UserRole).value());
+ ui->authorLabel->setText(plugin->author());
+ ui->versionLabel->setText(plugin->version().canonicalString());
+ ui->descriptionLabel->setText(plugin->description());
+
+ QVariantMap settings = current->data(Qt::UserRole + 1).toMap();
+ QVariantMap descriptions = current->data(Qt::UserRole + 2).toMap();
+ ui->pluginSettingsList->setEnabled(settings.count() != 0);
+ for (auto iter = settings.begin(); iter != settings.end(); ++iter) {
+ QTreeWidgetItem *newItem = new QTreeWidgetItem(QStringList(iter.key()));
+ QVariant value = *iter;
+ QString description;
+ {
+ auto descriptionIter = descriptions.find(iter.key());
+ if (descriptionIter != descriptions.end()) {
+ description = descriptionIter->toString();
+ }
+ }
+
+ ui->pluginSettingsList->setItemDelegateForColumn(0, new NoEditDelegate());
+ newItem->setData(1, Qt::DisplayRole, value);
+ newItem->setData(1, Qt::EditRole, value);
+ newItem->setToolTip(1, description);
+
+ newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
+ ui->pluginSettingsList->addTopLevelItem(newItem);
+ }
+
+ ui->pluginSettingsList->resizeColumnToContents(0);
+ ui->pluginSettingsList->resizeColumnToContents(1);
+}
+
+void PluginsSettingsTab::storeSettings(QListWidgetItem *pluginItem)
+{
+ if (pluginItem != nullptr) {
+ QVariantMap settings = pluginItem->data(Qt::UserRole + 1).toMap();
+
+ for (int i = 0; i < ui->pluginSettingsList->topLevelItemCount(); ++i) {
+ const QTreeWidgetItem *item = ui->pluginSettingsList->topLevelItem(i);
+ settings[item->text(0)] = item->data(1, Qt::DisplayRole);
+ }
+
+ pluginItem->setData(Qt::UserRole + 1, settings);
+ }
+}
diff --git a/src/settingsdialogplugins.h b/src/settingsdialogplugins.h
new file mode 100644
index 00000000..48d61858
--- /dev/null
+++ b/src/settingsdialogplugins.h
@@ -0,0 +1,20 @@
+#ifndef SETTINGSDIALOGPLUGINS_H
+#define SETTINGSDIALOGPLUGINS_H
+
+#include "settings.h"
+#include "settingsdialog.h"
+
+class PluginsSettingsTab : public SettingsTab
+{
+public:
+ PluginsSettingsTab(Settings *m_parent, SettingsDialog &m_dialog);
+
+ void update();
+ void closing() override;
+
+private:
+ void on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
+ void storeSettings(QListWidgetItem *pluginItem);
+};
+
+#endif // SETTINGSDIALOGPLUGINS_H
--
cgit v1.3.1
From e4dcdb01ac2e3f99fea76b21e1acfd21d0de89c7 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Sat, 20 Jul 2019 10:45:59 -0400
Subject: split workarounds tab
---
src/CMakeLists.txt | 3 ++
src/loadmechanism.cpp | 6 +--
src/loadmechanism.h | 6 +--
src/settings.cpp | 73 +-------------------------
src/settings.h | 20 +------
src/settingsdialog.cpp | 51 ------------------
src/settingsdialog.h | 14 +----
src/settingsdialogplugins.cpp | 9 ++++
src/settingsdialogplugins.h | 1 +
src/settingsdialogworkarounds.cpp | 108 ++++++++++++++++++++++++++++++++++++++
src/settingsdialogworkarounds.h | 25 +++++++++
11 files changed, 157 insertions(+), 159 deletions(-)
create mode 100644 src/settingsdialogworkarounds.cpp
create mode 100644 src/settingsdialogworkarounds.h
(limited to 'src/settingsdialog.cpp')
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a8ded510..86ef9721 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -42,6 +42,7 @@ SET(organizer_SRCS
settingsdialogpaths.cpp
settingsdialogplugins.cpp
settingsdialogsteam.cpp
+ settingsdialogworkarounds.cpp
settings.cpp
selfupdater.cpp
selectiondialog.cpp
@@ -161,6 +162,7 @@ SET(organizer_HDRS
settingsdialogpaths.h
settingsdialogplugins.h
settingsdialogsteam.h
+ settingsdialogworkarounds.h
settings.h
selfupdater.h
selectiondialog.h
@@ -446,6 +448,7 @@ set(settings
settingsdialogpaths
settingsdialogplugins
settingsdialogsteam
+ settingsdialogworkarounds
)
set(utilities
diff --git a/src/loadmechanism.cpp b/src/loadmechanism.cpp
index 4d6cebd4..2d01562d 100644
--- a/src/loadmechanism.cpp
+++ b/src/loadmechanism.cpp
@@ -63,7 +63,7 @@ void LoadMechanism::removeHintFile(QDir targetDirectory)
}
-bool LoadMechanism::isDirectLoadingSupported()
+bool LoadMechanism::isDirectLoadingSupported() const
{
//FIXME: Seriously? isn't there a 'do i need steam' thing?
IPluginGame const *game = qApp->property("managed_game").value();
@@ -76,7 +76,7 @@ bool LoadMechanism::isDirectLoadingSupported()
}
}
-bool LoadMechanism::isScriptExtenderSupported()
+bool LoadMechanism::isScriptExtenderSupported() const
{
IPluginGame const *game = qApp->property("managed_game").value();
ScriptExtender *extender = game->feature();
@@ -85,7 +85,7 @@ bool LoadMechanism::isScriptExtenderSupported()
return extender != nullptr && extender->isInstalled();
}
-bool LoadMechanism::isProxyDLLSupported()
+bool LoadMechanism::isProxyDLLSupported() const
{
// using steam_api.dll as the proxy is way too game specific as many games will have different
// versions of that dll.
diff --git a/src/loadmechanism.h b/src/loadmechanism.h
index c04473ab..51fefaf9 100644
--- a/src/loadmechanism.h
+++ b/src/loadmechanism.h
@@ -68,21 +68,21 @@ public:
*
* @return true if the load mechanism is supported
**/
- bool isDirectLoadingSupported();
+ bool isDirectLoadingSupported() const;
/**
* @brief test whether the "Script Extender" load mechanism is supported for the current game
*
* @return true if the load mechanism is supported
**/
- bool isScriptExtenderSupported();
+ bool isScriptExtenderSupported() const;
/**
* @brief test whether the "Proxy DLL" load mechanism is supported for the current game
*
* @return true if the load mechanism is supported
**/
- bool isProxyDLLSupported();
+ bool isProxyDLLSupported() const;
private:
diff --git a/src/settings.cpp b/src/settings.cpp
index bc45b720..515ff907 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -27,6 +27,7 @@ along with Mod Organizer. If not, see .
#include "settingsdialogpaths.h"
#include "settingsdialogplugins.h"
#include "settingsdialogsteam.h"
+#include "settingsdialogworkarounds.h"
#include "versioninfo.h"
#include "appconfig.h"
#include "organizercore.h"
@@ -679,7 +680,7 @@ void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
tabs.push_back(std::unique_ptr(new NexusSettingsTab(this, dialog)));
tabs.push_back(std::unique_ptr(new SteamSettingsTab(this, dialog)));
tabs.push_back(std::unique_ptr(new PluginsSettingsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new WorkaroundsTab(this, dialog)));
+ tabs.push_back(std::unique_ptr(new WorkaroundsSettingsTab(this, dialog)));
QString key = QString("geometry/%1").arg(dialog.objectName());
@@ -770,73 +771,3 @@ void Settings::DiagnosticsTab::update()
m_Settings.setValue("Settings/crash_dumps_type", m_dumpsTypeBox->currentIndex());
m_Settings.setValue("Settings/crash_dumps_max", m_dumpsMaxEdit->value());
}
-
-
-Settings::WorkaroundsTab::WorkaroundsTab(Settings *m_parent,
- SettingsDialog &m_dialog)
- : SettingsTab(m_parent, m_dialog)
- , m_appIDEdit(m_dialog.findChild("appIDEdit"))
- , m_mechanismBox(m_dialog.findChild("mechanismBox"))
- , m_hideUncheckedBox(m_dialog.findChild("hideUncheckedBox"))
- , m_forceEnableBox(m_dialog.findChild("forceEnableBox"))
- , m_displayForeignBox(m_dialog.findChild("displayForeignBox"))
- , m_lockGUIBox(m_dialog.findChild("lockGUIBox"))
- , m_enableArchiveParsingBox(m_dialog.findChild("enableArchiveParsingBox"))
- , m_resetGeometriesBtn(m_dialog.findChild("resetGeometryBtn"))
-{
- m_appIDEdit->setText(m_parent->getSteamAppID());
-
- LoadMechanism::EMechanism mechanismID = m_parent->getLoadMechanism();
- int index = 0;
-
- if (m_parent->m_LoadMechanism.isDirectLoadingSupported()) {
- m_mechanismBox->addItem(QObject::tr("Mod Organizer"), LoadMechanism::LOAD_MODORGANIZER);
- if (mechanismID == LoadMechanism::LOAD_MODORGANIZER) {
- index = m_mechanismBox->count() - 1;
- }
- }
-
- if (m_parent->m_LoadMechanism.isScriptExtenderSupported()) {
- m_mechanismBox->addItem(QObject::tr("Script Extender"), LoadMechanism::LOAD_SCRIPTEXTENDER);
- if (mechanismID == LoadMechanism::LOAD_SCRIPTEXTENDER) {
- index = m_mechanismBox->count() - 1;
- }
- }
-
- if (m_parent->m_LoadMechanism.isProxyDLLSupported()) {
- m_mechanismBox->addItem(QObject::tr("Proxy DLL"), LoadMechanism::LOAD_PROXYDLL);
- if (mechanismID == LoadMechanism::LOAD_PROXYDLL) {
- index = m_mechanismBox->count() - 1;
- }
- }
-
- m_mechanismBox->setCurrentIndex(index);
-
- m_hideUncheckedBox->setChecked(m_parent->hideUncheckedPlugins());
- m_forceEnableBox->setChecked(m_parent->forceEnableCoreFiles());
- m_displayForeignBox->setChecked(m_parent->displayForeign());
- m_lockGUIBox->setChecked(m_parent->lockGUI());
- m_enableArchiveParsingBox->setChecked(m_parent->archiveParsing());
-
- m_resetGeometriesBtn->setChecked(m_parent->directInterface().value("reset_geometry", false).toBool());
-
- m_dialog.setExecutableBlacklist(m_parent->executablesBlacklist());
-
-}
-
-void Settings::WorkaroundsTab::update()
-{
- if (m_appIDEdit->text() != m_parent->m_GamePlugin->steamAPPId()) {
- m_Settings.setValue("Settings/app_id", m_appIDEdit->text());
- } else {
- m_Settings.remove("Settings/app_id");
- }
- m_Settings.setValue("Settings/load_mechanism", m_mechanismBox->itemData(m_mechanismBox->currentIndex()).toInt());
- m_Settings.setValue("Settings/hide_unchecked_plugins", m_hideUncheckedBox->isChecked());
- m_Settings.setValue("Settings/force_enable_core_files", m_forceEnableBox->isChecked());
- m_Settings.setValue("Settings/display_foreign", m_displayForeignBox->isChecked());
- m_Settings.setValue("Settings/lock_gui", m_lockGUIBox->isChecked());
- m_Settings.setValue("Settings/archive_parsing_experimental", m_enableArchiveParsingBox->isChecked());
-
- m_Settings.setValue("Settings/executable_blacklist", m_dialog.getExecutableBlacklist());
-}
diff --git a/src/settings.h b/src/settings.h
index 5298103a..64068173 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -434,6 +434,7 @@ public:
QMap m_PluginDescriptions;
QSet m_PluginBlacklist;
void writePluginBlacklist();
+ const LoadMechanism& loadMechanism() const { return m_LoadMechanism; }
public slots:
@@ -466,25 +467,6 @@ private:
void setLevelsBox();
};
- /** Display/store the configuration in the 'workarounds' tab of the settings dialogue */
- class WorkaroundsTab : public SettingsTab
- {
- public:
- WorkaroundsTab(Settings *m_parent, SettingsDialog &m_dialog);
-
- void update();
-
- private:
- QLineEdit *m_appIDEdit;
- QComboBox *m_mechanismBox;
- QCheckBox *m_hideUncheckedBox;
- QCheckBox *m_forceEnableBox;
- QCheckBox *m_displayForeignBox;
- QCheckBox *m_lockGUIBox;
- QCheckBox *m_enableArchiveParsingBox;
- QPushButton *m_resetGeometriesBtn;
- };
-
private slots:
signals:
diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp
index f43f7ae8..76b0a146 100644
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -58,10 +58,6 @@ SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* setti
{
ui->setupUi(this);
ui->pluginSettingsList->setStyleSheet("QTreeWidget::item {padding-right: 10px;}");
-
- QShortcut *delShortcut = new QShortcut(
- QKeySequence(Qt::Key_Delete), ui->pluginBlacklist);
- connect(delShortcut, SIGNAL(activated()), this, SLOT(deleteBlacklistItem()));
}
SettingsDialog::~SettingsDialog()
@@ -111,50 +107,3 @@ bool SettingsDialog::getApiKeyChanged()
{
return m_keyChanged;
}
-
-void SettingsDialog::on_execBlacklistBtn_clicked()
-{
- bool ok = false;
- QString result = QInputDialog::getMultiLineText(
- this,
- tr("Executables Blacklist"),
- tr("Enter one executable per line to be blacklisted from the virtual file system.\n"
- "Mods and other virtualized files will not be visible to these executables and\n"
- "any executables launched by them.\n\n"
- "Example:\n"
- " Chrome.exe\n"
- " Firefox.exe"),
- m_ExecutableBlacklist.split(";").join("\n"),
- &ok
- );
- if (ok) {
- QStringList blacklist;
- for (auto exec : result.split("\n")) {
- if (exec.trimmed().endsWith(".exe", Qt::CaseInsensitive)) {
- blacklist << exec.trimmed();
- }
- }
- m_ExecutableBlacklist = blacklist.join(";");
- }
-}
-
-void SettingsDialog::on_bsaDateBtn_clicked()
-{
- IPluginGame const *game
- = qApp->property("managed_game").value();
- QDir dir = game->dataDirectory();
-
- Helper::backdateBSAs(qApp->applicationDirPath().toStdWString(),
- dir.absolutePath().toStdWString());
-}
-
-void SettingsDialog::deleteBlacklistItem()
-{
- ui->pluginBlacklist->takeItem(ui->pluginBlacklist->currentIndex().row());
-}
-
-void SettingsDialog::on_resetGeometryBtn_clicked()
-{
- m_GeometriesReset = true;
- ui->resetGeometryBtn->setChecked(true);
-}
diff --git a/src/settingsdialog.h b/src/settingsdialog.h
index 319e6ed8..81c17f44 100644
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -57,30 +57,20 @@ public:
// temp
Ui::SettingsDialog *ui;
bool m_keyChanged;
+ bool m_GeometriesReset;
PluginContainer *m_PluginContainer;
public slots:
virtual void accept();
public:
- QString getExecutableBlacklist() { return m_ExecutableBlacklist; }
- void setExecutableBlacklist(QString blacklist) { m_ExecutableBlacklist = blacklist; }
- bool getResetGeometries();
bool getApiKeyChanged();
-
-private slots:
- void on_bsaDateBtn_clicked();
- void on_execBlacklistBtn_clicked();
- void on_resetGeometryBtn_clicked();
-
- void deleteBlacklistItem();
+ bool getResetGeometries();
private:
Settings* m_settings;
- bool m_GeometriesReset;
- QString m_ExecutableBlacklist;
};
#endif // SETTINGSDIALOG_H
diff --git a/src/settingsdialogplugins.cpp b/src/settingsdialogplugins.cpp
index 32269344..33bc1563 100644
--- a/src/settingsdialogplugins.cpp
+++ b/src/settingsdialogplugins.cpp
@@ -29,6 +29,10 @@ PluginsSettingsTab::PluginsSettingsTab(Settings *m_parent, SettingsDialog &m_dia
QObject::connect(
ui->pluginsList, &QListWidget::currentItemChanged,
[&](auto* current, auto* previous) { on_pluginsList_currentItemChanged(current, previous); });
+
+ QShortcut *delShortcut = new QShortcut(
+ QKeySequence(Qt::Key_Delete), ui->pluginBlacklist);
+ QObject::connect(delShortcut, &QShortcut::activated, parentWidget(), [&]{ deleteBlacklistItem(); });
}
void PluginsSettingsTab::update()
@@ -95,6 +99,11 @@ void PluginsSettingsTab::on_pluginsList_currentItemChanged(QListWidgetItem *curr
ui->pluginSettingsList->resizeColumnToContents(1);
}
+void PluginsSettingsTab::deleteBlacklistItem()
+{
+ ui->pluginBlacklist->takeItem(ui->pluginBlacklist->currentIndex().row());
+}
+
void PluginsSettingsTab::storeSettings(QListWidgetItem *pluginItem)
{
if (pluginItem != nullptr) {
diff --git a/src/settingsdialogplugins.h b/src/settingsdialogplugins.h
index 48d61858..9d21daa6 100644
--- a/src/settingsdialogplugins.h
+++ b/src/settingsdialogplugins.h
@@ -14,6 +14,7 @@ public:
private:
void on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
+ void deleteBlacklistItem();
void storeSettings(QListWidgetItem *pluginItem);
};
diff --git a/src/settingsdialogworkarounds.cpp b/src/settingsdialogworkarounds.cpp
new file mode 100644
index 00000000..4cca5fd4
--- /dev/null
+++ b/src/settingsdialogworkarounds.cpp
@@ -0,0 +1,108 @@
+#include "settingsdialogworkarounds.h"
+#include "ui_settingsdialog.h"
+#include "helper.h"
+#include
+
+WorkaroundsSettingsTab::WorkaroundsSettingsTab(Settings *m_parent, SettingsDialog &m_dialog)
+ : SettingsTab(m_parent, m_dialog)
+{
+ ui->appIDEdit->setText(m_parent->getSteamAppID());
+
+ LoadMechanism::EMechanism mechanismID = m_parent->getLoadMechanism();
+ int index = 0;
+
+ if (m_parent->loadMechanism().isDirectLoadingSupported()) {
+ ui->mechanismBox->addItem(QObject::tr("Mod Organizer"), LoadMechanism::LOAD_MODORGANIZER);
+ if (mechanismID == LoadMechanism::LOAD_MODORGANIZER) {
+ index = ui->mechanismBox->count() - 1;
+ }
+ }
+
+ if (m_parent->loadMechanism().isScriptExtenderSupported()) {
+ ui->mechanismBox->addItem(QObject::tr("Script Extender"), LoadMechanism::LOAD_SCRIPTEXTENDER);
+ if (mechanismID == LoadMechanism::LOAD_SCRIPTEXTENDER) {
+ index = ui->mechanismBox->count() - 1;
+ }
+ }
+
+ if (m_parent->loadMechanism().isProxyDLLSupported()) {
+ ui->mechanismBox->addItem(QObject::tr("Proxy DLL"), LoadMechanism::LOAD_PROXYDLL);
+ if (mechanismID == LoadMechanism::LOAD_PROXYDLL) {
+ index = ui->mechanismBox->count() - 1;
+ }
+ }
+
+ ui->mechanismBox->setCurrentIndex(index);
+
+ ui->hideUncheckedBox->setChecked(m_parent->hideUncheckedPlugins());
+ ui->forceEnableBox->setChecked(m_parent->forceEnableCoreFiles());
+ ui->displayForeignBox->setChecked(m_parent->displayForeign());
+ ui->lockGUIBox->setChecked(m_parent->lockGUI());
+ ui->enableArchiveParsingBox->setChecked(m_parent->archiveParsing());
+
+ ui->resetGeometryBtn->setChecked(m_parent->directInterface().value("reset_geometry", false).toBool());
+
+ setExecutableBlacklist(m_parent->executablesBlacklist());
+
+ QObject::connect(ui->bsaDateBtn, &QPushButton::clicked, [&]{ on_bsaDateBtn_clicked(); });
+ QObject::connect(ui->execBlacklistBtn, &QPushButton::clicked, [&]{ on_execBlacklistBtn_clicked(); });
+ QObject::connect(ui->resetGeometryBtn, &QPushButton::clicked, [&]{ on_resetGeometryBtn_clicked(); });
+}
+
+void WorkaroundsSettingsTab::update()
+{
+ if (ui->appIDEdit->text() != m_parent->gamePlugin()->steamAPPId()) {
+ m_Settings.setValue("Settings/app_id", ui->appIDEdit->text());
+ } else {
+ m_Settings.remove("Settings/app_id");
+ }
+ m_Settings.setValue("Settings/load_mechanism", ui->mechanismBox->itemData(ui->mechanismBox->currentIndex()).toInt());
+ m_Settings.setValue("Settings/hide_unchecked_plugins", ui->hideUncheckedBox->isChecked());
+ m_Settings.setValue("Settings/force_enable_core_files", ui->forceEnableBox->isChecked());
+ m_Settings.setValue("Settings/display_foreign", ui->displayForeignBox->isChecked());
+ m_Settings.setValue("Settings/lock_gui", ui->lockGUIBox->isChecked());
+ m_Settings.setValue("Settings/archive_parsing_experimental", ui->enableArchiveParsingBox->isChecked());
+
+ m_Settings.setValue("Settings/executable_blacklist", getExecutableBlacklist());
+}
+
+void WorkaroundsSettingsTab::on_execBlacklistBtn_clicked()
+{
+ bool ok = false;
+ QString result = QInputDialog::getMultiLineText(
+ parentWidget(),
+ QObject::tr("Executables Blacklist"),
+ QObject::tr("Enter one executable per line to be blacklisted from the virtual file system.\n"
+ "Mods and other virtualized files will not be visible to these executables and\n"
+ "any executables launched by them.\n\n"
+ "Example:\n"
+ " Chrome.exe\n"
+ " Firefox.exe"),
+ m_ExecutableBlacklist.split(";").join("\n"),
+ &ok
+ );
+ if (ok) {
+ QStringList blacklist;
+ for (auto exec : result.split("\n")) {
+ if (exec.trimmed().endsWith(".exe", Qt::CaseInsensitive)) {
+ blacklist << exec.trimmed();
+ }
+ }
+ m_ExecutableBlacklist = blacklist.join(";");
+ }
+}
+
+void WorkaroundsSettingsTab::on_bsaDateBtn_clicked()
+{
+ const auto* game = qApp->property("managed_game").value();
+ QDir dir = game->dataDirectory();
+
+ Helper::backdateBSAs(qApp->applicationDirPath().toStdWString(),
+ dir.absolutePath().toStdWString());
+}
+
+void WorkaroundsSettingsTab::on_resetGeometryBtn_clicked()
+{
+ m_dialog.m_GeometriesReset = true;
+ ui->resetGeometryBtn->setChecked(true);
+}
diff --git a/src/settingsdialogworkarounds.h b/src/settingsdialogworkarounds.h
new file mode 100644
index 00000000..1687624b
--- /dev/null
+++ b/src/settingsdialogworkarounds.h
@@ -0,0 +1,25 @@
+#ifndef SETTINGSDIALOGWORKAROUNDS_H
+#define SETTINGSDIALOGWORKAROUNDS_H
+
+#include "settings.h"
+#include "settingsdialog.h"
+
+class WorkaroundsSettingsTab : public SettingsTab
+{
+public:
+ WorkaroundsSettingsTab(Settings *m_parent, SettingsDialog &m_dialog);
+
+ void update();
+
+private:
+ QString m_ExecutableBlacklist;
+
+ void on_bsaDateBtn_clicked();
+ void on_execBlacklistBtn_clicked();
+ void on_resetGeometryBtn_clicked();
+
+ QString getExecutableBlacklist() { return m_ExecutableBlacklist; }
+ void setExecutableBlacklist(QString blacklist) { m_ExecutableBlacklist = blacklist; }
+};
+
+#endif // SETTINGSDIALOGWORKAROUNDS_H
--
cgit v1.3.1
From 107b396902be52f8ae305f58d4e7d85a86779051 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Sat, 20 Jul 2019 11:12:28 -0400
Subject: moved tabs to SettingsDialog removed Settings::query(), main window
now deals with SettingsDialog directly
---
src/mainwindow.cpp | 5 +-
src/settings.cpp | 100 ----------------------------------------
src/settings.h | 55 +---------------------
src/settingsdialog.cpp | 105 +++++++++++++++++++++++++++++++++++++++++-
src/settingsdialog.h | 26 +++++++++--
src/settingsdialogplugins.cpp | 2 +
6 files changed, 133 insertions(+), 160 deletions(-)
(limited to 'src/settingsdialog.cpp')
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 7c73bc8a..28405819 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -72,6 +72,7 @@ along with Mod Organizer. If not, see .
#include "previewdialog.h"
#include "browserdialog.h"
#include "aboutdialog.h"
+#include "settingsdialog.h"
#include
#include "nxmaccessmanager.h"
#include "appconfig.h"
@@ -5217,7 +5218,9 @@ void MainWindow::on_actionSettings_triggered()
bool proxy = settings.useProxy();
DownloadManager *dlManager = m_OrganizerCore.downloadManager();
- settings.query(&m_PluginContainer, this);
+
+ SettingsDialog dialog(&m_PluginContainer, &settings, this);
+ dialog.exec();
if (oldManagedGameDirectory != settings.getManagedGameDirectory()) {
QMessageBox::about(this, tr("Restarting MO"),
diff --git a/src/settings.cpp b/src/settings.cpp
index 725b7e06..dc07e107 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -21,14 +21,6 @@ along with Mod Organizer. If not, see .
#include "pluginsetting.h"
#include "serverinfo.h"
-#include "settingsdialog.h"
-#include "settingsdialogdiagnostics.h"
-#include "settingsdialoggeneral.h"
-#include "settingsdialognexus.h"
-#include "settingsdialogpaths.h"
-#include "settingsdialogplugins.h"
-#include "settingsdialogsteam.h"
-#include "settingsdialogworkarounds.h"
#include "versioninfo.h"
#include "appconfig.h"
#include "organizercore.h"
@@ -75,23 +67,6 @@ along with Mod Organizer. If not, see .
using namespace MOBase;
-SettingsTab::SettingsTab(Settings *m_parent, SettingsDialog &m_dialog)
- : m_parent(m_parent)
- , m_Settings(m_parent->settingsRef())
- , m_dialog(m_dialog)
- , ui(m_dialog.ui)
-{
-}
-
-SettingsTab::~SettingsTab()
-{}
-
-QWidget* SettingsTab::parentWidget()
-{
- return &m_dialog;
-}
-
-
Settings *Settings::s_Instance = nullptr;
@@ -668,78 +643,3 @@ void Settings::writePluginBlacklist()
m_Settings.endArray();
}
-
-void Settings::query(PluginContainer *pluginContainer, QWidget *parent)
-{
- SettingsDialog dialog(pluginContainer, this, parent);
-
- std::vector> tabs;
-
- tabs.push_back(std::unique_ptr(new GeneralSettingsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new PathsSettingsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new DiagnosticsSettingsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new NexusSettingsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new SteamSettingsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new PluginsSettingsTab(this, dialog)));
- tabs.push_back(std::unique_ptr(new WorkaroundsSettingsTab(this, dialog)));
-
-
- QString key = QString("geometry/%1").arg(dialog.objectName());
- if (m_Settings.contains(key)) {
- dialog.restoreGeometry(m_Settings.value(key).toByteArray());
- }
-
- if (dialog.exec() == QDialog::Accepted) {
-
- for (auto&& tab : tabs) {
- tab->closing();
- }
-
- // remember settings before change
- QMap before;
- m_Settings.beginGroup("Settings");
- for (auto k : m_Settings.allKeys())
- before[k] = m_Settings.value(k).toString();
- m_Settings.endGroup();
-
- // transfer modified settings to configuration file
- for (std::unique_ptr const &tab: tabs) {
- tab->update();
- }
-
- // print "changed" settings
- m_Settings.beginGroup("Settings");
- bool first_update = true;
- for (auto k : m_Settings.allKeys())
- if (m_Settings.value(k).toString() != before[k] && !k.contains("username") && !k.contains("password"))
- {
- if (first_update) {
- log::debug("Changed settings:");
- first_update = false;
- }
- log::debug(" {}={}", k, m_Settings.value(k).toString());
- }
- m_Settings.endGroup();
- }
- m_Settings.setValue(key, dialog.saveGeometry());
-
- // These changes happen regardless of accepted or rejected
- bool restartNeeded = false;
- if (dialog.getApiKeyChanged()) {
- restartNeeded = true;
- }
- if (dialog.getResetGeometries()) {
- restartNeeded = true;
- m_Settings.setValue("reset_geometry", true);
- }
- if (restartNeeded) {
- if (QMessageBox::question(nullptr,
- tr("Restart Mod Organizer?"),
- tr("In order to finish configuration changes, MO must be restarted.\n"
- "Restart it now?"),
- QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
- qApp->exit(INT_MAX);
- }
- }
-
-}
diff --git a/src/settings.h b/src/settings.h
index 71fbcbc1..899baaa3 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -26,60 +26,21 @@ along with Mod Organizer. If not, see .
#include
#include
#include
-#include
#include
#include
#include
#include
#include
-#include
-
-#include //for uint
-
#include