From fdb9d7ab40da1d6b40ae11c3988af7082b6bc7cd Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sat, 23 Jan 2021 00:30:45 +0100 Subject: Allow users to hide rooms with specific tags --- src/ChatPage.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'src/ChatPage.cpp') diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 0377ce30..3df67fcc 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -267,10 +267,27 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) [this](const QString &groupId) { current_community_ = groupId; - if (groupId == "world") - room_list_->removeFilter(); - else - room_list_->applyFilter(communitiesList_->roomList(groupId)); + if (groupId == "world") { + auto hidden = communitiesList_->hiddenTagsAndCommunities(); + std::set roomsToHide = communitiesList_->roomList(groupId); + for (const auto &hiddenTag : hidden) { + auto temp = communitiesList_->roomList(hiddenTag); + roomsToHide.insert(temp.begin(), temp.end()); + } + + room_list_->removeFilter(roomsToHide); + } else { + auto hidden = communitiesList_->hiddenTagsAndCommunities(); + hidden.erase(current_community_); + + auto roomsToShow = communitiesList_->roomList(groupId); + for (const auto &hiddenTag : hidden) { + for (const auto &r : communitiesList_->roomList(hiddenTag)) + roomsToShow.erase(r); + } + + room_list_->applyFilter(roomsToShow); + } }); connect(¬ificationsManager, -- cgit 1.5.1 From be49d184be05d97c6a4142e122b405a00e89f27c Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 25 Jan 2021 15:59:15 +0100 Subject: Make matrix link chat invites direct chats --- src/ChatPage.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/ChatPage.cpp') diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 3df67fcc..4e472a3a 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -1314,8 +1314,10 @@ ChatPage::startChat(QString userid) mtx::requests::CreateRoom req; req.preset = mtx::requests::Preset::PrivateChat; req.visibility = mtx::common::RoomVisibility::Private; - if (utils::localUser() != userid) - req.invite = {userid.toStdString()}; + if (utils::localUser() != userid) { + req.invite = {userid.toStdString()}; + req.is_direct = true; + } emit ChatPage::instance()->createRoom(req); } -- cgit 1.5.1 From 87490c29cd8af7c17b5a4591798f1f0ebfa9023c Mon Sep 17 00:00:00 2001 From: Jedi18 Date: Thu, 28 Jan 2021 20:03:50 +0530 Subject: Username can be edited by double clicking on text, added global user profile menu action in user info widget --- resources/qml/UserProfile.qml | 51 ++++++++------------------ src/ChatPage.cpp | 4 ++ src/UserInfoWidget.cpp | 4 ++ src/UserInfoWidget.h | 3 ++ src/timeline/TimelineModel.cpp | 2 +- src/ui/UserProfile.cpp | 83 +++++++++++++++++++++++++----------------- src/ui/UserProfile.h | 9 +++++ 7 files changed, 86 insertions(+), 70 deletions(-) (limited to 'src/ChatPage.cpp') diff --git a/resources/qml/UserProfile.qml b/resources/qml/UserProfile.qml index 2a06b955..0ced5498 100644 --- a/resources/qml/UserProfile.qml +++ b/resources/qml/UserProfile.qml @@ -15,6 +15,7 @@ ApplicationWindow { minimumHeight: 420 palette: colors color: colors.window + title: profile.globalUserProfile ? "Global User Profile" : "Room User Profile" ColumnLayout { id: contentL @@ -33,13 +34,25 @@ ApplicationWindow { onClicked: TimelineManager.openImageOverlay(TimelineManager.timeline.avatarUrl(userid), TimelineManager.timeline.data.id) } - Label { + TextInput { + id: displayUsername + readOnly: !profile.isUsernameEditingAllowed text: profile.displayName - fontSizeMode: Text.HorizontalFit font.pixelSize: 20 color: TimelineManager.userColor(profile.userid, colors.window) font.bold: true Layout.alignment: Qt.AlignHCenter + focus: true + + onEditingFinished: profile.changeUsername(displayUsername.text) + + MouseArea { + enabled: !profile.isUsernameEditingAllowed + anchors.fill: parent + onDoubleClicked: { + profile.allowUsernameEditing(true) + } + } } MatrixText { @@ -58,40 +71,6 @@ ApplicationWindow { onClicked: profile.verify() } - Button { - id: changeUsername - - text: (profile.roomid_ == "") ? qsTr("Change global username") : qsTr("Change room username") - Layout.alignment: Qt.AlignHCenter - enabled : profile.isSelf - visible: profile.isSelf - onClicked: changeUsernameDialog.open() - - Dialog { - id: changeUsernameDialog - modal: true - title: (profile.roomid_ == "") ? qsTr("Change global username") : qsTr("Change room username") - onAccepted: profile.changeUsername(usernameEdit.text) - - Column { - anchors.fill: parent - - Text { - text: "New Username" - anchors.horizontalCenter: parent.horizontalCenter - } - TextField { - id: usernameEdit - focus: true - wrapMode: TextEdit.Wrap - anchors.horizontalCenter: parent.horizontalCenter - } - } - - standardButtons: Dialog.Ok | Dialog.Cancel - } - } - Image { Layout.preferredHeight: 16 Layout.preferredWidth: 16 diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 4e472a3a..0d3c98a8 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -112,6 +112,10 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) connect(sidebarActions_, &SideBarActions::createRoom, this, &ChatPage::createRoom); user_info_widget_ = new UserInfoWidget(sideBar_); + connect(user_info_widget_, &UserInfoWidget::openGlobalUserProfile, this, [this]() { + view_manager_->activeTimeline()->openUserProfile("", true); + }); + user_mentions_popup_ = new popups::UserMentions(); room_list_ = new RoomList(userSettings, sideBar_); connect(room_list_, &RoomList::joinRoom, this, &ChatPage::joinRoom); diff --git a/src/UserInfoWidget.cpp b/src/UserInfoWidget.cpp index f8e94431..5bcb44a9 100644 --- a/src/UserInfoWidget.cpp +++ b/src/UserInfoWidget.cpp @@ -125,6 +125,10 @@ UserInfoWidget::UserInfoWidget(QWidget *parent) ChatPage::instance()->setStatus(text); }); + auto userProfileAction = menu->addAction(tr("User Profile Settings")); + connect( + userProfileAction, &QAction::triggered, this, [this]() { emit openGlobalUserProfile(); }); + #if 0 // disable presence menu until issues in synapse are resolved auto setAutoPresence = menu->addAction(tr("Set presence automatically")); connect(setAutoPresence, &QAction::triggered, this, []() { diff --git a/src/UserInfoWidget.h b/src/UserInfoWidget.h index 03ab2cf0..bfcfbc0b 100644 --- a/src/UserInfoWidget.h +++ b/src/UserInfoWidget.h @@ -51,6 +51,9 @@ protected: void paintEvent(QPaintEvent *event) override; void contextMenuEvent(QContextMenuEvent *) override; +signals: + void openGlobalUserProfile(); + private: Avatar *userAvatar_; diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 79cf5184..ffb0beec 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -801,7 +801,7 @@ TimelineModel::viewDecryptedRawMessage(QString id) const void TimelineModel::openUserProfile(QString userid, bool global) { - emit openProfile(new UserProfile(global ? "" : room_id_, userid, manager_, this)); + emit openProfile(new UserProfile(global ? "" : room_id_, global ? utils::localUser() : userid, manager_, this)); } void diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp index 503f314c..4b7f054d 100644 --- a/src/ui/UserProfile.cpp +++ b/src/ui/UserProfile.cpp @@ -107,6 +107,12 @@ UserProfile::avatarUrl() return cache::avatarUrl(roomid_, userid_); } +bool +UserProfile::globalUserProfile() const +{ + return (roomid_ == "") && isSelf(); +} + bool UserProfile::getUserStatus() { @@ -217,39 +223,37 @@ UserProfile::startChat() void UserProfile::changeUsername(QString username) { - // change room username - mtx::events::state::Member member; - member.display_name = username.toStdString(); - member.avatar_url = - cache::avatarUrl(roomid_, - QString::fromStdString(http::client()->user_id().to_string())) - .toStdString(); - member.membership = mtx::events::state::Membership::Join; - - http::client()->send_state_event(roomid_.toStdString(), - http::client()->user_id().to_string(), - member, - [](mtx::responses::EventId, mtx::http::RequestErr err) { - if (err) - nhlog::net()->error( - "Failed to set room displayname: {}", - err->matrix_error.error); - }); - - /*connect(modal, &EditModal::nameChanged, this, [this](const QString &newName) { - if (roomNameLabel_) - roomNameLabel_->setText(newName); - });*/ - - /*std::string newName = "jedi18"; - // change user name - http::client()->set_displayname( - newName, [this]( mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn("could not change username"); - return; - } - });*/ + if (globalUserProfile()) { + // change global + http::client()->set_displayname( + username.toStdString(), [this]( mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn("could not change username"); + return; + } + }); + } else { + // change room username + mtx::events::state::Member member; + member.display_name = username.toStdString(); + member.avatar_url = + cache::avatarUrl(roomid_, + QString::fromStdString(http::client()->user_id().to_string())) + .toStdString(); + member.membership = mtx::events::state::Membership::Join; + + http::client()->send_state_event( + roomid_.toStdString(), + http::client()->user_id().to_string(), + member, + [](mtx::responses::EventId, mtx::http::RequestErr err) { + if (err) + nhlog::net()->error("Failed to set room displayname: {}", + err->matrix_error.error); + }); + } + + allowUsernameEditing(false); } void @@ -267,3 +271,16 @@ UserProfile::unverify(QString device) { cache::markDeviceUnverified(userid_.toStdString(), device.toStdString()); } + +void +UserProfile::allowUsernameEditing(bool allow) +{ + usernameEditing = allow; + emit usernameEditingChanged(); +} + +bool +UserProfile::isUsernameEditingAllowed() const +{ + return usernameEditing; +} diff --git a/src/ui/UserProfile.h b/src/ui/UserProfile.h index df90e5a1..4839e0d8 100644 --- a/src/ui/UserProfile.h +++ b/src/ui/UserProfile.h @@ -83,10 +83,13 @@ class UserProfile : public QObject Q_PROPERTY(QString userid READ userid CONSTANT) Q_PROPERTY(QString avatarUrl READ avatarUrl CONSTANT) Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList CONSTANT) + Q_PROPERTY(bool globalUserProfile READ globalUserProfile CONSTANT) Q_PROPERTY(bool isUserVerified READ getUserStatus NOTIFY userStatusChanged) Q_PROPERTY( bool userVerificationEnabled READ userVerificationEnabled NOTIFY userStatusChanged) Q_PROPERTY(bool isSelf READ isSelf CONSTANT) + Q_PROPERTY( + bool isUsernameEditingAllowed READ isUsernameEditingAllowed NOTIFY usernameEditingChanged) public: UserProfile(QString roomid, QString userid, @@ -98,9 +101,11 @@ public: QString userid(); QString displayName(); QString avatarUrl(); + bool globalUserProfile() const; bool getUserStatus(); bool userVerificationEnabled() const; bool isSelf() const; + bool isUsernameEditingAllowed() const; Q_INVOKABLE void verify(QString device = ""); Q_INVOKABLE void unverify(QString device = ""); @@ -110,15 +115,19 @@ public: Q_INVOKABLE void kickUser(); Q_INVOKABLE void startChat(); Q_INVOKABLE void changeUsername(QString username); + Q_INVOKABLE void allowUsernameEditing(bool allow); signals: void userStatusChanged(); + void usernameEditingChanged(); + private: QString roomid_, userid_; DeviceInfoModel deviceList_; bool isUserVerified = false; bool hasMasterKey = false; + bool usernameEditing = false; TimelineViewManager *manager; TimelineModel *model; }; -- cgit 1.5.1 From 3b82b2ff972e4f74904e315008b996202473570c Mon Sep 17 00:00:00 2001 From: Jedi18 Date: Thu, 28 Jan 2021 23:53:56 +0530 Subject: fix linting --- src/ChatPage.cpp | 2 +- src/timeline/TimelineModel.cpp | 4 ++-- src/ui/UserProfile.cpp | 4 ++-- src/ui/UserProfile.h | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) (limited to 'src/ChatPage.cpp') diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 0d3c98a8..cf50e62a 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -111,7 +111,7 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) connect(sidebarActions_, &SideBarActions::joinRoom, this, &ChatPage::joinRoom); connect(sidebarActions_, &SideBarActions::createRoom, this, &ChatPage::createRoom); - user_info_widget_ = new UserInfoWidget(sideBar_); + user_info_widget_ = new UserInfoWidget(sideBar_); connect(user_info_widget_, &UserInfoWidget::openGlobalUserProfile, this, [this]() { view_manager_->activeTimeline()->openUserProfile("", true); }); diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 41c0b40e..a25e77fd 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -814,8 +814,8 @@ void TimelineModel::openUserProfile(QString userid, bool global) { if (global) { - emit openProfile(new UserProfile("",utils::localUser(), - manager_, this, globalUsername)); + emit openProfile( + new UserProfile("", utils::localUser(), manager_, this, globalUsername)); } else { emit openProfile(new UserProfile(room_id_, userid, manager_, this)); } diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp index a53d25f4..28757b72 100644 --- a/src/ui/UserProfile.cpp +++ b/src/ui/UserProfile.cpp @@ -4,10 +4,10 @@ #include "DeviceVerificationFlow.h" #include "Logging.h" #include "Utils.h" -#include #include "mtx/responses/crypto.hpp" #include "timeline/TimelineModel.h" #include "timeline/TimelineViewManager.h" +#include UserProfile::UserProfile(QString roomid, QString userid, @@ -228,7 +228,7 @@ UserProfile::changeUsername(QString username) if (globalUserProfile()) { // change global http::client()->set_displayname( - username.toStdString(), [this]( mtx::http::RequestErr err) { + username.toStdString(), [this](mtx::http::RequestErr err) { if (err) { nhlog::net()->warn("could not change username"); return; diff --git a/src/ui/UserProfile.h b/src/ui/UserProfile.h index 04317766..b1172077 100644 --- a/src/ui/UserProfile.h +++ b/src/ui/UserProfile.h @@ -94,7 +94,7 @@ public: UserProfile(QString roomid, QString userid, TimelineViewManager *manager_, - TimelineModel *parent = nullptr, + TimelineModel *parent = nullptr, QString globalUsername = ""); DeviceInfoModel *deviceList(); @@ -126,8 +126,8 @@ private: QString roomid_, userid_; QString globalUsername; DeviceInfoModel deviceList_; - bool isUserVerified = false; - bool hasMasterKey = false; + bool isUserVerified = false; + bool hasMasterKey = false; bool usernameEditing = false; TimelineViewManager *manager; TimelineModel *model; -- cgit 1.5.1 From 9b5a287d14a18b1bef012a348dd77350fdb70ba3 Mon Sep 17 00:00:00 2001 From: Jedi18 Date: Fri, 29 Jan 2021 11:55:24 +0530 Subject: made requeste changes --- resources/qml/UserProfile.qml | 10 +++++----- src/ChatPage.cpp | 2 +- src/timeline/TimelineModel.cpp | 6 +----- src/ui/UserProfile.cpp | 8 ++++---- src/ui/UserProfile.h | 4 ++-- 5 files changed, 13 insertions(+), 17 deletions(-) (limited to 'src/ChatPage.cpp') diff --git a/resources/qml/UserProfile.qml b/resources/qml/UserProfile.qml index 5e577099..79e2b665 100644 --- a/resources/qml/UserProfile.qml +++ b/resources/qml/UserProfile.qml @@ -15,7 +15,7 @@ ApplicationWindow { minimumHeight: 420 palette: colors color: colors.window - title: profile.globalUserProfile ? "Global User Profile" : "Room User Profile" + title: profile.isGlobalUserProfile ? "Global User Profile" : "Room User Profile" ColumnLayout { id: contentL @@ -44,19 +44,19 @@ ApplicationWindow { Layout.alignment: Qt.AlignHCenter selectByMouse: true - Keys.priority: Keys.BeforeItem - Keys.onReturnPressed: profile.changeUsername(displayUsername.text) + onAccepted: profile.changeUsername(displayUsername.text) ImageButton { + visible: profile.isSelf anchors.leftMargin: 5 anchors.left: displayUsername.right anchors.verticalCenter: displayUsername.verticalCenter image: profile.isUsernameEditingAllowed ? ":/icons/icons/ui/checkmark.png" : ":/icons/icons/ui/edit.png" onClicked: { - if(profile.isUsernameEditingAllowed) { + if (profile.isUsernameEditingAllowed) { profile.changeUsername(displayUsername.text) - }else{ + } else { profile.allowUsernameEditing(true) } } diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index cf50e62a..07ed3941 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -113,7 +113,7 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) user_info_widget_ = new UserInfoWidget(sideBar_); connect(user_info_widget_, &UserInfoWidget::openGlobalUserProfile, this, [this]() { - view_manager_->activeTimeline()->openUserProfile("", true); + view_manager_->activeTimeline()->openUserProfile(utils::localUser(), true); }); user_mentions_popup_ = new popups::UserMentions(); diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 73077508..79cf5184 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -801,11 +801,7 @@ TimelineModel::viewDecryptedRawMessage(QString id) const void TimelineModel::openUserProfile(QString userid, bool global) { - if (global) { - emit openProfile(new UserProfile("", utils::localUser(), manager_, this)); - } else { - emit openProfile(new UserProfile(room_id_, userid, manager_, this)); - } + emit openProfile(new UserProfile(global ? "" : room_id_, userid, manager_, this)); } void diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp index e2adffcd..9e8d45b5 100644 --- a/src/ui/UserProfile.cpp +++ b/src/ui/UserProfile.cpp @@ -116,7 +116,7 @@ UserProfile::userid() QString UserProfile::displayName() { - return globalUserProfile() ? globalUsername : cache::displayName(roomid_, userid_); + return isGlobalUserProfile() ? globalUsername : cache::displayName(roomid_, userid_); } QString @@ -126,9 +126,9 @@ UserProfile::avatarUrl() } bool -UserProfile::globalUserProfile() const +UserProfile::isGlobalUserProfile() const { - return (roomid_ == "") && isSelf(); + return roomid_ == ""; } bool @@ -241,7 +241,7 @@ UserProfile::startChat() void UserProfile::changeUsername(QString username) { - if (globalUserProfile()) { + if (isGlobalUserProfile()) { // change global http::client()->set_displayname( username.toStdString(), [this](mtx::http::RequestErr err) { diff --git a/src/ui/UserProfile.h b/src/ui/UserProfile.h index 5ccb54b3..d450d58f 100644 --- a/src/ui/UserProfile.h +++ b/src/ui/UserProfile.h @@ -83,7 +83,7 @@ class UserProfile : public QObject Q_PROPERTY(QString userid READ userid CONSTANT) Q_PROPERTY(QString avatarUrl READ avatarUrl CONSTANT) Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList CONSTANT) - Q_PROPERTY(bool globalUserProfile READ globalUserProfile CONSTANT) + Q_PROPERTY(bool isGlobalUserProfile READ isGlobalUserProfile CONSTANT) Q_PROPERTY(bool isUserVerified READ getUserStatus NOTIFY userStatusChanged) Q_PROPERTY( bool userVerificationEnabled READ userVerificationEnabled NOTIFY userStatusChanged) @@ -101,7 +101,7 @@ public: QString userid(); QString displayName(); QString avatarUrl(); - bool globalUserProfile() const; + bool isGlobalUserProfile() const; bool getUserStatus(); bool userVerificationEnabled() const; bool isSelf() const; -- cgit 1.5.1