From b3e6cd3eb0ff01b7e38e782a8d5617b37da09ab7 Mon Sep 17 00:00:00 2001 From: brkgbr <17569128+brkgbr@users.noreply.github.com> Date: Mon, 22 Dec 2025 09:46:32 +0100 Subject: [PATCH 1/3] feat: Added a right click option to activity items to allow file observation features Signed-off-by: brkgbr <17569128+brkgbr@users.noreply.github.com> --- src/gui/tray/ActivityList.qml | 53 +++++++++++++++++++++++++++--- src/gui/tray/MainWindow.qml | 5 ++- src/gui/tray/activitylistmodel.cpp | 16 +++++++++ src/gui/tray/activitylistmodel.h | 1 + 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/gui/tray/ActivityList.qml b/src/gui/tray/ActivityList.qml index e2e43c3492707..d2a0e488df783 100644 --- a/src/gui/tray/ActivityList.qml +++ b/src/gui/tray/ActivityList.qml @@ -26,6 +26,7 @@ ScrollView { } signal openFile(string filePath) + signal showInFileManager(int index) signal activityItemClicked(int index) contentWidth: availableWidth @@ -51,6 +52,14 @@ ScrollView { ListView { id: activityList + function openFileOrLink(index) { + if (model.isCurrentUserFileActivity && model.openablePath) { + openFile("file://" + model.openablePath); + } else { + activityItemClicked(index); + } + } + Accessible.role: Accessible.List Accessible.name: qsTr("Activity list") @@ -117,11 +126,25 @@ ScrollView { forceActiveFocus(); } - onClicked: { - if (model.isCurrentUserFileActivity && model.openablePath) { - openFile("file://" + model.openablePath); - } else { - activityItemClicked(model.activityIndex) + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: (mouse)=> { + switch (mouse.button) { + case Qt.LeftButton: + activityList.openFileOrLink(activityList.currentIndex) + break; + case Qt.RightButton: + // We only want to allow the context menu for actual files + if (model.showFileDetails) { + contextMenu.x = mouse.x; + contextMenu.y = mouse.y; + contextMenu.selectedItem = activityList.currentIndex + contextMenu.open(); + } + break; + } } } } @@ -148,6 +171,26 @@ ScrollView { visible: !controlRoot.atYBeginning && controlRoot.contentHeight > controlRoot.height } + Menu { + id: contextMenu + property int selectedItem + + MenuItem { + text: qsTr("Open local file") + onTriggered: { + activityList.currentIndex = contextMenu.selectedItem + activityList.openFileOrLink(contextMenu.selectedItem); + } + } + MenuItem { + text: qsTr("Show in file manager") + onTriggered: { + activityList.currentIndex = contextMenu.selectedItem + showInFileManager(contextMenu.selectedItem); + } + } + } + Column { id: placeholderColumn width: parent.width * 0.8 diff --git a/src/gui/tray/MainWindow.qml b/src/gui/tray/MainWindow.qml index c70bdf34ac5bf..f0f46fe2dee08 100644 --- a/src/gui/tray/MainWindow.qml +++ b/src/gui/tray/MainWindow.qml @@ -486,9 +486,8 @@ ApplicationWindow { activeFocusOnTab: true model: activityModel onOpenFile: Qt.openUrlExternally(filePath); - onActivityItemClicked: { - model.slotTriggerDefaultAction(index) - } + onShowInFileManager: index => model.slotTriggerShowInFileManager(index) + onActivityItemClicked: index => model.slotTriggerDefaultAction(index) Connections { target: activityModel function onInteractiveActivityReceived() { diff --git a/src/gui/tray/activitylistmodel.cpp b/src/gui/tray/activitylistmodel.cpp index 674aee5a7247d..463e95df8a58e 100644 --- a/src/gui/tray/activitylistmodel.cpp +++ b/src/gui/tray/activitylistmodel.cpp @@ -17,6 +17,8 @@ #include "caseclashfilenamedialog.h" #include "activitydata.h" #include "systray.h" +#include "openfilemanager.h" +#include "filesystem.h" #include #include @@ -862,6 +864,20 @@ void ActivityListModel::slotTriggerDismiss(const int activityIndex) emit sendNotificationRequest(activity._accName, Utility::concatUrlPath(accountState()->account()->url(), "ocs/v2.php/apps/notifications/api/v2/notifications/" + QString::number(activity._id)).toString(), deleteVerb, activityIndex); } +void ActivityListModel::slotTriggerShowInFileManager(const int activityIndex) +{ + if (activityIndex < 0 || activityIndex >= _finalList.size()) { + qCWarning(lcActivity) << "Couldn't trigger show in file manager at index" << activityIndex << "/ final list size:" << _finalList.size(); + return; + } + + const auto modelIndex = index(activityIndex); + const auto path = data(modelIndex, PathRole).toString(); + if (FileSystem::fileExists(path)) { + showInFileManager(path); + } +} + AccountState *ActivityListModel::accountState() const { return _accountState; diff --git a/src/gui/tray/activitylistmodel.h b/src/gui/tray/activitylistmodel.h index d200baa6ed669..e46249f40cb75 100644 --- a/src/gui/tray/activitylistmodel.h +++ b/src/gui/tray/activitylistmodel.h @@ -120,6 +120,7 @@ public slots: void slotTriggerDefaultAction(const int activityIndex); void slotTriggerAction(const int activityIndex, const int actionIndex); void slotTriggerDismiss(const int activityIndex); + void slotTriggerShowInFileManager(const int activityIndex); void addNotificationToActivityList(const OCC::Activity &activity); void addErrorToActivityList(const OCC::Activity &activity, const OCC::ActivityListModel::ErrorType type); From 9c5fbe6d4ede309e5d9c8a284412473cc5673ea1 Mon Sep 17 00:00:00 2001 From: brkgbr <17569128+brkgbr@users.noreply.github.com> Date: Tue, 17 Mar 2026 16:32:10 +0100 Subject: [PATCH 2/3] Revert "feat: Added a right click option to activity items to allow file observation features" This reverts commit b3e6cd3eb0ff01b7e38e782a8d5617b37da09ab7. Signed-off-by: brkgbr <17569128+brkgbr@users.noreply.github.com> --- src/gui/tray/ActivityList.qml | 53 +++--------------------------- src/gui/tray/MainWindow.qml | 5 +-- src/gui/tray/activitylistmodel.cpp | 16 --------- src/gui/tray/activitylistmodel.h | 1 - 4 files changed, 8 insertions(+), 67 deletions(-) diff --git a/src/gui/tray/ActivityList.qml b/src/gui/tray/ActivityList.qml index d2a0e488df783..e2e43c3492707 100644 --- a/src/gui/tray/ActivityList.qml +++ b/src/gui/tray/ActivityList.qml @@ -26,7 +26,6 @@ ScrollView { } signal openFile(string filePath) - signal showInFileManager(int index) signal activityItemClicked(int index) contentWidth: availableWidth @@ -52,14 +51,6 @@ ScrollView { ListView { id: activityList - function openFileOrLink(index) { - if (model.isCurrentUserFileActivity && model.openablePath) { - openFile("file://" + model.openablePath); - } else { - activityItemClicked(index); - } - } - Accessible.role: Accessible.List Accessible.name: qsTr("Activity list") @@ -126,25 +117,11 @@ ScrollView { forceActiveFocus(); } - - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton - onClicked: (mouse)=> { - switch (mouse.button) { - case Qt.LeftButton: - activityList.openFileOrLink(activityList.currentIndex) - break; - case Qt.RightButton: - // We only want to allow the context menu for actual files - if (model.showFileDetails) { - contextMenu.x = mouse.x; - contextMenu.y = mouse.y; - contextMenu.selectedItem = activityList.currentIndex - contextMenu.open(); - } - break; - } + onClicked: { + if (model.isCurrentUserFileActivity && model.openablePath) { + openFile("file://" + model.openablePath); + } else { + activityItemClicked(model.activityIndex) } } } @@ -171,26 +148,6 @@ ScrollView { visible: !controlRoot.atYBeginning && controlRoot.contentHeight > controlRoot.height } - Menu { - id: contextMenu - property int selectedItem - - MenuItem { - text: qsTr("Open local file") - onTriggered: { - activityList.currentIndex = contextMenu.selectedItem - activityList.openFileOrLink(contextMenu.selectedItem); - } - } - MenuItem { - text: qsTr("Show in file manager") - onTriggered: { - activityList.currentIndex = contextMenu.selectedItem - showInFileManager(contextMenu.selectedItem); - } - } - } - Column { id: placeholderColumn width: parent.width * 0.8 diff --git a/src/gui/tray/MainWindow.qml b/src/gui/tray/MainWindow.qml index f0f46fe2dee08..c70bdf34ac5bf 100644 --- a/src/gui/tray/MainWindow.qml +++ b/src/gui/tray/MainWindow.qml @@ -486,8 +486,9 @@ ApplicationWindow { activeFocusOnTab: true model: activityModel onOpenFile: Qt.openUrlExternally(filePath); - onShowInFileManager: index => model.slotTriggerShowInFileManager(index) - onActivityItemClicked: index => model.slotTriggerDefaultAction(index) + onActivityItemClicked: { + model.slotTriggerDefaultAction(index) + } Connections { target: activityModel function onInteractiveActivityReceived() { diff --git a/src/gui/tray/activitylistmodel.cpp b/src/gui/tray/activitylistmodel.cpp index b4a855e82e792..45f319b5e1931 100644 --- a/src/gui/tray/activitylistmodel.cpp +++ b/src/gui/tray/activitylistmodel.cpp @@ -17,8 +17,6 @@ #include "caseclashfilenamedialog.h" #include "activitydata.h" #include "systray.h" -#include "openfilemanager.h" -#include "filesystem.h" #include "common/utility.h" #include @@ -865,20 +863,6 @@ void ActivityListModel::slotTriggerDismiss(const int activityIndex) emit sendNotificationRequest(activity._accName, Utility::concatUrlPath(accountState()->account()->url(), "ocs/v2.php/apps/notifications/api/v2/notifications/" + QString::number(activity._id)).toString(), deleteVerb, activityIndex); } -void ActivityListModel::slotTriggerShowInFileManager(const int activityIndex) -{ - if (activityIndex < 0 || activityIndex >= _finalList.size()) { - qCWarning(lcActivity) << "Couldn't trigger show in file manager at index" << activityIndex << "/ final list size:" << _finalList.size(); - return; - } - - const auto modelIndex = index(activityIndex); - const auto path = data(modelIndex, PathRole).toString(); - if (FileSystem::fileExists(path)) { - showInFileManager(path); - } -} - AccountState *ActivityListModel::accountState() const { return _accountState; diff --git a/src/gui/tray/activitylistmodel.h b/src/gui/tray/activitylistmodel.h index e46249f40cb75..d200baa6ed669 100644 --- a/src/gui/tray/activitylistmodel.h +++ b/src/gui/tray/activitylistmodel.h @@ -120,7 +120,6 @@ public slots: void slotTriggerDefaultAction(const int activityIndex); void slotTriggerAction(const int activityIndex, const int actionIndex); void slotTriggerDismiss(const int activityIndex); - void slotTriggerShowInFileManager(const int activityIndex); void addNotificationToActivityList(const OCC::Activity &activity); void addErrorToActivityList(const OCC::Activity &activity, const OCC::ActivityListModel::ErrorType type); From 034403c60cebdab39aa4e3048f0df62d59cdf19a Mon Sep 17 00:00:00 2001 From: brkgbr <17569128+brkgbr@users.noreply.github.com> Date: Tue, 17 Mar 2026 16:37:16 +0100 Subject: [PATCH 3/3] feat: Added Show in file manager to FileDetailsPage Signed-off-by: brkgbr <17569128+brkgbr@users.noreply.github.com> --- src/gui/filedetails/FileDetailsPage.qml | 8 ++++++++ src/gui/filedetails/filedetails.cpp | 9 +++++++++ src/gui/filedetails/filedetails.h | 1 + 3 files changed, 18 insertions(+) diff --git a/src/gui/filedetails/FileDetailsPage.qml b/src/gui/filedetails/FileDetailsPage.qml index c061eff726883..0e0602ea52d62 100644 --- a/src/gui/filedetails/FileDetailsPage.qml +++ b/src/gui/filedetails/FileDetailsPage.qml @@ -229,6 +229,14 @@ Page { onClicked: swipeView.currentIndex = shareViewLoader.swipeIndex visible: root.fileDetails.sharingAvailable } + + NCTabButton { + width: visible ? implicitWidth : 0 + height: visible ? implicitHeight : 0 + svgCustomColorSource: "image://svgimage-custom-color/files.svg" + text: qsTr("Show in file manager") + onClicked: root.fileDetails.showInFileManager() + } } } diff --git a/src/gui/filedetails/filedetails.cpp b/src/gui/filedetails/filedetails.cpp index eff3aff78b31b..7cfbb96b4b582 100644 --- a/src/gui/filedetails/filedetails.cpp +++ b/src/gui/filedetails/filedetails.cpp @@ -7,7 +7,9 @@ #include "accountstate.h" #include "filedetails.h" +#include "filesystem.h" #include "folderman.h" +#include "openfilemanager.h" namespace OCC { @@ -91,6 +93,13 @@ void FileDetails::setLocalPath(const QString &localPath) Q_EMIT fileChanged(); } +void FileDetails::showInFileManager() const +{ + if (FileSystem::fileExists(_localPath)) { + OCC::showInFileManager(_localPath); + } +} + QString FileDetails::name() const { return _fileInfo.fileName(); diff --git a/src/gui/filedetails/filedetails.h b/src/gui/filedetails/filedetails.h index af115735ce19b..6c02b3f319555 100644 --- a/src/gui/filedetails/filedetails.h +++ b/src/gui/filedetails/filedetails.h @@ -46,6 +46,7 @@ class FileDetails : public QObject public slots: void setLocalPath(const QString &localPath); + void showInFileManager() const; signals: void localPathChanged();