diff --git a/src/controller.cpp b/src/controller.cpp index 7ace239f2..e393547fb 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -371,36 +371,6 @@ void Controller::saveWindowGeometry() WindowController::instance().saveGeometry(); } -void Controller::createRoom(const QString &name, const QString &topic) -{ - auto createRoomJob = m_connection->createRoom(Connection::PublishRoom, QString(), name, topic, QStringList()); - connect(createRoomJob, &CreateRoomJob::failure, this, [this, createRoomJob] { - Q_EMIT errorOccured(i18n("Room creation failed: %1", createRoomJob->errorString())); - }); - connectSingleShot(this, &Controller::roomAdded, &RoomManager::instance(), &RoomManager::enterRoom, Qt::QueuedConnection); -} - -void Controller::createSpace(const QString &name, const QString &topic) -{ - auto createRoomJob = m_connection->createRoom(Connection::UnpublishRoom, - {}, - name, - topic, - QStringList(), - {}, - {}, - false, - {}, - {}, - QJsonObject{ - {"type"_ls, "m.space"_ls}, - }); - connect(createRoomJob, &CreateRoomJob::failure, this, [this, createRoomJob] { - Q_EMIT errorOccured(i18n("Space creation failed: %1", createRoomJob->errorString())); - }); - connectSingleShot(this, &Controller::roomAdded, &RoomManager::instance(), &RoomManager::enterRoom, Qt::QueuedConnection); -} - bool Controller::isOnline() const { return m_isOnline; diff --git a/src/controller.h b/src/controller.h index f88aef2b8..72d82df01 100644 --- a/src/controller.h +++ b/src/controller.h @@ -113,16 +113,6 @@ public: */ bool saveAccessTokenToKeyChain(const Quotient::AccountSettings &account, const QByteArray &accessToken); - /** - * @brief Create new room for a group chat. - */ - Q_INVOKABLE void createRoom(const QString &name, const QString &topic); - - /** - * @brief Create new space. - */ - Q_INVOKABLE void createSpace(const QString &name, const QString &topic); - /** * @brief Join a room. */ @@ -216,7 +206,6 @@ Q_SIGNALS: void userConsentRequired(QUrl url); void isOnlineChanged(bool isOnline); void activeConnectionIndexChanged(); - void roomAdded(NeoChatRoom *room); public Q_SLOTS: void saveWindowGeometry(); diff --git a/src/models/roomlistmodel.cpp b/src/models/roomlistmodel.cpp index bb250103c..0dc1a656d 100644 --- a/src/models/roomlistmodel.cpp +++ b/src/models/roomlistmodel.cpp @@ -144,7 +144,6 @@ void RoomListModel::doAddRoom(Room *r) m_rooms.append(room); connectRoomSignals(room); Q_EMIT roomAdded(room); - Q_EMIT Controller::instance().roomAdded(room); } else { qCritical() << "Attempt to add nullptr to the room list"; Q_ASSERT(false); diff --git a/src/neochatconnection.cpp b/src/neochatconnection.cpp index c611e7c8b..d76313652 100644 --- a/src/neochatconnection.cpp +++ b/src/neochatconnection.cpp @@ -8,6 +8,7 @@ #include "controller.h" #include "jobs/neochatchangepasswordjob.h" #include "jobs/neochatdeactivateaccountjob.h" +#include "roommanager.h" #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include @@ -15,8 +16,11 @@ #include #endif +#include + #include #include +#include #include #include @@ -156,4 +160,26 @@ void NeoChatConnection::deactivateAccount(const QString &password) }); } +void NeoChatConnection::createRoom(const QString &name, const QString &topic) +{ + const auto job = Connection::createRoom(Connection::PublishRoom, {}, name, topic, {}); + connect(job, &CreateRoomJob::failure, this, [this, job] { + Q_EMIT Controller::instance().errorOccured(i18n("Room creation failed: %1", job->errorString())); + }); + connectSingleShot(this, &Connection::newRoom, this, [](Room *room) { + RoomManager::instance().enterRoom(dynamic_cast(room)); + }); +} + +void NeoChatConnection::createSpace(const QString &name, const QString &topic) +{ + const auto job = Connection::createRoom(Connection::UnpublishRoom, {}, name, topic, {}, {}, {}, false, {}, {}, QJsonObject{{"type"_ls, "m.space"_ls}}); + connect(job, &CreateRoomJob::failure, this, [this, job] { + Q_EMIT Controller::instance().errorOccured(i18n("Space creation failed: %1", job->errorString())); + }); + connectSingleShot(this, &Connection::newRoom, this, [](Room *room) { + RoomManager::instance().enterRoom(dynamic_cast(room)); + }); +} + #include "moc_neochatconnection.cpp" diff --git a/src/neochatconnection.h b/src/neochatconnection.h index c4c1bf344..907fd3e7f 100644 --- a/src/neochatconnection.h +++ b/src/neochatconnection.h @@ -48,6 +48,16 @@ public: Q_INVOKABLE void deactivateAccount(const QString &password); + /** + * @brief Create new room for a group chat. + */ + Q_INVOKABLE void createRoom(const QString &name, const QString &topic); + + /** + * @brief Create new space. + */ + Q_INVOKABLE void createSpace(const QString &name, const QString &topic); + Q_SIGNALS: void labelChanged(); }; diff --git a/src/qml/Dialog/CreateRoomDialog.qml b/src/qml/Dialog/CreateRoomDialog.qml index d3e41bf04..7eabc0a66 100644 --- a/src/qml/Dialog/CreateRoomDialog.qml +++ b/src/qml/Dialog/CreateRoomDialog.qml @@ -12,6 +12,8 @@ FormCard.FormCardPage { title: i18nc("@title", "Create a Room") + required property NeoChatConnection connection + Component.onCompleted: roomNameField.forceActiveFocus() FormCard.FormHeader { @@ -35,7 +37,7 @@ FormCard.FormCardPage { text: i18nc("@action:button", "Ok") enabled: roomNameField.text.length > 0 onClicked: { - Controller.createRoom(roomNameField.text, roomTopicField.text); + root.connection.createRoom(roomNameField.text, roomTopicField.text); root.closeDialog() } } diff --git a/src/qml/Dialog/CreateSpaceDialog.qml b/src/qml/Dialog/CreateSpaceDialog.qml index 6396f77d2..40199be5b 100644 --- a/src/qml/Dialog/CreateSpaceDialog.qml +++ b/src/qml/Dialog/CreateSpaceDialog.qml @@ -11,6 +11,8 @@ import org.kde.kirigamiaddons.formcard 1.0 as FormCard FormCard.FormCardPage { id: root + required property NeoChatConnection connection + title: i18n("Create a Space") Kirigami.Theme.colorSet: Kirigami.Theme.Window @@ -30,7 +32,7 @@ FormCard.FormCardPage { FormCard.FormButtonDelegate { text: i18n("Create space") onClicked: { - Controller.createSpace(nameDelegate.text, topicDelegate.text) + root.connection.createSpace(nameDelegate.text, topicDelegate.text) root.close() root.destroy() } diff --git a/src/qml/Page/RoomList/ExploreComponent.qml b/src/qml/Page/RoomList/ExploreComponent.qml index abf7593e0..ec434868c 100644 --- a/src/qml/Page/RoomList/ExploreComponent.qml +++ b/src/qml/Page/RoomList/ExploreComponent.qml @@ -14,6 +14,7 @@ RowLayout { property var desiredWidth property bool collapsed: false + required property NeoChatConnection connection property Kirigami.Action exploreAction: Kirigami.Action { text: i18n("Explore rooms") @@ -38,7 +39,7 @@ RowLayout { text: i18n("Create a Room") icon.name: "system-users" onTriggered: { - pageStack.pushDialogLayer("qrc:/CreateRoomDialog.qml", {}, {title: i18nc("@title", "Create a Room")}) + pageStack.pushDialogLayer("qrc:/CreateRoomDialog.qml", {connection: root.connection}, {title: i18nc("@title", "Create a Room")}) } shortcut: StandardKey.New } @@ -46,7 +47,7 @@ RowLayout { text: i18n("Create a Space") icon.name: "list-add" onTriggered: { - pageStack.pushDialogLayer("qrc:/CreateSpaceDialog.qml", {}, {title: i18nc("@title", "Create a Space")}) + pageStack.pushDialogLayer("qrc:/CreateSpaceDialog.qml", {connection: root.connection}, {title: i18nc("@title", "Create a Space")}) } } diff --git a/src/qml/Page/RoomList/Page.qml b/src/qml/Page/RoomList/Page.qml index 627277006..dbf4d190f 100644 --- a/src/qml/Page/RoomList/Page.qml +++ b/src/qml/Page/RoomList/Page.qml @@ -89,6 +89,7 @@ Kirigami.Page { Layout.fillWidth: true desiredWidth: root.width - Kirigami.Units.largeSpacing collapsed: root.collapsed + connection: root.connection } padding: 0 diff --git a/src/qml/main.qml b/src/qml/main.qml index a5421c895..74fb1a68d 100644 --- a/src/qml/main.qml +++ b/src/qml/main.qml @@ -320,12 +320,16 @@ Kirigami.ApplicationWindow { Component { id: createRoomDialog - CreateRoomDialog {} + CreateRoomDialog { + connection: Controller.activeConnection + } } Component { id: createSpaceDialog - CreateSpaceDialog {} + CreateSpaceDialog { + connection: Controller.activeConnection + } } Component {