fix: 修复插件显示位置不正确的问题

部分系统服务启动较晚,导致插件加载完成时间和初始化顺序并不一致,之前会在检测到插件后把顺序写入到后端接口,但此时可能部分插件还未加载完成,导致给出的数据排序异常

Log: 修复插件显示位置不正确的问题
Bug: https://pms.uniontech.com/zentao/bug-view-61127.html
Change-Id: I37912ea5cac5ae5b8eeabe418f17d16284d29ca3
This commit is contained in:
范朋程 2021-03-09 13:29:02 +08:00
parent 4abd6be7d8
commit 8e61f9d107
6 changed files with 44 additions and 10 deletions

View File

@ -152,8 +152,15 @@ PluginsItemInterface *AbstractPluginsController::pluginInterAt(QObject *destItem
void AbstractPluginsController::startLoader(PluginLoader *loader)
{
connect(loader, &PluginLoader::finished, loader, &PluginLoader::deleteLater, Qt::QueuedConnection);
connect(loader, &PluginLoader::pluginFounded, this, [ = ](const QString &pluginFile){
QPair<QString, PluginsItemInterface *> pair;
pair.first = pluginFile;
pair.second = nullptr;
m_pluginLoadMap.insert(pair, false);
});
connect(loader, &PluginLoader::pluginFounded, this, &AbstractPluginsController::loadPlugin, Qt::QueuedConnection);
QGSettings gsetting("com.deepin.dde.dock", "/com/deepin/dde/dock/");
QTimer::singleShot(gsetting.get("delay-plugins-time").toUInt(),
@ -178,7 +185,7 @@ void AbstractPluginsController::positionChanged()
inter->positionChanged(position);
}
void AbstractPluginsController::loadPlugin(const QString &pluginFile, bool lastone)
void AbstractPluginsController::loadPlugin(const QString &pluginFile)
{
QPluginLoader *pluginLoader = new QPluginLoader(pluginFile);
const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject();
@ -219,6 +226,18 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile, bool lasto
interfaceData["pluginloader"] = pluginLoader;
m_pluginsMap.insert(interface, interfaceData);
for (auto &pair: m_pluginLoadMap.keys()) {
if (pair.first == pluginFile) {
m_pluginLoadMap.remove(pair);
QPair<QString, PluginsItemInterface *> newPair;
newPair.first = pluginFile;
newPair.second = interface;
m_pluginLoadMap.insert(newPair, false);
break;
}
}
QString dbusService = meta.value("depends-daemon-dbus-service").toString();
if (!dbusService.isEmpty() && !m_dbusDaemonInterface->isServiceRegistered(dbusService).value()) {
qDebug() << objectName() << dbusService << "daemon has not started, waiting for signal";
@ -238,11 +257,8 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile, bool lasto
// NOTE(justforlxz): 插件的所有初始化工作都在init函数中进行
// loadPlugin函数是按队列执行的initPlugin函数会有可能导致
// 函数执行被阻塞。
QTimer::singleShot(1, this, [ = ] {
QTimer::singleShot(1, this, [ = ] {
initPlugin(interface);
if (lastone) {
emit pluginLoaderFinished();
}
});
}
@ -250,6 +266,21 @@ void AbstractPluginsController::initPlugin(PluginsItemInterface *interface)
{
qDebug() << objectName() << "init plugin: " << interface->pluginName();
interface->init(this);
for (const auto &pair : m_pluginLoadMap.keys()) {
if (pair.second == interface)
m_pluginLoadMap.insert(pair, true);
}
bool loaded = true;
for (int i = 0; i < m_pluginLoadMap.keys().size(); ++i) {
if (!m_pluginLoadMap.values()[i]) {
loaded = false;
break;
}
}
if (loaded) {
emit pluginLoaderFinished();
}
qDebug() << objectName() << "init plugin finished: " << interface->pluginName();
}

View File

@ -62,7 +62,7 @@ protected Q_SLOTS:
private slots:
void displayModeChanged();
void positionChanged();
void loadPlugin(const QString &pluginFile, bool lastone);
void loadPlugin(const QString &pluginFile);
void initPlugin(PluginsItemInterface *interface);
void refreshPluginSettings();
@ -75,6 +75,9 @@ private:
QMap<PluginsItemInterface *, QMap<QString, QObject *>> m_pluginsMap;
// filepath, interface, loaded
QMap<QPair<QString, PluginsItemInterface *>, bool> m_pluginLoadMap;
QJsonObject m_pluginSettingsObject;
};

View File

@ -59,7 +59,7 @@ void PluginLoader::run()
}
for (auto plugin : plugins) {
emit pluginFounded(pluginsDir.absoluteFilePath(plugin), plugins.last() == plugin);
emit pluginFounded(pluginsDir.absoluteFilePath(plugin));
}
emit finished();

View File

@ -33,7 +33,7 @@ public:
signals:
void finished() const;
void pluginFounded(const QString &pluginFile, bool lastone) const;
void pluginFounded(const QString &pluginFile) const;
protected:
void run();

View File

@ -123,7 +123,7 @@ int BluetoothPlugin::itemSortKey(const QString &itemKey)
{
const QString key = QString("pos_%1_%2").arg(itemKey).arg(Dock::Efficient);
return m_proxyInter->getValue(this, key, 5).toInt();
return m_proxyInter->getValue(this, key, 4).toInt();
}
void BluetoothPlugin::setSortKey(const QString &itemKey, const int order)

View File

@ -167,7 +167,7 @@ int PowerPlugin::itemSortKey(const QString &itemKey)
{
const QString key = QString("pos_%1_%2").arg(itemKey).arg(Dock::Efficient);
return m_proxyInter->getValue(this, key, 4).toInt();
return m_proxyInter->getValue(this, key, 5).toInt();
}
void PowerPlugin::setSortKey(const QString &itemKey, const int order)