Skip to content
Snippets Groups Projects
RoomSettings.qml 9.29 KiB
Newer Older
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 ".."
import "../ui"
Nicolas Werner's avatar
Nicolas Werner committed
import Qt.labs.platform 1.1 as Platform
Jedi18's avatar
Jedi18 committed
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.13
Jedi18's avatar
Jedi18 committed
import im.nheko 1.0

ApplicationWindow {
    id: roomSettingsDialog
Jedi18's avatar
Jedi18 committed

    property var roomSettings

    minimumWidth: 340
    minimumHeight: 340
    palette: Nheko.colors
    color: Nheko.colors.window
    flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
    title: qsTr("Room Settings")
Jedi18's avatar
Jedi18 committed

    Shortcut {
        sequence: StandardKey.Cancel
        onActivated: roomSettingsDialog.close()
    }
    ScrollHelper {
        flickable: flickable
        anchors.fill: flickable
    }
    Flickable {
        id: flickable
        boundsBehavior: Flickable.StopAtBounds
        anchors.fill: parent
        clip: true
        flickableDirection: Flickable.VerticalFlick
        contentWidth: contentLayout1.width
        contentHeight: contentLayout1.height
Jedi18's avatar
Jedi18 committed
    ColumnLayout {
Jedi18's avatar
Jedi18 committed
        id: contentLayout1
        width: flickable.width
        spacing: Nheko.paddingMedium
Jedi18's avatar
Jedi18 committed

        Avatar {
            Layout.topMargin: Nheko.paddingMedium
Jedi18's avatar
Jedi18 committed
            url: roomSettings.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
Joe Donofry's avatar
Joe Donofry committed
            roomid: roomSettings.roomId
            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
            wrapMode: Text.Wrap // somehow still doesn't wrap
Jedi18's avatar
Jedi18 committed
        }

        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
            function onDisplayError(errorMessage) {
                errorText.text = errorMessage;
                errorText.opacity = 1;
                hideErrorAnimation.restart();
Jedi18's avatar
Jedi18 committed
        }
Jedi18's avatar
Jedi18 committed
                text: roomSettings.roomName
                Layout.alignment: Qt.AlignHCenter
Loren Burkholder's avatar
Loren Burkholder committed
                font.pixelSize: fontMetrics.font.pixelSize * 2
                Layout.fillWidth: true
                horizontalAlignment: TextEdit.AlignHCenter
                text: qsTr("%n member(s)", "", roomSettings.memberCount)
Jedi18's avatar
Jedi18 committed
                Layout.alignment: Qt.AlignHCenter
                    onSingleTapped: TimelineManager.openRoomMembers(Rooms.getRoomById(roomSettings.roomId))
                }

                CursorShape {
                    cursorShape: Qt.PointingHandCursor
                    anchors.fill: parent
                }

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

            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

                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

            rowSpacing: Nheko.paddingMedium
            Layout.margins: Nheko.paddingMedium
Jedi18's avatar
Jedi18 committed

                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);
                text: qsTr("Room access")
Jedi18's avatar
Jedi18 committed
            }

            ComboBox {
                enabled: roomSettings.canChangeJoinRules
                model: {
                    let opts = [qsTr("Anyone and guests"), qsTr("Anyone"), qsTr("Invited users")];
                    if (roomSettings.supportsKnocking)
                        opts.push(qsTr("By knocking"));

                    if (roomSettings.supportsRestricted)
                        opts.push(qsTr("Restricted by membership in other rooms"));

                    return opts;
                }
                currentIndex: roomSettings.accessJoinRules
                onActivated: {
                    roomSettings.changeAccessRules(index);
                text: qsTr("Encryption")
Jedi18's avatar
Jedi18 committed
            ToggleButton {
                id: encryptionToggle

                checked: roomSettings.isEncryptionEnabled
                onCheckedChanged: {
                    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.")
                modality: Qt.NonModal
                    if (roomSettings.isEncryptionEnabled)
                        return ;

                    roomSettings.enableEncryption();
                }
                onRejected: {
                    encryptionToggle.checked = false;
                buttons: Platform.MessageDialog.Ok | Platform.MessageDialog.Cancel
Jedi18's avatar
Jedi18 committed
            }
                text: qsTr("Sticker & Emote Settings")
            }

            Button {
                text: qsTr("Change")
                ToolTip.text: qsTr("Change what packs are enabled, remove packs or create new ones")
                onClicked: TimelineManager.openImagePackSettings(roomSettings.roomId)
                Layout.alignment: Qt.AlignRight
            }

                text: qsTr("Hidden events")
            }

            HiddenEventsDialog {
                id: hiddenEventsDialog
                roomid: roomSettings.roomId
                roomName: roomSettings.roomName
            }

            Button {
                text: qsTr("Configure")
                ToolTip.text: qsTr("Select events to hide in this room")
                onClicked: hiddenEventsDialog.show()
                Layout.alignment: Qt.AlignRight
            }

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

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

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

            Item {
                Layout.fillWidth: true
            }

                text: qsTr("Internal ID")
Jedi18's avatar
Jedi18 committed
                text: roomSettings.roomId
                font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 0.8)
                text: qsTr("Room Version")
Jedi18's avatar
Jedi18 committed
                text: roomSettings.roomVersion
                font.pixelSize: fontMetrics.font.pixelSize
Jedi18's avatar
Jedi18 committed
            }
Jedi18's avatar
Jedi18 committed
        }
    }
    }
    footer: DialogButtonBox {
        standardButtons: DialogButtonBox.Ok
        onAccepted: close()
Jedi18's avatar
Jedi18 committed
    }