Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

优化dfm-extension #1979

Merged
merged 2 commits into from
May 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 4 additions & 10 deletions examples/dfm-extension-example/dfm-extension-example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,12 @@
#include "myemblemiconplugin.h"
#include "mywindowplugin.h"

#ifdef DFMEXT_VERSION
# if (DFMEXT_VERSION >= DFMEXT_VERSION_CHECK(6, 0, 0))
# define NEW_VERSION
# endif
#endif

// 右键菜单的扩展
static DFMEXT::DFMExtMenuPlugin *myMenu { nullptr };
// 角标的扩展
static DFMEXT::DFMExtEmblemIconPlugin *myEmblemIcon { nullptr };

#ifdef NEW_VERSION
#ifdef DFMEXT_INTERFACE_Window
// 窗口的扩展
static DFMEXT::DFMExtWindowPlugin *myWindow { nullptr };
#endif
Expand All @@ -24,7 +18,7 @@
{
myMenu = new Exapmle::MyMenuPlugin;
myEmblemIcon = new Exapmle::MyEmblemIconPlugin;
#ifdef NEW_VERSION
#ifdef DFMEXT_INTERFACE_Window
myWindow = new Exapmle::MyWindowPlugin;
#endif
}
Expand All @@ -33,7 +27,7 @@
{
delete myMenu;
delete myEmblemIcon;
#ifdef NEW_VERSION
#ifdef DFMEXT_INTERFACE_Window
delete myWindow;
#endif
}
Expand All @@ -48,8 +42,8 @@
return myEmblemIcon;
}

#ifdef NEW_VERSION
#ifdef DFMEXT_INTERFACE_Window
extern "C" DFMEXT::DFMExtWindowPlugin *dfm_extension_window()

Check warning on line 46 in examples/dfm-extension-example/dfm-extension-example.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'dfm_extension_window' is never used.
{
return myWindow;
}
Expand Down
5 changes: 5 additions & 0 deletions include/dfm-extension/dfm-extension-global.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,9 @@
*/
#define DFMEXT_VERSION_CHECK(major, minor, patch) ((major << 16) | (minor << 8) | (patch))

// TODO: auto-generate
#define DFMEXT_INTERFACE_Menu
#define DFMEXT_INTERFACE_Emblem
#define DFMEXT_INTERFACE_Window

#endif // DDEFILEMANAGEREXTENSION_GLOBAL_H
Original file line number Diff line number Diff line change
Expand Up @@ -50,36 +50,12 @@ void ExtensionPluginInitWorker::doWork(const QStringList &paths)

// do init plugins
fmInfo() << "Start init extension plugins";
for (const auto &[k, v] : loadedLoaders) {
if (!v->initialize()) {
fmWarning() << "init failed: " << v->fileName() << v->lastError();
continue;
}
fmInfo() << "Inited extension plugin:" << v->fileName();
doAppendExt(v->fileName(), v);
}
// TODO(zhangs): record plugin state
for (const auto &[k, v] : loadedLoaders)
emit requestInitPlugin(v);

emit initPluginsFinished();
}

void ExtensionPluginInitWorker::doAppendExt(const QString &name, ExtPluginLoaderPointer loader)
{
Q_ASSERT(loader);

DFMEXT::DFMExtMenuPlugin *menu { loader->resolveMenuPlugin() };
if (menu)
emit newMenuPluginResolved(name, menu);

DFMEXT::DFMExtEmblemIconPlugin *emblem { loader->resolveEmblemPlugin() };
if (emblem)
emit newEmblemPluginResolved(name, emblem);

DFMEXT::DFMExtWindowPlugin *window { loader->resolveWindowPlugin() };
if (window)
emit newWindowPluginResolved(name, window);
}

