diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml index 979e727d..cde744c5 100644 --- a/resources/qml/RoomList.qml +++ b/resources/qml/RoomList.qml @@ -212,6 +212,16 @@ Page { Layout.preferredHeight: userInfoGrid.implicitHeight + 2 * Nheko.paddingMedium Layout.minimumHeight: 40 + TapHandler { + onSingleTapped: { + Nheko.updateUserProfile(); + var userProfile = userProfileComponent.createObject(timelineRoot, { + "profile": Nheko.currentUser + }); + userProfile.show(); + } + } + RowLayout { id: userInfoGrid diff --git a/resources/qml/RoomSettings.qml b/resources/qml/RoomSettings.qml index 14de0edf..1f7fe5de 100644 --- a/resources/qml/RoomSettings.qml +++ b/resources/qml/RoomSettings.qml @@ -20,7 +20,7 @@ ApplicationWindow { minimumHeight: 650 palette: Nheko.colors color: Nheko.colors.window - modality: Qt.WindowModal + modality: Qt.NonModal flags: Qt.Dialog title: qsTr("Room Settings") @@ -205,7 +205,7 @@ ApplicationWindow { title: qsTr("End-to-End Encryption") text: qsTr("Encryption is currently experimental and things might break unexpectedly.
Please take note that it can't be disabled afterwards.") - modality: Qt.WindowModal + modality: Qt.NonModal onAccepted: { if (roomSettings.isEncryptionEnabled) return ; diff --git a/resources/qml/UserProfile.qml b/resources/qml/UserProfile.qml index 4e5e64dc..21f34f15 100644 --- a/resources/qml/UserProfile.qml +++ b/resources/qml/UserProfile.qml @@ -22,7 +22,7 @@ ApplicationWindow { palette: Nheko.colors color: Nheko.colors.window title: profile.isGlobalUserProfile ? qsTr("Global User Profile") : qsTr("Room User Profile") - modality: Qt.WindowModal + modality: Qt.NonModal flags: Qt.Dialog Shortcut { diff --git a/resources/qml/device-verification/DeviceVerification.qml b/resources/qml/device-verification/DeviceVerification.qml index 6d0be204..e2c66c5a 100644 --- a/resources/qml/device-verification/DeviceVerification.qml +++ b/resources/qml/device-verification/DeviceVerification.qml @@ -15,7 +15,7 @@ ApplicationWindow { onClosing: TimelineManager.removeVerificationFlow(flow) title: stack.currentItem.title flags: Qt.Dialog - modality: Qt.WindowModal + modality: Qt.NonModal palette: Nheko.colors height: stack.implicitHeight width: stack.implicitWidth diff --git a/src/Cache.cpp b/src/Cache.cpp index d8c78381..c41b66cc 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -3469,6 +3469,7 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query } } } + for (auto &[user_id, update] : updates) { (void)update; if (user_id == local_user) { @@ -3476,9 +3477,8 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query (void)status; emit verificationStatusChanged(user); } - } else { - emit verificationStatusChanged(user_id); } + emit verificationStatusChanged(user_id); } } @@ -3552,6 +3552,19 @@ Cache::query_keys(const std::string &user_id, last_changed = cache_->last_changed; req.token = last_changed; + // use context object so that we can disconnect again + QObject *context{new QObject(this)}; + QObject::connect(this, + &Cache::verificationStatusChanged, + context, + [cb, user_id, context_ = context](std::string updated_user) mutable { + if (user_id == updated_user) { + context_->deleteLater(); + auto keys = cache::userKeys(user_id); + cb(keys.value_or(UserKeyCache{}), {}); + } + }); + http::client()->query_keys( req, [cb, user_id, last_changed, this](const mtx::responses::QueryKeys &res, @@ -3565,21 +3578,6 @@ Cache::query_keys(const std::string &user_id, } emit userKeysUpdate(last_changed, res); - - // use context object so that we can disconnect again - std::unique_ptr context{new QObject}; - QObject *pcontext = context.get(); - QObject::connect( - this, - &Cache::verificationStatusChanged, - pcontext, - [cb, user_id, context_ = std::move(context)](std::string updated_user) mutable { - if (user_id == updated_user) { - context_.release(); - auto keys = cache::userKeys(user_id); - cb(keys.value_or(UserKeyCache{}), {}); - } - }); }); } diff --git a/src/ui/NhekoGlobalObject.h b/src/ui/NhekoGlobalObject.h index fe645a34..fc35fe22 100644 --- a/src/ui/NhekoGlobalObject.h +++ b/src/ui/NhekoGlobalObject.h @@ -40,7 +40,7 @@ public: Q_INVOKABLE void openLink(QString link) const; -private slots: +public slots: void updateUserProfile(); signals: diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp index cef8bd85..da130242 100644 --- a/src/ui/UserProfile.cpp +++ b/src/ui/UserProfile.cpp @@ -42,7 +42,6 @@ UserProfile::UserProfile(QString roomid, if (!cache::client() || !cache::client()->isDatabaseReady()) return; - fetchDeviceList(this->userid_); connect(cache::client(), &Cache::verificationStatusChanged, this, @@ -66,7 +65,9 @@ UserProfile::UserProfile(QString roomid, : verification::VERIFIED; } deviceList_.reset(deviceList_.deviceList_); + emit devicesChanged(); }); + fetchDeviceList(this->userid_); } QHash @@ -223,6 +224,7 @@ UserProfile::fetchDeviceList(const QString &userID) } this->deviceList_.queueReset(std::move(deviceInfo)); + emit devicesChanged(); }); }); } diff --git a/src/ui/UserProfile.h b/src/ui/UserProfile.h index bf71d0de..721d7230 100644 --- a/src/ui/UserProfile.h +++ b/src/ui/UserProfile.h @@ -90,7 +90,7 @@ class UserProfile : public QObject Q_PROPERTY(QString displayName READ displayName NOTIFY displayNameChanged) Q_PROPERTY(QString userid READ userid CONSTANT) Q_PROPERTY(QString avatarUrl READ avatarUrl NOTIFY avatarUrlChanged) - Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList CONSTANT) + Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList NOTIFY devicesChanged) Q_PROPERTY(bool isGlobalUserProfile READ isGlobalUserProfile CONSTANT) Q_PROPERTY(int userVerified READ getUserStatus NOTIFY userStatusChanged) Q_PROPERTY(bool isLoading READ isLoading NOTIFY loadingChanged) @@ -133,6 +133,7 @@ signals: void avatarUrlChanged(); void displayError(const QString &errorMessage); void globalUsernameRetrieved(const QString &globalUser); + void devicesChanged(); public slots: void updateAvatarUrl();