From 98c0febe24fae76eaf365ca3e4c6ea160a265da1 Mon Sep 17 00:00:00 2001 From: wjyrich Date: Thu, 30 Oct 2025 13:41:11 +0800 Subject: [PATCH] feat: implement trash empty state detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add isTrashEmpty() method to detect if trash is empty using gio command 2. Modify context menu to disable "Clean Trash" option when trash is empty 3. Update trash tip text generation to use new queryTrashCountAndEmpty method 4. Add property binding to dynamically enable/disable menu items based on trash state 5. Use gio trash --list command for more reliable trash content detection feat: 实现回收站空状态检测 1. 添加 isTrashEmpty() 方法使用 gio 命令检测回收站是否为空 2. 修改上下文菜单,在回收站为空时禁用"清空回收站"选项 3. 更新回收站提示文本生成以使用新的 queryTrashCountAndEmpty 方法 4. 添加属性绑定以根据回收站状态动态启用/禁用菜单项 5. 使用 gio trash --list 命令进行更可靠的回收站内容检测 PMS: BUG-335901 --- panels/dock/taskmanager/package/AppItem.qml | 5 ++++ panels/dock/taskmanager/taskmanager.cpp | 33 +++++++++++++++------ panels/dock/taskmanager/taskmanager.h | 2 ++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/panels/dock/taskmanager/package/AppItem.qml b/panels/dock/taskmanager/package/AppItem.qml index 240b9a80e..268031428 100644 --- a/panels/dock/taskmanager/package/AppItem.qml +++ b/panels/dock/taskmanager/package/AppItem.qml @@ -137,6 +137,7 @@ Item { Loader { id: contextMenuLoader active: false + property bool trashEmpty: true sourceComponent: LP.Menu { id: contextMenu Instantiator { @@ -144,6 +145,9 @@ Item { model: JSON.parse(menus) delegate: LP.MenuItem { text: modelData.name + enabled: (root.itemId === "dde-trash" && modelData.id === "clean-trash") + ? !contextMenuLoader.trashEmpty + : true onTriggered: { TaskManager.requestNewInstance(root.modelIndex, modelData.id); } @@ -319,6 +323,7 @@ Item { onClicked: function (mouse) { let index = root.modelIndex; if (mouse.button === Qt.RightButton) { + contextMenuLoader.trashEmpty = TaskManager.isTrashEmpty() contextMenuLoader.active = true MenuHelper.openMenu(contextMenuLoader.item) } else { diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index bdcd746a9..431ce4132 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -436,16 +437,30 @@ void TaskManager::saveDockElementsOrder(const QStringList &appIds) QString TaskManager::getTrashTipText() { - int fileCount = 0; - QString trashPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/Trash/files"; - QDir trashDir(trashPath); - - if (trashDir.exists()) { - QStringList entries = trashDir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); - fileCount = entries.size(); - } + const auto count = queryTrashCount(); + return tr("%1 files").arg(count); +} + +bool TaskManager::isTrashEmpty() const +{ + return queryTrashCount() == 0; +} - return tr("%1 files").arg(fileCount); +int TaskManager::queryTrashCount() const +{ + int count = 0; + + QProcess gio; + gio.start("gio", QStringList() << "trash" << "--list"); + if (gio.waitForFinished(1000) && gio.exitStatus() == QProcess::NormalExit && gio.exitCode() == 0) { + const QByteArray &out = gio.readAllStandardOutput(); + const QList lines = out.split('\n'); + for (const QByteArray &l : lines) { + if (!l.trimmed().isEmpty()) count++; + } + return count; + } + return count; } void TaskManager::modifyOpacityChanged() diff --git a/panels/dock/taskmanager/taskmanager.h b/panels/dock/taskmanager/taskmanager.h index e64ccfa9c..d4cabf9c8 100644 --- a/panels/dock/taskmanager/taskmanager.h +++ b/panels/dock/taskmanager/taskmanager.h @@ -97,6 +97,7 @@ class TaskManager : public DS_NAMESPACE::DContainment, public AbstractTaskManage Q_INVOKABLE void saveDockElementsOrder(const QStringList &appIds); Q_INVOKABLE QString getTrashTipText(); + Q_INVOKABLE bool isTrashEmpty() const; Q_SIGNALS: void dataModelChanged(); void windowSplitChanged(); @@ -114,6 +115,7 @@ private Q_SLOTS: DockGlobalElementModel *m_dockGlobalElementModel = nullptr; DockItemModel *m_itemModel = nullptr; HoverPreviewProxyModel *m_hoverPreviewModel = nullptr; + int queryTrashCount() const; }; }