summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLostDragonist <lost.dragonist@gmail.com>2019-03-23 21:21:51 -0500
committerLostDragonist <lost.dragonist@gmail.com>2019-03-23 21:21:51 -0500
commit1f3133059e3c821e92dbaa6e3149dd59ce86c245 (patch)
tree64b5cb49486d23e200ba3f25bc56ed10855437b4 /src
parentff7fd68c0b8f861ac294a3876485c59de94a67cd (diff)
Prevent diagnose plugins that return false for isActive from reporting notifications
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.cpp11
-rw-r--r--src/plugincontainer.cpp4
-rw-r--r--src/plugincontainer.h1
-rw-r--r--src/problemsdialog.cpp15
-rw-r--r--src/problemsdialog.h6
5 files changed, 28 insertions, 9 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 76101be1..ea46b175 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -727,8 +727,13 @@ bool MainWindow::errorReported(QString &logFile)
size_t MainWindow::checkForProblems()
{
size_t numProblems = 0;
- for (IPluginDiagnose *diagnose : m_PluginContainer.plugins<IPluginDiagnose>()) {
- numProblems += diagnose->activeProblems().size();
+ for (QObject *pluginObj : m_PluginContainer.plugins<QObject>()) {
+ IPlugin *plugin = qobject_cast<IPlugin*>(pluginObj);
+ if (plugin == nullptr || plugin->isActive()) {
+ IPluginDiagnose *diagnose = qobject_cast<IPluginDiagnose*>(pluginObj);
+ if (diagnose != nullptr)
+ numProblems += diagnose->activeProblems().size();
+ }
}
return numProblems;
}
@@ -6063,7 +6068,7 @@ void MainWindow::on_bsaList_itemChanged(QTreeWidgetItem*, int)
void MainWindow::on_actionNotifications_triggered()
{
updateProblemsButton();
- ProblemsDialog problems(m_PluginContainer.plugins<IPluginDiagnose>(), this);
+ ProblemsDialog problems(m_PluginContainer.plugins<QObject>(), this);
if (problems.hasProblems()) {
QSettings &settings = m_OrganizerCore.settings().directInterface();
QString key = QString("geometry/%1").arg(problems.objectName());
diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp
index 46a95f0c..2126c5ef 100644
--- a/src/plugincontainer.cpp
+++ b/src/plugincontainer.cpp
@@ -84,6 +84,10 @@ void PluginContainer::registerGame(IPluginGame *game)
bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName)
{
+ // Storing the original QObject* is a bit of a hack as I couldn't figure out any
+ // way to cast directly between IPlugin* and IPluginDiagnose*
+ bf::at_key<QObject>(m_Plugins).push_back(plugin);
+
{ // generic treatment for all plugins
IPlugin *pluginObj = qobject_cast<IPlugin*>(plugin);
if (pluginObj == nullptr) {
diff --git a/src/plugincontainer.h b/src/plugincontainer.h
index 172dbd09..21ad4241 100644
--- a/src/plugincontainer.h
+++ b/src/plugincontainer.h
@@ -32,6 +32,7 @@ class PluginContainer : public QObject, public MOBase::IPluginDiagnose
private:
typedef boost::fusion::map<
+ boost::fusion::pair<QObject, std::vector<QObject*>>,
boost::fusion::pair<MOBase::IPlugin, std::vector<MOBase::IPlugin*>>,
boost::fusion::pair<MOBase::IPluginDiagnose, std::vector<MOBase::IPluginDiagnose*>>,
boost::fusion::pair<MOBase::IPluginGame, std::vector<MOBase::IPluginGame*>>,
diff --git a/src/problemsdialog.cpp b/src/problemsdialog.cpp
index 60a0b1df..795baab0 100644
--- a/src/problemsdialog.cpp
+++ b/src/problemsdialog.cpp
@@ -1,6 +1,7 @@
#include "problemsdialog.h"
#include "ui_problemsdialog.h"
#include <utility.h>
+#include <iplugin.h>
#include <iplugindiagnose.h>
#include <QPushButton>
#include <Shellapi.h>
@@ -9,8 +10,8 @@
using namespace MOBase;
-ProblemsDialog::ProblemsDialog(std::vector<MOBase::IPluginDiagnose *> diagnosePlugins, QWidget *parent)
- : QDialog(parent), ui(new Ui::ProblemsDialog), m_DiagnosePlugins(diagnosePlugins)
+ProblemsDialog::ProblemsDialog(std::vector<QObject *> pluginObjects, QWidget *parent)
+ : QDialog(parent), ui(new Ui::ProblemsDialog), m_PluginObjects(pluginObjects)
{
ui->setupUi(this);
@@ -29,7 +30,15 @@ ProblemsDialog::~ProblemsDialog()
void ProblemsDialog::runDiagnosis()
{
ui->problemsWidget->clear();
- foreach (IPluginDiagnose *diagnose, m_DiagnosePlugins) {
+ for(QObject *pluginObj : m_PluginObjects) {
+ IPlugin *plugin = qobject_cast<IPlugin*>(pluginObj);
+ if (plugin != nullptr && !plugin->isActive())
+ continue;
+
+ IPluginDiagnose *diagnose = qobject_cast<IPluginDiagnose*>(pluginObj);
+ if (diagnose == nullptr)
+ continue;
+
std::vector<unsigned int> activeProblems = diagnose->activeProblems();
foreach (unsigned int key, activeProblems) {
QTreeWidgetItem *newItem = new QTreeWidgetItem();
diff --git a/src/problemsdialog.h b/src/problemsdialog.h
index 24a69cdf..a48a5de1 100644
--- a/src/problemsdialog.h
+++ b/src/problemsdialog.h
@@ -15,9 +15,9 @@ class ProblemsDialog;
class ProblemsDialog : public QDialog
{
Q_OBJECT
-
+
public:
- explicit ProblemsDialog(std::vector<MOBase::IPluginDiagnose*> diagnosePlugins, QWidget *parent = 0);
+ explicit ProblemsDialog(std::vector<QObject*> pluginObjects, QWidget *parent = 0);
~ProblemsDialog();
bool hasProblems() const;
@@ -34,7 +34,7 @@ private slots:
private:
Ui::ProblemsDialog *ui;
- std::vector<MOBase::IPluginDiagnose *> m_DiagnosePlugins;
+ std::vector<QObject *> m_PluginObjects;
};
#endif // PROBLEMSDIALOG_H