summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2020-09-05 13:49:55 +0200
committerMikaël Capelle <capelle.mikael@gmail.com>2020-09-05 13:49:55 +0200
commitb95373cb12379db7f55bce50cca2d7ef217ac423 (patch)
tree67778628d835bd56b5859a1917b47e3210a4ba44
parent2ad41ee2cd94f5012140989f9ddc553459fc5214 (diff)
Change for onPluginStateChanged to take a list of plugins.
-rw-r--r--src/pluginlist.cpp57
-rw-r--r--src/pluginlist.h13
2 files changed, 56 insertions, 14 deletions
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp
index 67ca0133..8dd12cdf 100644
--- a/src/pluginlist.cpp
+++ b/src/pluginlist.cpp
@@ -312,10 +312,14 @@ void PluginList::enableESP(const QString &name, bool enable)
std::map<QString, int>::iterator iter = m_ESPsByName.find(name.toLower());
if (iter != m_ESPsByName.end()) {
+ auto enabled = m_ESPs[iter->second].enabled;
m_ESPs[iter->second].enabled =
enable | m_ESPs[iter->second].forceEnabled;
emit writePluginsList();
+ if (enabled != m_ESPs[iter->second].enabled) {
+ pluginStatesChanged({ name }, state(name));
+ }
} else {
reportError(tr("Plugin not found: %1").arg(qUtf8Printable(name)));
}
@@ -335,30 +339,36 @@ int PluginList::findPluginByPriority(int priority)
void PluginList::enableSelected(const QItemSelectionModel *selectionModel)
{
if (selectionModel->hasSelection()) {
- bool dirty = false;
+ QStringList dirty;
for (auto row : selectionModel->selectedRows(COL_PRIORITY)) {
int rowIndex = findPluginByPriority(row.data().toInt());
if (!m_ESPs[rowIndex].enabled) {
m_ESPs[rowIndex].enabled = true;
- dirty = true;
+ dirty.append(m_ESPs[rowIndex].name);
}
}
- if (dirty) emit writePluginsList();
+ if (!dirty.isEmpty()) {
+ emit writePluginsList();
+ pluginStatesChanged(dirty, IPluginList::PluginState::STATE_ACTIVE);
+ }
}
}
void PluginList::disableSelected(const QItemSelectionModel *selectionModel)
{
if (selectionModel->hasSelection()) {
- bool dirty = false;
+ QStringList dirty;
for (auto row : selectionModel->selectedRows(COL_PRIORITY)) {
int rowIndex = findPluginByPriority(row.data().toInt());
if (!m_ESPs[rowIndex].forceEnabled && m_ESPs[rowIndex].enabled) {
m_ESPs[rowIndex].enabled = false;
- dirty = true;
+ dirty.append(m_ESPs[rowIndex].name);
}
}
- if (dirty) emit writePluginsList();
+ if (!dirty.isEmpty()) {
+ emit writePluginsList();
+ pluginStatesChanged(dirty, IPluginList::PluginState::STATE_INACTIVE);
+ }
}
}
@@ -367,10 +377,17 @@ void PluginList::enableAll()
{
if (QMessageBox::question(nullptr, tr("Confirm"), tr("Really enable all plugins?"),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
+ QStringList dirty;
for (ESPInfo &info : m_ESPs) {
- info.enabled = true;
+ if (!info.enabled) {
+ info.enabled = true;
+ dirty.append(info.name);
+ }
+ }
+ if (!dirty.isEmpty()) {
+ emit writePluginsList();
+ pluginStatesChanged(dirty, IPluginList::PluginState::STATE_ACTIVE);
}
- emit writePluginsList();
}
}
@@ -379,12 +396,17 @@ void PluginList::disableAll()
{
if (QMessageBox::question(nullptr, tr("Confirm"), tr("Really disable all plugins?"),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
+ QStringList dirty;
for (ESPInfo &info : m_ESPs) {
- if (!info.forceEnabled) {
+ if (!info.forceEnabled && info.enabled) {
info.enabled = false;
+ dirty.append(info.name);
}
}
- emit writePluginsList();
+ if (!dirty.isEmpty()) {
+ emit writePluginsList();
+ pluginStatesChanged(dirty, IPluginList::PluginState::STATE_INACTIVE);
+ }
}
}
@@ -853,12 +875,23 @@ QString PluginList::origin(const QString &name) const
}
}
-bool PluginList::onPluginStateChanged(const std::function<void (const QString &, PluginStates)> &func)
+bool PluginList::onPluginStateChanged(const std::function<void(const std::map<QString, PluginStates>&)>& func)
{
auto conn = m_PluginStateChanged.connect(func);
return conn.connected();
}
+void PluginList::pluginStatesChanged(QStringList const& pluginNames, IPluginList::PluginStates state) const {
+ if (pluginNames.isEmpty()) {
+ return;
+ }
+ std::map<QString, IPluginList::PluginStates> infos;
+ for (auto& name : pluginNames) {
+ infos[name] = state;
+ }
+ m_PluginStateChanged(infos);
+}
+
bool PluginList::onRefreshed(const std::function<void ()> &callback)
{
auto conn = m_Refreshed.connect(callback);
@@ -1324,7 +1357,7 @@ bool PluginList::setData(const QModelIndex &modIndex, const QVariant &value, int
IPluginList::PluginStates newState = state(modName);
if (oldState != newState) {
try {
- m_PluginStateChanged(modName, newState);
+ pluginStatesChanged({ modName }, newState);
testMasters();
emit dataChanged(
this->index(0, 0),
diff --git a/src/pluginlist.h b/src/pluginlist.h
index 00679a35..0b49b86f 100644
--- a/src/pluginlist.h
+++ b/src/pluginlist.h
@@ -96,7 +96,7 @@ public:
typedef boost::signals2::signal<void ()> SignalRefreshed;
typedef boost::signals2::signal<void (const QString &, int, int)> SignalPluginMoved;
- typedef boost::signals2::signal<void (const QString &, PluginStates)> SignalPluginStateChanged;
+ typedef boost::signals2::signal<void (const std::map<QString, PluginStates>&)> SignalPluginStateChanged;
public:
@@ -235,7 +235,7 @@ public:
virtual QString origin(const QString &name) const override;
virtual void setLoadOrder(const QStringList &pluginList) override;
virtual bool onPluginMoved(const std::function<void (const QString &, int, int)> &func) override;
- virtual bool onPluginStateChanged(const std::function<void (const QString &, PluginStates)> &func) override;
+ virtual bool onPluginStateChanged(const std::function<void (const std::map<QString, PluginStates>&)> &func) override;
public: // implementation of the QAbstractTableModel interface
@@ -361,6 +361,15 @@ private:
int findPluginByPriority(int priority);
+ /**
+ * @brief Notify MO2 plugins that the states of the given plugins have changed to the given state.
+ *
+ * @param pluginNames Names of the plugin.
+ * @param state New state of the plugin.
+ *
+ */
+ void pluginStatesChanged(QStringList const& pluginNames, IPluginList::PluginStates state) const;
+
private:
std::vector<ESPInfo> m_ESPs;