Skip to content
Snippets Groups Projects
TimelineView.qml 7.28 KiB
Newer Older
  • Learn to ignore specific revisions
  • Nicolas Werner's avatar
    Nicolas Werner committed
    // SPDX-FileCopyrightText: 2021 Nheko Contributors
    
    // SPDX-FileCopyrightText: 2022 Nheko Contributors
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    // SPDX-License-Identifier: GPL-3.0-or-later
    
    
    import "./components"
    
    import "./delegates"
    import "./device-verification"
    import "./emoji"
    
    Joe Donofry's avatar
    Joe Donofry committed
    import "./ui"
    
    import "./voip"
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    import Qt.labs.platform 1.1 as Platform
    
    import QtQuick.Controls 2.5
    
    import QtQuick.Layouts 1.3
    
    import QtQuick.Window 2.13
    
    import im.nheko.EmojiModel 1.0
    
        property var room: null
    
        property var roomPreview: null
    
        property bool showBackButton: false
    
            visible: !room && !TimelineManager.isInitialSync && (!roomPreview || !roomPreview.roomid)
    
            anchors.centerIn: parent
            text: qsTr("No room open")
            font.pointSize: 24
            color: Nheko.colors.text
    
    Joe Donofry's avatar
    Joe Donofry committed
        Spinner {
    
            visible: TimelineManager.isInitialSync
    
            foreground: Nheko.colors.mid
    
            running: TimelineManager.isInitialSync
    
    Joe Donofry's avatar
    Joe Donofry committed
            // height is somewhat arbitrary here... don't set width because width scales w/ height
            height: parent.height / 16
    
        ColumnLayout {
            id: timelineLayout
    
            visible: room != null && !room.isSpace
            enabled: visible
    
            anchors.fill: parent
    
                showBackButton: timelineView.showBackButton
    
            Rectangle {
                Layout.fillWidth: true
                height: 1
    
                z: 3
    
                color: Nheko.theme.separator
    
    Joe Donofry's avatar
    Joe Donofry committed
    
    
                Layout.fillWidth: true
                Layout.fillHeight: true
                color: Nheko.colors.base
    
                ColumnLayout {
                    anchors.fill: parent
                    spacing: 0
    
                    StackLayout {
                        id: stackLayout
    
                            function onRoomChanged() {
    
                                stackLayout.currentIndex = 0;
    
                            target: timelineView
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                        MessageView {
                            implicitHeight: msgView.height - typingIndicator.height
                            Layout.fillWidth: true
                        }
    
                        Loader {
                            source: CallManager.isOnCall && CallManager.callType != CallType.VOICE ? "voip/VideoCall.qml" : ""
                            onLoaded: TimelineManager.setVideoCallItem()
    
    trilene's avatar
    trilene committed
                        }
    
                    TypingIndicator {
                        id: typingIndicator
                    }
    
            CallInviteBar {
                id: callInviteBar
    
            ActiveCallBar {
                Layout.fillWidth: true
                z: 3
            }
    
            Rectangle {
                Layout.fillWidth: true
                z: 3
                height: 1
    
                color: Nheko.theme.separator
    
        ColumnLayout {
    
            property string roomId: room ? room.roomId : (roomPreview ? roomPreview.roomid : "")
    
            property string roomName: room ? room.roomName : (roomPreview ? roomPreview.roomName : "")
            property string roomTopic: room ? room.roomTopic : (roomPreview ? roomPreview.roomTopic : "")
            property string avatarUrl: room ? room.roomAvatarUrl : (roomPreview ? roomPreview.roomAvatarUrl : "")
    
            visible: room != null && room.isSpace || roomPreview != null
    
            enabled: visible
            anchors.fill: parent
            anchors.margins: Nheko.paddingLarge
            spacing: Nheko.paddingLarge
    
    
            Item {
                Layout.fillHeight: true
            }
    
    
            Avatar {
    
                url: parent.avatarUrl.replace("mxc://", "image://MxcImage/")
    
                roomid: parent.roomId
    
                displayName: parent.roomName
    
                height: 130
                width: 130
                Layout.alignment: Qt.AlignHCenter
                enabled: false
            }
    
    Loren Burkholder's avatar
    Loren Burkholder committed
    
    
            MatrixText {
    
                text: parent.roomName == "" ? qsTr("No preview available") : parent.roomName
    
                font.pixelSize: 24
                Layout.alignment: Qt.AlignHCenter
            }
    
            MatrixText {
    
                visible: !!room
    
                text: qsTr("%1 member(s)").arg(room ? room.roomMemberCount : 0)
                Layout.alignment: Qt.AlignHCenter
            }
    
            ScrollView {
                Layout.alignment: Qt.AlignHCenter
    
                Layout.fillWidth: true
                Layout.leftMargin: Nheko.paddingLarge
                Layout.rightMargin: Nheko.paddingLarge
    
    
                TextArea {
    
                    text: TimelineManager.escapeEmoji(preview.roomTopic)
    
                    wrapMode: TextEdit.WordWrap
                    textFormat: TextEdit.RichText
                    readOnly: true
                    background: null
                    selectByMouse: true
                    color: Nheko.colors.text
                    horizontalAlignment: TextEdit.AlignHCenter
                    onLinkActivated: Nheko.openLink(link)
    
                    CursorShape {
                        anchors.fill: parent
                        cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
                    }
    
                }
    
            }
    
    
            FlatButton {
                visible: roomPreview && !roomPreview.isInvite
                Layout.alignment: Qt.AlignHCenter
                text: qsTr("join the conversation")
                onClicked: Rooms.joinPreview(roomPreview.roomid)
            }
    
            FlatButton {
                visible: roomPreview && roomPreview.isInvite
                Layout.alignment: Qt.AlignHCenter
                text: qsTr("accept invite")
                onClicked: Rooms.acceptInvite(roomPreview.roomid)
            }
    
            FlatButton {
                visible: roomPreview && roomPreview.isInvite
                Layout.alignment: Qt.AlignHCenter
                text: qsTr("decline invite")
                onClicked: Rooms.declineInvite(roomPreview.roomid)
            }
    
            Item {
                visible: room != null
                Layout.preferredHeight: Math.ceil(fontMetrics.lineSpacing * 2)
            }
    
    
            Item {
                Layout.fillHeight: true
            }
    
        }
    
    
        ImageButton {
            id: backToRoomsButton
    
            anchors.top: parent.top
            anchors.left: parent.left
            anchors.margins: Nheko.paddingMedium
            width: Nheko.avatarSize
            height: Nheko.avatarSize
    
            visible: (room == null || room.isSpace) && showBackButton
    
            image: ":/icons/icons/ui/angle-arrow-left.svg"
    
            ToolTip.visible: hovered
            ToolTip.text: qsTr("Back to room list")
            onClicked: Rooms.resetCurrentRoom()
        }
    
    
            anchors.fill: parent
    
            roomid: room ? room.roomId : ""
    
        Connections {
            function onOpenReadReceiptsDialog(rr) {
                var dialog = readReceiptsDialog.createObject(timelineRoot, {
                    "readReceipts": rr,
                    "room": room
                });
                dialog.show();
            }
    
    
            function onShowRawMessageDialog(rawMessage) {
                var dialog = rawMessageDialog.createObject(timelineRoot, {
                    "rawMessage": rawMessage
                });
                dialog.show();
            }