From c2c87e03636b5339df26fcc18aa0cb071d4fc13a Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Fri, 16 Feb 2018 00:41:00 -0600 Subject: [PATCH] Restructure plugin system to be more portable --- CMakeLists.txt | 2 +- src/nostalgia/core/studio/CMakeLists.txt | 2 +- src/nostalgia/core/studio/core-studio.json | 3 + src/nostalgia/core/studio/plugin.hpp | 2 +- src/nostalgia/studio/mainwindow.cpp | 58 +++++++++++++------- src/nostalgia/studio/mainwindow.hpp | 8 ++- src/nostalgia/studio/nostalgia-studio.json | 12 +--- src/nostalgia/world/studio/CMakeLists.txt | 2 +- src/nostalgia/world/studio/world-studio.json | 3 + 9 files changed, 57 insertions(+), 35 deletions(-) create mode 100644 src/nostalgia/core/studio/core-studio.json create mode 100644 src/nostalgia/world/studio/world-studio.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 992f284bd..4b2c79b21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ else() set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(NOSTALGIA_DIST_BIN bin) set(NOSTALGIA_DIST_LIB lib) - set(NOSTALGIA_DIST_PLUGIN lib) + set(NOSTALGIA_DIST_PLUGIN lib/nostalgia/plugins) set(NOSTALGIA_DIST_RESOURCES share) endif() diff --git a/src/nostalgia/core/studio/CMakeLists.txt b/src/nostalgia/core/studio/CMakeLists.txt index 075d418f9..09bee3ccc 100644 --- a/src/nostalgia/core/studio/CMakeLists.txt +++ b/src/nostalgia/core/studio/CMakeLists.txt @@ -20,7 +20,7 @@ install( TARGETS NostalgiaCore-Studio LIBRARY DESTINATION - ${NOSTALGIA_DIST_PLUGIN}/nostalgia + ${NOSTALGIA_DIST_PLUGIN} ) install( diff --git a/src/nostalgia/core/studio/core-studio.json b/src/nostalgia/core/studio/core-studio.json new file mode 100644 index 000000000..23100699e --- /dev/null +++ b/src/nostalgia/core/studio/core-studio.json @@ -0,0 +1,3 @@ +{ + "plugin_name": "Nostalgia Core" +} \ No newline at end of file diff --git a/src/nostalgia/core/studio/plugin.hpp b/src/nostalgia/core/studio/plugin.hpp index 11a8724d5..6a4c5c0b8 100644 --- a/src/nostalgia/core/studio/plugin.hpp +++ b/src/nostalgia/core/studio/plugin.hpp @@ -17,7 +17,7 @@ namespace core { class Plugin: public QObject, studio::Plugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "net.drinkingtea.nostalgia.studio.Plugin") + Q_PLUGIN_METADATA(IID "net.drinkingtea.nostalgia.studio.Plugin" FILE "core-studio.json") Q_INTERFACES(nostalgia::studio::Plugin) public: diff --git a/src/nostalgia/studio/mainwindow.cpp b/src/nostalgia/studio/mainwindow.cpp index 72e9aac9d..149756665 100644 --- a/src/nostalgia/studio/mainwindow.cpp +++ b/src/nostalgia/studio/mainwindow.cpp @@ -73,30 +73,48 @@ MainWindow::~MainWindow() { } void MainWindow::loadPlugins() { - for (auto p : m_profile.plugins) { -#if defined(Q_OS_WIN) - auto libName = p.libName + ".dll"; -#elif defined(Q_OS_MAC) - auto libName = "lib" + p.libName + ".dylib"; -#else - auto libName = "lib" + p.libName + ".so"; -#endif - auto pluginPath = QFileInfo(m_profilePath).absolutePath() + "/" + p.dir + "/" + libName; - - auto loader = new QPluginLoader(pluginPath); - auto plugin = qobject_cast(loader->instance()); - if (plugin) { - m_cleanupTasks.push_back([loader]() { - loader->unload(); - delete loader; - }); - m_plugins.push_back(plugin); - } else { - qInfo() << loader->errorString(); + for (auto dir : m_profile.pluginsPath) { + QFileInfo dirInfo(m_profilePath); + dir = dirInfo.absolutePath() + "/" + dir; + if (dirInfo.exists()) { + qDebug() << "Checking plugin directory:" << dir; + loadPluginDir(dir); } } } +void MainWindow::loadPluginDir(QString dir) { +#if defined(Q_OS_WIN) + constexpr auto libSuffix = ".dll"; +#elif defined(Q_OS_MAC) + constexpr auto libSuffix = ".dylib"; +#else + constexpr auto libSuffix = ".so"; +#endif + + for (auto pluginPath : QDir(dir).entryList()) { + pluginPath = dir + '/' + pluginPath; + if (pluginPath.endsWith(libSuffix)) { + loadPlugin(pluginPath); + } + } +} + +void MainWindow::loadPlugin(QString pluginPath) { + qDebug() << "Loading plugin:" << pluginPath; + auto loader = new QPluginLoader(pluginPath); + auto plugin = qobject_cast(loader->instance()); + if (plugin) { + m_cleanupTasks.push_back([loader]() { + loader->unload(); + delete loader; + }); + m_plugins.push_back(plugin); + } else { + qInfo() << loader->errorString(); + } +} + void MainWindow::setupMenu() { auto menu = menuBar(); auto fileMenu = menu->addMenu(tr("&File")); diff --git a/src/nostalgia/studio/mainwindow.hpp b/src/nostalgia/studio/mainwindow.hpp index 7203de77c..8f4c82293 100644 --- a/src/nostalgia/studio/mainwindow.hpp +++ b/src/nostalgia/studio/mainwindow.hpp @@ -61,7 +61,7 @@ ox::Error ioOp(T *io, NostalgiaStudioPluginDef *obj) { struct NostalgiaStudioProfile { QString appName; QString orgName; - QVector plugins; + QVector pluginsPath; }; template @@ -70,7 +70,7 @@ ox::Error ioOp(T *io, NostalgiaStudioProfile *obj) { io->setFields(3); err |= io->op("app_name", &obj->appName); err |= io->op("org_name", &obj->orgName); - err |= io->op("plugins", &obj->plugins); + err |= io->op("plugins_path", &obj->pluginsPath); return err; } @@ -104,6 +104,10 @@ class MainWindow: public QMainWindow { private: void loadPlugins(); + void loadPluginDir(QString path); + + void loadPlugin(QString path); + void setupDockWidgets(); void setupMenu(); diff --git a/src/nostalgia/studio/nostalgia-studio.json b/src/nostalgia/studio/nostalgia-studio.json index 0328a1ea1..c258dfbe0 100644 --- a/src/nostalgia/studio/nostalgia-studio.json +++ b/src/nostalgia/studio/nostalgia-studio.json @@ -1,14 +1,8 @@ { "app_name": "Nostalgia Studio", "org_name": "Drinking Tea", - "plugins": [ - { - "dir": "../lib/nostalgia", - "lib_name": "NostalgiaCore-Studio" - }, - { - "dir": "../lib/nostalgia", - "lib_name": "NostalgiaWorld-Studio" - } + "plugins_path": [ + "../lib/nostalgia/plugins", + "../Plugins" ] } diff --git a/src/nostalgia/world/studio/CMakeLists.txt b/src/nostalgia/world/studio/CMakeLists.txt index f05db341e..01a7fa2c9 100644 --- a/src/nostalgia/world/studio/CMakeLists.txt +++ b/src/nostalgia/world/studio/CMakeLists.txt @@ -18,5 +18,5 @@ install( TARGETS NostalgiaWorld-Studio LIBRARY DESTINATION - ${NOSTALGIA_DIST_PLUGIN}/nostalgia + ${NOSTALGIA_DIST_PLUGIN} ) diff --git a/src/nostalgia/world/studio/world-studio.json b/src/nostalgia/world/studio/world-studio.json new file mode 100644 index 000000000..3cd12d3bc --- /dev/null +++ b/src/nostalgia/world/studio/world-studio.json @@ -0,0 +1,3 @@ +{ + "plugin_name": "Nostalgia World" +} \ No newline at end of file