diff options
| author | Mikaƫl Capelle <capelle.mikael@gmail.com> | 2020-09-27 14:55:50 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-27 14:55:50 +0200 |
| commit | c67f37a41fad286fb7eebdd13743fec3e8965acb (patch) | |
| tree | 3901fe80f5b0970b1533229156abfe30650f32fb | |
| parent | 8e43dee79c86bf56deb98654439016205c470679 (diff) | |
| parent | b95373cb12379db7f55bce50cca2d7ef217ac423 (diff) | |
Merge pull request #1226 from Holt59/fix-ipluginlist-callbacks
Change for onPluginStateChanged to take a list of plugins.
| -rw-r--r-- | src/pluginlist.cpp | 57 | ||||
| -rw-r--r-- | src/pluginlist.h | 13 |
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;
|
