Merge pull request #1019 from maltee1/qml_createroom

CreateRoom dialog in QML
This commit is contained in:
DeepBlueV7.X 2022-03-29 20:54:45 +02:00 committed by GitHub
commit f9e294ce0c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 366 additions and 242 deletions

View file

@ -1187,7 +1187,7 @@ ChatPage::decryptDownloadedSecrets(mtx::secret_storage::AesHmacSha2KeyDescriptio
}
void
ChatPage::startChat(QString userid)
ChatPage::startChat(QString userid, std::optional<bool> encryptionEnabled)
{
auto joined_rooms = cache::joinedRooms();
auto room_infos = cache::getRoomInfo(joined_rooms);
@ -1213,6 +1213,14 @@ ChatPage::startChat(QString userid)
mtx::requests::CreateRoom req;
req.preset = mtx::requests::Preset::PrivateChat;
req.visibility = mtx::common::RoomVisibility::Private;
if (encryptionEnabled.value_or(false)) {
mtx::events::StrippedEvent<mtx::events::state::Encryption> enc;
enc.type = mtx::events::EventType::RoomEncryption;
enc.content.algorithm = mtx::crypto::MEGOLM_ALGO;
req.initial_state.emplace_back(std::move(enc));
}
if (utils::localUser() != userid) {
req.invite = {userid.toStdString()};
req.is_direct = true;

View file

@ -74,12 +74,13 @@ public:
// TODO(Nico): Get rid of this!
QString currentRoom() const;
void startChat(QString userid, std::optional<bool> encryptionEnabled);
public slots:
bool handleMatrixUri(QString uri);
bool handleMatrixUri(const QUrl &uri);
void startChat(QString userid);
void startChat(QString userid) { startChat(userid, std::nullopt); }
void leaveRoom(const QString &room_id);
void createRoom(const mtx::requests::CreateRoom &req);
void joinRoom(const QString &room);

View file

@ -54,8 +54,6 @@
#include "ui/UIA.h"
#include "voip/WebRTCSession.h"
#include "dialogs/CreateRoom.h"
Q_DECLARE_METATYPE(mtx::events::collections::TimelineEvents)
Q_DECLARE_METATYPE(std::vector<DeviceInfo>)
Q_DECLARE_METATYPE(std::vector<mtx::responses::PublicRoomsChunk>)
@ -404,19 +402,6 @@ MainWindow::hasActiveUser()
settings->contains(prefix + "auth/user_id");
}
void
MainWindow::openCreateRoomDialog(
std::function<void(const mtx::requests::CreateRoom &request)> callback)
{
auto dialog = new dialogs::CreateRoom(nullptr);
connect(dialog,
&dialogs::CreateRoom::createRoom,
this,
[callback](const mtx::requests::CreateRoom &request) { callback(request); });
showDialog(dialog);
}
bool
MainWindow::pageSupportsTray() const
{

View file

@ -47,8 +47,6 @@ public:
static MainWindow *instance() { return instance_; }
void saveCurrentWindowSize();
void
openCreateRoomDialog(std::function<void(const mtx::requests::CreateRoom &request)> callback);
void openJoinRoomDialog(std::function<void(const QString &room_id)> callback);
MxcImageProvider *imageProvider() { return imgProvider; }

View file

@ -1,159 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QComboBox>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include "dialogs/CreateRoom.h"
#include "Config.h"
#include "ui/TextField.h"
#include "ui/ToggleButton.h"
using namespace dialogs;
CreateRoom::CreateRoom(QWidget *parent)
: QFrame(parent)
{
setAutoFillBackground(true);
setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
setWindowModality(Qt::WindowModal);
setAttribute(Qt::WA_DeleteOnClose, true);
QFont largeFont;
largeFont.setPointSizeF(largeFont.pointSizeF() * 1.5);
setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
setMinimumHeight(conf::window::minHeight);
setMinimumWidth(conf::window::minModalWidth);
auto layout = new QVBoxLayout(this);
layout->setSpacing(conf::modals::WIDGET_SPACING);
layout->setContentsMargins(conf::modals::WIDGET_MARGIN,
conf::modals::WIDGET_MARGIN,
conf::modals::WIDGET_MARGIN,
conf::modals::WIDGET_MARGIN);
buttonBox_ = new QDialogButtonBox(QDialogButtonBox::Cancel);
confirmBtn_ = new QPushButton(tr("Create room"), this);
confirmBtn_->setDefault(true);
buttonBox_->addButton(confirmBtn_, QDialogButtonBox::AcceptRole);
QFont font;
font.setPointSizeF(font.pointSizeF() * 1.3);
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(tr("Private"));
visibilityCombo_->addItem(tr("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(tr("Private Chat"));
presetCombo_->addItem(tr("Public Chat"));
presetCombo_->addItem(tr("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(0x38, 0xA3, 0xD8));
directToggle_->setInactiveColor(QColor("gray"));
directToggle_->setState(false);
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->addWidget(buttonBox_);
connect(buttonBox_, &QDialogButtonBox::accepted, this, [this]() {
request_.name = nameInput_->text().toStdString();
request_.topic = topicInput_->text().toStdString();
request_.room_alias_name = aliasInput_->text().toStdString();
emit createRoom(request_);
clearFields();
emit close();
});
connect(buttonBox_, &QDialogButtonBox::rejected, this, [this]() {
clearFields();
emit close();
});
connect(visibilityCombo_,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
[this](int idx) {
if (idx == 0) {
request_.visibility = mtx::common::RoomVisibility::Private;
} else {
request_.visibility = mtx::common::RoomVisibility::Public;
}
});
connect(presetCombo_,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
[this](int idx) {
if (idx == 0) {
request_.preset = mtx::requests::Preset::PrivateChat;
} else if (idx == 1) {
request_.preset = mtx::requests::Preset::PublicChat;
} else {
request_.preset = mtx::requests::Preset::TrustedPrivateChat;
}
});
connect(directToggle_, &Toggle::toggled, this, [this](bool isEnabled) {
request_.is_direct = isEnabled;
});
}
void
CreateRoom::clearFields()
{
nameInput_->clear();
topicInput_->clear();
aliasInput_->clear();
}
void
CreateRoom::showEvent(QShowEvent *event)
{
nameInput_->setFocus();
QFrame::showEvent(event);
}

View file

@ -1,50 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QDialogButtonBox>
#include <QFrame>
#include <mtx/requests.hpp>
class QPushButton;
class TextField;
class QComboBox;
class Toggle;
namespace dialogs {
class CreateRoom : public QFrame
{
Q_OBJECT
public:
CreateRoom(QWidget *parent = nullptr);
signals:
void createRoom(const mtx::requests::CreateRoom &request);
protected:
void showEvent(QShowEvent *event) override;
private:
void clearFields();
QComboBox *visibilityCombo_;
QComboBox *presetCombo_;
Toggle *directToggle_;
QPushButton *confirmBtn_;
QDialogButtonBox *buttonBox_;
TextField *nameInput_;
TextField *topicInput_;
TextField *aliasInput_;
mtx::requests::CreateRoom request_;
};
} // dialogs

View file

@ -199,6 +199,14 @@ TimelineViewManager::openGlobalUserProfile(QString userId)
emit openProfile(profile);
}
UserProfile *
TimelineViewManager::getGlobalUserProfile(QString userId)
{
UserProfile *profile = new UserProfile{QString{}, userId, this};
QQmlEngine::setObjectOwnership(profile, QQmlEngine::JavaScriptOwnership);
return (profile);
}
void
TimelineViewManager::setVideoCallItem()
{

View file

@ -67,6 +67,7 @@ public:
Q_INVOKABLE void openRoomSettings(QString room_id);
Q_INVOKABLE void openInviteUsers(QString roomId);
Q_INVOKABLE void openGlobalUserProfile(QString userId);
Q_INVOKABLE UserProfile *getGlobalUserProfile(QString userId);
Q_INVOKABLE void focusMessageInput();

View file

@ -13,7 +13,6 @@
#include "Cache_p.h"
#include "ChatPage.h"
#include "Logging.h"
#include "MainWindow.h"
#include "UserSettingsPage.h"
#include "Utils.h"
#include "voip/WebRTCSession.h"
@ -129,8 +128,32 @@ Nheko::logout() const
}
void
Nheko::openCreateRoomDialog() const
Nheko::createRoom(QString name, QString topic, QString aliasLocalpart, bool isEncrypted, int preset)
{
MainWindow::instance()->openCreateRoomDialog(
[](const mtx::requests::CreateRoom &req) { ChatPage::instance()->createRoom(req); });
mtx::requests::CreateRoom req;
switch (preset) {
case 1:
req.preset = mtx::requests::Preset::PublicChat;
break;
case 2:
req.preset = mtx::requests::Preset::TrustedPrivateChat;
break;
case 0:
default:
req.preset = mtx::requests::Preset::PrivateChat;
}
req.name = name.toStdString();
req.topic = topic.toStdString();
req.room_alias_name = aliasLocalpart.toStdString();
if (isEncrypted) {
mtx::events::StrippedEvent<mtx::events::state::Encryption> enc;
enc.type = mtx::events::EventType::RoomEncryption;
enc.content.algorithm = mtx::crypto::MEGOLM_ALGO;
req.initial_state.emplace_back(std::move(enc));
}
emit ChatPage::instance()->createRoom(req);
}

View file

@ -52,7 +52,8 @@ public:
Q_INVOKABLE void setStatusMessage(QString msg) const;
Q_INVOKABLE void showUserSettingsPage() const;
Q_INVOKABLE void logout() const;
Q_INVOKABLE void openCreateRoomDialog() const;
Q_INVOKABLE void
createRoom(QString name, QString topic, QString aliasLocalpart, bool isEncrypted, int preset);
public slots:
void updateUserProfile();

View file

@ -53,6 +53,9 @@ UserProfile::UserProfile(QString roomid,
emit verificationStatiChanged();
});
connect(this, &UserProfile::devicesChanged, [this]() {
nhlog::net()->critical("Device list: {}", deviceList_.rowCount());
});
fetchDeviceList(this->userid_);
}
@ -187,7 +190,6 @@ UserProfile::fetchDeviceList(const QString &userID)
nhlog::net()->warn("failed to query device keys: {},{}",
mtx::errors::to_string(err->matrix_error.errcode),
static_cast<int>(err->status_code));
return;
}
// Ensure local key cache is up to date
@ -201,7 +203,6 @@ UserProfile::fetchDeviceList(const QString &userID)
nhlog::net()->warn("failed to query device keys: {},{}",
mtx::errors::to_string(err->matrix_error.errcode),
static_cast<int>(err->status_code));
return;
}
emit verificationStatiChanged();
@ -312,10 +313,16 @@ UserProfile::kickUser()
ChatPage::instance()->kickUser(this->userid_, QLatin1String(""));
}
void
UserProfile::startChat(bool encryption)
{
ChatPage::instance()->startChat(this->userid_, encryption);
}
void
UserProfile::startChat()
{
ChatPage::instance()->startChat(this->userid_);
ChatPage::instance()->startChat(this->userid_, std::nullopt);
}
void

View file

@ -143,6 +143,7 @@ public:
// Q_INVOKABLE void ignoreUser();
Q_INVOKABLE void kickUser();
Q_INVOKABLE void startChat();
Q_INVOKABLE void startChat(bool encryptionEnabled);
Q_INVOKABLE void changeUsername(QString username);
Q_INVOKABLE void changeDeviceName(QString deviceID, QString deviceName);
Q_INVOKABLE void changeAvatar();