summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-11 23:00:37 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-11 23:00:37 +0200
commit544b62351212188449851b7092cf229091c6f612 (patch)
treeb4201211717b25fc90819a1291e8a16373bd7aea /src
parent3c5241ccd00b1e920386843b0a8d92ae09c6614a (diff)
Add dialog to create rooms
fixes #25
Diffstat (limited to 'src')
-rw-r--r--src/ChatPage.cc7
-rw-r--r--src/MatrixClient.cc43
-rw-r--r--src/SideBarActions.cc27
-rw-r--r--src/dialogs/CreateRoom.cc152
4 files changed, 229 insertions, 0 deletions
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index dfae487d..4f03026d 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -70,6 +70,8 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
sidebarActions_, &SideBarActions::showSettings, this, &ChatPage::showUserSettingsPage);
connect(
sidebarActions_, &SideBarActions::joinRoom, client_.data(), &MatrixClient::joinRoom);
+ connect(
+ sidebarActions_, &SideBarActions::createRoom, client_.data(), &MatrixClient::createRoom);
user_info_widget_ = new UserInfoWidget(sideBar_);
room_list_ = new RoomList(client, sideBar_);
@@ -202,6 +204,8 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
client_->uploadAudio(current_room_, filename);
});
+ connect(
+ client_.data(), &MatrixClient::roomCreationFailed, this, &ChatPage::showNotification);
connect(client_.data(), &MatrixClient::joinFailed, this, &ChatPage::showNotification);
connect(client_.data(),
&MatrixClient::imageUploaded,
@@ -268,6 +272,9 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
connect(client_.data(), &MatrixClient::invitedUser, this, [=](QString, QString user) {
emit showNotification(QString("Invited user %1").arg(user));
});
+ connect(client_.data(), &MatrixClient::roomCreated, this, [=](QString room_id) {
+ emit showNotification(QString("Room %1 created").arg(room_id));
+ });
connect(client_.data(), &MatrixClient::leftRoom, this, &ChatPage::removeRoom);
showContentTimer_ = new QTimer(this);
diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc
index b18b6e4a..4634345b 100644
--- a/src/MatrixClient.cc
+++ b/src/MatrixClient.cc
@@ -890,6 +890,49 @@ MatrixClient::inviteUser(const QString &roomId, const QString &user)
emit invitedUser(roomId, user);
});
}
+
+void
+MatrixClient::createRoom(const mtx::requests::CreateRoom &create_room_request)
+{
+ QUrlQuery query;
+ query.addQueryItem("access_token", token_);
+
+ QUrl endpoint(server_);
+ endpoint.setPath(clientApiUrl_ + QString("/createRoom"));
+ endpoint.setQuery(query);
+
+ QNetworkRequest request(endpoint);
+ request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/json");
+
+ nlohmann::json body = create_room_request;
+ auto reply = post(request, QString::fromStdString(body.dump()).toUtf8());
+
+ connect(reply, &QNetworkReply::finished, this, [this, reply]() {
+ reply->deleteLater();
+
+ int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+
+ if (status == 0 || status >= 400) {
+ auto data = reply->readAll();
+ auto response = QJsonDocument::fromJson(data);
+ auto json = response.object();
+
+ if (json.contains("error"))
+ emit roomCreationFailed(json["error"].toString());
+ else
+ qDebug() << reply->errorString();
+
+ return;
+ }
+
+ auto data = reply->readAll();
+ auto response = QJsonDocument::fromJson(data);
+ auto room_id = response.object()["room_id"].toString();
+
+ emit roomCreated(room_id);
+ });
+}
+
void
MatrixClient::sendTypingNotification(const QString &roomid, int timeoutInMillis)
{
diff --git a/src/SideBarActions.cc b/src/SideBarActions.cc
index f6e99270..c09821ff 100644
--- a/src/SideBarActions.cc
+++ b/src/SideBarActions.cc
@@ -1,3 +1,4 @@
+#include <QDebug>
#include <QIcon>
#include "Config.h"
@@ -59,6 +60,32 @@ SideBarActions::SideBarActions(QWidget *parent)
joinRoomModal_->fadeIn();
});
+ connect(createRoomAction_, &QAction::triggered, this, [=]() {
+ if (createRoomDialog_.isNull()) {
+ createRoomDialog_ =
+ QSharedPointer<dialogs::CreateRoom>(new dialogs::CreateRoom(this));
+
+ connect(createRoomDialog_.data(),
+ &dialogs::CreateRoom::closing,
+ this,
+ [=](bool isCreating, const mtx::requests::CreateRoom &request) {
+ createRoomModal_->fadeOut();
+
+ if (isCreating)
+ emit createRoom(request);
+ });
+ }
+
+ if (createRoomModal_.isNull()) {
+ createRoomModal_ = QSharedPointer<OverlayModal>(
+ new OverlayModal(MainWindow::instance(), createRoomDialog_.data()));
+ createRoomModal_->setDuration(0);
+ createRoomModal_->setColor(QColor(30, 30, 30, 170));
+ }
+
+ createRoomModal_->fadeIn();
+ });
+
addMenu_->addAction(createRoomAction_);
addMenu_->addAction(joinRoomAction_);
diff --git a/src/dialogs/CreateRoom.cc b/src/dialogs/CreateRoom.cc
new file mode 100644
index 00000000..c46636ab
--- /dev/null
+++ b/src/dialogs/CreateRoom.cc
@@ -0,0 +1,152 @@
+#include <QComboBox>
+#include <QLabel>
+#include <QStyleOption>
+#include <QVBoxLayout>
+
+#include "Config.h"
+#include "FlatButton.h"
+#include "TextField.h"
+#include "Theme.h"
+#include "ToggleButton.h"
+
+#include "dialogs/CreateRoom.h"
+
+using namespace dialogs;
+
+CreateRoom::CreateRoom(QWidget *parent)
+ : QFrame(parent)
+{
+ setMaximumSize(520, 600);
+
+ auto layout = new QVBoxLayout(this);
+ layout->setSpacing(30);
+ layout->setMargin(20);
+
+ auto buttonLayout = new QHBoxLayout();
+ buttonLayout->setSpacing(0);
+ buttonLayout->setMargin(0);
+
+ confirmBtn_ = new FlatButton("CREATE", this);
+ confirmBtn_->setFontSize(conf::btn::fontSize);
+
+ cancelBtn_ = new FlatButton(tr("CANCEL"), this);
+ cancelBtn_->setFontSize(conf::btn::fontSize);
+
+ buttonLayout->addStretch(1);
+ buttonLayout->addWidget(confirmBtn_);
+ buttonLayout->addWidget(cancelBtn_);
+
+ QFont font;
+ font.setPixelSize(conf::headerFontSize);
+
+ nameInput_ = new TextField(this);
+ nameInput_->setLabel(tr("Name"));
+
+ topicInput_ = new TextField(this);
+ topicInput_->setLabel(tr("Topic"));
+
+ aliasInput_ = new TextField(this);
+ aliasInput_->setLabel(tr("Alias"));
+
+ auto visibilityLayout = new QHBoxLayout;
+ visibilityLayout->setContentsMargins(0, 10, 0, 10);
+
+ auto presetLayout = new QHBoxLayout;
+ presetLayout->setContentsMargins(0, 10, 0, 10);
+
+ auto visibilityLabel = new QLabel(tr("Room visibility"), this);
+ visibilityCombo_ = new QComboBox(this);
+ visibilityCombo_->addItem("Private");
+ visibilityCombo_->addItem("Public");
+
+ visibilityLayout->addWidget(visibilityLabel);
+ visibilityLayout->addWidget(visibilityCombo_, 0, Qt::AlignBottom | Qt::AlignRight);
+
+ auto presetLabel = new QLabel(tr("Room preset"), this);
+ presetCombo_ = new QComboBox(this);
+ presetCombo_->addItem("Private Chat");
+ presetCombo_->addItem("Public Chat");
+ presetCombo_->addItem("Trusted Private Chat");
+
+ presetLayout->addWidget(presetLabel);
+ presetLayout->addWidget(presetCombo_, 0, Qt::AlignBottom | Qt::AlignRight);
+
+ auto directLabel_ = new QLabel(tr("Direct Chat"), this);
+ directToggle_ = new Toggle(this);
+ directToggle_->setActiveColor(QColor("#38A3D8"));
+ directToggle_->setInactiveColor(QColor("gray"));
+ directToggle_->setState(true);
+ directLabel_->setStyleSheet("font-size: 15px;");
+
+ auto directLayout = new QHBoxLayout;
+ directLayout->setContentsMargins(0, 10, 0, 10);
+ directLayout->addWidget(directLabel_);
+ directLayout->addWidget(directToggle_, 0, Qt::AlignBottom | Qt::AlignRight);
+
+ layout->addWidget(nameInput_);
+ layout->addWidget(topicInput_);
+ layout->addWidget(aliasInput_);
+ layout->addLayout(visibilityLayout);
+ layout->addLayout(presetLayout);
+ layout->addLayout(directLayout);
+ layout->addLayout(buttonLayout);
+
+ connect(confirmBtn_, &QPushButton::clicked, this, [=]() {
+ request_.name = nameInput_->text().toStdString();
+ request_.topic = topicInput_->text().toStdString();
+ request_.room_alias_name = aliasInput_->text().toStdString();
+
+ emit closing(true, request_);
+
+ clearFields();
+ });
+
+ connect(cancelBtn_, &QPushButton::clicked, this, [=]() {
+ emit closing(false, request_);
+
+ clearFields();
+ });
+
+ connect(visibilityCombo_,
+ static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::activated),
+ [=](const QString &text) {
+ if (text == "Private") {
+ request_.visibility = mtx::requests::Visibility::Private;
+ } else {
+ request_.visibility = mtx::requests::Visibility::Public;
+ }
+ });
+
+ connect(presetCombo_,
+ static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::activated),
+ [=](const QString &text) {
+ if (text == "Private Chat") {
+ request_.preset = mtx::requests::Preset::PrivateChat;
+ } else if (text == "Public Chat") {
+ request_.preset = mtx::requests::Preset::PublicChat;
+ } else {
+ request_.preset = mtx::requests::Preset::TrustedPrivateChat;
+ }
+ });
+
+ connect(directToggle_, &Toggle::toggled, this, [=](bool isDisabled) {
+ request_.is_direct = !isDisabled;
+ });
+}
+
+void
+CreateRoom::clearFields()
+{
+ nameInput_->clear();
+ topicInput_->clear();
+ aliasInput_->clear();
+}
+
+void
+CreateRoom::paintEvent(QPaintEvent *)
+{
+ QStyleOption opt;
+ opt.init(this);
+ QPainter p(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+}