summaryrefslogtreecommitdiff
path: root/src/settings.cpp
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-08-03 09:31:19 -0400
committerGitHub <noreply@github.com>2019-08-03 09:31:19 -0400
commita7df11a31d684cfc341fc401dc3a9449f2538084 (patch)
tree04005ddcf6b364c0b1132e47c0490314c14726ae /src/settings.cpp
parent80dd9222f325959a26580ce2fdd1ebc4b7979517 (diff)
parent712c8687c208629e22ef7b4d8015c899c2ea053a (diff)
Merge pull request #808 from isanae/settings-rework
Settings rework
Diffstat (limited to 'src/settings.cpp')
-rw-r--r--src/settings.cpp675
1 files changed, 18 insertions, 657 deletions
diff --git a/src/settings.cpp b/src/settings.cpp
index 5ad066b2..77db6918 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -18,72 +18,16 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
*/
#include "settings.h"
-
-#include "pluginsetting.h"
#include "serverinfo.h"
-#include "settingsdialog.h"
-#include "versioninfo.h"
#include "appconfig.h"
-#include "organizercore.h"
#include <utility.h>
-#include <iplugin.h>
#include <iplugingame.h>
-#include <questionboxmemory.h>
#include <usvfsparameters.h>
-#include <QCheckBox>
-#include <QCoreApplication>
-#include <QComboBox>
-#include <QDate>
-#include <QDialog>
-#include <QDir>
-#include <QDirIterator>
-#include <QFileInfo>
-#include <QLineEdit>
-#include <QSpinBox>
-#include <QListWidgetItem>
-#include <QLocale>
-#include <QMessageBox>
-#include <QApplication>
-#include <QRegExp>
-#include <QDir>
-#include <QStringList>
-#include <QVariantMap>
-#include <QLabel>
-#include <QPushButton>
-#include <QPalette>
-
-#include <Qt> // for Qt::UserRole, etc
-
-#include <Windows.h> // For ShellExecuteW, HINSTANCE, etc
-#include <wincred.h> // For storage
-
-#include <algorithm> // for sort
-#include <memory>
-#include <stdexcept> // for runtime_error
-#include <string>
-#include <utility> // for pair, make_pair
-
-
using namespace MOBase;
-template <typename T>
-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<T>() < other.data(m_SortRole).value<T>();
- }
-private:
- int m_SortRole;
-};
-
-
Settings *Settings::s_Instance = nullptr;
-
Settings::Settings(const QSettings &settingsSource)
: m_Settings(settingsSource.fileName(), settingsSource.format())
{
@@ -94,13 +38,11 @@ Settings::Settings(const QSettings &settingsSource)
}
}
-
Settings::~Settings()
{
s_Instance = nullptr;
}
-
Settings &Settings::instance()
{
if (s_Instance == nullptr) {
@@ -384,15 +326,10 @@ bool Settings::hasNexusApiKey() const
bool Settings::getSteamLogin(QString &username, QString &password) const
{
- if (m_Settings.contains("Settings/steam_username")) {
- QString tempPass = deObfuscate("steam_password");
- if (!tempPass.isEmpty()) {
- username = m_Settings.value("Settings/steam_username").toString();
- password = tempPass;
- return true;
- }
- }
- return false;
+ username = m_Settings.value("Settings/steam_username", "").toString();
+ password = deObfuscate("steam_password");
+
+ return !username.isEmpty() && !password.isEmpty();
}
bool Settings::compactDownloads() const
{
@@ -492,12 +429,21 @@ void Settings::setSteamLogin(QString username, QString password)
LoadMechanism::EMechanism Settings::getLoadMechanism() const
{
- switch (m_Settings.value("Settings/load_mechanism").toInt()) {
- case LoadMechanism::LOAD_MODORGANIZER: return LoadMechanism::LOAD_MODORGANIZER;
- case LoadMechanism::LOAD_SCRIPTEXTENDER: return LoadMechanism::LOAD_SCRIPTEXTENDER;
- case LoadMechanism::LOAD_PROXYDLL: return LoadMechanism::LOAD_PROXYDLL;
+ const auto i = m_Settings.value("Settings/load_mechanism").toInt();
+
+ switch (i)
+ {
+ case LoadMechanism::LOAD_MODORGANIZER:
+ return LoadMechanism::LOAD_MODORGANIZER;
+
+ default:
+ qCritical().nospace().noquote()
+ << "invalid load mechanism " << i << ", reverting to modorganizer";
+
+ m_Settings.setValue("Settings/load_mechanism", LoadMechanism::LOAD_MODORGANIZER);
+
+ return LoadMechanism::LOAD_MODORGANIZER;
}
- throw std::runtime_error("invalid load mechanism");
}
@@ -662,588 +608,3 @@ void Settings::writePluginBlacklist()
m_Settings.endArray();
}
-
-void Settings::addLanguages(QComboBox *languageBox)
-{
- std::vector<std::pair<QString, QString>> 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<std::unique_ptr<SettingsTab>> tabs;
-
- tabs.push_back(std::unique_ptr<SettingsTab>(new GeneralTab(this, dialog)));
- tabs.push_back(std::unique_ptr<SettingsTab>(new PathsTab(this, dialog)));
- tabs.push_back(std::unique_ptr<SettingsTab>(new DiagnosticsTab(this, dialog)));
- tabs.push_back(std::unique_ptr<SettingsTab>(new NexusTab(this, dialog)));
- tabs.push_back(std::unique_ptr<SettingsTab>(new SteamTab(this, dialog)));
- tabs.push_back(std::unique_ptr<SettingsTab>(new PluginsTab(this, dialog)));
- tabs.push_back(std::unique_ptr<SettingsTab>(new WorkaroundsTab(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) {
- // remember settings before change
- QMap<QString, QString> 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<SettingsTab> 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);
- }
- }
-
-}
-
-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<QComboBox *>("languageBox"))
- , m_styleBox(m_dialog.findChild<QComboBox *>("styleBox"))
- , m_compactBox(m_dialog.findChild<QCheckBox *>("compactBox"))
- , m_showMetaBox(m_dialog.findChild<QCheckBox *>("showMetaBox"))
- , m_usePrereleaseBox(m_dialog.findChild<QCheckBox *>("usePrereleaseBox"))
- , m_overwritingBtn(m_dialog.findChild<QPushButton *>("overwritingBtn"))
- , m_overwrittenBtn(m_dialog.findChild<QPushButton *>("overwrittenBtn"))
- , m_overwritingArchiveBtn(m_dialog.findChild<QPushButton *>("overwritingArchiveBtn"))
- , m_overwrittenArchiveBtn(m_dialog.findChild<QPushButton *>("overwrittenArchiveBtn"))
- , m_containsBtn(m_dialog.findChild<QPushButton *>("containsBtn"))
- , m_containedBtn(m_dialog.findChild<QPushButton *>("containedBtn"))
- , m_colorSeparatorsBox(m_dialog.findChild<QCheckBox *>("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)
- , m_baseDirEdit(m_dialog.findChild<QLineEdit *>("baseDirEdit"))
- , m_downloadDirEdit(m_dialog.findChild<QLineEdit *>("downloadDirEdit"))
- , m_modDirEdit(m_dialog.findChild<QLineEdit *>("modDirEdit"))
- , m_cacheDirEdit(m_dialog.findChild<QLineEdit *>("cacheDirEdit"))
- , m_profilesDirEdit(m_dialog.findChild<QLineEdit *>("profilesDirEdit"))
- , m_overwriteDirEdit(m_dialog.findChild<QLineEdit *>("overwriteDirEdit"))
- , m_managedGameDirEdit(m_dialog.findChild<QLineEdit *>("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<QString, QString, std::wstring> 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)
- : Settings::SettingsTab(m_parent, m_dialog)
- , m_logLevelBox(m_dialog.findChild<QComboBox *>("logLevelBox"))
- , m_dumpsTypeBox(m_dialog.findChild<QComboBox *>("dumpsTypeBox"))
- , m_dumpsMaxEdit(m_dialog.findChild<QSpinBox *>("dumpsMaxEdit"))
- , m_diagnosticsExplainedLabel(m_dialog.findChild<QLabel *>("diagnosticsExplainedLabel"))
-{
- setLevelsBox();
- m_dumpsTypeBox->setCurrentIndex(m_parent->crashDumpsType());
- m_dumpsMaxEdit->setValue(m_parent->crashDumpsMax());
- QString logsPath = qApp->property("dataPath").toString()
- + "/" + QString::fromStdWString(AppConfig::logPath());
- m_diagnosticsExplainedLabel->setText(
- m_diagnosticsExplainedLabel->text()
- .replace("LOGS_FULL_PATH", logsPath)
- .replace("LOGS_DIR", QString::fromStdWString(AppConfig::logPath()))
- .replace("DUMPS_FULL_PATH", QString::fromStdWString(OrganizerCore::crashDumpsPath()))
- .replace("DUMPS_DIR", QString::fromStdWString(AppConfig::dumpsDir()))
- );
-}
-
-void Settings::DiagnosticsTab::update()
-{
- m_Settings.setValue("Settings/log_level", m_logLevelBox->currentData().toInt());
- m_Settings.setValue("Settings/crash_dumps_type", m_dumpsTypeBox->currentIndex());
- 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; i<m_logLevelBox->count(); ++i) {
- if (m_logLevelBox->itemData(i) == m_parent->logLevel()) {
- m_logLevelBox->setCurrentIndex(i);
- break;
- }
- }
-}
-
-Settings::NexusTab::NexusTab(Settings *parent, SettingsDialog &dialog)
- : Settings::SettingsTab(parent, dialog)
- , m_offlineBox(dialog.findChild<QCheckBox *>("offlineBox"))
- , m_proxyBox(dialog.findChild<QCheckBox *>("proxyBox"))
- , m_knownServersList(dialog.findChild<QListWidget *>("knownServersList"))
- , m_preferredServersList(
- dialog.findChild<QListWidget *>("preferredServersList"))
- , m_endorsementBox(dialog.findChild<QCheckBox *>("endorsementBox"))
- , m_hideAPICounterBox(dialog.findChild<QCheckBox *>("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<int>(val["downloadSpeed"].toDouble() / val["downloadCount"].toInt());
- descriptor += QString(" (%1 kbps)").arg(bps / 1024);
- }
-
- QListWidgetItem *newItem = new QListWidgetItemEx<int>(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)
- : Settings::SettingsTab(m_parent, m_dialog)
- , m_steamUserEdit(m_dialog.findChild<QLineEdit *>("steamUserEdit"))
- , m_steamPassEdit(m_dialog.findChild<QLineEdit *>("steamPassEdit"))
-{
- if (m_Settings.contains("Settings/steam_username")) {
- m_steamUserEdit->setText(m_Settings.value("Settings/steam_username", "").toString());
- QString password = deObfuscate("steam_password");
- if (!password.isEmpty()) {
- m_steamPassEdit->setText(password);
- }
- }
-}
-
-void Settings::SteamTab::update()
-{
- //FIXME this should be inlined here?
- m_parent->setSteamLogin(m_steamUserEdit->text(), m_steamPassEdit->text());
-}
-
-Settings::PluginsTab::PluginsTab(Settings *m_parent, SettingsDialog &m_dialog)
- : Settings::SettingsTab(m_parent, m_dialog)
- , m_pluginsList(m_dialog.findChild<QListWidget *>("pluginsList"))
- , m_pluginBlacklistList(m_dialog.findChild<QListWidget *>("pluginBlacklist"))
-{
- // display plugin settings
- QSet<QString> 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)
- : Settings::SettingsTab(m_parent, m_dialog)
- , m_appIDEdit(m_dialog.findChild<QLineEdit *>("appIDEdit"))
- , m_mechanismBox(m_dialog.findChild<QComboBox *>("mechanismBox"))
- , m_hideUncheckedBox(m_dialog.findChild<QCheckBox *>("hideUncheckedBox"))
- , m_forceEnableBox(m_dialog.findChild<QCheckBox *>("forceEnableBox"))
- , m_displayForeignBox(m_dialog.findChild<QCheckBox *>("displayForeignBox"))
- , m_lockGUIBox(m_dialog.findChild<QCheckBox *>("lockGUIBox"))
- , m_enableArchiveParsingBox(m_dialog.findChild<QCheckBox *>("enableArchiveParsingBox"))
- , m_resetGeometriesBtn(m_dialog.findChild<QPushButton *>("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());
-}