summaryrefslogtreecommitdiff
path: root/src/settings.cpp
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2013-09-21 19:25:33 +0200
committerTannin <devnull@localhost>2013-09-21 19:25:33 +0200
commitdfca8be71b15bc13997110cc8777dd5a84a1fde7 (patch)
treeaac3cf02be006c1f5a15c48872db965fa6f7b10f /src/settings.cpp
parent08037bf876659d52b8bb8be26c7aca362555ef85 (diff)
- esp reader now handles invalid files more gracefully
- files moved will now also be treated as "deleted" in the old location so a newly created file with that same name is not created in overwrite - introduced a mechanism by which MO can recognize if it crashed before when attempting to load a plugin. That plugin can be blacklisted so it doesn't get loaded again - plugins can now programaticaly change their settings - plugins can now store data persistently without exposing that data as settings - requesting an unset-setting from a plugin is no longer treated as a bug - clarified warning message for when files are in overwrite directory - the proxyPython plugin will now discover if python initialization crashed MO on a previous session and give the user a chance to fix it or disable the plugin - bugfix: GetModuleFileName modified the buffer past the zero termination. While this doesn't violate the API documentation it is different from the regular windows implementation - bugfix: proxy plugins couldn't access the parent widget - bugfix: when moving a file from overwrite to a mod the in-memory file structure wasn't updated - bugfix: name input dialog for profiles allowed names that weren't valid directory names - bugfix: profile dialog wasn't able to delete profiles if the name started or ended in whitespaces - bugfix: The name-cells for plugin settings could be changed (without effect) - removed a few obsolete files from the repository
Diffstat (limited to 'src/settings.cpp')
-rw-r--r--src/settings.cpp80
1 files changed, 78 insertions, 2 deletions
diff --git a/src/settings.cpp b/src/settings.cpp
index 39b6dba7..42a8d693 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -87,6 +87,19 @@ void Settings::clearPlugins()
{
m_Plugins.clear();
m_PluginSettings.clear();
+
+ m_PluginBlacklist.clear();
+ int count = m_Settings.beginReadArray("pluginBlacklist");
+ for (int i = 0; i < count; ++i) {
+ m_Settings.setArrayIndex(i);
+ m_PluginBlacklist.insert(m_Settings.value("name").toString());
+ }
+ m_Settings.endArray();
+}
+
+bool Settings::pluginBlacklisted(const QString &fileName) const
+{
+ return m_PluginBlacklist.contains(fileName);
}
void Settings::registerPlugin(IPlugin *plugin)
@@ -275,16 +288,47 @@ QVariant Settings::pluginSetting(const QString &pluginName, const QString &key)
{
auto iterPlugin = m_PluginSettings.find(pluginName);
if (iterPlugin == m_PluginSettings.end()) {
- throw MyException(tr("setting for invalid plugin \"%1\" requested").arg(key));
+ return QVariant();
}
auto iterSetting = iterPlugin->find(key);
if (iterSetting == iterPlugin->end()) {
- throw MyException(tr("invalid setting \"%1\" requested for plugin \"%2\"").arg(key).arg(pluginName));
+ return QVariant();
}
return *iterSetting;
}
+void Settings::setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value)
+{
+ auto iterPlugin = m_PluginSettings.find(pluginName);
+ if (iterPlugin == m_PluginSettings.end()) {
+ throw MyException(tr("attempt to store setting for unknown plugin \"%1\"").arg(pluginName));
+ }
+
+ // store the new setting both in memory and in the ini
+ m_PluginSettings[pluginName][key] = value;
+ m_Settings.setValue("Plugins/" + pluginName + "/" + key, value);
+}
+
+QVariant Settings::pluginPersistent(const QString &pluginName, const QString &key, const QVariant &def) const
+{
+ if (!m_PluginSettings.contains(pluginName)) {
+ return def;
+ }
+ return m_Settings.value("PluginPersistance/" + pluginName + "/" + key, def);
+}
+
+void Settings::setPluginPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync)
+{
+ if (!m_PluginSettings.contains(pluginName)) {
+ throw MyException(tr("attempt to store setting for unknown plugin \"%1\"").arg(pluginName));
+ }
+ m_Settings.setValue("PluginPersistance/" + pluginName + "/" + key, value);
+ if (sync) {
+ m_Settings.sync();
+ }
+}
+
QString Settings::language()
{
QString result = m_Settings.value("Settings/language", "").toString();
@@ -330,6 +374,23 @@ void Settings::updateServers(const QList<ServerInfo> &servers)
m_Settings.sync();
}
+void Settings::addBlacklistPlugin(const QString &fileName)
+{
+ m_PluginBlacklist.insert(fileName);
+ writePluginBlacklist();
+}
+
+void Settings::writePluginBlacklist()
+{
+ m_Settings.beginWriteArray("pluginBlacklist");
+ int idx = 0;
+ foreach (const QString &plugin, m_PluginBlacklist) {
+ m_Settings.setArrayIndex(idx++);
+ m_Settings.setValue("name", plugin);
+ }
+
+ m_Settings.endArray();
+}
void Settings::addLanguages(QComboBox *languageBox)
{
@@ -443,6 +504,7 @@ void Settings::query(QWidget *parent)
// plugis page
QListWidget *pluginsList = dialog.findChild<QListWidget*>("pluginsList");
+ QListWidget *pluginBlacklistList = dialog.findChild<QListWidget*>("pluginBlacklist");
// workarounds page
QCheckBox *forceEnableBox = dialog.findChild<QCheckBox*>("forceEnableBox");
@@ -522,6 +584,7 @@ void Settings::query(QWidget *parent)
nmmVersionEdit->setText(m_Settings.value("Settings/nmm_version", "0.33.1").toString());
logLevelBox->setCurrentIndex(logLevel());
+ // display plugin settings
foreach (IPlugin *plugin, m_Plugins) {
QListWidgetItem *listItem = new QListWidgetItem(plugin->name(), pluginsList);
listItem->setData(Qt::UserRole, QVariant::fromValue((void*)plugin));
@@ -529,6 +592,12 @@ void Settings::query(QWidget *parent)
pluginsList->addItem(listItem);
}
+ // display plugin blacklist
+ foreach (const QString &pluginName, m_PluginBlacklist) {
+ pluginBlacklistList->addItem(pluginName);
+ }
+
+ // display server preferences
m_Settings.beginGroup("Servers");
foreach (const QString &key, m_Settings.childKeys()) {
QVariantMap val = m_Settings.value(key).toMap();
@@ -624,6 +693,13 @@ void Settings::query(QWidget *parent)
}
}
+ // store plugin blacklist
+ m_PluginBlacklist.clear();
+ foreach (QListWidgetItem *item, pluginBlacklistList->findItems("*", Qt::MatchWildcard)) {
+ m_PluginBlacklist.insert(item->text());
+ }
+ writePluginBlacklist();
+
// store server preference
m_Settings.beginGroup("Servers");
for (int i = 0; i < knownServersList->count(); ++i) {