Merge pull request #1019 from maltee1/qml_createroom
CreateRoom dialog in QML
This commit is contained in:
commit
f9e294ce0c
18 changed files with 366 additions and 242 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue