Skip to content
Snippets Groups Projects
RoomSettings.qml 8.05 KiB
Newer Older
Nicolas Werner's avatar
Nicolas Werner committed
// SPDX-FileCopyrightText: 2021 Nheko Contributors
Nicolas Werner's avatar
Nicolas Werner committed
// SPDX-License-Identifier: GPL-3.0-or-later

Nicolas Werner's avatar
Nicolas Werner committed
import Qt.labs.platform 1.1 as Platform
Jedi18's avatar
Jedi18 committed
import QtQuick 2.9
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.3
import im.nheko 1.0

ApplicationWindow {
    id: roomSettingsDialog
Jedi18's avatar
Jedi18 committed

    property var roomSettings

    x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
Jedi18's avatar
Jedi18 committed
    y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
Jedi18's avatar
Jedi18 committed
    minimumHeight: 650
    palette: Nheko.colors
    color: Nheko.colors.window
    flags: Qt.Dialog
    title: qsTr("Room Settings")
Jedi18's avatar
Jedi18 committed

    Shortcut {
        sequence: StandardKey.Cancel
        onActivated: roomSettingsDialog.close()
    }

    ColumnLayout {
Jedi18's avatar
Jedi18 committed
        id: contentLayout1
Jedi18's avatar
Jedi18 committed

Jedi18's avatar
Jedi18 committed
        anchors.fill: parent
Jedi18's avatar
Jedi18 committed
        anchors.margins: 10
        spacing: 10

        Avatar {
Jedi18's avatar
Jedi18 committed
            url: roomSettings.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
            displayName: roomSettings.roomName
Jedi18's avatar
Jedi18 committed
            height: 130
            width: 130
            Layout.alignment: Qt.AlignHCenter
Jedi18's avatar
Jedi18 committed
            onClicked: {
                if (roomSettings.canChangeAvatar)
                    roomSettings.updateAvatar();

Jedi18's avatar
Jedi18 committed
            Layout.alignment: Qt.AlignHCenter
            visible: roomSettings.isLoading
            foreground: Nheko.colors.mid
            running: roomSettings.isLoading
Jedi18's avatar
Jedi18 committed
        }

        Text {
            id: errorText
Jedi18's avatar
Jedi18 committed
            color: "red"
            visible: opacity > 0
            opacity: 0
            Layout.alignment: Qt.AlignHCenter
        }

        SequentialAnimation {
            id: hideErrorAnimation
Jedi18's avatar
Jedi18 committed
            running: false
Jedi18's avatar
Jedi18 committed
            PauseAnimation {
                duration: 4000
            }
Jedi18's avatar
Jedi18 committed
            NumberAnimation {
                target: errorText
                property: 'opacity'
                to: 0
                duration: 1000
            }
Jedi18's avatar
Jedi18 committed
            target: roomSettings
            onDisplayError: {
                errorText.text = errorMessage;
                errorText.opacity = 1;
                hideErrorAnimation.restart();
Jedi18's avatar
Jedi18 committed
            }
Jedi18's avatar
Jedi18 committed
        }

        ColumnLayout {
            Layout.alignment: Qt.AlignHCenter

            MatrixText {
Jedi18's avatar
Jedi18 committed
                text: roomSettings.roomName
Loren Burkholder's avatar
Loren Burkholder committed
                font.pixelSize: fontMetrics.font.pixelSize * 2
Jedi18's avatar
Jedi18 committed
                Layout.alignment: Qt.AlignHCenter
            }

            MatrixText {
                text: qsTr("%1 member(s)").arg(roomSettings.memberCount)
Jedi18's avatar
Jedi18 committed
                Layout.alignment: Qt.AlignHCenter
            }
Jedi18's avatar
Jedi18 committed
        }

        ImageButton {
            Layout.alignment: Qt.AlignHCenter
            image: ":/icons/icons/ui/edit.png"
            visible: roomSettings.canChangeNameAndTopic
            onClicked: roomSettings.openEditModal()
Jedi18's avatar
Jedi18 committed
        }
Jedi18's avatar
Jedi18 committed

Jedi18's avatar
Jedi18 committed
        ScrollView {
            Layout.fillHeight: true
Jedi18's avatar
Jedi18 committed
            Layout.alignment: Qt.AlignHCenter
            Layout.fillWidth: true
            Layout.leftMargin: Nheko.paddingLarge
            Layout.rightMargin: Nheko.paddingLarge
Jedi18's avatar
Jedi18 committed

Jedi18's avatar
Jedi18 committed
            TextArea {
                text: TimelineManager.escapeEmoji(roomSettings.roomTopic)
Nicolas Werner's avatar
Nicolas Werner committed
                wrapMode: TextEdit.WordWrap
                textFormat: TextEdit.RichText
Jedi18's avatar
Jedi18 committed
                readOnly: true
                background: null
                color: Nheko.colors.text
Nicolas Werner's avatar
Nicolas Werner committed
                horizontalAlignment: TextEdit.AlignHCenter
                onLinkActivated: Nheko.openLink(link)
Nicolas Werner's avatar
Nicolas Werner committed
                CursorShape {
                    anchors.fill: parent
                    cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
                }
Jedi18's avatar
Jedi18 committed
            }
Jedi18's avatar
Jedi18 committed
        }
Jedi18's avatar
Jedi18 committed

Jedi18's avatar
Jedi18 committed

            MatrixText {
                text: qsTr("SETTINGS")
Jedi18's avatar
Jedi18 committed
            }

            Item {
                Layout.fillWidth: true
            }

                text: qsTr("Notifications")
Jedi18's avatar
Jedi18 committed
            ComboBox {
                model: [qsTr("Muted"), qsTr("Mentions only"), qsTr("All messages")]
                currentIndex: roomSettings.notifications
                onActivated: {
                    roomSettings.changeNotifications(index);
Jedi18's avatar
Jedi18 committed
            }

            MatrixText {
                text: "Room access"
Jedi18's avatar
Jedi18 committed
            }

            ComboBox {
                enabled: roomSettings.canChangeJoinRules
                model: [qsTr("Anyone and guests"), qsTr("Anyone"), qsTr("Invited users")]
                currentIndex: roomSettings.accessJoinRules
                onActivated: {
                    roomSettings.changeAccessRules(index);
Jedi18's avatar
Jedi18 committed
            }

            MatrixText {
                text: qsTr("Encryption")
Jedi18's avatar
Jedi18 committed
            ToggleButton {
                id: encryptionToggle

                checked: roomSettings.isEncryptionEnabled
Jedi18's avatar
Jedi18 committed
                onClicked: {
                    if (roomSettings.isEncryptionEnabled) {
                        checked = true;
                        return ;
                    }
                    confirmEncryptionDialog.open();
                }
                id: confirmEncryptionDialog
                title: qsTr("End-to-End Encryption")
                text: qsTr("Encryption is currently experimental and things might break unexpectedly. <br>
                            Please take note that it can't be disabled afterwards.")
                    if (roomSettings.isEncryptionEnabled)
                        return ;

                    roomSettings.enableEncryption();
                }
                onRejected: {
                    encryptionToggle.checked = false;
                buttons: Dialog.Ok | Dialog.Cancel
Jedi18's avatar
Jedi18 committed
            }
Jedi18's avatar
Jedi18 committed
            MatrixText {
                visible: roomSettings.isEncryptionEnabled
                text: qsTr("Respond to key requests")
Jedi18's avatar
Jedi18 committed
            ToggleButton {
                visible: roomSettings.isEncryptionEnabled
                ToolTip.text: qsTr("Whether or not the client should respond automatically with the session keys
                                upon request. Use with caution, this is a temporary measure to test the
                                E2E implementation until device verification is completed.")
                checked: roomSettings.respondsToKeyRequests
Jedi18's avatar
Jedi18 committed
                onClicked: {
                    roomSettings.changeKeyRequestsPreference(checked);
            Item {
                // for adding extra space between sections
                Layout.fillWidth: true
            }

            Item {
                // for adding extra space between sections
                Layout.fillWidth: true
            }

Jedi18's avatar
Jedi18 committed
            MatrixText {
                text: qsTr("INFO")
Jedi18's avatar
Jedi18 committed
            }

            Item {
                Layout.fillWidth: true
            }

                text: qsTr("Internal ID")
Jedi18's avatar
Jedi18 committed
            MatrixText {
Jedi18's avatar
Jedi18 committed
                text: roomSettings.roomId
Loren Burkholder's avatar
Loren Burkholder committed
                font.pixelSize: fontMetrics.font.pixelSize * 1.2
Jedi18's avatar
Jedi18 committed
            }

            MatrixText {
                text: qsTr("Room Version")
Jedi18's avatar
Jedi18 committed
            }

            MatrixText {
Jedi18's avatar
Jedi18 committed
                text: roomSettings.roomVersion
Loren Burkholder's avatar
Loren Burkholder committed
                font.pixelSize: fontMetrics.font.pixelSize * 1.2
Jedi18's avatar
Jedi18 committed
            }
        DialogButtonBox {
            Layout.fillWidth: true
            standardButtons: DialogButtonBox.Ok
            onAccepted: close()
Jedi18's avatar
Jedi18 committed
        }
Jedi18's avatar
Jedi18 committed
    }