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> 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
@@ -108,6 +108,12 @@ UserProfile::avatarUrl()
}
bool
+UserProfile::globalUserProfile() const
+{
+ return (roomid_ == "") && isSelf();
+}
+
+bool
UserProfile::getUserStatus()
{
return isUserVerified;
@@ -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;
};
|