diff options
author | Matthieu Gallien <matthieu_gallien@yahoo.fr> | 2022-03-28 18:59:50 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-28 18:59:50 +0300 |
commit | ca63851ebe964590939140cc9c0dfa5ec0b6941c (patch) | |
tree | 71a022354e438071b4cbb75f2925ab19afee834b | |
parent | c450c1f6a5277f8a71bf826e84e84250801c5311 (diff) | |
parent | 7cc2486d79711ebd47ff1c2f35ed659619462abe (diff) |
Merge pull request #4385 from nextcloud/bugfix/talk-reply
Improve talk reply
-rw-r--r-- | src/gui/tray/ActivityItem.qml | 3 | ||||
-rw-r--r-- | src/gui/tray/ActivityItemContent.qml | 3 | ||||
-rw-r--r-- | src/gui/tray/TalkReplyTextField.qml | 8 | ||||
-rw-r--r-- | src/gui/tray/activitydata.h | 2 | ||||
-rw-r--r-- | src/gui/tray/activitylistmodel.cpp | 46 | ||||
-rw-r--r-- | src/gui/tray/activitylistmodel.h | 12 | ||||
-rw-r--r-- | src/gui/tray/usermodel.cpp | 6 | ||||
-rw-r--r-- | src/gui/tray/usermodel.h | 6 |
8 files changed, 67 insertions, 19 deletions
diff --git a/src/gui/tray/ActivityItem.qml b/src/gui/tray/ActivityItem.qml index b9bc78b26..46c353f94 100644 --- a/src/gui/tray/ActivityItem.qml +++ b/src/gui/tray/ActivityItem.qml @@ -73,13 +73,12 @@ MouseArea { ActivityItemActions { id: activityActions - visible: !root.isFileActivityList && model.linksForActionButtons.length > 0 + visible: !root.isFileActivityList && model.linksForActionButtons.length > 0 && !model.displayReplyOption Layout.preferredHeight: Style.trayWindowHeaderHeight * 0.85 Layout.fillWidth: true Layout.leftMargin: 40 Layout.bottomMargin: model.links.length > 1 ? 5 : 0 - Layout.topMargin: isTalkReplyPossible? 48 : 0 displayActions: model.displayActions objectType: model.objectType diff --git a/src/gui/tray/ActivityItemContent.qml b/src/gui/tray/ActivityItemContent.qml index 4d779a524..f18244e56 100644 --- a/src/gui/tray/ActivityItemContent.qml +++ b/src/gui/tray/ActivityItemContent.qml @@ -133,7 +133,8 @@ RowLayout { Loader { id: talkReplyTextFieldLoader - active: isChatActivity && isTalkReplyPossible + active: isChatActivity && isTalkReplyPossible && model.displayReplyOption + visible: model.displayReplyOption anchors.top: activityTextDateTime.bottom anchors.topMargin: 10 diff --git a/src/gui/tray/TalkReplyTextField.qml b/src/gui/tray/TalkReplyTextField.qml index e59c22cec..610e28af1 100644 --- a/src/gui/tray/TalkReplyTextField.qml +++ b/src/gui/tray/TalkReplyTextField.qml @@ -12,16 +12,15 @@ Item { return; } - UserModel.currentUser.sendReplyMessage(model.conversationToken, replyMessageTextField.text, model.messageId); - replyMessageSent.text = replyMessageTextField.text; - replyMessageTextField.clear(); + UserModel.currentUser.sendReplyMessage(model.index, model.conversationToken, replyMessageTextField.text, model.messageId); } Text { id: replyMessageSent + text: model.messageSent font.pixelSize: Style.topLinePixelSize color: Style.menuBorder - visible: replyMessageSent.text !== "" + visible: model.messageSent !== "" } TextField { @@ -43,6 +42,7 @@ Item { radius: 24 border.width: 1 border.color: Style.ncBlue + color: Style.backgroundColor } Button { diff --git a/src/gui/tray/activitydata.h b/src/gui/tray/activitydata.h index bd7b49ffc..166832f4f 100644 --- a/src/gui/tray/activitydata.h +++ b/src/gui/tray/activitydata.h @@ -112,6 +112,8 @@ public: struct TalkNotificationData { QString conversationToken; QString messageId; + QString messageSent; + bool displayReplyOption = false; }; Type _type; diff --git a/src/gui/tray/activitylistmodel.cpp b/src/gui/tray/activitylistmodel.cpp index ff50ae0d0..a34c2464b 100644 --- a/src/gui/tray/activitylistmodel.cpp +++ b/src/gui/tray/activitylistmodel.cpp @@ -77,8 +77,10 @@ QHash<int, QByteArray> ActivityListModel::roleNames() const roles[ShareableRole] = "isShareable"; roles[IsCurrentUserFileActivityRole] = "isCurrentUserFileActivity"; roles[ThumbnailRole] = "thumbnail"; - roles[TalkConversationTokenRole] = "conversationToken"; - roles[TalkMessageIdRole] = "messageId"; + roles[TalkNotificationConversationTokenRole] = "conversationToken"; + roles[TalkNotificationMessageIdRole] = "messageId"; + roles[TalkNotificationMessageSentRole] = "messageSent"; + roles[TalkNotificationDisplayReplyOptionRole] = "displayReplyOption"; return roles; } @@ -325,10 +327,14 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const const auto preview = a._previews[0]; return(generatePreviewMap(preview)); } - case TalkConversationTokenRole: + case TalkNotificationConversationTokenRole: return a._talkNotificationData.conversationToken; - case TalkMessageIdRole: + case TalkNotificationMessageIdRole: return a._talkNotificationData.messageId; + case TalkNotificationMessageSentRole: + return replyMessageSent(a); + case TalkNotificationDisplayReplyOptionRole: + return displayReplyOption(a); default: return QVariant(); } @@ -608,6 +614,12 @@ void ActivityListModel::slotTriggerAction(const int activityIndex, const int act const auto action = activity._links[actionIndex]; + // TODO this will change with https://github.com/nextcloud/desktop/issues/4159 + if (action._verb == "WEB" && action._label == tr("View chat")) { + setDisplayReplyOption(activityIndex); + return; + } + if (action._verb == "WEB") { Utility::openBrowser(QUrl(action._link)); return; @@ -808,5 +820,31 @@ void ActivityListModel::slotRemoveAccount() _showMoreActivitiesAvailableEntry = false; } +void ActivityListModel::setReplyMessageSent(const int activityIndex, const QString &message) +{ + if (activityIndex < 0 || activityIndex >= _finalList.size()) { + qCWarning(lcActivity) << "Couldn't trigger action on activity at index" << activityIndex << "/ final list size:" << _finalList.size(); + return; + } + + _finalList[activityIndex]._talkNotificationData.messageSent = message; + + emit dataChanged(index(activityIndex, 0), index(activityIndex, 0), {ActivityListModel::TalkNotificationMessageSentRole}); } +QString ActivityListModel::replyMessageSent(const Activity &activity) const +{ + return activity._talkNotificationData.messageSent; +} + +void ActivityListModel::setDisplayReplyOption(const int activityIndex) +{ + _finalList[activityIndex]._talkNotificationData.displayReplyOption = true; + emit dataChanged(index(activityIndex, 0), index(activityIndex, 0), {ActivityListModel::TalkNotificationDisplayReplyOptionRole}); +} + +bool ActivityListModel::displayReplyOption(const Activity &activity) const +{ + return activity._talkNotificationData.displayReplyOption; +} +} diff --git a/src/gui/tray/activitylistmodel.h b/src/gui/tray/activitylistmodel.h index ee6959f60..c0698a9e6 100644 --- a/src/gui/tray/activitylistmodel.h +++ b/src/gui/tray/activitylistmodel.h @@ -68,8 +68,10 @@ public: ShareableRole, IsCurrentUserFileActivityRole, ThumbnailRole, - TalkConversationTokenRole, - TalkMessageIdRole, + TalkNotificationConversationTokenRole, + TalkNotificationMessageIdRole, + TalkNotificationMessageSentRole, + TalkNotificationDisplayReplyOptionRole, }; Q_ENUM(DataRole) @@ -104,6 +106,10 @@ public: void setCurrentItem(const int currentItem); + void setReplyMessageSent(const int activityIndex, const QString &message); + QString replyMessageSent(const Activity &activity) const; + bool displayReplyOption(const Activity &activity) const; + public slots: void slotRefreshActivity(); void slotRemoveAccount(); @@ -143,6 +149,8 @@ private: void ingestActivities(const QJsonArray &activities); + void setDisplayReplyOption(const int activityIndex); + ActivityList _activityLists; ActivityList _syncFileItemLists; ActivityList _notificationLists; diff --git a/src/gui/tray/usermodel.cpp b/src/gui/tray/usermodel.cpp index 1298fc627..16d3c8263 100644 --- a/src/gui/tray/usermodel.cpp +++ b/src/gui/tray/usermodel.cpp @@ -793,10 +793,13 @@ void User::removeAccount() const AccountManager::instance()->save(); } -void User::slotSendReplyMessage(const QString &token, const QString &message, const QString &replyTo) +void User::slotSendReplyMessage(const int activityIndex, const QString &token, const QString &message, const QString &replyTo) { QPointer<TalkReply> talkReply = new TalkReply(_account.data(), this); talkReply->sendReplyMessage(token, message, replyTo); + connect(talkReply, &TalkReply::replyMessageSent, this, [&](const QString &message) { + _activityModel->setReplyMessageSent(activityIndex, message); + }); } /*-------------------------------------------------------------------------------------*/ @@ -1230,5 +1233,4 @@ QHash<int, QByteArray> UserAppsModel::roleNames() const roles[IconUrlRole] = "appIconUrl"; return roles; } - } diff --git a/src/gui/tray/usermodel.h b/src/gui/tray/usermodel.h index 2f1fdc74d..81036f940 100644 --- a/src/gui/tray/usermodel.h +++ b/src/gui/tray/usermodel.h @@ -87,7 +87,7 @@ signals: void headerColorChanged(); void headerTextColorChanged(); void accentColorChanged(); - void sendReplyMessage(const QString &token, const QString &message, const QString &replyTo); + void sendReplyMessage(const int activityIndex, const QString &conversationToken, const QString &message, const QString &replyTo); public slots: void slotItemCompleted(const QString &folder, const SyncFileItemPtr &item); @@ -107,7 +107,7 @@ public slots: void slotRefreshImmediately(); void setNotificationRefreshInterval(std::chrono::milliseconds interval); void slotRebuildNavigationAppList(); - void slotSendReplyMessage(const QString &conversationToken, const QString &message, const QString &replyTo); + void slotSendReplyMessage(const int activityIndex, const QString &conversationToken, const QString &message, const QString &replyTo); private: void slotPushNotificationsReady(); @@ -142,7 +142,6 @@ private: // number of currently running notification requests. If non zero, // no query for notifications is started. int _notificationRequestsRunning; - QString textSentStr; }; class UserModel : public QAbstractListModel @@ -255,6 +254,5 @@ private: AccountAppList _apps; }; - } #endif // USERMODEL_H |