From e9ed12e27bcbc4f4a256e8e3840c1022fd14872e Mon Sep 17 00:00:00 2001 From: Loren Burkholder Date: Fri, 24 Sep 2021 21:32:06 -0400 Subject: [PATCH] QML the join room dialog --- CMakeLists.txt | 2 - resources/qml/Root.qml | 12 ++++ resources/qml/dialogs/JoinRoomDialog.qml | 64 +++++++++++++++++++++ resources/res.qrc | 23 ++++---- src/MainWindow.cpp | 13 ----- src/MainWindow.h | 2 +- src/dialogs/JoinRoom.cpp | 73 ------------------------ src/dialogs/JoinRoom.h | 36 ------------ src/ui/NhekoGlobalObject.cpp | 8 +-- src/ui/NhekoGlobalObject.h | 3 +- 10 files changed, 92 insertions(+), 144 deletions(-) create mode 100644 resources/qml/dialogs/JoinRoomDialog.qml delete mode 100644 src/dialogs/JoinRoom.cpp delete mode 100644 src/dialogs/JoinRoom.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a3b344b8..761e42be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,7 +281,6 @@ set(SRC_FILES src/dialogs/CreateRoom.cpp src/dialogs/FallbackAuth.cpp src/dialogs/ImageOverlay.cpp - src/dialogs/JoinRoom.cpp src/dialogs/LeaveRoom.cpp src/dialogs/Logout.cpp src/dialogs/PreviewUploadOverlay.cpp @@ -496,7 +495,6 @@ qt5_wrap_cpp(MOC_HEADERS src/dialogs/CreateRoom.h src/dialogs/FallbackAuth.h src/dialogs/ImageOverlay.h - src/dialogs/JoinRoom.h src/dialogs/LeaveRoom.h src/dialogs/Logout.h src/dialogs/PreviewUploadOverlay.h diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml index 29da45eb..2c4dac0d 100644 --- a/resources/qml/Root.qml +++ b/resources/qml/Root.qml @@ -118,6 +118,13 @@ Page { } } + Component { + id: joinRoomDialog + + JoinRoomDialog { + } + } + Shortcut { sequence: "Ctrl+K" onActivated: { @@ -148,6 +155,11 @@ Page { dialog.open(); } + function onOpenJoinRoomDialog() { + var dialog = joinRoomDialog.createObject(timelineRoot); + dialog.show(); + } + target: Nheko } diff --git a/resources/qml/dialogs/JoinRoomDialog.qml b/resources/qml/dialogs/JoinRoomDialog.qml new file mode 100644 index 00000000..25400e40 --- /dev/null +++ b/resources/qml/dialogs/JoinRoomDialog.qml @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +import ".." +import QtQuick 2.12 +import QtQuick.Controls 2.5 +import QtQuick.Layouts 1.3 +import im.nheko 1.0 + +ApplicationWindow { + id: joinRoomRoot + + title: qsTr("Join room") + modality: Qt.WindowModal + flags: Qt.Dialog | Qt.WindowCloseButtonHint | Qt.WindowTitleHint + palette: Nheko.colors + color: Nheko.colors.window + Component.onCompleted: Nheko.reparent(joinRoomRoot) + width: 350 + height: fontMetrics.lineSpacing * 7 + + ColumnLayout { + spacing: Nheko.paddingMedium + anchors.margins: Nheko.paddingMedium + anchors.fill: parent + + Label { + id: promptLabel + + text: qsTr("Room ID or alias") + color: Nheko.colors.text + } + + MatrixTextField { + id: input + + Layout.fillWidth: true + } + + } + + footer: DialogButtonBox { + onAccepted: { + Nheko.joinRoom(input.text); + joinRoomRoot.close(); + } + onRejected: { + joinRoomRoot.close(); + } + + Button { + text: "Join" + enabled: input.text.match("#.+?:.{3,}") + DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole + } + + Button { + text: "Cancel" + DialogButtonBox.buttonRole: DialogButtonBox.RejectRole + } + } + +} diff --git a/resources/res.qrc b/resources/res.qrc index c18a6109..e017b789 100644 --- a/resources/res.qrc +++ b/resources/res.qrc @@ -158,10 +158,19 @@ qml/device-verification/EmojiVerification.qml qml/device-verification/NewVerificationRequest.qml qml/device-verification/Failed.qml - qml/device-verification/Success.qml - qml/dialogs/InputDialog.qml + qml/device-verification/Success.qml qml/dialogs/ImagePackSettingsDialog.qml qml/dialogs/ImagePackEditorDialog.qml + qml/dialogs/InputDialog.qml + qml/dialogs/InviteDialog.qml + qml/dialogs/JoinRoomDialog.qml + qml/dialogs/LogoutDialog.qml + qml/dialogs/RawMessageDialog.qml + qml/dialogs/ReadReceipts.qml + qml/dialogs/RoomDirectory.qml + qml/dialogs/RoomMembers.qml + qml/dialogs/RoomSettings.qml + qml/dialogs/UserProfile.qml qml/ui/Ripple.qml qml/ui/Spinner.qml qml/ui/animations/BlinkAnimation.qml @@ -176,15 +185,7 @@ qml/components/AdaptiveLayout.qml qml/components/AdaptiveLayoutElement.qml qml/components/AvatarListTile.qml - qml/components/FlatButton.qml - qml/dialogs/InviteDialog.qml - qml/dialogs/RawMessageDialog.qml - qml/dialogs/ReadReceipts.qml - qml/dialogs/RoomDirectory.qml - qml/dialogs/RoomMembers.qml - qml/dialogs/RoomSettings.qml - qml/dialogs/UserProfile.qml - qml/dialogs/LogoutDialog.qml + qml/components/FlatButton.qml media/ring.ogg diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 0978fc25..777b5b22 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -33,7 +33,6 @@ #include "ui/SnackBar.h" #include "dialogs/CreateRoom.h" -#include "dialogs/JoinRoom.h" #include "dialogs/LeaveRoom.h" MainWindow *MainWindow::instance_ = nullptr; @@ -324,18 +323,6 @@ MainWindow::showOverlayProgressBar() showSolidOverlayModal(spinner_); } -void -MainWindow::openJoinRoomDialog(std::function callback) -{ - auto dialog = new dialogs::JoinRoom(this); - connect(dialog, &dialogs::JoinRoom::joinRoom, this, [callback](const QString &room) { - if (!room.isEmpty()) - callback(room); - }); - - showDialog(dialog); -} - void MainWindow::openCreateRoomDialog( std::function callback) diff --git a/src/MainWindow.h b/src/MainWindow.h index a3c3c767..01575a19 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -37,7 +37,6 @@ struct CreateRoom; namespace dialogs { class CreateRoom; class InviteUsers; -class JoinRoom; class LeaveRoom; class Logout; class MemberList; @@ -64,6 +63,7 @@ public: void openCreateRoomDialog( std::function callback); void openJoinRoomDialog(std::function callback); + void openLogoutDialog(); void hideOverlay(); void showSolidOverlayModal(QWidget *content, QFlags flags = Qt::AlignCenter); diff --git a/src/dialogs/JoinRoom.cpp b/src/dialogs/JoinRoom.cpp deleted file mode 100644 index 76baf857..00000000 --- a/src/dialogs/JoinRoom.cpp +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include -#include -#include - -#include "dialogs/JoinRoom.h" - -#include "Config.h" -#include "ui/TextField.h" - -using namespace dialogs; - -JoinRoom::JoinRoom(QWidget *parent) - : QFrame(parent) -{ - setAutoFillBackground(true); - setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); - setWindowModality(Qt::WindowModal); - setAttribute(Qt::WA_DeleteOnClose, true); - - setMinimumWidth(conf::modals::MIN_WIDGET_WIDTH); - setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - - auto layout = new QVBoxLayout(this); - layout->setSpacing(conf::modals::WIDGET_SPACING); - layout->setMargin(conf::modals::WIDGET_MARGIN); - - auto buttonLayout = new QHBoxLayout(); - buttonLayout->setSpacing(15); - - confirmBtn_ = new QPushButton(tr("Join"), this); - confirmBtn_->setDefault(true); - cancelBtn_ = new QPushButton(tr("Cancel"), this); - - buttonLayout->addStretch(1); - buttonLayout->addWidget(cancelBtn_); - buttonLayout->addWidget(confirmBtn_); - - roomInput_ = new TextField(this); - roomInput_->setLabel(tr("Room ID or alias")); - - layout->addWidget(roomInput_); - layout->addLayout(buttonLayout); - layout->addStretch(1); - - connect(roomInput_, &QLineEdit::returnPressed, this, &JoinRoom::handleInput); - connect(confirmBtn_, &QPushButton::clicked, this, &JoinRoom::handleInput); - connect(cancelBtn_, &QPushButton::clicked, this, &JoinRoom::close); -} - -void -JoinRoom::handleInput() -{ - if (roomInput_->text().isEmpty()) - return; - - // TODO: input validation with error messages. - emit joinRoom(roomInput_->text()); - roomInput_->clear(); - - emit close(); -} - -void -JoinRoom::showEvent(QShowEvent *event) -{ - roomInput_->setFocus(); - - QFrame::showEvent(event); -} diff --git a/src/dialogs/JoinRoom.h b/src/dialogs/JoinRoom.h deleted file mode 100644 index 11c54d7c..00000000 --- a/src/dialogs/JoinRoom.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include - -class QPushButton; -class TextField; - -namespace dialogs { - -class JoinRoom : public QFrame -{ - Q_OBJECT -public: - JoinRoom(QWidget *parent = nullptr); - -signals: - void joinRoom(const QString &room); - -protected: - void showEvent(QShowEvent *event) override; - -private slots: - void handleInput(); - -private: - QPushButton *confirmBtn_; - QPushButton *cancelBtn_; - - TextField *roomInput_; -}; - -} // dialogs diff --git a/src/ui/NhekoGlobalObject.cpp b/src/ui/NhekoGlobalObject.cpp index d687a308..11fc5681 100644 --- a/src/ui/NhekoGlobalObject.cpp +++ b/src/ui/NhekoGlobalObject.cpp @@ -21,6 +21,7 @@ Nheko::Nheko() connect( UserSettings::instance().get(), &UserSettings::themeChanged, this, &Nheko::colorsChanged); connect(ChatPage::instance(), &ChatPage::contentLoaded, this, &Nheko::updateUserProfile); + connect(this, &Nheko::joinRoom, ChatPage::instance(), &ChatPage::joinRoom); } void @@ -96,13 +97,6 @@ Nheko::openCreateRoomDialog() const [](const mtx::requests::CreateRoom &req) { ChatPage::instance()->createRoom(req); }); } -void -Nheko::openJoinRoomDialog() const -{ - MainWindow::instance()->openJoinRoomDialog( - [](const QString &room_id) { ChatPage::instance()->joinRoom(room_id); }); -} - void Nheko::reparent(QWindow *win) const { diff --git a/src/ui/NhekoGlobalObject.h b/src/ui/NhekoGlobalObject.h index 64aad941..c70813c5 100644 --- a/src/ui/NhekoGlobalObject.h +++ b/src/ui/NhekoGlobalObject.h @@ -50,7 +50,6 @@ public: Q_INVOKABLE void showUserSettingsPage() const; Q_INVOKABLE void logout() const; Q_INVOKABLE void openCreateRoomDialog() const; - Q_INVOKABLE void openJoinRoomDialog() const; Q_INVOKABLE void reparent(QWindow *win) const; public slots: @@ -61,6 +60,8 @@ signals: void profileChanged(); void openLogoutDialog(); + void openJoinRoomDialog(); + void joinRoom(QString roomId); private: QScopedPointer currentUser_;