From c986c63b84a5330ae33f8a147d68c58dd08fb0b4 Mon Sep 17 00:00:00 2001 From: Tobias Fella Date: Mon, 29 Jan 2024 23:12:51 +0100 Subject: [PATCH] Add a way for distros to recommend joining a space Implements #137 --- CMakeLists.txt | 5 +++ src/CMakeLists.txt | 6 +++ src/qml/RecommendedSpaceDialog.qml | 62 ++++++++++++++++++++++++++++++ src/qml/SpaceDrawer.qml | 35 +++++++++++++++++ src/spacehierarchycache.cpp | 37 ++++++++++++++++++ src/spacehierarchycache.h | 14 +++++++ 6 files changed, 159 insertions(+) create mode 100644 src/qml/RecommendedSpaceDialog.qml diff --git a/CMakeLists.txt b/CMakeLists.txt index cc2e418f3..5c548c117 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,11 @@ endif() set(QUOTIENT_FORCE_NAMESPACED_INCLUDES TRUE) +set(RECOMMENDED_SPACE_ID "" CACHE STRING "The matrix ID of a space that will be recommended to the user. Only relevant to distros") +set(RECOMMENDED_SPACE_DISPLAYNAME "" CACHE STRING "The displayname of a space that will be recommended to the user. Only relevant to distros") +set(RECOMMENDED_SPACE_AVATAR "" CACHE STRING "mxc url of a space that will be recommended to the user. Only relevant to distros") +set(RECOMMENDED_SPACE_DESCRIPTION "" CACHE STRING "Description of a space that will be recommended to the user. Only relevant to distros") + ecm_setup_version(${PROJECT_VERSION} VARIABLE_PREFIX NEOCHAT VERSION_HEADER ${CMAKE_CURRENT_BINARY_DIR}/neochat-version.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d6c72e62e..e9ab6a518 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -307,11 +307,17 @@ qt_add_qml_module(neochat URI org.kde.neochat NO_PLUGIN qml/ServerComboBox.qml qml/UserSearchPage.qml qml/ManualUserDialog.qml + qml/RecommendedSpaceDialog.qml RESOURCES qml/confetti.png qml/glowdot.png ) +target_compile_definitions(neochat PRIVATE "RECOMMENDED_SPACE_ID=\"${RECOMMENDED_SPACE_ID}\"") +target_compile_definitions(neochat PRIVATE "RECOMMENDED_SPACE_AVATAR=\"${RECOMMENDED_SPACE_AVATAR}\"") +target_compile_definitions(neochat PRIVATE "RECOMMENDED_SPACE_DESCRIPTION=\"${RECOMMENDED_SPACE_DESCRIPTION}\"") +target_compile_definitions(neochat PRIVATE "RECOMMENDED_SPACE_DISPLAYNAME=\"${RECOMMENDED_SPACE_DISPLAYNAME}\"") + configure_file(config-neochat.h.in ${CMAKE_CURRENT_BINARY_DIR}/config-neochat.h) if(WIN32) diff --git a/src/qml/RecommendedSpaceDialog.qml b/src/qml/RecommendedSpaceDialog.qml new file mode 100644 index 000000000..c95570a4e --- /dev/null +++ b/src/qml/RecommendedSpaceDialog.qml @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2024 Tobias Fella +// SPDX-License-Identifier: GPL-2.0-or-later + +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.components + +import org.kde.neochat + +FormCard.FormCardPage { + id: root + + property var connection + + title: i18nc("@title Join ", "Join %1", SpaceHierarchyCache.recommendedSpaceDisplayName) + + FormCard.FormHeader { + title: i18nc("@title", "Your distro recommends you join this space") + } + FormCard.FormCard { + FormCard.AbstractFormDelegate { + background: null + contentItem: RowLayout { + spacing: Kirigami.Units.largeSpacing * 4 + Avatar { + source: root.connection.makeMediaUrl(SpaceHierarchyCache.recommendedSpaceAvatar) + } + ColumnLayout { + Layout.fillWidth: true + Kirigami.Heading { + Layout.fillWidth: true + text: SpaceHierarchyCache.recommendedSpaceDisplayName + } + QQC2.Label { + Layout.fillWidth: true + text: SpaceHierarchyCache.recommendedSpaceDescription + } + } + } + + } + FormCard.FormDelegateSeparator {} + FormCard.FormButtonDelegate { + text: i18nc("@action:button", "Join") + onClicked: { + SpaceHierarchyCache.recommendedSpaceHidden = true + RoomManager.resolveResource(SpaceHierarchyCache.recommendedSpaceId, "join") + root.closeDialog() + } + } + FormCard.FormButtonDelegate { + text: i18nc("@action:button", "Ignore") + onClicked: { + SpaceHierarchyCache.recommendedSpaceHidden = true + root.closeDialog() + } + } + } +} diff --git a/src/qml/SpaceDrawer.qml b/src/qml/SpaceDrawer.qml index 8c23aa786..39eea7f57 100644 --- a/src/qml/SpaceDrawer.qml +++ b/src/qml/SpaceDrawer.qml @@ -176,6 +176,41 @@ QQC2.Control { } } + AvatarTabButton { + id: recommendedSpaceButton + Layout.fillWidth: true + Layout.preferredHeight: width - Kirigami.Units.smallSpacing + Layout.maximumHeight: width - Kirigami.Units.smallSpacing + + visible: SpaceHierarchyCache.recommendedSpaceId.length > 0 && !root.connection.room(SpaceHierarchyCache.recommendedSpaceId) && !SpaceHierarchyCache.recommendedSpaceHidden + + text: i18nc("Join ", "Join %1", SpaceHierarchyCache.recommendedSpaceDisplayName) + source: root.connection.makeMediaUrl(SpaceHierarchyCache.recommendedSpaceAvatar) + onClicked: { + let dialog = pageStack.pushDialogLayer(Qt.resolvedUrl("qrc:/org/kde/neochat/qml/RecommendedSpaceDialog.qml"), { + connection: root.connection + }, { + title: i18nc("@title Join ", "Join %1", SpaceHierarchyCache.recommendedSpaceDisplayName) + }); + } + Rectangle { + color: Kirigami.Theme.backgroundColor + width: Kirigami.Units.gridUnit * 1.5 + height: width + anchors.bottom: parent.bottom + anchors.bottomMargin: Kirigami.Units.smallSpacing + anchors.rightMargin: Kirigami.Units.smallSpacing * 2 + anchors.right: parent.right + radius: width / 2 + z: parent.z + 1 + Kirigami.Icon { + anchors.fill: parent + z: parent + 1 + source: "list-add" + } + } + } + Kirigami.Separator { Layout.fillWidth: true Layout.topMargin: Kirigami.Units.smallSpacing / 2 diff --git a/src/spacehierarchycache.cpp b/src/spacehierarchycache.cpp index db8331745..44e955cca 100644 --- a/src/spacehierarchycache.cpp +++ b/src/spacehierarchycache.cpp @@ -6,6 +6,9 @@ #include #include +#include +#include + #include "neochatroom.h" using namespace Quotient; @@ -111,4 +114,38 @@ void SpaceHierarchyCache::setConnection(NeoChatConnection *connection) connect(connection, &Connection::aboutToDeleteRoom, this, &SpaceHierarchyCache::removeSpaceFromHierarchy); } +QString SpaceHierarchyCache::recommendedSpaceId() const +{ + return QStringLiteral(RECOMMENDED_SPACE_ID); +} + +QString SpaceHierarchyCache::recommendedSpaceAvatar() const +{ + return QStringLiteral(RECOMMENDED_SPACE_AVATAR); +} + +QString SpaceHierarchyCache::recommendedSpaceDisplayName() const +{ + return QStringLiteral(RECOMMENDED_SPACE_DISPLAYNAME); +} + +QString SpaceHierarchyCache::recommendedSpaceDescription() const +{ + return QStringLiteral(RECOMMENDED_SPACE_DESCRIPTION); +} + +bool SpaceHierarchyCache::recommendedSpaceHidden() const +{ + KConfigGroup group(KSharedConfig::openStateConfig(), QStringLiteral("recommendedSpace")); + return group.readEntry(QStringLiteral("hidden"), false); +} + +void SpaceHierarchyCache::setRecommendedSpaceHidden(bool hidden) +{ + KConfigGroup group(KSharedConfig::openStateConfig(), QStringLiteral("recommendedSpace")); + group.writeEntry(QStringLiteral("hidden"), hidden); + group.sync(); + Q_EMIT recommendedSpaceHiddenChanged(); +} + #include "moc_spacehierarchycache.cpp" diff --git a/src/spacehierarchycache.h b/src/spacehierarchycache.h index 17b8e5314..0809fd410 100644 --- a/src/spacehierarchycache.h +++ b/src/spacehierarchycache.h @@ -31,6 +31,11 @@ class SpaceHierarchyCache : public QObject QML_SINGLETON Q_PROPERTY(NeoChatConnection *connection READ connection WRITE setConnection NOTIFY connectionChanged) + Q_PROPERTY(QString recommendedSpaceId READ recommendedSpaceId CONSTANT) + Q_PROPERTY(QString recommendedSpaceAvatar READ recommendedSpaceAvatar CONSTANT) + Q_PROPERTY(QString recommendedSpaceDisplayName READ recommendedSpaceDisplayName CONSTANT) + Q_PROPERTY(QString recommendedSpaceDescription READ recommendedSpaceDescription CONSTANT) + Q_PROPERTY(bool recommendedSpaceHidden READ recommendedSpaceHidden WRITE setRecommendedSpaceHidden NOTIFY recommendedSpaceHiddenChanged) public: static SpaceHierarchyCache &instance() @@ -57,9 +62,18 @@ public: NeoChatConnection *connection() const; void setConnection(NeoChatConnection *connection); + QString recommendedSpaceId() const; + QString recommendedSpaceAvatar() const; + QString recommendedSpaceDisplayName() const; + QString recommendedSpaceDescription() const; + + bool recommendedSpaceHidden() const; + void setRecommendedSpaceHidden(bool hidden); + Q_SIGNALS: void spaceHierarchyChanged(); void connectionChanged(); + void recommendedSpaceHiddenChanged(); private Q_SLOTS: void addSpaceToHierarchy(Quotient::Room *room);