diff --git a/src/dde-control-center/pluginmanager.cpp b/src/dde-control-center/pluginmanager.cpp index ee413901f5..9eb1defdfa 100644 --- a/src/dde-control-center/pluginmanager.cpp +++ b/src/dde-control-center/pluginmanager.cpp @@ -174,10 +174,12 @@ PluginManager::PluginManager(DccManager *parent) , m_rootModule(nullptr) , m_threadPool(nullptr) , m_isDeleting(false) + , m_modulePhaseFinished(false) { qRegisterMetaType("PluginData"); connect(this, &PluginManager::pluginEndStatusChanged, this, &PluginManager::loadPlugin); connect(this, &PluginManager::updatePluginStatus, this, &PluginManager::onUpdatePluginStatus); + connect(this, &PluginManager::modulePhaseFinished, this, &PluginManager::onModulePhaseFinished); connect(m_manager, &DccManager::hideModuleChanged, this, &PluginManager::onHideModuleChanged); } @@ -322,6 +324,18 @@ bool PluginManager::preparePluginFactory(PluginData *plugin) return true; } +bool PluginManager::allModulesFinished() const +{ + for (auto &&plugin : m_plugins) { + uint status = plugin->status; + bool moduleFinished = (status & ModuleEnd) || (status & ModuleErr) || (status & PluginEnd); + if (!moduleFinished) { + return false; + } + } + return !m_plugins.isEmpty(); +} + QThreadPool *PluginManager::threadPool() { if (!m_threadPool) { @@ -346,16 +360,12 @@ void PluginManager::loadPlugin(PluginData *plugin) } else if ((plugin->status & (DataEnd | MainObjLoad)) == DataEnd) { loadMain(plugin); } else if ((plugin->status & (ModuleEnd | DataBegin)) == ModuleEnd) { - if (plugin->module) { - disconnect(plugin->module, nullptr, this, nullptr); - if (plugin->module->isVisibleToApp()) { - threadPool()->start(new LoadPluginTask(plugin, this)); - } else { - connect(plugin->module, &DccObject::visibleToAppChanged, this, &PluginManager::onVisibleToAppChanged); - Q_EMIT updatePluginStatus(plugin, PluginEnd, QString()); - } - } else { - threadPool()->start(new LoadPluginTask(plugin, this)); + if (!m_modulePhaseFinished && allModulesFinished()) { + Q_EMIT modulePhaseFinished(); + return; + } + if (m_modulePhaseFinished) { + loadPluginData(plugin); } } else if ((plugin->status & (MetaDataEnd | ModuleLoad)) == MetaDataEnd) { if (!preparePluginFactory(plugin)) { @@ -448,6 +458,24 @@ void PluginManager::loadModule(PluginData *plugin) } } +void PluginManager::loadPluginData(PluginData *plugin) +{ + if (isDeleting()) { + return; + } + if (plugin->module) { + disconnect(plugin->module, nullptr, this, nullptr); + if (plugin->module->isVisibleToApp()) { + threadPool()->start(new LoadPluginTask(plugin, this)); + } else { + connect(plugin->module, &DccObject::visibleToAppChanged, this, &PluginManager::onVisibleToAppChanged); + Q_EMIT updatePluginStatus(plugin, PluginEnd, QString()); + } + } else { + threadPool()->start(new LoadPluginTask(plugin, this)); + } +} + void PluginManager::loadMain(PluginData *plugin) { if (isDeleting()) { @@ -591,6 +619,19 @@ void PluginManager::mainLoading() createMain(component); } +void PluginManager::onModulePhaseFinished() +{ + if (isDeleting()) { + return; + } + m_modulePhaseFinished = true; + for (auto &&plugin : m_plugins) { + if (plugin->status & ModuleEnd) { + loadPlugin(plugin); + } + } +} + void PluginManager::onHideModuleChanged(const QSet &hideModule) { for (auto &&plugin : m_plugins) { diff --git a/src/dde-control-center/pluginmanager.h b/src/dde-control-center/pluginmanager.h index 391829903f..bfb7ff07ff 100644 --- a/src/dde-control-center/pluginmanager.h +++ b/src/dde-control-center/pluginmanager.h @@ -34,6 +34,7 @@ public Q_SLOTS: Q_SIGNALS: void addObject(DccObject *obj); void loadAllFinished(); + void modulePhaseFinished(); void pluginEndStatusChanged(PluginData *plugin); void updatePluginStatus(PluginData *plugin, uint status, const QString &log); @@ -42,12 +43,14 @@ public Q_SLOTS: bool compareVersion(const QString &targetVersion, const QString &baseVersion); bool updatePluginType(PluginData *plugin); bool preparePluginFactory(PluginData *plugin); + bool allModulesFinished() const; QThreadPool *threadPool(); private Q_SLOTS: void loadPlugin(PluginData *plugin); void loadMetaData(PluginData *plugin); void loadModule(PluginData *plugin); + void loadPluginData(PluginData *plugin); void loadMain(PluginData *plugin); void createModule(QQmlComponent *component); void createMain(QQmlComponent *component); @@ -56,6 +59,7 @@ private Q_SLOTS: void moduleLoading(); void mainLoading(); + void onModulePhaseFinished(); void onHideModuleChanged(const QSet &hideModule); void onVisibleToAppChanged(bool visibleToApp); void onUpdatePluginStatus(PluginData *plugin, uint status, const QString &log); @@ -66,6 +70,7 @@ private Q_SLOTS: DccObject *m_rootModule; // root module from MainWindow QThreadPool *m_threadPool; bool m_isDeleting; + bool m_modulePhaseFinished; QQmlEngine *m_engine; };