Files
neochat/src/app/qml/ManualRoomDialog.qml
Joshua Goins b1595a4556 Ensure most of our dialogs have cancel buttons on the right
This is standard for KDE dialogs, but we weren't super consistent about
it. Most of this is porting to DialogButtonBox, and using buttonRole. I
also made sure the close button is hidden in cases where we have a
cancel button already.

I also took the time to clean out some cruft like manually calling
close() and such. I probably missed a lot more spots, but this is a good
improvement.
2026-02-16 16:31:10 -05:00

120 lines
3.9 KiB
QML

// SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com>
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
import QtQuick
import QtQuick.Window
import QtQuick.Layouts
import QtQuick.Controls as QQC2
import org.kde.kirigami as Kirigami
import org.kde.kirigamiaddons.formcard as FormCard
import org.kde.neochat
Kirigami.Dialog {
id: root
/**
* @brief The connection for the current user.
*/
required property NeoChatConnection connection
/**
* @brief Signal emitted when a valid room id or alias is entered.
*/
signal roomSelected(string roomId, string displayName, url avatarUrl, string alias, string topic, int memberCount, bool isJoined)
title: i18nc("@title", "Manually Enter a Room")
showCloseButton: false
standardButtons: QQC2.Dialog.Cancel
width: Math.min(root.Window.window.width, Kirigami.Units.gridUnit * 24)
leftPadding: 0
rightPadding: 0
topPadding: 0
bottomPadding: 0
onAccepted: {
// We don't necessarily have all the info so fill out the best we can.
let roomId = roomIdAliasText.isAlias() ? "" : roomIdAliasText.text;
let displayName = "";
let avatarUrl = "";
let alias = roomIdAliasText.isAlias() ? roomIdAliasText.text : "";
let topic = "";
let memberCount = -1;
let isJoined = false;
if (roomIdAliasText.room) {
roomId = roomIdAliasText.room.id;
displayName = roomIdAliasText.room.displayName;
avatarUrl = roomIdAliasText.room.avatarUrl.toString().length > 0 ? connection.makeMediaUrl(roomIdAliasText.room.avatarUrl) : "";
alias = roomIdAliasText.room.canonicalAlias;
topic = roomIdAliasText.room.topic;
memberCount = roomIdAliasText.room.joinedCount;
isJoined = true;
}
root.roomSelected(roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined);
}
contentItem: ColumnLayout {
spacing: 0
FormCard.FormTextFieldDelegate {
id: roomIdAliasText
property bool isValidText: text.match(/(#|!)(.+):(.+)/g)
property bool correctStart: text.startsWith("#") || text.startsWith("!")
property NeoChatRoom room: {
if (!acceptableInput) {
return null;
}
if (isAlias()) {
return root.connection.roomByAlias(text) as NeoChatRoom;
} else {
return root.connection.room(text) as NeoChatRoom;
}
}
label: i18n("Room ID or Alias:")
statusMessage: {
if (text.length > 0 && !correctStart) {
return i18n("Must start with # for an alias or ! for an ID");
}
if (timer.running) {
return "";
}
if (text.length > 0 && !isValidText) {
return i18n("The input is not a valid room ID or alias");
}
return correctStart ? "" : i18n("Must start with # for an alias or ! for an ID");
}
status: text.length > 0 ? Kirigami.MessageType.Error : Kirigami.MessageType.Information
onTextEdited: timer.restart()
function isAlias() {
return roomIdAliasText.text.startsWith("#");
}
Timer {
id: timer
interval: 1000
}
}
}
onVisibleChanged: {
roomIdAliasText.forceActiveFocus();
timer.restart();
}
footer: QQC2.DialogButtonBox {
QQC2.Button {
text: i18nc("@action:button Join this room/space", "Join")
icon.name: "checkmark"
enabled: roomIdAliasText.isValidText
onClicked: root.accept()
QQC2.DialogButtonBox.buttonRole: QQC2.DialogButtonBox.AcceptRole
}
}
}