summary refs log tree commit diff
path: root/resources/qml/Root.qml
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2021-05-14 15:23:32 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2021-05-14 15:23:40 +0200
commit39a43ad4abc84733b6e8a5a244f1055048ce115c (patch)
tree89110bb753926ed22959f6f992ae66c97ddb45cc /resources/qml/Root.qml
parentMove global avatarSize property (diff)
downloadnheko-39a43ad4abc84733b6e8a5a244f1055048ce115c.tar.xz
Reorganize TimelineView to prepare porting the room list
Diffstat (limited to 'resources/qml/Root.qml')
-rw-r--r--resources/qml/Root.qml260
1 files changed, 260 insertions, 0 deletions
diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
new file mode 100644
index 00000000..35b81a1f
--- /dev/null
+++ b/resources/qml/Root.qml
@@ -0,0 +1,260 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import "./delegates"
+import "./device-verification"
+import "./emoji"
+import "./voip"
+import Qt.labs.platform 1.1 as Platform
+import QtGraphicalEffects 1.0
+import QtQuick 2.9
+import QtQuick.Controls 2.13
+import QtQuick.Layouts 1.3
+import QtQuick.Window 2.2
+import im.nheko 1.0
+import im.nheko.EmojiModel 1.0
+
+Page {
+    id: timelineRoot
+
+    palette: Nheko.colors
+
+    FontMetrics {
+        id: fontMetrics
+    }
+
+    EmojiPicker {
+        id: emojiPopup
+
+        colors: palette
+        model: TimelineManager.completerFor("allemoji", "")
+    }
+
+    Component {
+        id: userProfileComponent
+
+        UserProfile {
+        }
+
+    }
+
+    Component {
+        id: roomSettingsComponent
+
+        RoomSettings {
+        }
+
+    }
+
+    Component {
+        id: mobileCallInviteDialog
+
+        CallInvite {
+        }
+
+    }
+
+    Component {
+        id: quickSwitcherComponent
+
+        QuickSwitcher {
+        }
+
+    }
+
+    Component {
+        id: forwardCompleterComponent
+
+        ForwardCompleter {
+        }
+
+    }
+
+    Shortcut {
+        sequence: "Ctrl+K"
+        onActivated: {
+            var quickSwitch = quickSwitcherComponent.createObject(timelineRoot);
+            TimelineManager.focusTimeline();
+            quickSwitch.open();
+        }
+    }
+
+    Platform.Menu {
+        id: messageContextMenu
+
+        property string eventId
+        property string link
+        property string text
+        property int eventType
+        property bool isEncrypted
+        property bool isEditable
+        property bool isSender
+
+        function show(eventId_, eventType_, isSender_, isEncrypted_, isEditable_, link_, text_, showAt_) {
+            eventId = eventId_;
+            eventType = eventType_;
+            isEncrypted = isEncrypted_;
+            isEditable = isEditable_;
+            isSender = isSender_;
+            if (text_)
+                text = text_;
+            else
+                text = "";
+            if (link_)
+                link = link_;
+            else
+                link = "";
+            if (showAt_)
+                open(showAt_);
+            else
+                open();
+        }
+
+        Platform.MenuItem {
+            visible: messageContextMenu.text
+            enabled: visible
+            text: qsTr("Copy")
+            onTriggered: Clipboard.text = messageContextMenu.text
+        }
+
+        Platform.MenuItem {
+            visible: messageContextMenu.link
+            enabled: visible
+            text: qsTr("Copy link location")
+            onTriggered: Clipboard.text = messageContextMenu.link
+        }
+
+        Platform.MenuItem {
+            id: reactionOption
+
+            visible: TimelineManager.timeline ? TimelineManager.timeline.permissions.canSend(MtxEvent.Reaction) : false
+            text: qsTr("React")
+            onTriggered: emojiPopup.show(null, function(emoji) {
+                TimelineManager.queueReactionMessage(messageContextMenu.eventId, emoji);
+            })
+        }
+
+        Platform.MenuItem {
+            visible: TimelineManager.timeline ? TimelineManager.timeline.permissions.canSend(MtxEvent.TextMessage) : false
+            text: qsTr("Reply")
+            onTriggered: TimelineManager.timeline.replyAction(messageContextMenu.eventId)
+        }
+
+        Platform.MenuItem {
+            visible: messageContextMenu.isEditable && (TimelineManager.timeline ? TimelineManager.timeline.permissions.canSend(MtxEvent.TextMessage) : false)
+            enabled: visible
+            text: qsTr("Edit")
+            onTriggered: TimelineManager.timeline.editAction(messageContextMenu.eventId)
+        }
+
+        Platform.MenuItem {
+            text: qsTr("Read receipts")
+            onTriggered: TimelineManager.timeline.readReceiptsAction(messageContextMenu.eventId)
+        }
+
+        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")
+        }
+
+        Platform.MenuItem {
+            text: qsTr("View raw message")
+            onTriggered: TimelineManager.timeline.viewRawMessage(messageContextMenu.eventId)
+        }
+
+        Platform.MenuItem {
+            // TODO(Nico): Fix this still being iterated over, when using keyboard to select options
+            visible: messageContextMenu.isEncrypted
+            enabled: visible
+            text: qsTr("View decrypted raw message")
+            onTriggered: TimelineManager.timeline.viewDecryptedRawMessage(messageContextMenu.eventId)
+        }
+
+        Platform.MenuItem {
+            visible: (TimelineManager.timeline ? TimelineManager.timeline.permissions.canRedact() : false) || messageContextMenu.isSender
+            text: qsTr("Remove message")
+            onTriggered: TimelineManager.timeline.redactEvent(messageContextMenu.eventId)
+        }
+
+        Platform.MenuItem {
+            visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker
+            enabled: visible
+            text: qsTr("Save as")
+            onTriggered: TimelineManager.timeline.saveMedia(messageContextMenu.eventId)
+        }
+
+        Platform.MenuItem {
+            visible: messageContextMenu.eventType == MtxEvent.ImageMessage || messageContextMenu.eventType == MtxEvent.VideoMessage || messageContextMenu.eventType == MtxEvent.AudioMessage || messageContextMenu.eventType == MtxEvent.FileMessage || messageContextMenu.eventType == MtxEvent.Sticker
+            enabled: visible
+            text: qsTr("Open in external program")
+            onTriggered: TimelineManager.timeline.openMedia(messageContextMenu.eventId)
+        }
+
+        Platform.MenuItem {
+            visible: messageContextMenu.eventId
+            enabled: visible
+            text: qsTr("Copy link to event")
+            onTriggered: TimelineManager.timeline.copyLinkToEvent(messageContextMenu.eventId)
+        }
+
+    }
+
+    Component {
+        id: deviceVerificationDialog
+
+        DeviceVerification {
+        }
+
+    }
+
+    Connections {
+        target: TimelineManager
+        onNewDeviceVerificationRequest: {
+            var dialog = deviceVerificationDialog.createObject(timelineRoot, {
+                "flow": flow
+            });
+            dialog.show();
+        }
+        onOpenProfile: {
+            var userProfile = userProfileComponent.createObject(timelineRoot, {
+                "profile": profile
+            });
+            userProfile.show();
+        }
+    }
+
+    Connections {
+        target: TimelineManager.timeline
+        onOpenRoomSettingsDialog: {
+            var roomSettings = roomSettingsComponent.createObject(timelineRoot, {
+                "roomSettings": settings
+            });
+            roomSettings.show();
+        }
+    }
+
+    Connections {
+        target: CallManager
+        onNewInviteState: {
+            if (CallManager.haveCallInvite && Settings.mobileMode) {
+                var dialog = mobileCallInviteDialog.createObject(msgView);
+                dialog.open();
+            }
+        }
+    }
+
+    ChatPage {
+        anchors.fill: parent
+    }
+
+}