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