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; }; }