summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/organizercore.cpp10
-rw-r--r--src/plugincontainer.cpp4
-rw-r--r--src/settings.cpp130
-rw-r--r--src/settings.h181
-rw-r--r--src/settingsdialogplugins.cpp10
5 files changed, 222 insertions, 113 deletions
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 1a89641d..91e16716 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -866,26 +866,26 @@ void OrganizerCore::modDataChanged(MOBase::IModInterface *)
QVariant OrganizerCore::pluginSetting(const QString &pluginName,
const QString &key) const
{
- return m_Settings.plugins().pluginSetting(pluginName, key);
+ return m_Settings.plugins().setting(pluginName, key);
}
void OrganizerCore::setPluginSetting(const QString &pluginName,
const QString &key, const QVariant &value)
{
- m_Settings.plugins().setPluginSetting(pluginName, key, value);
+ m_Settings.plugins().setSetting(pluginName, key, value);
}
QVariant OrganizerCore::persistent(const QString &pluginName,
const QString &key,
const QVariant &def) const
{
- return m_Settings.plugins().pluginPersistent(pluginName, key, def);
+ return m_Settings.plugins().persistent(pluginName, key, def);
}
void OrganizerCore::setPersistent(const QString &pluginName, const QString &key,
const QVariant &value, bool sync)
{
- m_Settings.plugins().setPluginPersistent(pluginName, key, value, sync);
+ m_Settings.plugins().setPersistent(pluginName, key, value, sync);
}
QString OrganizerCore::pluginDataPath() const
@@ -2580,7 +2580,7 @@ void OrganizerCore::prepareStart()
m_CurrentProfile->writeModlist();
m_CurrentProfile->createTweakedIniFile();
saveCurrentLists();
- m_Settings.game().setupLoadMechanism();
+ m_Settings.game().loadMechanism().activate(m_Settings.game().loadMechanismType());
storeSettings();
}
diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp
index 16a77387..c0706ba8 100644
--- a/src/plugincontainer.cpp
+++ b/src/plugincontainer.cpp
@@ -266,7 +266,7 @@ void PluginContainer::loadPlugins()
"(Please note: If this is the first time you see this message for this plugin you may want to give it another try. "
"The plugin may be able to recover from the problem)").arg(fileName),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) {
- m_Organizer->settings().plugins().addBlacklistPlugin(fileName);
+ m_Organizer->settings().plugins().addBlacklist(fileName);
}
loadCheck.close();
}
@@ -279,7 +279,7 @@ void PluginContainer::loadPlugins()
while (iter.hasNext()) {
iter.next();
- if (m_Organizer->settings().plugins().pluginBlacklisted(iter.fileName())) {
+ if (m_Organizer->settings().plugins().blacklisted(iter.fileName())) {
log::debug("plugin \"{}\" blacklisted", iter.fileName());
continue;
}
diff --git a/src/settings.cpp b/src/settings.cpp
index a33005b6..ce9676ea 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -512,9 +512,9 @@ const LoadMechanism& GameSettings::loadMechanism() const
return m_LoadMechanism;
}
-void GameSettings::setupLoadMechanism()
+LoadMechanism& GameSettings::loadMechanism()
{
- m_LoadMechanism.activate(loadMechanismType());
+ return m_LoadMechanism;
}
bool GameSettings::hideUncheckedPlugins() const
@@ -1063,19 +1063,7 @@ void PluginSettings::clearPlugins()
m_PluginSettings.clear();
m_PluginBlacklist.clear();
- m_PluginBlacklist = readPluginBlacklist();
-}
-
-QSet<QString> PluginSettings::readPluginBlacklist() const
-{
- QSet<QString> set;
-
- ScopedReadArray sra(m_Settings, "pluginBlacklist");
- sra.for_each([&]{
- set.insert(sra.get<QString>("name"));
- });
-
- return set;
+ m_PluginBlacklist = readBlacklist();
}
void PluginSettings::registerPlugin(IPlugin *plugin)
@@ -1106,12 +1094,12 @@ void PluginSettings::registerPlugin(IPlugin *plugin)
}
}
-bool PluginSettings::pluginBlacklisted(const QString &fileName) const
+std::vector<MOBase::IPlugin*> PluginSettings::plugins() const
{
- return m_PluginBlacklist.contains(fileName);
+ return m_Plugins;
}
-QVariant PluginSettings::pluginSetting(const QString &pluginName, const QString &key) const
+QVariant PluginSettings::setting(const QString &pluginName, const QString &key) const
{
auto iterPlugin = m_PluginSettings.find(pluginName);
if (iterPlugin == m_PluginSettings.end()) {
@@ -1126,7 +1114,7 @@ QVariant PluginSettings::pluginSetting(const QString &pluginName, const QString
return *iterSetting;
}
-void PluginSettings::setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value)
+void PluginSettings::setSetting(const QString &pluginName, const QString &key, const QVariant &value)
{
auto iterPlugin = m_PluginSettings.find(pluginName);
@@ -1141,7 +1129,27 @@ void PluginSettings::setPluginSetting(const QString &pluginName, const QString &
set(m_Settings, "Plugins", pluginName + "/" + key, value);
}
-QVariant PluginSettings::pluginPersistent(const QString &pluginName, const QString &key, const QVariant &def) const
+QVariantMap PluginSettings::settings(const QString &pluginName) const
+{
+ return m_PluginSettings[pluginName];
+}
+
+void PluginSettings::setSettings(const QString &pluginName, const QVariantMap& map)
+{
+ m_PluginSettings[pluginName] = map;
+}
+
+QVariantMap PluginSettings::descriptions(const QString &pluginName) const
+{
+ return m_PluginDescriptions[pluginName];
+}
+
+void PluginSettings::setDescriptions(const QString &pluginName, const QVariantMap& map)
+{
+ m_PluginDescriptions[pluginName] = map;
+}
+
+QVariant PluginSettings::persistent(const QString &pluginName, const QString &key, const QVariant &def) const
{
if (!m_PluginSettings.contains(pluginName)) {
return def;
@@ -1150,7 +1158,7 @@ QVariant PluginSettings::pluginPersistent(const QString &pluginName, const QStri
return get<QVariant>(m_Settings, "PluginPersistance", pluginName + "/" + key, def);
}
-void PluginSettings::setPluginPersistent(
+void PluginSettings::setPersistent(
const QString &pluginName, const QString &key, const QVariant &value, bool sync)
{
if (!m_PluginSettings.contains(pluginName)) {
@@ -1165,74 +1173,70 @@ void PluginSettings::setPluginPersistent(
m_Settings.sync();
}
}
-
-void PluginSettings::addBlacklistPlugin(const QString &fileName)
+void PluginSettings::addBlacklist(const QString &fileName)
{
m_PluginBlacklist.insert(fileName);
- writePluginBlacklist();
+ writeBlacklist();
}
-void PluginSettings::writePluginBlacklist()
+bool PluginSettings::blacklisted(const QString &fileName) const
{
- const auto current = readPluginBlacklist();
-
- if (current.size() > m_PluginBlacklist.size()) {
- // Qt can't remove array elements, the section must be cleared
- removeSection(m_Settings, "pluginBlacklist");
- }
+ return m_PluginBlacklist.contains(fileName);
+}
- ScopedWriteArray swa(m_Settings, "pluginBlacklist", m_PluginBlacklist.size());
+void PluginSettings::setBlacklist(const QStringList& pluginNames)
+{
+ m_PluginBlacklist.clear();
- for (const QString &plugin : m_PluginBlacklist) {
- swa.next();
- swa.set("name", plugin);
+ for (const auto& name : pluginNames) {
+ m_PluginBlacklist.insert(name);
}
}
-QVariantMap PluginSettings::pluginSettings(const QString &pluginName) const
+const QSet<QString>& PluginSettings::blacklist() const
{
- return m_PluginSettings[pluginName];
+ return m_PluginBlacklist;
}
-void PluginSettings::setPluginSettings(const QString &pluginName, const QVariantMap& map)
+void PluginSettings::save()
{
- m_PluginSettings[pluginName] = map;
-}
+ for (auto iterPlugins=m_PluginSettings.begin(); iterPlugins!=m_PluginSettings.end(); ++iterPlugins) {
+ for (auto iterSettings=iterPlugins->begin(); iterSettings!=iterPlugins->end(); ++iterSettings) {
+ const auto key = iterPlugins.key() + "/" + iterSettings.key();
+ set(m_Settings, "Plugins", key, iterSettings.value());
+ }
+ }
-QVariantMap PluginSettings::pluginDescriptions(const QString &pluginName) const
-{
- return m_PluginDescriptions[pluginName];
+ writeBlacklist();
}
-void PluginSettings::pluginDescriptions(const QString &pluginName, const QVariantMap& map)
+void PluginSettings::writeBlacklist()
{
- m_PluginDescriptions[pluginName] = map;
-}
+ const auto current = readBlacklist();
-const QSet<QString>& PluginSettings::pluginBlacklist() const
-{
- return m_PluginBlacklist;
-}
+ if (current.size() > m_PluginBlacklist.size()) {
+ // Qt can't remove array elements, the section must be cleared
+ removeSection(m_Settings, "pluginBlacklist");
+ }
-void PluginSettings::setPluginBlacklist(const QStringList& pluginNames)
-{
- m_PluginBlacklist.clear();
+ ScopedWriteArray swa(m_Settings, "pluginBlacklist", m_PluginBlacklist.size());
- for (const auto& name : pluginNames) {
- m_PluginBlacklist.insert(name);
+ for (const QString &plugin : m_PluginBlacklist) {
+ swa.next();
+ swa.set("name", plugin);
}
}
-void PluginSettings::save()
+QSet<QString> PluginSettings::readBlacklist() const
{
- for (auto iterPlugins=m_PluginSettings.begin(); iterPlugins!=m_PluginSettings.end(); ++iterPlugins) {
- for (auto iterSettings=iterPlugins->begin(); iterSettings!=iterPlugins->end(); ++iterSettings) {
- const auto key = iterPlugins.key() + "/" + iterSettings.key();
- set(m_Settings, "Plugins", key, iterSettings.value());
- }
- }
+ QSet<QString> set;
- writePluginBlacklist();
+ ScopedReadArray sra(m_Settings, "pluginBlacklist");
+ sra.for_each([&]{
+ set.insert(sra.get<QString>("name"));
+ });
+
+ return set;
}
diff --git a/src/settings.h b/src/settings.h
index 2ff8da1c..d3926d72 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -40,6 +40,10 @@ class ServerList;
class Settings;
class ExpanderWidget;
+
+// helper class that calls restoreGeometry() in the constructor and
+// saveGeometry() in the destructor
+//
class GeometrySaver
{
public:
@@ -52,48 +56,57 @@ private:
};
+// setting for the currently managed game
+//
class GameSettings
{
public:
GameSettings(QSettings& setting);
+ // game plugin
+ //
const MOBase::IPluginGame* plugin();
void setPlugin(const MOBase::IPluginGame* gamePlugin);
- /**
- * whether files of the core game are forced-enabled so the user can't
- * accidentally disable them
- */
+ // whether files of the core game are forced-enabled so the user can't
+ // accidentally disable them
+ //
bool forceEnableCoreFiles() const;
void setForceEnableCoreFiles(bool b);
- /**
- * the directory where the managed game is stored (with native separators)
- **/
+ // the directory where the managed game is stored
+ //
std::optional<QString> directory() const;
void setDirectory(const QString& path);
+ // the name of the managed game
+ //
std::optional<QString> name() const;
void setName(const QString& name);
+ // the edition of the managed game
+ //
std::optional<QString> edition() const;
void setEdition(const QString& name);
+ // the current profile name
+ //
std::optional<QString> selectedProfileName() const;
void setSelectedProfileName(const QString& name);
- /**
- * @return the load mechanism to be used
- **/
+ // load mechanism type
+ //
LoadMechanism::EMechanism loadMechanismType() const;
void setLoadMechanism(LoadMechanism::EMechanism m);
+
+ // load mechanism object
+ //
const LoadMechanism& loadMechanism() const;
- void setupLoadMechanism();
+ LoadMechanism& loadMechanism();
- /**
- * @return true if the user wants unchecked plugins (esp, esm) should be hidden from
- * the virtual data directory
- **/
+ // whether the user wants unchecked plugins (esp, esm) to be hidden from
+ // the virtual data directory
+ //
bool hideUncheckedPlugins() const;
void setHideUncheckedPlugins(bool b);
@@ -104,11 +117,26 @@ private:
};
+// geometry settings for various widgets; this should contain any setting that
+// can get invalid through UI changes or when users change display settings
+// (resolution, monitors, etc.); see WidgetSettings for the counterpart
+//
+// all these settings are stored under [Geometry] and get wiped when the
+// "reset geometry settings" button is clicked in the settings
+//
+// saveGeometry(), restoreGeometry(), saveState() and restoreState() call the
+// same functions on the given widget
+//
class GeometrySettings
{
public:
GeometrySettings(QSettings& s);
+ // asks the settings to get reset
+ //
+ // this gets called from the settings dialog and gets picked up in
+ // resetIfNeeded(), called from runApplication() just before exiting
+ //
void requestReset();
void resetIfNeeded();
@@ -137,10 +165,18 @@ public:
void saveDocks(const QMainWindow* w);
void restoreDocks(QMainWindow* w) const;
+ // this should be a generic "tab order" setting, but it only happens for the
+ // mod info dialog right now
+ //
QStringList modInfoTabOrder() const;
void setModInfoTabOrder(const QString& names);
+ // assumes the given widget is a top-level
+ //
void centerOnMainWindowMonitor(QWidget* w);
+
+ // saves the monitor number of the given window
+ //
void saveMainWindowMonitor(const QMainWindow* w);
private:
@@ -149,33 +185,52 @@ private:
};
+// widget settings that should stay valid regardless of UI changes or when users
+// change display settings (resolution, monitors, etc.); see GeometrySettings
+// for the counterpart
+//
class WidgetSettings
{
public:
WidgetSettings(QSettings& s);
+ // selected index for a combobox
+ //
std::optional<int> index(const QComboBox* cb) const;
void saveIndex(const QComboBox* cb);
void restoreIndex(QComboBox* cb, std::optional<int> def={}) const;
+ // selected tab index for a tab widget
+ //
std::optional<int> index(const QTabWidget* w) const;
void saveIndex(const QTabWidget* w);
void restoreIndex(QTabWidget* w, std::optional<int> def={}) const;
+ // check state for a checkable button
+ //
std::optional<bool> checked(const QAbstractButton* w) const;
void saveChecked(const QAbstractButton* w);
void restoreChecked(QAbstractButton* w, std::optional<bool> def={}) const;
+ // returns the remembered button for a question dialog, or NoButton if the
+ // user hasn't saved the choice
+ //
MOBase::QuestionBoxMemory::Button questionButton(
const QString& windowName, const QString& filename) const;
+ // sets the button to be remembered for the given window
+ //
void setQuestionWindowButton(
const QString& windowName, MOBase::QuestionBoxMemory::Button button);
+ // sets the button to be remembered for the given file
+ //
void setQuestionFileButton(
const QString& windowName, const QString& filename,
MOBase::QuestionBoxMemory::Button choice);
+ // wipes all the remembered buttons
+ //
void resetQuestionButtons();
private:
@@ -183,13 +238,13 @@ private:
};
+// various color settings
+//
class ColorSettings
{
public:
ColorSettings(QSettings& s);
- void setCrashDumpsMax(int i) const;
-
QColor modlistOverwrittenLoose() const;
void setModlistOverwrittenLoose(const QColor& c);
@@ -212,46 +267,91 @@ public:
void setPreviousSeparatorColor(const QColor& c) const;
void removePreviousSeparatorColor();
- /**
- * @brief color the scrollbar of the mod list for custom separator colors?
- * @return the state of the setting
- */
+ // whether the scrollbar of the mod list should have colors for custom
+ // separator colors
+ //
bool colorSeparatorScrollbar() const;
void setColorSeparatorScrollbar(bool b);
- static QColor idealTextColor(const QColor& rBackgroundColor);
+ // returns a color with a good contrast for the given background
+ //
+ static QColor idealTextColor(const QColor& rBackgroundColor);
private:
QSettings& m_Settings;
};
+// settings about plugins
+//
class PluginSettings
{
public:
PluginSettings(QSettings& settings);
+
+ // forgets all the plugins
+ //
void clearPlugins();
+
+ // adds the given plugin to the list and loads all of its settings
+ //
void registerPlugin(MOBase::IPlugin *plugin);
- void addPluginSettings(const std::vector<MOBase::IPlugin*> &plugins);
- QVariant pluginSetting(const QString &pluginName, const QString &key) const;
- void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value);
- QVariant pluginPersistent(const QString &pluginName, const QString &key, const QVariant &def) const;
- void setPluginPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync);
- void addBlacklistPlugin(const QString &fileName);
- bool pluginBlacklisted(const QString &fileName) const;
- void setPluginBlacklist(const QStringList& pluginNames);
- std::vector<MOBase::IPlugin*> plugins() const { return m_Plugins; }
+ // returns all the registered plugins
+ //
+ std::vector<MOBase::IPlugin*> plugins() const;
+
+
+ // returns the plugin setting for the given key
+ //
+ QVariant setting(const QString &pluginName, const QString &key) const;
+
+ // sets the plugin setting for the given key
+ //
+ void setSetting(const QString &pluginName, const QString &key, const QVariant &value);
+
+ // returns all settings
+ //
+ QVariantMap settings(const QString &pluginName) const;
+
+ // overwrites all settings
+ //
+ void setSettings(const QString &pluginName, const QVariantMap& map);
+
+ // returns all descriptions
+ //
+ QVariantMap descriptions(const QString &pluginName) const;
- QVariantMap pluginSettings(const QString &pluginName) const;
- void setPluginSettings(const QString &pluginName, const QVariantMap& map);
+ // overwrites all descriptions
+ //
+ void setDescriptions(const QString &pluginName, const QVariantMap& map);
- QVariantMap pluginDescriptions(const QString &pluginName) const;
- void pluginDescriptions(const QString &pluginName, const QVariantMap& map);
- const QSet<QString>& pluginBlacklist() const;
+ // ?
+ QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def) const;
+ void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync);
+
+ // adds the given plugin to the blacklist
+ //
+ void addBlacklist(const QString &fileName);
+
+ // returns whether the given plugin is blacklisted
+ //
+ bool blacklisted(const QString &fileName) const;
+
+ // overwrites the whole blacklist
+ //
+ void setBlacklist(const QStringList& pluginNames);
+
+ // returns the blacklist
+ //
+ const QSet<QString>& blacklist() const;
+
+
+ // commits all the settings to the ini
+ //
void save();
private:
@@ -261,8 +361,13 @@ private:
QMap<QString, QVariantMap> m_PluginDescriptions;
QSet<QString> m_PluginBlacklist;
- void writePluginBlacklist();
- QSet<QString> readPluginBlacklist() const;
+ // commits the blacklist to the ini
+ //
+ void writeBlacklist();
+
+ // reads the blacklist from the ini
+ //
+ QSet<QString> readBlacklist() const;
};
diff --git a/src/settingsdialogplugins.cpp b/src/settingsdialogplugins.cpp
index 956971fe..c84d0556 100644
--- a/src/settingsdialogplugins.cpp
+++ b/src/settingsdialogplugins.cpp
@@ -17,14 +17,14 @@ PluginsSettingsTab::PluginsSettingsTab(Settings& s, SettingsDialog& d)
continue;
QListWidgetItem *listItem = new QListWidgetItem(plugin->name(), ui->pluginsList);
listItem->setData(Qt::UserRole, QVariant::fromValue((void*)plugin));
- listItem->setData(Qt::UserRole + 1, settings().plugins().pluginSettings(plugin->name()));
- listItem->setData(Qt::UserRole + 2, settings().plugins().pluginDescriptions(plugin->name()));
+ listItem->setData(Qt::UserRole + 1, settings().plugins().settings(plugin->name()));
+ listItem->setData(Qt::UserRole + 2, settings().plugins().descriptions(plugin->name()));
ui->pluginsList->addItem(listItem);
handledNames.insert(plugin->name());
}
// display plugin blacklist
- for (const QString &pluginName : settings().plugins().pluginBlacklist()) {
+ for (const QString &pluginName : settings().plugins().blacklist()) {
ui->pluginBlacklist->addItem(pluginName);
}
@@ -42,7 +42,7 @@ 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);
- settings().plugins().setPluginSettings(
+ settings().plugins().setSettings(
item->text(), item->data(Qt::UserRole + 1).toMap());
}
@@ -52,7 +52,7 @@ void PluginsSettingsTab::update()
names.push_back(item->text());
}
- settings().plugins().setPluginBlacklist(names);
+ settings().plugins().setBlacklist(names);
settings().plugins().save();
}