Restructure plugin system to be more portable
This commit is contained in:
parent
2b8b5661eb
commit
c2c87e0363
@ -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()
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ install(
|
|||||||
TARGETS
|
TARGETS
|
||||||
NostalgiaCore-Studio
|
NostalgiaCore-Studio
|
||||||
LIBRARY DESTINATION
|
LIBRARY DESTINATION
|
||||||
${NOSTALGIA_DIST_PLUGIN}/nostalgia
|
${NOSTALGIA_DIST_PLUGIN}
|
||||||
)
|
)
|
||||||
|
|
||||||
install(
|
install(
|
||||||
|
3
src/nostalgia/core/studio/core-studio.json
Normal file
3
src/nostalgia/core/studio/core-studio.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"plugin_name": "Nostalgia Core"
|
||||||
|
}
|
@ -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:
|
||||||
|
@ -73,16 +73,35 @@ 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;
|
}
|
||||||
|
|
||||||
|
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 loader = new QPluginLoader(pluginPath);
|
||||||
auto plugin = qobject_cast<Plugin*>(loader->instance());
|
auto plugin = qobject_cast<Plugin*>(loader->instance());
|
||||||
if (plugin) {
|
if (plugin) {
|
||||||
@ -95,7 +114,6 @@ void MainWindow::loadPlugins() {
|
|||||||
qInfo() << loader->errorString();
|
qInfo() << loader->errorString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::setupMenu() {
|
void MainWindow::setupMenu() {
|
||||||
auto menu = menuBar();
|
auto menu = menuBar();
|
||||||
|
@ -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();
|
||||||
|
@ -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"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -18,5 +18,5 @@ install(
|
|||||||
TARGETS
|
TARGETS
|
||||||
NostalgiaWorld-Studio
|
NostalgiaWorld-Studio
|
||||||
LIBRARY DESTINATION
|
LIBRARY DESTINATION
|
||||||
${NOSTALGIA_DIST_PLUGIN}/nostalgia
|
${NOSTALGIA_DIST_PLUGIN}
|
||||||
)
|
)
|
||||||
|
3
src/nostalgia/world/studio/world-studio.json
Normal file
3
src/nostalgia/world/studio/world-studio.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"plugin_name": "Nostalgia World"
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user