ExtensionPluginManagerPrivate::ExtensionPluginManagerPrivate(ExtensionPluginManager *qq)
: q_ptr(qq)
{
Expand All @@ -94,6 +70,7 @@ ExtensionPluginManagerPrivate::ExtensionPluginManagerPrivate(ExtensionPluginMana
void ExtensionPluginManagerPrivate::startInitializePlugins()
{
Q_Q(ExtensionPluginManager);
qRegisterMetaType<ExtPluginLoaderPointer>("ExtPluginLoaderPointer");

ExtensionPluginInitWorker *worker { new ExtensionPluginInitWorker };
worker->moveToThread(&workerThread);
Expand All @@ -112,14 +89,17 @@ void ExtensionPluginManagerPrivate::startInitializePlugins()
workerThread.quit();
workerThread.wait();
});
connect(worker, &ExtensionPluginInitWorker::newMenuPluginResolved, this, [this](const QString &name, DFMEXT::DFMExtMenuPlugin *menu) {
menuMap.insert(name, QSharedPointer<DFMEXT::DFMExtMenuPlugin>(menu));
});
connect(worker, &ExtensionPluginInitWorker::newEmblemPluginResolved, this, [this](const QString &name, DFMEXT::DFMExtEmblemIconPlugin *emblem) {
emblemMap.insert(name, QSharedPointer<DFMEXT::DFMExtEmblemIconPlugin>(emblem));
});
connect(worker, &ExtensionPluginInitWorker::newWindowPluginResolved, this, [this](const QString &name, DFMEXT::DFMExtWindowPlugin *window) {
windowMap.insert(name, QSharedPointer<DFMEXT::DFMExtWindowPlugin>(window));
connect(worker, &ExtensionPluginInitWorker::requestInitPlugin, this, [this](ExtPluginLoaderPointer loader) {
// Some plugins construct GUI object in `initialize`,
// so must invoke `initialize` int the main thread here.
Q_ASSERT(loader);
Q_ASSERT(qApp->thread() == QThread::currentThread());
if (!loader->initialize()) {
fmWarning() << "init failed: " << loader->fileName() << loader->lastError();
return;
}
fmInfo() << "Inited extension plugin:" << loader->fileName();
doAppendExt(loader->fileName(), loader);
});

workerThread.start();
Expand Down Expand Up @@ -193,6 +173,23 @@ void ExtensionPluginManagerPrivate::restartDesktop(const QUrl &url)
}
}

void ExtensionPluginManagerPrivate::doAppendExt(const QString &name, ExtPluginLoaderPointer loader)
{
Q_ASSERT(loader);

DFMEXT::DFMExtMenuPlugin *menu { loader->resolveMenuPlugin() };
if (menu)
menuMap.insert(name, QSharedPointer<DFMEXT::DFMExtMenuPlugin>(menu));

DFMEXT::DFMExtEmblemIconPlugin *emblem { loader->resolveEmblemPlugin() };
if (emblem)
emblemMap.insert(name, QSharedPointer<DFMEXT::DFMExtEmblemIconPlugin>(emblem));

DFMEXT::DFMExtWindowPlugin *window { loader->resolveWindowPlugin() };
if (window)
windowMap.insert(name, QSharedPointer<DFMEXT::DFMExtWindowPlugin>(window));
}

ExtensionPluginManager &ExtensionPluginManager::instance()
{
static ExtensionPluginManager ins;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,13 @@ class ExtensionPluginInitWorker : public QObject
public Q_SLOTS:
void doWork(const QStringList &paths);

private:
void doAppendExt(const QString &name, ExtPluginLoaderPointer loader);

Q_SIGNALS:
void requestInitPlugin(ExtPluginLoaderPointer);

void scanPluginsFinished();
void loadPluginsFinished();
void initPluginsFinished();

void newMenuPluginResolved(const QString &name, DFMEXT::DFMExtMenuPlugin *menu);
void newEmblemPluginResolved(const QString &name, DFMEXT::DFMExtEmblemIconPlugin *emblem);
void newWindowPluginResolved(const QString &name, DFMEXT::DFMExtWindowPlugin *emblem);

private:
std::map<QString, ExtPluginLoaderPointer> allLoaders;
std::map<QString, ExtPluginLoaderPointer> loadedLoaders;
Expand All @@ -56,6 +51,7 @@ class ExtensionPluginManagerPrivate : public QObject
void startInitializePlugins();
void startMonitorPlugins();
void restartDesktop(const QUrl &url);
void doAppendExt(const QString &name, ExtPluginLoaderPointer loader);

Q_SIGNALS:
void startInitialize(const QStringList &paths);
Expand Down
Loading