Merge pull request #552 from Jedi18/forward_message_feature
Forward Message
4 files changed, 138 insertions, 2 deletions
diff --git a/resources/qml/ForwardCompleter.qml b/resources/qml/ForwardCompleter.qml
new file mode 100644
index 00000000..c544378b
--- /dev/null
+++ b/resources/qml/ForwardCompleter.qml
@@ -0,0 +1,117 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import "./delegates/"
+import QtQuick 2.9
+import QtQuick.Controls 2.3
+import im.nheko 1.0
+
+Popup {
+ id: forwardMessagePopup
+
+ property var mid
+
+ function setMessageEventId(mid_in) {
+ mid = mid_in;
+ }
+
+ x: Math.round(parent.width / 2 - width / 2)
+ y: Math.round(parent.height / 2 - height / 2)
+ modal: true
+ palette: colors
+ parent: Overlay.overlay
+ width: implicitWidth >= (timelineRoot.width * 0.8) ? implicitWidth : (timelineRoot.width * 0.8)
+ height: implicitHeight + completerPopup.height + padding * 2
+ leftPadding: 10
+ rightPadding: 10
+ background: Rectangle {
+ color: colors.window
+ }
+
+ onOpened: {
+ completerPopup.open();
+ roomTextInput.forceActiveFocus();
+ }
+ onClosed: {
+ completerPopup.close();
+ }
+
+ Column {
+ id: forwardColumn
+
+ spacing: 5
+
+ Label {
+ id: titleLabel
+
+ text: qsTr("Forward Message")
+ font.bold: true
+ bottomPadding: 10
+ color: colors.text
+ }
+
+ Reply {
+ id: replyPreview
+
+ modelData: TimelineManager.timeline ? TimelineManager.timeline.getDump(mid, "") : {
+ }
+ userColor: TimelineManager.userColor(modelData.userId, colors.window)
+ }
+
+ MatrixTextField {
+ id: roomTextInput
+
+ width: forwardMessagePopup.width - forwardMessagePopup.leftPadding * 2
+ color: colors.text
+ onTextEdited: {
+ completerPopup.completer.searchString = text;
+ }
+ Keys.onPressed: {
+ if (event.key == Qt.Key_Up && completerPopup.opened) {
+ event.accepted = true;
+ completerPopup.up();
+ } else if (event.key == Qt.Key_Down && completerPopup.opened) {
+ event.accepted = true;
+ completerPopup.down();
+ } else if (event.matches(StandardKey.InsertParagraphSeparator)) {
+ completerPopup.finishCompletion();
+ event.accepted = true;
+ }
+ }
+ }
+
+ }
+
+ Completer {
+ id: completerPopup
+
+ y: titleLabel.height + replyPreview.height + roomTextInput.height + roomTextInput.bottomPadding + forwardColumn.spacing * 3
+ width: forwardMessagePopup.width - forwardMessagePopup.leftPadding * 2
+ completerName: "room"
+ fullWidth: true
+ centerRowContent: false
+ avatarHeight: 24
+ avatarWidth: 24
+ bottomToTop: false
+ closePolicy: Popup.NoAutoClose
+ }
+
+ Connections {
+ onCompletionSelected: {
+ TimelineManager.timeline.forwardMessage(messageContextMenu.eventId, id);
+ forwardMessagePopup.close();
+ }
+ onCountChanged: {
+ if (completerPopup.count > 0 && (completerPopup.currentIndex < 0 || completerPopup.currentIndex >= completerPopup.count))
+ completerPopup.currentIndex = 0;
+
+ }
+ target: completerPopup
+ }
+
+ Overlay.modal: Rectangle {
+ color: Qt.rgba(colors.window.r, colors.window.g, colors.window.b, 0.7)
+ }
+
+}
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 3cc2ab15..81ca7705 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -71,6 +71,14 @@ Page {
}
+ Component {
+ id: forwardCompleterComponent
+
+ ForwardCompleter {
+ }
+
+ }
+
Shortcut {
sequence: "Ctrl+K"
onActivated: {
@@ -126,6 +134,16 @@ Page {
}
Platform.MenuItem {
+ visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker || messageContextMenu.eventType == MtxEvent.TextMessage || messageContextMenu.eventType == MtxEvent.LocationMessage || messageContextMenu.eventType == MtxEvent.EmoteMessage || messageContextMenu.eventType == MtxEvent.NoticeMessage
+ text: qsTr("Forward")
+ onTriggered: {
+ var forwardMess = forwardCompleterComponent.createObject(timelineRoot);
+ forwardMess.setMessageEventId(messageContextMenu.eventId);
+ forwardMess.open();
+ }
+ }
+
+ Platform.MenuItem {
text: qsTr("Mark as read")
}
diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml
index f5c5c84a..858652c2 100644
--- a/resources/qml/TopBar.qml
+++ b/resources/qml/TopBar.qml
@@ -72,8 +72,8 @@ Rectangle {
font.pointSize: fontMetrics.font.pointSize * 1.1
text: room ? room.roomName : qsTr("No room selected")
maximumLineCount: 1
- elide: Text.ElideRight
- textFormat: Text.RichText
+ elide: Text.ElideRight
+ textFormat: Text.RichText
}
MatrixText {
diff --git a/resources/res.qrc b/resources/res.qrc
index 328f65ca..304493b6 100644
--- a/resources/res.qrc
+++ b/resources/res.qrc
@@ -142,6 +142,7 @@
<file>qml/TimelineRow.qml</file>
<file>qml/TopBar.qml</file>
<file>qml/QuickSwitcher.qml</file>
+ <file>qml/ForwardCompleter.qml</file>
<file>qml/TypingIndicator.qml</file>
<file>qml/RoomSettings.qml</file>
<file>qml/emoji/EmojiButton.qml</file>
|