New parent dialog
Move the add new offical parent to a dialog and make sure that the join room dialog only shows spaces.
This commit is contained in:
@@ -282,6 +282,7 @@ qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN
|
|||||||
qml/SpaceHomePage.qml
|
qml/SpaceHomePage.qml
|
||||||
qml/SpaceHierarchyDelegate.qml
|
qml/SpaceHierarchyDelegate.qml
|
||||||
qml/RemoveChildDialog.qml
|
qml/RemoveChildDialog.qml
|
||||||
|
qml/SelectParentDialog.qml
|
||||||
RESOURCES
|
RESOURCES
|
||||||
qml/confetti.png
|
qml/confetti.png
|
||||||
qml/glowdot.png
|
qml/glowdot.png
|
||||||
|
|||||||
@@ -124,6 +124,20 @@ void PublicRoomListModel::setKeyword(const QString &value)
|
|||||||
Q_EMIT hasMoreChanged();
|
Q_EMIT hasMoreChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PublicRoomListModel::showOnlySpaces() const
|
||||||
|
{
|
||||||
|
return m_showOnlySpaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PublicRoomListModel::setShowOnlySpaces(bool showOnlySpaces)
|
||||||
|
{
|
||||||
|
if (showOnlySpaces == m_showOnlySpaces) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_showOnlySpaces = showOnlySpaces;
|
||||||
|
Q_EMIT showOnlySpacesChanged();
|
||||||
|
}
|
||||||
|
|
||||||
void PublicRoomListModel::next(int count)
|
void PublicRoomListModel::next(int count)
|
||||||
{
|
{
|
||||||
if (count < 1) {
|
if (count < 1) {
|
||||||
@@ -136,7 +150,11 @@ void PublicRoomListModel::next(int count)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
job = m_connection->callApi<QueryPublicRoomsJob>(m_server, count, nextBatch, QueryPublicRoomsJob::Filter{m_keyword, {}});
|
QStringList roomTypes;
|
||||||
|
if (m_showOnlySpaces) {
|
||||||
|
roomTypes += QLatin1String("m.space");
|
||||||
|
}
|
||||||
|
job = m_connection->callApi<QueryPublicRoomsJob>(m_server, count, nextBatch, QueryPublicRoomsJob::Filter{m_keyword, roomTypes});
|
||||||
Q_EMIT loadingChanged();
|
Q_EMIT loadingChanged();
|
||||||
|
|
||||||
connect(job, &BaseJob::finished, this, [this] {
|
connect(job, &BaseJob::finished, this, [this] {
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ class PublicRoomListModel : public QAbstractListModel
|
|||||||
*/
|
*/
|
||||||
Q_PROPERTY(QString keyword READ keyword WRITE setKeyword NOTIFY keywordChanged)
|
Q_PROPERTY(QString keyword READ keyword WRITE setKeyword NOTIFY keywordChanged)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Whether only space rooms should be shown.
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(bool showOnlySpaces READ showOnlySpaces WRITE setShowOnlySpaces NOTIFY showOnlySpacesChanged)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Whether the model has more items to load.
|
* @brief Whether the model has more items to load.
|
||||||
*/
|
*/
|
||||||
@@ -103,6 +108,9 @@ public:
|
|||||||
[[nodiscard]] QString keyword() const;
|
[[nodiscard]] QString keyword() const;
|
||||||
void setKeyword(const QString &value);
|
void setKeyword(const QString &value);
|
||||||
|
|
||||||
|
[[nodiscard]] bool showOnlySpaces() const;
|
||||||
|
void setShowOnlySpaces(bool showOnlySpaces);
|
||||||
|
|
||||||
[[nodiscard]] bool hasMore() const;
|
[[nodiscard]] bool hasMore() const;
|
||||||
|
|
||||||
[[nodiscard]] bool loading() const;
|
[[nodiscard]] bool loading() const;
|
||||||
@@ -118,6 +126,7 @@ private:
|
|||||||
Quotient::Connection *m_connection = nullptr;
|
Quotient::Connection *m_connection = nullptr;
|
||||||
QString m_server;
|
QString m_server;
|
||||||
QString m_keyword;
|
QString m_keyword;
|
||||||
|
bool m_showOnlySpaces;
|
||||||
|
|
||||||
bool attempted = false;
|
bool attempted = false;
|
||||||
bool m_loading = false;
|
bool m_loading = false;
|
||||||
@@ -131,6 +140,7 @@ Q_SIGNALS:
|
|||||||
void connectionChanged();
|
void connectionChanged();
|
||||||
void serverChanged();
|
void serverChanged();
|
||||||
void keywordChanged();
|
void keywordChanged();
|
||||||
|
void showOnlySpacesChanged();
|
||||||
void hasMoreChanged();
|
void hasMoreChanged();
|
||||||
void loadingChanged();
|
void loadingChanged();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -349,134 +349,16 @@ FormCard.FormCardPage {
|
|||||||
visible: officalParentRepeater.count <= 0
|
visible: officalParentRepeater.count <= 0
|
||||||
text: i18n("This room has no official parent spaces.")
|
text: i18n("This room has no official parent spaces.")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
FormCard.FormHeader {
|
|
||||||
visible: root.room.canSendState("m.space.parent")
|
|
||||||
title: i18n("Add Official Parent Space")
|
|
||||||
}
|
|
||||||
FormCard.FormCard {
|
|
||||||
visible: root.room.canSendState("m.space.parent")
|
|
||||||
FormCard.FormButtonDelegate {
|
FormCard.FormButtonDelegate {
|
||||||
visible: !chosenRoomDelegate.visible
|
visible: root.room.canSendState("m.space.parent")
|
||||||
text: i18nc("@action:button", "Pick room")
|
text: i18nc("@action:button", "Add new official parent")
|
||||||
onClicked: {
|
onClicked: selectParentDialog.createObject(applicationWindow().overlay).open();
|
||||||
let dialog = pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/JoinRoomPage.qml", {connection: root.connection}, {title: i18nc("@title", "Explore Rooms")})
|
|
||||||
dialog.roomSelected.connect((roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined) => {
|
|
||||||
chosenRoomDelegate.roomId = roomId;
|
|
||||||
chosenRoomDelegate.displayName = displayName;
|
|
||||||
chosenRoomDelegate.avatarUrl = avatarUrl;
|
|
||||||
chosenRoomDelegate.alias = alias;
|
|
||||||
chosenRoomDelegate.topic = topic;
|
|
||||||
chosenRoomDelegate.memberCount = memberCount;
|
|
||||||
chosenRoomDelegate.isJoined = isJoined;
|
|
||||||
chosenRoomDelegate.visible = true;
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FormCard.AbstractFormDelegate {
|
|
||||||
id: chosenRoomDelegate
|
|
||||||
property string roomId
|
|
||||||
property string displayName
|
|
||||||
property url avatarUrl
|
|
||||||
property string alias
|
|
||||||
property string topic
|
|
||||||
property int memberCount
|
|
||||||
property bool isJoined
|
|
||||||
|
|
||||||
visible: false
|
Component {
|
||||||
|
id: selectParentDialog
|
||||||
contentItem: RowLayout {
|
SelectParentDialog {
|
||||||
KirigamiComponents.Avatar {
|
room: root.room
|
||||||
Layout.preferredWidth: Kirigami.Units.gridUnit * 2
|
|
||||||
Layout.preferredHeight: Kirigami.Units.gridUnit * 2
|
|
||||||
|
|
||||||
source: chosenRoomDelegate.avatarUrl
|
|
||||||
name: chosenRoomDelegate.displayName
|
|
||||||
}
|
}
|
||||||
ColumnLayout {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
RowLayout {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Kirigami.Heading {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
level: 4
|
|
||||||
text: chosenRoomDelegate.displayName
|
|
||||||
font.bold: true
|
|
||||||
textFormat: Text.PlainText
|
|
||||||
elide: Text.ElideRight
|
|
||||||
wrapMode: Text.NoWrap
|
|
||||||
}
|
|
||||||
QQC2.Label {
|
|
||||||
visible: chosenRoomDelegate.isJoined
|
|
||||||
text: i18n("Joined")
|
|
||||||
color: Kirigami.Theme.linkColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QQC2.Label {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
visible: text
|
|
||||||
text: chosenRoomDelegate.topic ? chosenRoomDelegate.topic.replace(/(\r\n\t|\n|\r\t)/gm," ") : ""
|
|
||||||
textFormat: Text.PlainText
|
|
||||||
elide: Text.ElideRight
|
|
||||||
wrapMode: Text.NoWrap
|
|
||||||
}
|
|
||||||
RowLayout {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Kirigami.Icon {
|
|
||||||
source: "user"
|
|
||||||
color: Kirigami.Theme.disabledTextColor
|
|
||||||
implicitHeight: Kirigami.Units.iconSizes.small
|
|
||||||
implicitWidth: Kirigami.Units.iconSizes.small
|
|
||||||
}
|
|
||||||
QQC2.Label {
|
|
||||||
text: chosenRoomDelegate.memberCount + " " + (chosenRoomDelegate.alias ?? chosenRoomDelegate.roomId)
|
|
||||||
color: Kirigami.Theme.disabledTextColor
|
|
||||||
elide: Text.ElideRight
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onClicked: {
|
|
||||||
let dialog = pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/JoinRoomPage.qml", {connection: root.connection}, {title: i18nc("@title", "Explore Rooms")})
|
|
||||||
dialog.roomSelected.connect((roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined) => {
|
|
||||||
chosenRoomDelegate.roomId = roomId;
|
|
||||||
chosenRoomDelegate.displayName = displayName;
|
|
||||||
chosenRoomDelegate.avatarUrl = avatarUrl;
|
|
||||||
chosenRoomDelegate.alias = alias;
|
|
||||||
chosenRoomDelegate.topic = topic;
|
|
||||||
chosenRoomDelegate.memberCount = memberCount;
|
|
||||||
chosenRoomDelegate.isJoined = isJoined;
|
|
||||||
chosenRoomDelegate.visible = true;
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FormCard.FormCheckDelegate {
|
|
||||||
id: existingOfficialCheck
|
|
||||||
property NeoChatRoom space: root.connection.room(chosenRoomDelegate.roomId)
|
|
||||||
text: i18n("Set this room as a child of the space %1", space?.displayName ?? "")
|
|
||||||
checked: enabled
|
|
||||||
|
|
||||||
enabled: chosenRoomDelegate.visible && space && space.canSendState("m.space.child")
|
|
||||||
}
|
|
||||||
FormCard.FormTextDelegate {
|
|
||||||
visible: chosenRoomDelegate.visible && !root.room.canModifyParent(chosenRoomDelegate.roomId)
|
|
||||||
text: existingOfficialCheck.space ? (existingOfficialCheck.space.isSpace ? i18n("You do not have a high enough privilege level in the parent to set this state") : i18n("The selected room is not a space")) : i18n("You do not have the privileges to complete this action")
|
|
||||||
textItem.color: Kirigami.Theme.negativeTextColor
|
|
||||||
}
|
|
||||||
FormCard.FormCheckDelegate {
|
|
||||||
id: makeCanonicalCheck
|
|
||||||
text: i18n("Make this space the canonical parent")
|
|
||||||
checked: enabled
|
|
||||||
|
|
||||||
enabled: chosenRoomDelegate.visible
|
|
||||||
}
|
|
||||||
FormCard.FormButtonDelegate {
|
|
||||||
text: i18nc("@action:button", "Ok")
|
|
||||||
enabled: chosenRoomDelegate.visible && root.room.canModifyParent(chosenRoomDelegate.roomId)
|
|
||||||
onClicked: {
|
|
||||||
root.room.addParent(chosenRoomDelegate.roomId, makeCanonicalCheck.checked, existingOfficialCheck.checked)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -541,6 +423,5 @@ FormCard.FormCardPage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ Kirigami.ScrollablePage {
|
|||||||
|
|
||||||
required property NeoChatConnection connection
|
required property NeoChatConnection connection
|
||||||
|
|
||||||
|
property bool showOnlySpaces: false
|
||||||
|
|
||||||
property alias keyword: identifierField.text
|
property alias keyword: identifierField.text
|
||||||
property string server
|
property string server
|
||||||
|
|
||||||
@@ -216,6 +218,7 @@ Kirigami.ScrollablePage {
|
|||||||
connection: root.connection
|
connection: root.connection
|
||||||
server: root.server
|
server: root.server
|
||||||
keyword: root.keyword
|
keyword: root.keyword
|
||||||
|
showOnlySpaces: root.showOnlySpaces
|
||||||
}
|
}
|
||||||
|
|
||||||
onContentYChanged: {
|
onContentYChanged: {
|
||||||
|
|||||||
165
src/qml/SelectParentDialog.qml
Normal file
165
src/qml/SelectParentDialog.qml
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
// 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.Controls as QQC2
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
import org.kde.kirigamiaddons.formcard as FormCard
|
||||||
|
import org.kde.kirigamiaddons.labs.components as Components
|
||||||
|
|
||||||
|
import org.kde.neochat
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A dialog to select a parent space to add to a given room.
|
||||||
|
*/
|
||||||
|
Kirigami.Dialog {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The current room that a parent is being selected for.
|
||||||
|
*/
|
||||||
|
required property NeoChatRoom room
|
||||||
|
|
||||||
|
title: i18nc("@title", "Select new offical parent")
|
||||||
|
|
||||||
|
width: Math.min(applicationWindow().width, Kirigami.Units.gridUnit * 24)
|
||||||
|
leftPadding: 0
|
||||||
|
rightPadding: 0
|
||||||
|
topPadding: 0
|
||||||
|
bottomPadding: 0
|
||||||
|
|
||||||
|
standardButtons: Kirigami.Dialog.Cancel
|
||||||
|
customFooterActions: [
|
||||||
|
Kirigami.Action {
|
||||||
|
enabled: chosenRoomDelegate.visible && root.room.canModifyParent(chosenRoomDelegate.roomId)
|
||||||
|
text: i18n("OK")
|
||||||
|
icon.name: "dialog-ok"
|
||||||
|
onTriggered: {
|
||||||
|
root.room.addParent(chosenRoomDelegate.roomId, makeCanonicalCheck.checked, existingOfficialCheck.checked)
|
||||||
|
root.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
contentItem: ColumnLayout {
|
||||||
|
spacing: 0
|
||||||
|
FormCard.FormButtonDelegate {
|
||||||
|
visible: !chosenRoomDelegate.visible
|
||||||
|
text: i18nc("@action:button", "Pick room")
|
||||||
|
onClicked: {
|
||||||
|
let dialog = pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/JoinRoomPage.qml", {connection: root.room.connection, showOnlySpaces: true}, {title: i18nc("@title", "Choose Parent Space")})
|
||||||
|
dialog.roomSelected.connect((roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined) => {
|
||||||
|
chosenRoomDelegate.roomId = roomId;
|
||||||
|
chosenRoomDelegate.displayName = displayName;
|
||||||
|
chosenRoomDelegate.avatarUrl = avatarUrl;
|
||||||
|
chosenRoomDelegate.alias = alias;
|
||||||
|
chosenRoomDelegate.topic = topic;
|
||||||
|
chosenRoomDelegate.memberCount = memberCount;
|
||||||
|
chosenRoomDelegate.isJoined = isJoined;
|
||||||
|
chosenRoomDelegate.visible = true;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FormCard.AbstractFormDelegate {
|
||||||
|
id: chosenRoomDelegate
|
||||||
|
property string roomId
|
||||||
|
property string displayName
|
||||||
|
property url avatarUrl
|
||||||
|
property string alias
|
||||||
|
property string topic
|
||||||
|
property int memberCount
|
||||||
|
property bool isJoined
|
||||||
|
|
||||||
|
visible: false
|
||||||
|
|
||||||
|
contentItem: RowLayout {
|
||||||
|
Components.Avatar {
|
||||||
|
Layout.preferredWidth: Kirigami.Units.gridUnit * 2
|
||||||
|
Layout.preferredHeight: Kirigami.Units.gridUnit * 2
|
||||||
|
|
||||||
|
source: chosenRoomDelegate.avatarUrl
|
||||||
|
name: chosenRoomDelegate.displayName
|
||||||
|
}
|
||||||
|
ColumnLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Kirigami.Heading {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
level: 4
|
||||||
|
text: chosenRoomDelegate.displayName
|
||||||
|
font.bold: true
|
||||||
|
textFormat: Text.PlainText
|
||||||
|
elide: Text.ElideRight
|
||||||
|
wrapMode: Text.NoWrap
|
||||||
|
}
|
||||||
|
QQC2.Label {
|
||||||
|
visible: chosenRoomDelegate.isJoined
|
||||||
|
text: i18n("Joined")
|
||||||
|
color: Kirigami.Theme.linkColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QQC2.Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: text
|
||||||
|
text: chosenRoomDelegate.topic ? chosenRoomDelegate.topic.replace(/(\r\n\t|\n|\r\t)/gm," ") : ""
|
||||||
|
textFormat: Text.PlainText
|
||||||
|
elide: Text.ElideRight
|
||||||
|
wrapMode: Text.NoWrap
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Kirigami.Icon {
|
||||||
|
source: "user"
|
||||||
|
color: Kirigami.Theme.disabledTextColor
|
||||||
|
implicitHeight: Kirigami.Units.iconSizes.small
|
||||||
|
implicitWidth: Kirigami.Units.iconSizes.small
|
||||||
|
}
|
||||||
|
QQC2.Label {
|
||||||
|
text: chosenRoomDelegate.memberCount + " " + (chosenRoomDelegate.alias ?? chosenRoomDelegate.roomId)
|
||||||
|
color: Kirigami.Theme.disabledTextColor
|
||||||
|
elide: Text.ElideRight
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
let dialog = pageStack.pushDialogLayer("qrc:/org/kde/neochat/qml/JoinRoomPage.qml", {connection: root.room.connection, showOnlySpaces: true}, {title: i18nc("@title", "Explore Rooms")})
|
||||||
|
dialog.roomSelected.connect((roomId, displayName, avatarUrl, alias, topic, memberCount, isJoined) => {
|
||||||
|
chosenRoomDelegate.roomId = roomId;
|
||||||
|
chosenRoomDelegate.displayName = displayName;
|
||||||
|
chosenRoomDelegate.avatarUrl = avatarUrl;
|
||||||
|
chosenRoomDelegate.alias = alias;
|
||||||
|
chosenRoomDelegate.topic = topic;
|
||||||
|
chosenRoomDelegate.memberCount = memberCount;
|
||||||
|
chosenRoomDelegate.isJoined = isJoined;
|
||||||
|
chosenRoomDelegate.visible = true;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FormCard.FormCheckDelegate {
|
||||||
|
id: existingOfficialCheck
|
||||||
|
property NeoChatRoom space: root.room.connection.room(chosenRoomDelegate.roomId)
|
||||||
|
text: i18n("Set this room as a child of the space %1", space?.displayName ?? "")
|
||||||
|
checked: enabled
|
||||||
|
|
||||||
|
enabled: chosenRoomDelegate.visible && space && space.canSendState("m.space.child")
|
||||||
|
}
|
||||||
|
FormCard.FormTextDelegate {
|
||||||
|
visible: chosenRoomDelegate.visible && !root.room.canModifyParent(chosenRoomDelegate.roomId)
|
||||||
|
text: existingOfficialCheck.space ? (existingOfficialCheck.space.isSpace ? i18n("You do not have a high enough privilege level in the parent to set this state") : i18n("The selected room is not a space")) : i18n("You do not have the privileges to complete this action")
|
||||||
|
textItem.color: Kirigami.Theme.negativeTextColor
|
||||||
|
}
|
||||||
|
FormCard.FormCheckDelegate {
|
||||||
|
id: makeCanonicalCheck
|
||||||
|
text: i18n("Make this space the canonical parent")
|
||||||
|
checked: enabled
|
||||||
|
|
||||||
|
enabled: chosenRoomDelegate.visible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user