perf(appstream): reuse metadata pool - #792
Conversation
Reviewer's GuideReuse a single AppStream::Pool instance within DesktopIntegration, expose a revision counter to QML so drag MIME bindings react to AppStream metadata changes, and adjust related methods/properties accordingly. Sequence diagram for QML drag MIME reacting to AppStream metadata changessequenceDiagram
participant Pool as AppStream_Pool
participant DesktopIntegration
participant HelperQml as Helper_qml
Pool->>DesktopIntegration: changed()
DesktopIntegration->>DesktopIntegration: ++m_dummyPackagesRevision
DesktopIntegration-->>HelperQml: dummyPackagesChanged
HelperQml->>HelperQml: generateDragMimeData(desktopId, dockOnly)
HelperQml->>DesktopIntegration: dummyPackagesRevision
DesktopIntegration-->>HelperQml: current revision
Note over HelperQml: Binding re-evaluates drag MIME data based on updated metadata
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
1. Load AppStream metadata once and reuse the pool for application queries. 2. Monitor metadata changes and notify QML drag MIME bindings. 3. Reuse the pool for compulsory and dummy package checks. Log: Avoid repeated AppStream metadata loading during launcher item creation Influence: Reduces launcher display latency. perf(appstream): 复用元数据池 1. AppStream 元数据仅加载一次,并复用数据池执行应用查询。 2. 监听元数据变化,并通知 QML 重新计算拖拽 MIME 绑定。 3. 必备应用和占位应用检查复用同一个数据池。 Log: 避免创建启动器应用项时重复加载 AppStream 元数据 PMS: TASK-393753 Influence: 降低启动器显示延迟。
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: BLumia, mhduiy The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
deepin pr auto review★ 总体评分:89分■ 【总体评价】
■ 【详细分析】
■ 【改进建议代码示例】 diff --git a/desktopintegration.h b/desktopintegration.h
--- a/desktopintegration.h
+++ b/desktopintegration.h
@@ -8,7 +8,7 @@
#include <QRect>
#include <QStandardPaths>
#include <QtQml/qqml.h>
-#include <AppStreamQt/pool.h>
+class AppStream::Pool;
class AppWiz;
class DdeDock;
@@ -87,7 +87,7 @@ private:
explicit DesktopIntegration(QObject * parent = nullptr);
QStringList m_compulsoryAppIdList;
- AppStream::Pool m_appStreamPool;
+ AppStream::Pool *m_appStreamPool = nullptr;
uint m_dummyPackagesRevision = 0;
AppWiz * m_appWizIntegration;
DdeDock * m_dockIntegration;
diff --git a/desktopintegration.cpp b/desktopintegration.cpp
--- a/desktopintegration.cpp
+++ b/desktopintegration.cpp
@@ -17,6 +17,7 @@
#include <xdgactivation.h>
+#include <AppStreamQt/pool.h>
#include "appwiz.h"
#include "ddedock.h"
#include "appearance.h"
@@ -92,7 +93,8 @@ bool DesktopIntegration::appIsCompulsoryForDesktop(const QString &desktopId)
const QString currentDE(DesktopIntegration::currentDE());
- const AppStream::ComponentBox components = m_appStreamPool.componentsByLaunchable(AppStream::Launchable::KindDesktopId, desktopId);
+ const AppStream::ComponentBox components = m_appStreamPool ? m_appStreamPool->componentsByLaunchable(AppStream::Launchable::KindDesktopId, desktopId)
+ : AppStream::ComponentBox();
for (const AppStream::Component & component : components) {
return component.compulsoryForDesktops().contains(currentDE);
}
@@ -104,7 +106,8 @@ bool DesktopIntegration::appIsCompulsoryForDesktop(const QString &desktopId)
bool DesktopIntegration::appIsDummyPackage(const QString &desktopId)
{
- const AppStream::ComponentBox components = m_appStreamPool.componentsByLaunchable(AppStream::Launchable::KindDesktopId, desktopId);
+ const AppStream::ComponentBox components = m_appStreamPool ? m_appStreamPool->componentsByLaunchable(AppStream::Launchable::KindDesktopId, desktopId)
+ : AppStream::ComponentBox();
for (const AppStream::Component & component : components) {
return component.customValue("DDE::is_dummy_package") == "true";
}
@@ -214,7 +217,7 @@ void DesktopIntegration::uninstallApp(const QString &desktopId)
DesktopIntegration::DesktopIntegration(QObject *parent)
: QObject(parent)
- , m_appStreamPool(this)
+ , m_appStreamPool(new AppStream::Pool(this))
, m_appWizIntegration(new AppWiz(this))
, m_dockIntegration(new DdeDock(this))
, m_appearanceIntegration(new Appearance(this))
@@ -222,10 +225,12 @@ DesktopIntegration::DesktopIntegration(QObject *parent)
{
qCDebug(logDesktopIntegration) << "Initializing DesktopIntegration";
- m_appStreamPool.addFlags(AppStream::Pool::FlagMonitor);
- if (!m_appStreamPool.load()) {
- qCWarning(logDesktopIntegration) << "Failed to load AppStream metadata:" << m_appStreamPool.lastError();
+ if (m_appStreamPool) {
+ m_appStreamPool->addFlags(AppStream::Pool::FlagMonitor);
+ if (!m_appStreamPool->load()) {
+ qCWarning(logDesktopIntegration) << "Failed to load AppStream metadata:" << m_appStreamPool->lastError();
+ }
}
- connect(&m_appStreamPool, &AppStream::Pool::changed, this, [this] {
+ connect(m_appStreamPool, &AppStream::Pool::changed, this, [this] {
++m_dummyPackagesRevision;
Q_EMIT dummyPackagesChanged();
}); |
|
/forcemerge |
|
This pr force merged! (status: blocked) |
Log: Avoid repeated AppStream metadata loading during launcher item creation
Influence: Reduces launcher display latency.
perf(appstream): 复用元数据池
Log: 避免创建启动器应用项时重复加载 AppStream 元数据
PMS: TASK-393753
Influence: 降低启动器显示延迟。
Summary by Sourcery
Reuse a single monitored AppStream metadata pool across desktop integration logic and surface changes to QML for drag MIME recalculation.
New Features:
Enhancements:
Documentation: