Restructure plugin system to be more portable

This commit is contained in:
Gary Talent 2018-02-16 00:41:00 -06:00
parent 2b8b5661eb
commit c2c87e0363
9 changed files with 57 additions and 35 deletions

View File

@ -57,7 +57,7 @@ else()
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(NOSTALGIA_DIST_BIN bin) set(NOSTALGIA_DIST_BIN bin)
set(NOSTALGIA_DIST_LIB lib) set(NOSTALGIA_DIST_LIB lib)
set(NOSTALGIA_DIST_PLUGIN lib) set(NOSTALGIA_DIST_PLUGIN lib/nostalgia/plugins)
set(NOSTALGIA_DIST_RESOURCES share) set(NOSTALGIA_DIST_RESOURCES share)
endif() endif()

View File

@ -20,7 +20,7 @@ install(
TARGETS TARGETS
NostalgiaCore-Studio NostalgiaCore-Studio
LIBRARY DESTINATION LIBRARY DESTINATION
${NOSTALGIA_DIST_PLUGIN}/nostalgia ${NOSTALGIA_DIST_PLUGIN}
) )
install( install(

View File

@ -0,0 +1,3 @@
{
"plugin_name": "Nostalgia Core"
}

View File

@ -17,7 +17,7 @@ namespace core {
class Plugin: public QObject, studio::Plugin { class Plugin: public QObject, studio::Plugin {
Q_OBJECT 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) Q_INTERFACES(nostalgia::studio::Plugin)
public: public:

View File

@ -73,30 +73,48 @@ MainWindow::~MainWindow() {
} }
void MainWindow::loadPlugins() { void MainWindow::loadPlugins() {
for (auto p : m_profile.plugins) { for (auto dir : m_profile.pluginsPath) {
#if defined(Q_OS_WIN) QFileInfo dirInfo(m_profilePath);
auto libName = p.libName + ".dll"; dir = dirInfo.absolutePath() + "/" + dir;
#elif defined(Q_OS_MAC) if (dirInfo.exists()) {
auto libName = "lib" + p.libName + ".dylib"; qDebug() << "Checking plugin directory:" << dir;
#else loadPluginDir(dir);
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<Plugin*>(loader->instance());
if (plugin) {
m_cleanupTasks.push_back([loader]() {
loader->unload();
delete loader;
});
m_plugins.push_back(plugin);
} else {
qInfo() << loader->errorString();
} }
} }
} }
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<Plugin*>(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() { void MainWindow::setupMenu() {
auto menu = menuBar(); auto menu = menuBar();
auto fileMenu = menu->addMenu(tr("&File")); auto fileMenu = menu->addMenu(tr("&File"));

View File

@ -61,7 +61,7 @@ ox::Error ioOp(T *io, NostalgiaStudioPluginDef *obj) {
struct NostalgiaStudioProfile { struct NostalgiaStudioProfile {
QString appName; QString appName;
QString orgName; QString orgName;
QVector<NostalgiaStudioPluginDef> plugins; QVector<QString> pluginsPath;
}; };
template<typename T> template<typename T>
@ -70,7 +70,7 @@ ox::Error ioOp(T *io, NostalgiaStudioProfile *obj) {
io->setFields(3); io->setFields(3);
err |= io->op("app_name", &obj->appName); err |= io->op("app_name", &obj->appName);
err |= io->op("org_name", &obj->orgName); err |= io->op("org_name", &obj->orgName);
err |= io->op("plugins", &obj->plugins); err |= io->op("plugins_path", &obj->pluginsPath);
return err; return err;
} }
@ -104,6 +104,10 @@ class MainWindow: public QMainWindow {
private: private:
void loadPlugins(); void loadPlugins();
void loadPluginDir(QString path);
void loadPlugin(QString path);
void setupDockWidgets(); void setupDockWidgets();
void setupMenu(); void setupMenu();

View File

@ -1,14 +1,8 @@
{ {
"app_name": "Nostalgia Studio", "app_name": "Nostalgia Studio",
"org_name": "Drinking Tea", "org_name": "Drinking Tea",
"plugins": [ "plugins_path": [
{ "../lib/nostalgia/plugins",
"dir": "../lib/nostalgia", "../Plugins"
"lib_name": "NostalgiaCore-Studio"
},
{
"dir": "../lib/nostalgia",
"lib_name": "NostalgiaWorld-Studio"
}
] ]
} }

View File

@ -18,5 +18,5 @@ install(
TARGETS TARGETS
NostalgiaWorld-Studio NostalgiaWorld-Studio
LIBRARY DESTINATION LIBRARY DESTINATION
${NOSTALGIA_DIST_PLUGIN}/nostalgia ${NOSTALGIA_DIST_PLUGIN}
) )

View File

@ -0,0 +1,3 @@
{
"plugin_name": "Nostalgia World"
}