Clicking on an activity list item for a file opens the local file if available
authorClaudio Cambra <claudio.cambra@gmail.com>
Mon, 18 Jul 2022 12:33:55 +0000 (14:33 +0200)
committerClaudio Cambra <claudio.cambra@gmail.com>
Tue, 2 Aug 2022 15:43:18 +0000 (17:43 +0200)
Signed-off-by: Claudio Cambra <claudio.cambra@gmail.com>
src/gui/tray/ActivityList.qml
src/gui/tray/Window.qml
src/gui/tray/activitydata.cpp
src/gui/tray/activitydata.h
src/gui/tray/activitylistmodel.cpp
src/gui/tray/activitylistmodel.h

index acfb1bbdc74919d2a74ee71957c23e97e3f161d6..f3a6416c2afe644d3e639346906316baf04a5008 100644 (file)
@@ -9,7 +9,7 @@ ScrollView {
 
     property bool isFileActivityList: false
 
-    signal showFileActivity(string objectName, int objectId)
+    signal openFile(string filePath)
     signal activityItemClicked(int index)
 
     contentWidth: availableWidth
@@ -38,8 +38,8 @@ ScrollView {
             width: activityList.contentWidth
             flickable: activityList
             onClicked: {
-                if (model.isCurrentUserFileActivity) {
-                    showFileActivity(model.objectName, model.objectId)
+                if (model.isCurrentUserFileActivity && model.openablePath) {
+                    openFile("file://" + model.openablePath);
                 } else {
                     activityItemClicked(model.index)
                 }
index 7d4041f330558513bbd98f658330caa359477447..34873a4d0813c6d9d2f4c65b458cb2f86e271669 100644 (file)
@@ -798,9 +798,7 @@ Window {
 \r
             activeFocusOnTab: true\r
             model: activityModel\r
-            onShowFileActivity: {\r
-                openFileActivityDialog(objectName, objectId)\r
-            }\r
+            onOpenFile: Qt.openUrlExternally(filePath);\r
             onActivityItemClicked: {\r
                 model.slotTriggerDefaultAction(index)\r
             }\r
index 1b8bfc34f2900b99734b6d9d5b56f00ee9895440..0875ee4635a2e4ea20c63b1512fb85b285c19276 100644 (file)
@@ -65,6 +65,7 @@ OCC::Activity Activity::fromActivityJson(const QJsonObject &json, const AccountP
     activity._dateTime = QDateTime::fromString(json.value(QStringLiteral("datetime")).toString(), Qt::ISODate);
     activity._icon = json.value(QStringLiteral("icon")).toString();
     activity._isCurrentUserFileActivity = activity._objectType == QStringLiteral("files") && activityUser == account->davUser();
+    activity._isMultiObjectActivity = json.value("objects").toObject().count() > 1;
 
     auto richSubjectData = json.value(QStringLiteral("subject_rich")).toArray();
 
index 944e1f6175562a6738c2f4ba93038578c282270c..9371fd736c7d110c5f4e42dabfcb4d2392b98a81 100644 (file)
@@ -102,6 +102,7 @@ public:
     static Activity fromActivityJson(const QJsonObject &json, const AccountPtr account);
 
     static QString relativeServerFileTypeIconPath(const QMimeType &mimeType);
+    static QString localFilePathForActivity(const Activity &activity, const AccountPtr account);
 
     struct RichSubjectParameter {
         QString type;    // Required
@@ -133,6 +134,7 @@ public:
     QString _folder;
     QString _file;
     QString _renamedFile;
+    bool _isMultiObjectActivity;
     QUrl _link;
     QDateTime _dateTime;
     qint64 _expireAtMsecs = -1;
index f0c6673c639a1bb920510679f2ac56d9b9e583e4..905ebcf4214d0266b0fb5e18d645ca2a6cf04c1b 100644 (file)
@@ -59,6 +59,7 @@ QHash<int, QByteArray> ActivityListModel::roleNames() const
     auto roles = QAbstractListModel::roleNames();
     roles[DisplayPathRole] = "displayPath";
     roles[PathRole] = "path";
+    roles[OpenablePathRole] = "openablePath";
     roles[DisplayLocationRole] = "displayLocation";
     roles[LinkRole] = "link";
     roles[MessageRole] = "message";
@@ -77,6 +78,7 @@ QHash<int, QByteArray> ActivityListModel::roleNames() const
     roles[DisplayActions] = "displayActions";
     roles[ShareableRole] = "isShareable";
     roles[IsCurrentUserFileActivityRole] = "isCurrentUserFileActivity";
+    roles[IsCurrentUserFileActivityRole] = "isCurrentUserFileActivity";
     roles[ThumbnailRole] = "thumbnail";
     roles[TalkNotificationConversationTokenRole] = "conversationToken";
     roles[TalkNotificationMessageIdRole] = "messageId";
@@ -263,6 +265,8 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
         return getDisplayPath();
     case PathRole:
         return QFileInfo(getFilePath()).path();
+    case OpenablePathRole:
+        return a._isMultiObjectActivity ? QFileInfo(getFilePath()).canonicalPath() : QFileInfo(getFilePath()).canonicalFilePath();
     case DisplayLocationRole:
         return displayLocation();
     case ActionsLinksRole: {
index 8ea3a49a17e4ae9411c77b287a46ef17e2839838..482e804834b4ad6516a38bcac555894e8f007b99 100644 (file)
@@ -60,6 +60,7 @@ public:
         MessageRole,
         DisplayPathRole,
         PathRole,
+        OpenablePathRole,
         DisplayLocationRole, // Provides the display path to a file's parent folder, relative to Nextcloud root
         LinkRole,
         PointInTimeRole,