mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
fix: 修复插件显示位置不正确的问题
部分系统服务启动较晚,导致插件加载完成时间和初始化顺序并不一致,之前会在检测到插件后把顺序写入到后端接口,但此时可能部分插件还未加载完成,导致给出的数据排序异常 Log: 修复插件显示位置不正确的问题 Bug: https://pms.uniontech.com/zentao/bug-view-61127.html Change-Id: I37912ea5cac5ae5b8eeabe418f17d16284d29ca3
This commit is contained in:
parent
4abd6be7d8
commit
8e61f9d107
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user