Skip to content
Snippets Groups Projects
RoomSettings.qml 20.3 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 ".."
    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 {
    
                    id: displayAvatar
    
    
    Malte E's avatar
    Malte E committed
                    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: TimelineManager.openImageOverlay(null, roomSettings.roomAvatarUrl, "", 0, 0)
    
                    ImageButton {
                        hoverEnabled: true
                        ToolTip.visible: hovered
                        ToolTip.text: qsTr("Change room avatar.")
                        anchors.left: displayAvatar.left
                        anchors.top: displayAvatar.top
                        anchors.leftMargin: Nheko.paddingMedium
                        anchors.topMargin: Nheko.paddingMedium
                        visible: roomSettings.canChangeAvatar
                        image: ":/icons/icons/ui/edit.svg"
                        onClicked: {
    
    Malte E's avatar
    Malte E committed
                            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
                }
    
    
                TextEdit {
                    id: roomName
    
                    property bool isNameEditingAllowed: false
    
                    readOnly: !isNameEditingAllowed
                    textFormat: isNameEditingAllowed ? TextEdit.PlainText : TextEdit.RichText
                    text: isNameEditingAllowed ? roomSettings.plainRoomName : roomSettings.roomName
                    font.pixelSize: fontMetrics.font.pixelSize * 2
                    color: Nheko.colors.text
    
                    Layout.alignment: Qt.AlignHCenter
                    Layout.maximumWidth: parent.width - (Nheko.paddingSmall * 2) - nameChangeButton.anchors.leftMargin - (nameChangeButton.width * 2)
                    horizontalAlignment: TextEdit.AlignHCenter
                    wrapMode: TextEdit.Wrap
                    selectByMouse: true
    
                    Keys.onShortcutOverride: event.key === Qt.Key_Enter
                    Keys.onPressed: {
                        if (event.matches(StandardKey.InsertLineSeparator) || event.matches(StandardKey.InsertParagraphSeparator)) {
                            roomSettings.changeName(roomName.text);
                            roomName.isNameEditingAllowed = false;
                            event.accepted = true;
                        }
                    }
    
                    ImageButton {
                        id: nameChangeButton
                        visible: roomSettings.canChangeName
                        anchors.leftMargin: Nheko.paddingSmall
                        anchors.left: roomName.right
                        anchors.verticalCenter: roomName.verticalCenter
                        hoverEnabled: true
                        ToolTip.visible: hovered
                        ToolTip.text: qsTr("Change name of this room")
                        ToolTip.delay: Nheko.tooltipDelay
                        image: roomName.isNameEditingAllowed ? ":/icons/icons/ui/checkmark.svg" : ":/icons/icons/ui/edit.svg"
                        onClicked: {
                            if (roomName.isNameEditingAllowed) {
                                roomSettings.changeName(roomName.text);
                                roomName.isNameEditingAllowed = false;
                            } else {
                                roomName.isNameEditingAllowed = true;
                                roomName.focus = true;
                                roomName.selectAll();
                            }
                        }
    
    Malte E's avatar
    Malte E committed
                    }
    
    Jedi18's avatar
    Jedi18 committed
    
    
                RowLayout {
                    spacing: Nheko.paddingMedium
                    Layout.alignment: Qt.AlignHCenter
    
    
    Malte E's avatar
    Malte E committed
                    Label {
                        text: qsTr("%n member(s)", "", roomSettings.memberCount)
    
                        color: Nheko.colors.text
    
                    ImageButton {
                        image: ":/icons/icons/ui/people.svg"
                        hoverEnabled: true
                        ToolTip.visible: hovered
                        ToolTip.text: qsTr("View members of %1").arg(roomSettings.roomName)
                        onClicked: TimelineManager.openRoomMembers(Rooms.getRoomById(roomSettings.roomId))
    
    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: false
    
    Malte E's avatar
    Malte E committed
                    clip: true
    
                    Layout.maximumHeight: showMore? Number.POSITIVE_INFINITY : 100
                    Layout.preferredHeight: implicitHeight
    
    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
    
    
                    property bool isTopicEditingAllowed: false
    
                    readOnly: !isTopicEditingAllowed
                    textFormat: isTopicEditingAllowed ? TextEdit.PlainText : TextEdit.RichText
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                    text: isTopicEditingAllowed
                            ? roomSettings.plainRoomTopic
                            : (roomSettings.plainRoomTopic === "" ? ("<i>" + qsTr("No topic set") + "</i>") : roomSettings.roomTopic)
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                    wrapMode: TextEdit.WordWrap
    
    Jedi18's avatar
    Jedi18 committed
                    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
                }
    
    
                ImageButton {
                    id: topicChangeButton
                    Layout.alignment: Qt.AlignHCenter
                    visible: roomSettings.canChangeTopic
                    hoverEnabled: true
                    ToolTip.visible: hovered
                    ToolTip.text: qsTr("Change topic of this room")
                    ToolTip.delay: Nheko.tooltipDelay
                    image: roomTopic.isTopicEditingAllowed ? ":/icons/icons/ui/checkmark.svg" : ":/icons/icons/ui/edit.svg"
                    onClicked: {
                        if (roomTopic.isTopicEditingAllowed) {
                            roomSettings.changeTopic(roomTopic.text);
                            roomTopic.isTopicEditingAllowed = false;
                        } else {
                            roomTopic.isTopicEditingAllowed = true;
                            roomTopic.showMore = true;
                            roomTopic.focus = true;
                            //roomTopic.selectAll();
                        }
                    }
                }
    
    
    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
                }
    
    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("Anyone can join")
    
    Malte E's avatar
    Malte E committed
                        Layout.fillWidth: true
    
                        color: Nheko.colors.text
    
    Malte E's avatar
    Malte E committed
                    }
    
    Jedi18's avatar
    Jedi18 committed
    
    
                    ToggleButton {
                        id: publicRoomButton
    
    
    Malte E's avatar
    Malte E committed
                        enabled: roomSettings.canChangeJoinRules
    
                        checked: !roomSettings.privateAccess
                        Layout.alignment: Qt.AlignRight
                    }
    
                    Label {
                        text: qsTr("Allow knocking")
                        Layout.fillWidth: true
                        color: Nheko.colors.text
                        visible: knockingButton.visible
                    }
    
                    ToggleButton {
                        id: knockingButton
    
                        visible: !publicRoomButton.checked
                        enabled: roomSettings.canChangeJoinRules && roomSettings.supportsKnocking
                        checked: roomSettings.knockingEnabled
                        onCheckedChanged: {
                            if (checked && !roomSettings.supportsKnockRestricted) restrictedButton.checked = false;
    
    Malte E's avatar
    Malte E committed
                        }
    
                        Layout.alignment: Qt.AlignRight
                    }
    
                    Label {
                        text: qsTr("Allow joining via other rooms")
                        Layout.fillWidth: true
                        color: Nheko.colors.text
                        visible: restrictedButton.visible
                    }
    
                    ToggleButton {
                        id: restrictedButton
    
                        visible: !publicRoomButton.checked
                        enabled: roomSettings.canChangeJoinRules && roomSettings.supportsRestricted
                        checked: roomSettings.restrictedEnabled
                        onCheckedChanged: {
                            if (checked && !roomSettings.supportsKnockRestricted) knockingButton.checked = false;
    
    Malte E's avatar
    Malte E committed
                        }
    
                        Layout.alignment: Qt.AlignRight
                    }
    
                    Label {
                        text: qsTr("Rooms to join via")
                        Layout.fillWidth: true
                        color: Nheko.colors.text
                        visible: allowedRoomsButton.visible
                    }
    
                    Button {
                        id: allowedRoomsButton
    
                        visible: restrictedButton.checked && restrictedButton.visible
                        enabled: roomSettings.canChangeJoinRules && roomSettings.supportsRestricted
    
                        text: qsTr("Change")
                        ToolTip.text: qsTr("Change the list of rooms users can join this room via. Usually this is the official community of this room.")
                        onClicked: timelineRoot.showAllowedRoomsEditor(roomSettings)
                        Layout.alignment: Qt.AlignRight
                    }
    
                    Label {
                        text: qsTr("Allow guests to join")
                        Layout.fillWidth: true
                        color: Nheko.colors.text
                    }
    
                    ToggleButton {
                        id: guestAccessButton
    
                        enabled: roomSettings.canChangeJoinRules
                        checked: roomSettings.guestAccess
                        Layout.alignment: Qt.AlignRight
                    }
    
                    Button {
                        visible: publicRoomButton.checked == roomSettings.privateAccess || knockingButton.checked != roomSettings.knockingEnabled || restrictedButton.checked != roomSettings.restrictedEnabled || guestAccessButton.checked != roomSettings.guestAccess || roomSettings.allowedRoomsModified
                        enabled: roomSettings.canChangeJoinRules
    
                        text: qsTr("Apply access rules")
                        onClicked: roomSettings.changeAccessRules(!publicRoomButton.checked, guestAccessButton.checked, knockingButton.checked, restrictedButton.checked)
                        Layout.columnSpan: 2
    
    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("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("Permission")
                        color: Nheko.colors.text
                    }
    
                    Button {
                        text: qsTr("Configure")
                        ToolTip.text: qsTr("View and change the permissions in this room")
                        onClicked: timelineRoot.showPLEditor(roomSettings)
                        Layout.alignment: Qt.AlignRight
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                        text: qsTr("Aliases")
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                        color: Nheko.colors.text
                    }
    
                    Button {
                        text: qsTr("Configure")
                        ToolTip.text: qsTr("View and change the addresses/aliases of this room")
                        onClicked: timelineRoot.showAliasEditor(roomSettings)
                        Layout.alignment: Qt.AlignRight
    
    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")
    
    Malte E's avatar
    Malte E committed
                        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
    
    Malte E's avatar
    Malte E committed
                            horizontalAlignment: Text.AlignRight
    
                            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
    
            anchors.horizontalCenter: flickable.horizontalCenter
            y: Math.min(showMorePlaceholder.y+contentLayout1.y-flickable.contentY,flickable.height-height)
    
    Malte E's avatar
    Malte E committed
            visible: roomTopic.cut
    
            text: roomTopic.showMore? qsTr("show less") : qsTr("show more")
    
    Malte E's avatar
    Malte E committed
            onClicked: {roomTopic.showMore = !roomTopic.showMore
                console.log(flickable.visibleArea)
            }
        }
    
        footer: DialogButtonBox {
            standardButtons: DialogButtonBox.Ok
            onAccepted: close()
    
    Jedi18's avatar
    Jedi18 committed
        }