diff --git a/frame/controller/dockitemmanager.cpp b/frame/controller/dockitemmanager.cpp index 825bc1c17..cafb6bf54 100644 --- a/frame/controller/dockitemmanager.cpp +++ b/frame/controller/dockitemmanager.cpp @@ -64,6 +64,7 @@ DockItemManager::DockItemManager(QObject *parent) connect(m_pluginsInter, &DockPluginsController::pluginItemRemoved, this, &DockItemManager::pluginItemRemoved, Qt::QueuedConnection); connect(m_pluginsInter, &DockPluginsController::pluginItemUpdated, this, &DockItemManager::itemUpdated, Qt::QueuedConnection); connect(m_pluginsInter, &DockPluginsController::trayVisableCountChanged, this, &DockItemManager::trayVisableCountChanged, Qt::QueuedConnection); + connect(m_pluginsInter, &DockPluginsController::pluginLoaderFinished, this, &DockItemManager::updatePluginsItemOrderKey, Qt::QueuedConnection); // 刷新图标 QMetaObject::invokeMethod(this, "refershItemsIcon", Qt::QueuedConnection); @@ -291,7 +292,6 @@ void DockItemManager::pluginItemInserted(PluginsItem *item) insertIndex ++; } - updatePluginsItemOrderKey(); emit itemInserted(insertIndex - firstPluginPosition, item); } diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index ad5011ad6..485c7f846 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -178,7 +178,7 @@ void AbstractPluginsController::positionChanged() inter->positionChanged(position); } -void AbstractPluginsController::loadPlugin(const QString &pluginFile) +void AbstractPluginsController::loadPlugin(const QString &pluginFile, bool lastone) { QPluginLoader *pluginLoader = new QPluginLoader(pluginFile); const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); @@ -238,8 +238,11 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) // NOTE(justforlxz): 插件的所有初始化工作都在init函数中进行, // loadPlugin函数是按队列执行的,initPlugin函数会有可能导致 // 函数执行被阻塞。 - QTimer::singleShot(1, this, [ = ] { + QTimer::singleShot(1, this, [ = ] { initPlugin(interface); + if (lastone) { + emit pluginLoaderFinished(); + } }); } diff --git a/frame/util/abstractpluginscontroller.h b/frame/util/abstractpluginscontroller.h index 73dd293e9..c89fd108e 100644 --- a/frame/util/abstractpluginscontroller.h +++ b/frame/util/abstractpluginscontroller.h @@ -47,6 +47,9 @@ public: const QVariant getValue(PluginsItemInterface *const itemInter, const QString &key, const QVariant& fallback = QVariant()) override; void removeValue(PluginsItemInterface * const itemInter, const QStringList &keyList) override; +signals: + void pluginLoaderFinished(); + protected: QMap> &pluginsMap(); QObject *pluginItemAt(PluginsItemInterface * const itemInter, const QString &itemKey) const; @@ -59,7 +62,7 @@ protected Q_SLOTS: private slots: void displayModeChanged(); void positionChanged(); - void loadPlugin(const QString &pluginFile); + void loadPlugin(const QString &pluginFile, bool lastone); void initPlugin(PluginsItemInterface *interface); void refreshPluginSettings(); diff --git a/frame/util/pluginloader.cpp b/frame/util/pluginloader.cpp index 3b2e90168..54031e81f 100644 --- a/frame/util/pluginloader.cpp +++ b/frame/util/pluginloader.cpp @@ -35,11 +35,14 @@ PluginLoader::PluginLoader(const QString &pluginDirPath, QObject *parent) void PluginLoader::run() { QDir pluginsDir(m_pluginDirPath); - const QStringList plugins = pluginsDir.entryList(QDir::Files); + const QStringList files = pluginsDir.entryList(QDir::Files); static const QGSettings gsetting("com.deepin.dde.dock.disableplugins", "/com/deepin/dde/dock/disableplugins/"); static const auto disable_plugins_list = gsetting.get("disable-plugins-list").toStringList(); - for (QString file : plugins) + QStringList plugins; + + // 查找可用插件 + for (QString file : files) { if (!QLibrary::isLibrary(file)) continue; @@ -52,8 +55,11 @@ void PluginLoader::run() qDebug() << "disable loading plugin:" << file; continue; } + plugins << file; + } - emit pluginFounded(pluginsDir.absoluteFilePath(file)); + for (auto plugin : plugins) { + emit pluginFounded(pluginsDir.absoluteFilePath(plugin), plugins.last() == plugin); } emit finished(); diff --git a/frame/util/pluginloader.h b/frame/util/pluginloader.h index 00d6dc945..63fc029e9 100644 --- a/frame/util/pluginloader.h +++ b/frame/util/pluginloader.h @@ -33,7 +33,7 @@ public: signals: void finished() const; - void pluginFounded(const QString &pluginFile) const; + void pluginFounded(const QString &pluginFile, bool lastone) const; protected: void run();