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 #include #include #include #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 joinRoomModal_; + QSharedPointer 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 -#include 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 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 #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(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( + 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 +#include #include #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