Skip to content
Snippets Groups Projects
RoomSettings.qml 12.9 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

Malte E's avatar
Malte E committed
    minimumHeight: 450
    width: 450
    height: 680
    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
Malte E's avatar
Malte E committed
        contentWidth: roomSettingsDialog.width
        contentHeight: contentLayout1.height
Malte E's avatar
Malte E committed
        ColumnLayout {
            id: contentLayout1
Malte E's avatar
Malte E committed
            width: parent.width
Malte E's avatar
Malte E committed
            spacing: Nheko.paddingMedium

            Avatar {
                Layout.topMargin: Nheko.paddingMedium
                url: roomSettings.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
                roomid: roomSettings.roomId
                displayName: roomSettings.roomName
                height: 130
                width: 130
                Layout.alignment: Qt.AlignHCenter
                onClicked: {
                    if (roomSettings.canChangeAvatar)
                        roomSettings.updateAvatar();
Malte E's avatar
Malte E committed
                }
Malte E's avatar
Malte E committed
            Spinner {
                Layout.alignment: Qt.AlignHCenter
                visible: roomSettings.isLoading
                foreground: Nheko.colors.mid
                running: roomSettings.isLoading
            }
Malte E's avatar
Malte E committed
            Text {
                id: errorText
Malte E's avatar
Malte E committed
                color: "red"
                visible: opacity > 0
                opacity: 0
                Layout.alignment: Qt.AlignHCenter
                wrapMode: Text.Wrap // somehow still doesn't wrap
Malte E's avatar
Malte E committed
                Layout.fillWidth: true
Malte E's avatar
Malte E committed
            }
Malte E's avatar
Malte E committed
            SequentialAnimation {
                id: hideErrorAnimation
Malte E's avatar
Malte E committed
                running: false
Malte E's avatar
Malte E committed
                PauseAnimation {
                    duration: 4000
                }
Malte E's avatar
Malte E committed
                NumberAnimation {
                    target: errorText
                    property: 'opacity'
                    to: 0
                    duration: 1000
                }
Malte E's avatar
Malte E committed

            Connections {
                target: roomSettings
                function onDisplayError(errorMessage) {
                    errorText.text = errorMessage;
                    errorText.opacity = 1;
                    hideErrorAnimation.restart();
                }
Jedi18's avatar
Jedi18 committed
            }
Malte E's avatar
Malte E committed
                Label {
                    text: roomSettings.roomName
                    Layout.alignment: Qt.AlignHCenter
                    font.pixelSize: fontMetrics.font.pixelSize * 2
                    Layout.fillWidth: true
                    horizontalAlignment: TextEdit.AlignHCenter
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("%n member(s)", "", roomSettings.memberCount)
                    Layout.alignment: Qt.AlignHCenter
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                    TapHandler {
                        onSingleTapped: TimelineManager.openRoomMembers(Rooms.getRoomById(roomSettings.roomId))
                    }

                    CursorShape {
                        cursorShape: Qt.PointingHandCursor
                        anchors.fill: parent
                    }
Malte E's avatar
Malte E committed
            ImageButton {
                Layout.alignment: Qt.AlignHCenter
                image: ":/icons/icons/ui/edit.svg"
                visible: roomSettings.canChangeNameAndTopic
                onClicked: roomSettings.openEditModal()
Jedi18's avatar
Jedi18 committed
            }
Malte E's avatar
Malte E committed
            TextArea {
Malte E's avatar
Malte E committed
                id: roomTopic
                property bool cut: implicitHeight > 100
                property bool showMore
                clip: true
                height: cut && !showMore? 100 : undefined
Malte E's avatar
Malte E committed
                Layout.preferredHeight: height
Malte E's avatar
Malte E 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
Malte E's avatar
Malte E committed
                selectByMouse: !Settings.mobileMode
                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
                }
Malte E's avatar
Malte E committed
            }
Malte E's avatar
Malte E committed
            Item {
                Layout.alignment: Qt.AlignHCenter
                id: showMorePlaceholder
                Layout.preferredHeight: showMoreButton.height
                Layout.preferredWidth: showMoreButton.width
                visible: roomTopic.cut
            }
            property point showMorePos: mapToGlobal(showMorePlaceholder.x,showMorePlaceholder.y)
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
            GridLayout {
                columns: 2
                rowSpacing: Nheko.paddingMedium
                Layout.margins: Nheko.paddingMedium
Malte E's avatar
Malte E committed
                Layout.fillWidth: true
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("SETTINGS")
                    font.bold: true
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                Item {
                    Layout.fillWidth: true
                }
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("Notifications")
                    Layout.fillWidth: true
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Malte E's avatar
Malte E committed
                ComboBox {
                    model: [qsTr("Muted"), qsTr("Mentions only"), qsTr("All messages")]
                    currentIndex: roomSettings.notifications
                    onActivated: {
                        roomSettings.changeNotifications(index);
                    }
                    Layout.fillWidth: true
Malte E's avatar
Malte E committed
                    WheelHandler{} // suppress scrolling changing values
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("Room access")
                    Layout.fillWidth: true
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E 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"));
Malte E's avatar
Malte E committed
                        if (roomSettings.supportsRestricted)
                            opts.push(qsTr("Restricted by membership in other rooms"));
Malte E's avatar
Malte E committed
                        return opts;
                    }
                    currentIndex: roomSettings.accessJoinRules
                    onActivated: {
                        roomSettings.changeAccessRules(index);
                    }
                    Layout.fillWidth: true
Malte E's avatar
Malte E committed
                    WheelHandler{} // suppress scrolling changing values
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("Encryption")
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                ToggleButton {
                    id: encryptionToggle
Malte E's avatar
Malte E committed
                    checked: roomSettings.isEncryptionEnabled
                    onCheckedChanged: {
                        if (roomSettings.isEncryptionEnabled) {
                            checked = true;
                            return ;
                        }
                        confirmEncryptionDialog.open();
Malte E's avatar
Malte E committed
                    Layout.alignment: Qt.AlignRight
Malte E's avatar
Malte E committed
                Platform.MessageDialog {
                    id: confirmEncryptionDialog
Malte E's avatar
Malte E committed
                    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
                    onAccepted: {
                        if (roomSettings.isEncryptionEnabled)
                            return ;
Malte E's avatar
Malte E committed
                        roomSettings.enableEncryption();
                    }
                    onRejected: {
                        encryptionToggle.checked = false;
                    }
                    buttons: Platform.MessageDialog.Ok | Platform.MessageDialog.Cancel
Malte E's avatar
Malte E committed

                Label {
                    text: qsTr("Sticker & Emote Settings")
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                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
                }
Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("Hidden events")
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Malte E's avatar
Malte E committed
                HiddenEventsDialog {
                    id: hiddenEventsDialog
                    roomid: roomSettings.roomId
                    roomName: roomSettings.roomName
                }
Malte E's avatar
Malte E committed
                Button {
                    text: qsTr("Configure")
                    ToolTip.text: qsTr("Select events to hide in this room")
                    onClicked: hiddenEventsDialog.show()
                    Layout.alignment: Qt.AlignRight
                }
Malte E's avatar
Malte E committed
                Item {
                    // for adding extra space between sections
                    Layout.fillWidth: true
                }
Malte E's avatar
Malte E committed
                Item {
                    // for adding extra space between sections
                    Layout.fillWidth: true
                }
Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("INFO")
                    font.bold: true
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Malte E's avatar
Malte E committed
                Item {
                    Layout.fillWidth: true
                }
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("Internal ID")
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Jedi18's avatar
Jedi18 committed

                AbstractButton { // AbstractButton does not allow setting text color
Malte E's avatar
Malte E committed
                    Layout.alignment: Qt.AlignRight
Malte E's avatar
Malte E committed
                    Layout.fillWidth: true
                    Layout.preferredHeight: idLabel.height
                    Label { // TextEdit does not trigger onClicked
                        id: idLabel
                        text: roomSettings.roomId
                        font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 0.8)
                        color: Nheko.colors.text
                        width: parent.width
                        wrapMode: Text.WrapAnywhere
                        ToolTip.text: qsTr("Copied to clipboard")
                        ToolTip.visible: toolTipTimer.running
                    }
                    TextEdit{ // label does not allow selection
                        id: textEdit
                        visible: false
                        text: roomSettings.roomId
                    }
                    onClicked: {
                        textEdit.selectAll()
                        textEdit.copy()
                        toolTipTimer.start()
                    }
                    Timer {
                        id: toolTipTimer
                    }
Malte E's avatar
Malte E committed
                }
Malte E's avatar
Malte E committed
                Label {
                    text: qsTr("Room Version")
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Jedi18's avatar
Jedi18 committed

Malte E's avatar
Malte E committed
                Label {
                    text: roomSettings.roomVersion
                    font.pixelSize: fontMetrics.font.pixelSize
                    Layout.alignment: Qt.AlignRight
                    color: Nheko.colors.text
Malte E's avatar
Malte E committed
                }
Malte E's avatar
Malte E committed
    Button {
        id: showMoreButton
        x: contentLayout1.showMorePos.x
        y: Math.min(contentLayout1.showMorePos.y-flickable.contentY,flickable.height-height)
Malte E's avatar
Malte E committed
        visible: roomTopic.cut
        text: roomTopic.showMore? "show less" : "show more"
        onClicked: {roomTopic.showMore = !roomTopic.showMore
            console.log(flickable.visibleArea)
        }
    }
    footer: DialogButtonBox {
        standardButtons: DialogButtonBox.Ok
        onAccepted: close()
Jedi18's avatar
Jedi18 committed
    }