matrixion/qml/dialogs/RoomSettings.qml

424 lines
16 KiB
QML
Raw Permalink Normal View History

2021-03-05 02:35:15 +03:00
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
2021-03-05 02:35:15 +03:00
// SPDX-License-Identifier: GPL-3.0-or-later
2022-04-16 03:13:01 +03:00
import "../"
import "../ui"
2021-02-23 07:24:34 +03:00
import Qt.labs.platform 1.1 as Platform
import QtQuick 2.15
2021-02-09 20:41:39 +03:00
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.13
import im.nheko
import im.nheko
2021-02-09 20:41:39 +03:00
ApplicationWindow {
id: roomSettingsDialog
2021-02-09 20:41:39 +03:00
property var roomSettings
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.window
2021-08-19 17:55:54 +03:00
flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
2022-04-16 03:13:01 +03:00
height: 680
minimumHeight: 450
minimumWidth: 340
modality: Qt.NonModal
palette: timelineRoot.palette
2021-04-17 21:40:31 +03:00
title: qsTr("Room Settings")
2022-04-16 03:13:01 +03:00
width: 450
footer: DialogButtonBox {
standardButtons: DialogButtonBox.Ok
onAccepted: close()
}
2021-02-09 20:41:39 +03:00
Shortcut {
sequence: StandardKey.Cancel
2022-04-16 03:13:01 +03:00
2021-02-09 20:41:39 +03:00
onActivated: roomSettingsDialog.close()
}
Flickable {
id: flickable
anchors.fill: parent
2022-04-16 03:13:01 +03:00
boundsBehavior: Flickable.StopAtBounds
clip: true
contentHeight: contentLayout1.height
2022-04-16 03:13:01 +03:00
contentWidth: roomSettingsDialog.width
flickableDirection: Flickable.VerticalFlick
2022-02-25 23:59:01 +03:00
ColumnLayout {
id: contentLayout1
spacing: Nheko.paddingMedium
2022-04-16 03:13:01 +03:00
width: parent.width
2022-02-25 23:59:01 +03:00
Avatar {
2022-04-16 03:13:01 +03:00
Layout.alignment: Qt.AlignHCenter
2022-02-25 23:59:01 +03:00
Layout.topMargin: Nheko.paddingMedium
displayName: roomSettings.roomName
height: 130
2022-04-16 03:13:01 +03:00
roomid: roomSettings.roomId
url: roomSettings.roomAvatarUrl.replace("mxc://", "image://MxcImage/")
2022-02-25 23:59:01 +03:00
width: 130
2022-04-16 03:13:01 +03:00
2022-02-25 23:59:01 +03:00
onClicked: {
if (roomSettings.canChangeAvatar)
roomSettings.updateAvatar();
}
2021-02-11 21:09:11 +03:00
}
2022-02-25 23:59:01 +03:00
Spinner {
Layout.alignment: Qt.AlignHCenter
2022-04-11 05:18:16 +03:00
foreground: timelineRoot.palette.mid
2022-02-25 23:59:01 +03:00
running: roomSettings.isLoading
2022-04-16 03:13:01 +03:00
visible: roomSettings.isLoading
2022-02-25 23:59:01 +03:00
}
Text {
id: errorText
2022-04-16 03:13:01 +03:00
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
2022-02-25 23:59:01 +03:00
color: "red"
opacity: 0
2022-04-16 03:13:01 +03:00
visible: opacity > 0
2022-02-25 23:59:01 +03:00
wrapMode: Text.Wrap // somehow still doesn't wrap
}
SequentialAnimation {
id: hideErrorAnimation
running: false
2022-02-25 23:59:01 +03:00
PauseAnimation {
duration: 4000
}
NumberAnimation {
2022-04-16 03:13:01 +03:00
duration: 1000
2022-02-25 23:59:01 +03:00
property: 'opacity'
2022-04-16 03:13:01 +03:00
target: errorText
2022-02-25 23:59:01 +03:00
to: 0
}
2021-02-11 21:09:11 +03:00
}
2022-02-25 23:59:01 +03:00
Connections {
function onDisplayError(errorMessage) {
errorText.text = errorMessage;
errorText.opacity = 1;
hideErrorAnimation.restart();
}
2022-04-16 03:13:01 +03:00
target: roomSettings
}
TextEdit {
id: roomName
property bool isNameEditingAllowed: false
Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: parent.width - (Nheko.paddingSmall * 2) - nameChangeButton.anchors.leftMargin - (nameChangeButton.width * 2)
2022-04-16 03:13:01 +03:00
color: timelineRoot.palette.text
font.pixelSize: fontMetrics.font.pixelSize * 2
horizontalAlignment: TextEdit.AlignHCenter
2022-04-16 03:13:01 +03:00
readOnly: !isNameEditingAllowed
selectByMouse: true
2022-04-16 03:13:01 +03:00
text: isNameEditingAllowed ? roomSettings.plainRoomName : roomSettings.roomName
textFormat: isNameEditingAllowed ? TextEdit.PlainText : TextEdit.RichText
wrapMode: TextEdit.Wrap
Keys.onPressed: {
if (event.matches(StandardKey.InsertLineSeparator) || event.matches(StandardKey.InsertParagraphSeparator)) {
roomSettings.changeName(roomName.text);
roomName.isNameEditingAllowed = false;
event.accepted = true;
}
}
2022-04-16 03:13:01 +03:00
Keys.onShortcutOverride: event.key === Qt.Key_Enter
ImageButton {
id: nameChangeButton
2022-04-16 03:13:01 +03:00
ToolTip.delay: Nheko.tooltipDelay
ToolTip.text: qsTr("Change name of this room")
ToolTip.visible: hovered
anchors.left: roomName.right
2022-04-16 03:13:01 +03:00
anchors.leftMargin: Nheko.paddingSmall
anchors.verticalCenter: roomName.verticalCenter
hoverEnabled: true
image: roomName.isNameEditingAllowed ? ":/icons/icons/ui/checkmark.svg" : ":/icons/icons/ui/edit.svg"
2022-04-16 03:13:01 +03:00
visible: roomSettings.canChangeName
onClicked: {
if (roomName.isNameEditingAllowed) {
roomSettings.changeName(roomName.text);
roomName.isNameEditingAllowed = false;
} else {
roomName.isNameEditingAllowed = true;
roomName.focus = true;
roomName.selectAll();
}
}
2022-02-25 23:59:01 +03:00
}
}
2022-04-16 03:13:01 +03:00
Label {
Layout.alignment: Qt.AlignHCenter
color: timelineRoot.palette.text
text: qsTr("%n member(s)", "", roomSettings.memberCount)
2022-04-16 03:13:01 +03:00
TapHandler {
onSingleTapped: TimelineManager.openRoomMembers(Rooms.getRoomById(roomSettings.roomId))
}
2022-04-16 03:13:01 +03:00
NhekoCursorShape {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
}
}
2022-02-25 23:59:01 +03:00
TextArea {
2022-03-02 12:02:01 +03:00
id: roomTopic
2022-04-16 03:13:01 +03:00
2022-03-02 12:02:01 +03:00
property bool cut: implicitHeight > 100
2022-04-16 03:13:01 +03:00
property bool isTopicEditingAllowed: false
property bool showMore: false
2022-04-16 03:13:01 +03:00
2022-02-25 23:59:01 +03:00
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
Layout.leftMargin: Nheko.paddingLarge
2022-04-16 03:13:01 +03:00
Layout.maximumHeight: showMore ? Number.POSITIVE_INFINITY : 100
Layout.preferredHeight: implicitHeight
2022-02-25 23:59:01 +03:00
Layout.rightMargin: Nheko.paddingLarge
2021-02-13 18:16:40 +03:00
background: null
2022-04-16 03:13:01 +03:00
clip: true
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2021-02-23 07:24:34 +03:00
horizontalAlignment: TextEdit.AlignHCenter
2022-04-16 03:13:01 +03:00
readOnly: !isTopicEditingAllowed
selectByMouse: !Settings.mobileMode
text: isTopicEditingAllowed ? roomSettings.plainRoomTopic : roomSettings.roomTopic
textFormat: isTopicEditingAllowed ? TextEdit.PlainText : TextEdit.RichText
wrapMode: TextEdit.WordWrap
2021-05-13 09:52:02 +03:00
onLinkActivated: Nheko.openLink(link)
NhekoCursorShape {
2021-02-23 07:24:34 +03:00
anchors.fill: parent
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
2022-02-25 23:59:01 +03:00
}
ImageButton {
id: topicChangeButton
Layout.alignment: Qt.AlignHCenter
ToolTip.delay: Nheko.tooltipDelay
2022-04-16 03:13:01 +03:00
ToolTip.text: qsTr("Change topic of this room")
ToolTip.visible: hovered
hoverEnabled: true
image: roomTopic.isTopicEditingAllowed ? ":/icons/icons/ui/checkmark.svg" : ":/icons/icons/ui/edit.svg"
2022-04-16 03:13:01 +03:00
visible: roomSettings.canChangeTopic
onClicked: {
if (roomTopic.isTopicEditingAllowed) {
roomSettings.changeTopic(roomTopic.text);
roomTopic.isTopicEditingAllowed = false;
} else {
roomTopic.isTopicEditingAllowed = true;
roomTopic.showMore = true;
roomTopic.focus = true;
//roomTopic.selectAll();
}
}
}
2022-03-02 12:02:01 +03:00
Item {
id: showMorePlaceholder
2022-04-16 03:13:01 +03:00
Layout.alignment: Qt.AlignHCenter
2022-03-02 12:02:01 +03:00
Layout.preferredHeight: showMoreButton.height
Layout.preferredWidth: showMoreButton.width
visible: roomTopic.cut
}
2022-02-25 23:59:01 +03:00
GridLayout {
2022-04-16 03:13:01 +03:00
Layout.fillWidth: true
Layout.margins: Nheko.paddingMedium
2022-02-25 23:59:01 +03:00
columns: 2
rowSpacing: Nheko.paddingMedium
2021-02-09 20:41:39 +03:00
2022-02-25 23:59:01 +03:00
Label {
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
font.bold: true
text: qsTr("SETTINGS")
2022-02-25 23:59:01 +03:00
}
Item {
Layout.fillWidth: true
}
Label {
Layout.fillWidth: true
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
text: qsTr("Notifications")
2022-02-25 23:59:01 +03:00
}
ComboBox {
2022-04-16 03:13:01 +03:00
Layout.fillWidth: true
2022-02-25 23:59:01 +03:00
currentIndex: roomSettings.notifications
2022-04-16 03:13:01 +03:00
model: [qsTr("Muted"), qsTr("Mentions only"), qsTr("All messages")]
2022-02-25 23:59:01 +03:00
onActivated: {
roomSettings.changeNotifications(index);
}
2021-02-09 20:41:39 +03:00
2022-04-16 03:13:01 +03:00
WheelHandler {
} // suppress scrolling changing values
}
2022-02-25 23:59:01 +03:00
Label {
Layout.fillWidth: true
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
text: qsTr("Room access")
2022-02-25 23:59:01 +03:00
}
ComboBox {
2022-04-16 03:13:01 +03:00
Layout.fillWidth: true
currentIndex: roomSettings.accessJoinRules
2022-02-25 23:59:01 +03:00
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;
}
2022-04-16 03:13:01 +03:00
2022-02-25 23:59:01 +03:00
onActivated: {
roomSettings.changeAccessRules(index);
}
2021-02-09 20:41:39 +03:00
2022-04-16 03:13:01 +03:00
WheelHandler {
} // suppress scrolling changing values
}
2022-02-25 23:59:01 +03:00
Label {
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
text: qsTr("Encryption")
2022-02-25 23:59:01 +03:00
}
ToggleButton {
id: encryptionToggle
2022-04-16 03:13:01 +03:00
Layout.alignment: Qt.AlignRight
2022-02-25 23:59:01 +03:00
checked: roomSettings.isEncryptionEnabled
2022-04-16 03:13:01 +03:00
2022-02-25 23:59:01 +03:00
onCheckedChanged: {
if (roomSettings.isEncryptionEnabled) {
checked = true;
2022-04-16 03:13:01 +03:00
return;
2022-02-25 23:59:01 +03:00
}
confirmEncryptionDialog.open();
}
}
2022-02-25 23:59:01 +03:00
Platform.MessageDialog {
id: confirmEncryptionDialog
2022-04-16 03:13:01 +03:00
buttons: Platform.MessageDialog.Ok | Platform.MessageDialog.Cancel
modality: Qt.NonModal
2022-02-25 23:59:01 +03:00
text: qsTr("Encryption is currently experimental and things might break unexpectedly. <br>
Please take note that it can't be disabled afterwards.")
2022-04-16 03:13:01 +03:00
title: qsTr("End-to-End Encryption")
2022-02-25 23:59:01 +03:00
onAccepted: {
if (roomSettings.isEncryptionEnabled)
2022-04-16 03:13:01 +03:00
return;
2022-02-25 23:59:01 +03:00
roomSettings.enableEncryption();
}
onRejected: {
encryptionToggle.checked = false;
}
}
2022-02-25 23:59:01 +03:00
Label {
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
text: qsTr("Sticker & Emote Settings")
}
2022-02-25 23:59:01 +03:00
Button {
2022-04-16 03:13:01 +03:00
Layout.alignment: Qt.AlignRight
2022-02-25 23:59:01 +03:00
ToolTip.text: qsTr("Change what packs are enabled, remove packs or create new ones")
2022-04-16 03:13:01 +03:00
text: qsTr("Change")
2022-02-25 23:59:01 +03:00
onClicked: TimelineManager.openImagePackSettings(roomSettings.roomId)
}
Label {
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
text: qsTr("Hidden events")
2022-02-25 23:59:01 +03:00
}
HiddenEventsDialog {
id: hiddenEventsDialog
roomName: roomSettings.roomName
2022-04-16 03:13:01 +03:00
roomid: roomSettings.roomId
2022-02-25 23:59:01 +03:00
}
Button {
2022-04-16 03:13:01 +03:00
Layout.alignment: Qt.AlignRight
2022-02-25 23:59:01 +03:00
ToolTip.text: qsTr("Select events to hide in this room")
2022-04-16 03:13:01 +03:00
text: qsTr("Configure")
2022-02-25 23:59:01 +03:00
onClicked: hiddenEventsDialog.show()
}
Item {
// for adding extra space between sections
Layout.fillWidth: true
}
Item {
// for adding extra space between sections
Layout.fillWidth: true
}
Label {
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
font.bold: true
text: qsTr("INFO")
2022-02-25 23:59:01 +03:00
}
Item {
Layout.fillWidth: true
}
Label {
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
text: qsTr("Internal ID")
2022-02-25 23:59:01 +03:00
}
2022-04-16 03:13:01 +03:00
AbstractButton {
// AbstractButton does not allow setting text color
2022-02-25 23:59:01 +03:00
Layout.alignment: Qt.AlignRight
2022-03-02 12:02:01 +03:00
Layout.fillWidth: true
Layout.preferredHeight: idLabel.height
2022-04-16 03:13:01 +03:00
onClicked: {
textEdit.selectAll();
textEdit.copy();
toolTipTimer.start();
}
Label {
// TextEdit does not trigger onClicked
id: idLabel
2022-04-16 03:13:01 +03:00
ToolTip.text: qsTr("Copied to clipboard")
ToolTip.visible: toolTipTimer.running
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
font.pixelSize: Math.floor(fontMetrics.font.pixelSize * 0.8)
2022-03-04 15:40:44 +03:00
horizontalAlignment: Text.AlignRight
2022-04-16 03:13:01 +03:00
text: roomSettings.roomId
width: parent.width
wrapMode: Text.WrapAnywhere
}
2022-04-16 03:13:01 +03:00
TextEdit {
// label does not allow selection
id: textEdit
text: roomSettings.roomId
2022-04-16 03:13:01 +03:00
visible: false
}
Timer {
id: toolTipTimer
}
2022-02-25 23:59:01 +03:00
}
Label {
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
text: qsTr("Room Version")
2022-02-25 23:59:01 +03:00
}
Label {
Layout.alignment: Qt.AlignRight
2022-04-11 05:18:16 +03:00
color: timelineRoot.palette.text
2022-04-16 03:13:01 +03:00
font.pixelSize: fontMetrics.font.pixelSize
text: roomSettings.roomVersion
2022-02-25 23:59:01 +03:00
}
2021-02-09 20:41:39 +03:00
}
}
}
2022-03-02 12:02:01 +03:00
Button {
id: showMoreButton
2022-03-04 13:19:58 +03:00
anchors.horizontalCenter: flickable.horizontalCenter
2022-04-16 03:13:01 +03:00
text: roomTopic.showMore ? qsTr("show less") : qsTr("show more")
2022-03-02 12:02:01 +03:00
visible: roomTopic.cut
2022-04-16 03:13:01 +03:00
y: Math.min(showMorePlaceholder.y + contentLayout1.y - flickable.contentY, flickable.height - height)
onClicked: {
roomTopic.showMore = !roomTopic.showMore;
console.log(flickable.visibleArea);
2022-03-02 12:02:01 +03:00
}
}
}