From 87490c29cd8af7c17b5a4591798f1f0ebfa9023c Mon Sep 17 00:00:00 2001 From: Jedi18 Date: Thu, 28 Jan 2021 20:03:50 +0530 Subject: [PATCH] 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 | 79 +++++++++++++++++++++------------- src/ui/UserProfile.h | 9 ++++ 7 files changed, 84 insertions(+), 68 deletions(-) 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; + 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); - }); + 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; - } - });*/ + 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; };