From 66d3e99ff2bea172d991ad59db19586ce7bcbed6 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Fri, 9 Oct 2015 19:18:45 -0300 Subject: Add a PluginManager class This class is currently very small but the reason of existence is to allow subsurface to be easily extendable via plugins. The current type of plugin that I'm making is Social Network, but another possibilities: - Dive Simulation Algorithm - Import/Export Filters - Profile Overlays Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- subsurface-core/pluginmanager.cpp | 44 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 subsurface-core/pluginmanager.cpp (limited to 'subsurface-core/pluginmanager.cpp') diff --git a/subsurface-core/pluginmanager.cpp b/subsurface-core/pluginmanager.cpp new file mode 100644 index 000000000..41d226f61 --- /dev/null +++ b/subsurface-core/pluginmanager.cpp @@ -0,0 +1,44 @@ +#include "pluginmanager.h" + +#include +#include +#include + +static QList _socialNetworks; + +PluginManager& PluginManager::instance() { + static PluginManager self; + return self; +} + +void PluginManager::loadPlugins() { + QDir pluginsDir(qApp->applicationDirPath()); + +#if defined(Q_OS_WIN) + if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") + pluginsDir.cdUp(); +#elif defined(Q_OS_MAC) + if (pluginsDir.dirName() == "MacOS") { + pluginsDir.cdUp(); + pluginsDir.cdUp(); + pluginsDir.cdUp(); + } +#endif + pluginsDir.cd("plugins"); + + foreach (const QString& fileName, pluginsDir.entryList(QDir::Files)) { + QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); + QObject *plugin = loader.instance(); + if(!plugin) { + continue; + } + + if (ISocialNetworkIntegration *social = qobject_cast(plugin)){ + _socialNetworks.push_back(social); + } + } +} + +QList PluginManager::socialNetworkIntegrationPlugins() const { + return _socialNetworks; +} \ No newline at end of file -- cgit v1.2.3-70-g09d2 From e62d439bda65801ae6f3d2e73bec1a706a46ca90 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Fri, 9 Oct 2015 19:26:05 -0300 Subject: Start the Plugin Manager This bit of code will try to load all plugins avaliable. Now I need to port a Facebook plugin for this new system, then I'll delete the old preferences widget. Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- subsurface-core/pluginmanager.cpp | 3 +++ subsurface-desktop-helper.cpp | 3 +++ 2 files changed, 6 insertions(+) (limited to 'subsurface-core/pluginmanager.cpp') diff --git a/subsurface-core/pluginmanager.cpp b/subsurface-core/pluginmanager.cpp index 41d226f61..290f43df0 100644 --- a/subsurface-core/pluginmanager.cpp +++ b/subsurface-core/pluginmanager.cpp @@ -11,6 +11,9 @@ PluginManager& PluginManager::instance() { return self; } +PluginManager::PluginManager() { +} + void PluginManager::loadPlugins() { QDir pluginsDir(qApp->applicationDirPath()); diff --git a/subsurface-desktop-helper.cpp b/subsurface-desktop-helper.cpp index af366fb84..420f75249 100644 --- a/subsurface-desktop-helper.cpp +++ b/subsurface-desktop-helper.cpp @@ -4,6 +4,7 @@ #include "display.h" #include "desktop-widgets/mainwindow.h" #include "helpers.h" +#include "pluginmanager.h" #include #include @@ -30,6 +31,8 @@ void init_ui() { init_qt_late(); + PluginManager::instance().loadPlugins(); + window = new MainWindow(); if (existing_filename && existing_filename[0] != '\0') window->setTitle(MWTF_FILENAME); -- cgit v1.2.3-70-g09d2 From 8dad3457ef1f412517c4d81f08ebd14680788ec3 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Thu, 29 Oct 2015 21:47:08 -0200 Subject: Make the skeleton Facebook plugin and make sure it is loaded Currently we need to copy manually the plugin dynamic library to the /plugins folder. Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- desktop-widgets/mainwindow.cpp | 4 ++- desktop-widgets/plugins/facebook/CMakeLists.txt | 5 +-- .../plugins/facebook/facebook_integration.cpp | 36 ++++++++++++++++++++++ .../plugins/facebook/facebook_integration.h | 21 +++++++++++++ subsurface-core/isocialnetworkintegration.h | 2 +- subsurface-core/pluginmanager.cpp | 24 +++++++++------ 6 files changed, 78 insertions(+), 14 deletions(-) (limited to 'subsurface-core/pluginmanager.cpp') diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 0150a7c6f..23b4fb9b0 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -256,15 +256,17 @@ MainWindow::MainWindow() : QMainWindow(), #endif if(PluginManager::instance().socialNetworkIntegrationPlugins().count()) { - QMenu *connections = new QMenu(); + QMenu *connections = new QMenu(tr("Connect to")); for(ISocialNetworkIntegration *plugin : PluginManager::instance().socialNetworkIntegrationPlugins()){ QAction *toggle_connection = new QAction(this); toggle_connection->setText(plugin->socialNetworkName()); toggle_connection->setIcon(QIcon(plugin->socialNetworkIcon())); + toggle_connection->setData(QVariant::fromValue(plugin)); QAction *share_on = new QAction(this); share_on->setText(plugin->socialNetworkName()); share_on->setIcon(QIcon(plugin->socialNetworkIcon())); + share_on->setData(QVariant::fromValue(plugin)); ui.menuShare_on->addAction(share_on); connections->addAction(toggle_connection); } diff --git a/desktop-widgets/plugins/facebook/CMakeLists.txt b/desktop-widgets/plugins/facebook/CMakeLists.txt index cccfec1f5..8628bd070 100644 --- a/desktop-widgets/plugins/facebook/CMakeLists.txt +++ b/desktop-widgets/plugins/facebook/CMakeLists.txt @@ -1,5 +1,6 @@ set(FACEBOOK_PLUGIN_SRCS facebook_integration.cpp) -add_library(facebook_integration ${FACEBOOK_PLUGIN_SRCS}) +add_library(facebook_integration SHARED ${FACEBOOK_PLUGIN_SRCS}) -target_link_libraries(facebook_integration subsurface_core ${QT_LIBRARIES}) +target_link_libraries(facebook_integration subsurface_corelib ${QT_LIBRARIES}) +add_dependencies(facebook_integration subsurface_corelib) \ No newline at end of file diff --git a/desktop-widgets/plugins/facebook/facebook_integration.cpp b/desktop-widgets/plugins/facebook/facebook_integration.cpp index e69de29bb..e9b2297a0 100644 --- a/desktop-widgets/plugins/facebook/facebook_integration.cpp +++ b/desktop-widgets/plugins/facebook/facebook_integration.cpp @@ -0,0 +1,36 @@ +#include "facebook_integration.h" + +FacebookPlugin::FacebookPlugin(QObject* parent): QObject(parent) +{ + +} + +bool FacebookPlugin::isConnected() +{ + +} + +void FacebookPlugin::requestLogin() +{ + +} + +void FacebookPlugin::requestLogoff() +{ + +} + +QString FacebookPlugin::socialNetworkIcon() const +{ + return QString(); +} + +QString FacebookPlugin::socialNetworkName() const +{ + return tr("Facebook"); +} + +void FacebookPlugin::uploadCurrentDive() +{ + +} diff --git a/desktop-widgets/plugins/facebook/facebook_integration.h b/desktop-widgets/plugins/facebook/facebook_integration.h index e69de29bb..a9d212e7e 100644 --- a/desktop-widgets/plugins/facebook/facebook_integration.h +++ b/desktop-widgets/plugins/facebook/facebook_integration.h @@ -0,0 +1,21 @@ +#ifndef FACEBOOK_INTEGRATION_H +#define FACEBOOK_INTEGRATION_H + +#include "subsurface-core/isocialnetworkintegration.h" +#include + +class FacebookPlugin : public QObject, public ISocialNetworkIntegration { + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.subsurface.plugins.ISocialNetworkIntegration") + Q_INTERFACES(ISocialNetworkIntegration) +public: + explicit FacebookPlugin(QObject* parent = 0); + virtual bool isConnected(); + virtual void requestLogin(); + virtual void requestLogoff(); + virtual QString socialNetworkIcon() const; + virtual QString socialNetworkName() const; + virtual void uploadCurrentDive(); +}; + +#endif \ No newline at end of file diff --git a/subsurface-core/isocialnetworkintegration.h b/subsurface-core/isocialnetworkintegration.h index 97ff91dc2..778a171b3 100644 --- a/subsurface-core/isocialnetworkintegration.h +++ b/subsurface-core/isocialnetworkintegration.h @@ -68,5 +68,5 @@ public: }; Q_DECLARE_INTERFACE(ISocialNetworkIntegration, "org.subsurface.ISocialNetworkIntegration.v1") - +Q_DECLARE_METATYPE(ISocialNetworkIntegration*); #endif \ No newline at end of file diff --git a/subsurface-core/pluginmanager.cpp b/subsurface-core/pluginmanager.cpp index 290f43df0..5c0f22525 100644 --- a/subsurface-core/pluginmanager.cpp +++ b/subsurface-core/pluginmanager.cpp @@ -3,18 +3,22 @@ #include #include #include +#include static QList _socialNetworks; -PluginManager& PluginManager::instance() { +PluginManager& PluginManager::instance() +{ static PluginManager self; return self; } -PluginManager::PluginManager() { +PluginManager::PluginManager() +{ } -void PluginManager::loadPlugins() { +void PluginManager::loadPlugins() +{ QDir pluginsDir(qApp->applicationDirPath()); #if defined(Q_OS_WIN) @@ -29,19 +33,19 @@ void PluginManager::loadPlugins() { #endif pluginsDir.cd("plugins"); + qDebug() << "Plugins Directory: " << pluginsDir; foreach (const QString& fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = loader.instance(); - if(!plugin) { + if(!plugin) continue; - } - if (ISocialNetworkIntegration *social = qobject_cast(plugin)){ + if (ISocialNetworkIntegration *social = qobject_cast(plugin)) _socialNetworks.push_back(social); - } - } + } } -QList PluginManager::socialNetworkIntegrationPlugins() const { +QList PluginManager::socialNetworkIntegrationPlugins() const +{ return _socialNetworks; -} \ No newline at end of file +} -- cgit v1.2.3-70-g09d2