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_;