diff options
| -rw-r--r-- | src/organizercore.cpp | 10 | ||||
| -rw-r--r-- | src/plugincontainer.cpp | 4 | ||||
| -rw-r--r-- | src/settings.cpp | 130 | ||||
| -rw-r--r-- | src/settings.h | 181 | ||||
| -rw-r--r-- | src/settingsdialogplugins.cpp | 10 |
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(); } |
