diff --git a/include/SideBarActions.h b/include/SideBarActions.h
index bf48c4da..7fbb7e67 100644
--- a/include/SideBarActions.h
+++ b/include/SideBarActions.h
@@ -1,10 +1,16 @@
#pragma once
+#include <QAction>
#include <QHBoxLayout>
#include <QResizeEvent>
#include <QWidget>
#include "FlatButton.h"
+#include "Menu.h"
+
+#include "dialogs/JoinRoom.h"
+
+class OverlayModal;
class SideBarActions : public QWidget
{
@@ -16,6 +22,7 @@ public:
signals:
void showSettings();
+ void joinRoom(const QString &room);
protected:
void resizeEvent(QResizeEvent *event) override;
@@ -23,6 +30,13 @@ protected:
private:
QHBoxLayout *layout_;
+ Menu *addMenu_;
+ QAction *createRoomAction_;
+ QAction *joinRoomAction_;
+
+ QSharedPointer<OverlayModal> joinRoomModal_;
+ QSharedPointer<dialogs::JoinRoom> joinRoomDialog_;
+
FlatButton *settingsBtn_;
FlatButton *createRoomBtn_;
FlatButton *joinRoomBtn_;
diff --git a/include/dialogs/JoinRoom.h b/include/dialogs/JoinRoom.h
index dbc06bdf..0c3f9188 100644
--- a/include/dialogs/JoinRoom.h
+++ b/include/dialogs/JoinRoom.h
@@ -1,9 +1,9 @@
#pragma once
#include <QFrame>
-#include <QLineEdit>
class FlatButton;
+class TextField;
namespace dialogs {
@@ -14,13 +14,16 @@ public:
JoinRoom(QWidget *parent = nullptr);
signals:
- void closing(bool isJoining, QString roomAlias);
+ void closing(bool isJoining, const QString &room);
+
+protected:
+ void paintEvent(QPaintEvent *event) override;
private:
FlatButton *confirmBtn_;
FlatButton *cancelBtn_;
- QLineEdit *roomAliasEdit_;
+ TextField *roomInput_;
};
} // dialogs
diff --git a/include/ui/TextField.h b/include/ui/TextField.h
index f66a7451..3682fbd2 100644
--- a/include/ui/TextField.h
+++ b/include/ui/TextField.h
@@ -17,6 +17,7 @@ class TextField : public QLineEdit
Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor)
Q_PROPERTY(QColor inkColor WRITE setInkColor READ inkColor)
+ Q_PROPERTY(QColor labelColor WRITE setLabelColor READ labelColor)
Q_PROPERTY(QColor underlineColor WRITE setUnderlineColor READ underlineColor)
Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor)
diff --git a/resources/styles/nheko-dark.qss b/resources/styles/nheko-dark.qss
index 84e21f8a..5704fee1 100644
--- a/resources/styles/nheko-dark.qss
+++ b/resources/styles/nheko-dark.qss
@@ -78,7 +78,8 @@ Avatar {
}
dialogs--Logout,
-dialogs--LeaveRoom {
+dialogs--LeaveRoom,
+dialogs--JoinRoom {
background-color: #383c4a;
color: #caccd1;
}
@@ -110,6 +111,7 @@ FloatingButton {
TextField {
qproperty-backgroundColor: #383c4e;
qproperty-inkColor: #caccd1;
+ qproperty-labelColor: #caccd1;
}
QLineEdit,
diff --git a/resources/styles/nheko.qss b/resources/styles/nheko.qss
index 115e4a2a..8ffe625b 100644
--- a/resources/styles/nheko.qss
+++ b/resources/styles/nheko.qss
@@ -80,7 +80,8 @@ Avatar {
}
dialogs--Logout,
-dialogs--LeaveRoom {
+dialogs--LeaveRoom,
+dialogs--JoinRoom {
background-color: white;
color: #333;
}
@@ -109,6 +110,12 @@ FloatingButton {
qproperty-foregroundColor: black;
}
+TextField {
+ qproperty-backgroundColor: white;
+ qproperty-inkColor: #333;
+ qproperty-labelColor: #333;
+}
+
ScrollBar {
qproperty-handleColor: #ccc;
qproperty-backgroundColor: #efefef;
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index 100c18f4..25b8fe66 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -68,6 +68,8 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
sidebarActions_ = new SideBarActions(this);
connect(
sidebarActions_, &SideBarActions::showSettings, this, &ChatPage::showUserSettingsPage);
+ connect(
+ sidebarActions_, &SideBarActions::joinRoom, client_.data(), &MatrixClient::joinRoom);
user_info_widget_ = new UserInfoWidget(sideBar_);
room_list_ = new RoomList(client, sideBar_);
diff --git a/src/SideBarActions.cc b/src/SideBarActions.cc
index 3e741406..f6e99270 100644
--- a/src/SideBarActions.cc
+++ b/src/SideBarActions.cc
@@ -1,6 +1,8 @@
#include <QIcon>
#include "Config.h"
+#include "MainWindow.h"
+#include "OverlayModal.h"
#include "SideBarActions.h"
#include "Theme.h"
@@ -27,12 +29,53 @@ SideBarActions::SideBarActions(QWidget *parent)
settingsBtn_->setIconSize(
QSize(conf::sidebarActions::iconSize, conf::sidebarActions::iconSize));
+ addMenu_ = new Menu(this);
+ createRoomAction_ = new QAction(tr("Create new room"), this);
+ joinRoomAction_ = new QAction(tr("Join a room"), this);
+
+ connect(joinRoomAction_, &QAction::triggered, this, [=]() {
+ if (joinRoomDialog_.isNull()) {
+ joinRoomDialog_ =
+ QSharedPointer<dialogs::JoinRoom>(new dialogs::JoinRoom(this));
+
+ connect(joinRoomDialog_.data(),
+ &dialogs::JoinRoom::closing,
+ this,
+ [=](bool isJoining, const QString &room) {
+ joinRoomModal_->fadeOut();
+
+ if (isJoining && !room.isEmpty())
+ emit joinRoom(room);
+ });
+ }
+
+ if (joinRoomModal_.isNull()) {
+ joinRoomModal_ = QSharedPointer<OverlayModal>(
+ new OverlayModal(MainWindow::instance(), joinRoomDialog_.data()));
+ joinRoomModal_->setDuration(0);
+ joinRoomModal_->setColor(QColor(30, 30, 30, 170));
+ }
+
+ joinRoomModal_->fadeIn();
+ });
+
+ addMenu_->addAction(createRoomAction_);
+ addMenu_->addAction(joinRoomAction_);
+
createRoomBtn_ = new FlatButton(this);
createRoomBtn_->setIcon(createRoomIcon);
createRoomBtn_->setCornerRadius(conf::sidebarActions::iconSize / 2);
createRoomBtn_->setIconSize(
QSize(conf::sidebarActions::iconSize, conf::sidebarActions::iconSize));
+ connect(createRoomBtn_, &QPushButton::clicked, this, [=]() {
+ auto pos = mapToGlobal(createRoomBtn_->pos());
+ auto padding = conf::sidebarActions::iconSize / 2;
+
+ addMenu_->popup(
+ QPoint(pos.x() + padding, pos.y() - padding - addMenu_->sizeHint().height()));
+ });
+
joinRoomBtn_ = new FlatButton(this);
joinRoomBtn_->setIcon(joinRoomIcon);
joinRoomBtn_->setCornerRadius(conf::sidebarActions::iconSize / 2);
diff --git a/src/dialogs/JoinRoom.cc b/src/dialogs/JoinRoom.cc
index 5b874011..59e1748d 100644
--- a/src/dialogs/JoinRoom.cc
+++ b/src/dialogs/JoinRoom.cc
@@ -1,8 +1,10 @@
#include <QLabel>
+#include <QStyleOption>
#include <QVBoxLayout>
#include "Config.h"
#include "FlatButton.h"
+#include "TextField.h"
#include "Theme.h"
#include "dialogs/JoinRoom.h"
@@ -35,17 +37,25 @@ JoinRoom::JoinRoom(QWidget *parent)
QFont font;
font.setPixelSize(conf::headerFontSize);
- auto label = new QLabel(tr("Room alias to join:"), this);
- label->setFont(font);
+ roomInput_ = new TextField(this);
+ roomInput_->setLabel(tr("Room ID or alias"));
- roomAliasEdit_ = new QLineEdit(this);
-
- layout->addWidget(label);
- layout->addWidget(roomAliasEdit_);
+ layout->addWidget(roomInput_);
layout->addLayout(buttonLayout);
+ // TODO: input validation with error messages.
connect(confirmBtn_, &QPushButton::clicked, [=]() {
- emit closing(true, roomAliasEdit_->text());
+ emit closing(true, roomInput_->text());
+ roomInput_->clear();
});
- connect(cancelBtn_, &QPushButton::clicked, [=]() { emit closing(false, nullptr); });
+ connect(cancelBtn_, &QPushButton::clicked, [=]() { emit closing(false, ""); });
+}
+
+void
+JoinRoom::paintEvent(QPaintEvent *)
+{
+ QStyleOption opt;
+ opt.init(this);
+ QPainter p(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
diff --git a/src/ui/TextField.cc b/src/ui/TextField.cc
index ff662a11..9b410ae5 100644
--- a/src/ui/TextField.cc
+++ b/src/ui/TextField.cc
@@ -127,6 +127,7 @@ void
TextField::setLabelColor(const QColor &color)
{
label_color_ = color;
+ update();
}
QColor
@@ -143,6 +144,7 @@ void
TextField::setInkColor(const QColor &color)
{
ink_color_ = color;
+ update();
}
QColor
@@ -159,6 +161,7 @@ void
TextField::setUnderlineColor(const QColor &color)
{
underline_color_ = color;
+ update();
}
QColor
|