diff --git a/resources/qml/dialogs/RoomSettings.qml b/resources/qml/dialogs/RoomSettings.qml index 442010fd..44051610 100644 --- a/resources/qml/dialogs/RoomSettings.qml +++ b/resources/qml/dialogs/RoomSettings.qml @@ -17,8 +17,10 @@ ApplicationWindow { property var roomSettings - minimumWidth: 450 - minimumHeight: 680 + minimumWidth: 340 + minimumHeight: 450 + width: 450 + height: 680 palette: Nheko.colors color: Nheko.colors.window modality: Qt.NonModal @@ -29,119 +31,134 @@ ApplicationWindow { 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: roomSettingsDialog.width + contentHeight: contentLayout1.height + ColumnLayout { + id: contentLayout1 + width: parent.width + spacing: Nheko.paddingMedium - ColumnLayout { - id: contentLayout1 + 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(); - anchors.fill: parent - anchors.margins: Nheko.paddingMedium - spacing: Nheko.paddingMedium - - Avatar { - 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(); + } + } + Spinner { + Layout.alignment: Qt.AlignHCenter + visible: roomSettings.isLoading + foreground: Nheko.colors.mid + running: roomSettings.isLoading } - } - Spinner { - Layout.alignment: Qt.AlignHCenter - visible: roomSettings.isLoading - foreground: Nheko.colors.mid - running: roomSettings.isLoading - } + Text { + id: errorText - Text { - id: errorText + color: "red" + visible: opacity > 0 + opacity: 0 + Layout.alignment: Qt.AlignHCenter + wrapMode: Text.Wrap // somehow still doesn't wrap + Layout.fillWidth: true + } - color: "red" - visible: opacity > 0 - opacity: 0 - Layout.alignment: Qt.AlignHCenter - } + SequentialAnimation { + id: hideErrorAnimation - SequentialAnimation { - id: hideErrorAnimation + running: false - running: false + PauseAnimation { + duration: 4000 + } - PauseAnimation { - duration: 4000 - } + NumberAnimation { + target: errorText + property: 'opacity' + to: 0 + duration: 1000 + } - NumberAnimation { - target: errorText - property: 'opacity' - to: 0 - duration: 1000 } - } - - Connections { - target: roomSettings - function onDisplayError(errorMessage) { - errorText.text = errorMessage; - errorText.opacity = 1; - hideErrorAnimation.restart(); + Connections { + target: roomSettings + function onDisplayError(errorMessage) { + errorText.text = errorMessage; + errorText.opacity = 1; + hideErrorAnimation.restart(); + } } - } + Label { + text: roomSettings.roomName + Layout.alignment: Qt.AlignHCenter + font.pixelSize: fontMetrics.font.pixelSize * 2 + Layout.fillWidth: true + horizontalAlignment: TextEdit.AlignHCenter + color: Nheko.colors.text + wrapMode: Text.Wrap + textFormat: Text.RichText + } - ColumnLayout { - Layout.alignment: Qt.AlignHCenter + Label { + text: qsTr("%n member(s)", "", roomSettings.memberCount) + Layout.alignment: Qt.AlignHCenter + color: Nheko.colors.text - MatrixText { - text: roomSettings.roomName - font.pixelSize: fontMetrics.font.pixelSize * 2 - Layout.fillWidth: true - horizontalAlignment: TextEdit.AlignHCenter - } - - MatrixText { - text: qsTr("%n member(s)", "", roomSettings.memberCount) - Layout.alignment: Qt.AlignHCenter + TapHandler { + onSingleTapped: TimelineManager.openRoomMembers(Rooms.getRoomById(roomSettings.roomId)) + } - TapHandler { - onSingleTapped: TimelineManager.openRoomMembers(Rooms.getRoomById(roomSettings.roomId)) - } + CursorShape { + cursorShape: Qt.PointingHandCursor + anchors.fill: parent + } - CursorShape { - cursorShape: Qt.PointingHandCursor - anchors.fill: parent } + ImageButton { + Layout.alignment: Qt.AlignHCenter + image: ":/icons/icons/ui/edit.svg" + visible: roomSettings.canChangeNameAndTopic + onClicked: roomSettings.openEditModal() } - } - - ImageButton { - Layout.alignment: Qt.AlignHCenter - image: ":/icons/icons/ui/edit.svg" - visible: roomSettings.canChangeNameAndTopic - onClicked: roomSettings.openEditModal() - } - - ScrollView { - Layout.fillHeight: true - Layout.alignment: Qt.AlignHCenter - Layout.fillWidth: true - Layout.leftMargin: Nheko.paddingLarge - Layout.rightMargin: Nheko.paddingLarge - TextArea { + id: roomTopic + property bool cut: implicitHeight > 100 + property bool showMore + clip: true + Layout.maximumHeight: showMore? Number.POSITIVE_INFINITY : 100 + Layout.preferredHeight: implicitHeight + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.leftMargin: Nheko.paddingLarge + Layout.rightMargin: Nheko.paddingLarge + text: TimelineManager.escapeEmoji(roomSettings.roomTopic) wrapMode: TextEdit.WordWrap textFormat: TextEdit.RichText readOnly: true background: null - selectByMouse: true + selectByMouse: !Settings.mobileMode color: Nheko.colors.text horizontalAlignment: TextEdit.AlignHCenter onLinkActivated: Nheko.openLink(link) @@ -152,171 +169,222 @@ ApplicationWindow { } } - - } - - GridLayout { - columns: 2 - rowSpacing: Nheko.paddingMedium - - MatrixText { - text: qsTr("SETTINGS") - font.bold: true - } - Item { - Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter + id: showMorePlaceholder + Layout.preferredHeight: showMoreButton.height + Layout.preferredWidth: showMoreButton.width + visible: roomTopic.cut } - MatrixText { - text: qsTr("Notifications") + GridLayout { + columns: 2 + rowSpacing: Nheko.paddingMedium + Layout.margins: Nheko.paddingMedium Layout.fillWidth: true - } - ComboBox { - model: [qsTr("Muted"), qsTr("Mentions only"), qsTr("All messages")] - currentIndex: roomSettings.notifications - onActivated: { - roomSettings.changeNotifications(index); + Label { + text: qsTr("SETTINGS") + font.bold: true + color: Nheko.colors.text } - Layout.fillWidth: true - } - MatrixText { - text: qsTr("Room access") - Layout.fillWidth: true - } + Item { + Layout.fillWidth: true + } - ComboBox { - enabled: roomSettings.canChangeJoinRules - model: { - let opts = [qsTr("Anyone and guests"), qsTr("Anyone"), qsTr("Invited users")]; - if (roomSettings.supportsKnocking) - opts.push(qsTr("By knocking")); + Label { + text: qsTr("Notifications") + Layout.fillWidth: true + color: Nheko.colors.text + } - if (roomSettings.supportsRestricted) - opts.push(qsTr("Restricted by membership in other rooms")); + ComboBox { + model: [qsTr("Muted"), qsTr("Mentions only"), qsTr("All messages")] + currentIndex: roomSettings.notifications + onActivated: { + roomSettings.changeNotifications(index); + } + Layout.fillWidth: true + WheelHandler{} // suppress scrolling changing values + } - return opts; + Label { + text: qsTr("Room access") + Layout.fillWidth: true + color: Nheko.colors.text } - currentIndex: roomSettings.accessJoinRules - onActivated: { - roomSettings.changeAccessRules(index); + + 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); + } + Layout.fillWidth: true + WheelHandler{} // suppress scrolling changing values } - Layout.fillWidth: true - } - MatrixText { - text: qsTr("Encryption") - } + Label { + text: qsTr("Encryption") + color: Nheko.colors.text + } - ToggleButton { - id: encryptionToggle + ToggleButton { + id: encryptionToggle - checked: roomSettings.isEncryptionEnabled - onCheckedChanged: { - if (roomSettings.isEncryptionEnabled) { - checked = true; - return ; + checked: roomSettings.isEncryptionEnabled + onCheckedChanged: { + if (roomSettings.isEncryptionEnabled) { + checked = true; + return ; + } + confirmEncryptionDialog.open(); } - confirmEncryptionDialog.open(); + Layout.alignment: Qt.AlignRight } - Layout.alignment: Qt.AlignRight - } - Platform.MessageDialog { - id: confirmEncryptionDialog + Platform.MessageDialog { + id: confirmEncryptionDialog - title: qsTr("End-to-End Encryption") - text: qsTr("Encryption is currently experimental and things might break unexpectedly.
- Please take note that it can't be disabled afterwards.") - modality: Qt.NonModal - onAccepted: { - if (roomSettings.isEncryptionEnabled) - return ; + title: qsTr("End-to-End Encryption") + text: qsTr("Encryption is currently experimental and things might break unexpectedly.
+ Please take note that it can't be disabled afterwards.") + modality: Qt.NonModal + onAccepted: { + if (roomSettings.isEncryptionEnabled) + return ; - roomSettings.enableEncryption(); + roomSettings.enableEncryption(); + } + onRejected: { + encryptionToggle.checked = false; + } + buttons: Platform.MessageDialog.Ok | Platform.MessageDialog.Cancel } - onRejected: { - encryptionToggle.checked = false; + + Label { + text: qsTr("Sticker & Emote Settings") + color: Nheko.colors.text } - buttons: Platform.MessageDialog.Ok | Platform.MessageDialog.Cancel - } - MatrixText { - 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 + } - 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 - } + Label { + text: qsTr("Hidden events") + color: Nheko.colors.text + } - MatrixText { - text: qsTr("Hidden events") - } + HiddenEventsDialog { + id: hiddenEventsDialog + roomid: roomSettings.roomId + roomName: roomSettings.roomName + } - 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 + } - 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 - } + Item { + // for adding extra space between sections + Layout.fillWidth: true + } - Item { - // for adding extra space between sections - Layout.fillWidth: true - } + Label { + text: qsTr("INFO") + font.bold: true + color: Nheko.colors.text + } - MatrixText { - text: qsTr("INFO") - font.bold: true - } + Item { + Layout.fillWidth: true + } - Item { - Layout.fillWidth: true - } + Label { + text: qsTr("Internal ID") + color: Nheko.colors.text + } - MatrixText { - text: qsTr("Internal ID") - } + AbstractButton { // AbstractButton does not allow setting text color + Layout.alignment: Qt.AlignRight + 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 + 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 + } + } - MatrixText { - text: roomSettings.roomId - font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 0.8) - Layout.alignment: Qt.AlignRight - } + Label { + text: qsTr("Room Version") + color: Nheko.colors.text + } - MatrixText { - text: qsTr("Room Version") - } + Label { + text: roomSettings.roomVersion + font.pixelSize: fontMetrics.font.pixelSize + Layout.alignment: Qt.AlignRight + color: Nheko.colors.text + } - MatrixText { - text: roomSettings.roomVersion - font.pixelSize: fontMetrics.font.pixelSize - Layout.alignment: Qt.AlignRight } - } - - DialogButtonBox { - Layout.fillWidth: true - standardButtons: DialogButtonBox.Ok - onAccepted: close() + } + Button { + id: showMoreButton + anchors.horizontalCenter: flickable.horizontalCenter + y: Math.min(showMorePlaceholder.y+contentLayout1.y-flickable.contentY,flickable.height-height) + 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() } }