Rewrite UserProfile in qml

This commit is contained in:
CH Chethan Reddy 2020-05-17 19:04:47 +05:30
parent 707248fea3
commit 64f204d984
7 changed files with 202 additions and 2 deletions

View file

@ -276,6 +276,7 @@ set(SRC_FILES
src/ui/ToggleButton.cpp src/ui/ToggleButton.cpp
src/ui/Theme.cpp src/ui/Theme.cpp
src/ui/ThemeManager.cpp src/ui/ThemeManager.cpp
src/ui/UserProfile.cpp
src/AvatarProvider.cpp src/AvatarProvider.cpp
src/BlurhashProvider.cpp src/BlurhashProvider.cpp
@ -480,6 +481,7 @@ qt5_wrap_cpp(MOC_HEADERS
src/ui/ToggleButton.h src/ui/ToggleButton.h
src/ui/Theme.h src/ui/Theme.h
src/ui/ThemeManager.h src/ui/ThemeManager.h
src/ui/UserProfile.h
src/notifications/Manager.h src/notifications/Manager.h

View file

@ -286,7 +286,10 @@ Page {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: chat.model.openUserProfile(modelData.userId) onClicked: {
userProfile.user_data = modelData
userProfile.show()
}
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
propagateComposedEvents: true propagateComposedEvents: true
} }
@ -300,7 +303,10 @@ Page {
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onClicked: chat.model.openUserProfile(section.split(" ")[0]) onClicked: {
userProfile.user_data = modelData
userProfile.show()
}
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
propagateComposedEvents: true propagateComposedEvents: true
} }
@ -314,6 +320,9 @@ Page {
width: chat.delegateMaxWidth - parent.spacing*2 - userName.implicitWidth - avatarSize width: chat.delegateMaxWidth - parent.spacing*2 - userName.implicitWidth - avatarSize
font.italic: true font.italic: true
} }
UserProfile{
id: userProfile
}
} }
} }
} }

View file

@ -0,0 +1,85 @@
import QtQuick 2.9
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.3
ApplicationWindow{
property var user_data
property var colors: currentActivePalette
id:userProfileDialog
height: 500
width: 500
modality:Qt.WindowModal
Layout.alignment: Qt.AlignHCenter
palette: colors
onAfterRendering: {
userProfileAvatar.url = chat.model.avatarUrl(user_data.userId).replace("mxc://", "image://MxcImage/")
userProfileName.text = user_data.userName
matrixUserID.text = user_data.userId
console.log("this is happening");
}
background: Item{
id: userProfileItem
width: userProfileDialog.width
height: userProfileDialog.height
anchors.margins: {
top:20
}
ColumnLayout{
anchors.fill: userProfileItem
width: userProfileDialog.width
spacing: 10
Avatar{
id: userProfileAvatar
height: 130
width: 130
displayName: modelData.userName
Layout.alignment: Qt.AlignHCenter
}
Label{
id: userProfileName
fontSizeMode: Text.HorizontalFit
Layout.alignment: Qt.AlignHCenter
}
Label{
id: matrixUserID
fontSizeMode: Text.HorizontalFit
Layout.alignment: Qt.AlignHCenter
}
ScrollView {
implicitHeight: userProfileDialog.height/2+20
implicitWidth: userProfileDialog.width-20
clip: true
Layout.alignment: Qt.AlignHCenter
ScrollBar.horizontal.policy: ScrollBar.AlwaysOn
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
Label {
text: "ABC"
font.pixelSize: 700
}
}
Button{
text:"OK"
onClicked: userProfileDialog.close()
anchors.margins: {
right:10
bottom:10
}
Layout.alignment: Qt.AlignRight | Qt.AlignBottom
}
}
Item { Layout.fillHeight: true }
}
}

View file

@ -126,6 +126,7 @@
<file>qml/TimelineRow.qml</file> <file>qml/TimelineRow.qml</file>
<file>qml/emoji/EmojiButton.qml</file> <file>qml/emoji/EmojiButton.qml</file>
<file>qml/emoji/EmojiPicker.qml</file> <file>qml/emoji/EmojiPicker.qml</file>
<file>qml/UserProfile.qml</file>
<file>qml/delegates/MessageDelegate.qml</file> <file>qml/delegates/MessageDelegate.qml</file>
<file>qml/delegates/TextMessage.qml</file> <file>qml/delegates/TextMessage.qml</file>
<file>qml/delegates/NoticeMessage.qml</file> <file>qml/delegates/NoticeMessage.qml</file>

View file

@ -52,6 +52,11 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven
nhlog::crypto()->warn("validation error for olm message: {} {}", nhlog::crypto()->warn("validation error for olm message: {} {}",
e.what(), e.what(),
j_msg.dump(2)); j_msg.dump(2));
nhlog::crypto()->warn("validation error for olm message: {} {}",
e.what(),
j_msg.dump(2));
} }
} else if (msg_type == to_string(mtx::events::EventType::RoomKeyRequest)) { } else if (msg_type == to_string(mtx::events::EventType::RoomKeyRequest)) {
@ -368,6 +373,10 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
if (!cache::outboundMegolmSessionExists(req.content.room_id)) { if (!cache::outboundMegolmSessionExists(req.content.room_id)) {
nhlog::crypto()->warn("requested session not found in room: {}", nhlog::crypto()->warn("requested session not found in room: {}",
req.content.room_id); req.content.room_id);
nhlog::crypto()->warn("requested session not found in room: {}",
req.content.room_id);
return; return;
} }
@ -390,6 +399,13 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
} }
if (!utils::respondsToKeyRequests(req.content.room_id)) { if (!utils::respondsToKeyRequests(req.content.room_id)) {
nhlog::crypto()->debug("ignoring all key requests for room {}",
req.content.room_id);
nhlog::crypto()->debug("ignoring all key requests for room {}",
req.content.room_id);
nhlog::crypto()->debug("ignoring all key requests for room {}", nhlog::crypto()->debug("ignoring all key requests for room {}",
req.content.room_id); req.content.room_id);
return; return;

58
src/ui/UserProfile.cpp Normal file
View file

@ -0,0 +1,58 @@
#include "UserProfile.h"
#include "Logging.h"
#include "MatrixClient.h"
#include "Utils.h"
UserProfile::UserProfile(QObject *parent)
: QObject(parent)
{}
QMap<QString, QString>
UserProfile::getDeviceList()
{
return this->deviceList;
}
void
UserProfile::fetchDeviceList(const QString &userId)
{
auto localUser = utils::localUser();
mtx::requests::QueryKeys req;
req.device_keys[userId.toStdString()] = {};
http::client()->query_keys(
req,
[user_id = userId.toStdString()](const mtx::responses::QueryKeys &res,
mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn("failed to query device keys: {} {}",
err->matrix_error.error,
static_cast<int>(err->status_code));
return;
}
if (res.device_keys.empty() ||
(res.device_keys.find(user_id) == res.device_keys.end())) {
nhlog::net()->warn("no devices retrieved {}", user_id);
return;
}
auto devices = res.device_keys.at(user_id);
std::vector<DeviceInfo> deviceInfo;
for (const auto &d : devices) {
auto device = d.second;
// TODO: Verify signatures and ignore those that don't pass.
deviceInfo.emplace_back(DeviceInfo{
QString::fromStdString(d.first),
QString::fromStdString(device.unsigned_info.device_display_name)});
}
std::sort(deviceInfo.begin(),
deviceInfo.end(),
[](const DeviceInfo &a, const DeviceInfo &b) {
return a.device_id > b.device_id;
});
});
}

29
src/ui/UserProfile.h Normal file
View file

@ -0,0 +1,29 @@
#pragma once
#include <QMap>
#include <QObject>
#include <QString>
struct DeviceInfo
{
QString device_id;
QString display_name;
};
class UserProfile : public QObject
{
Q_OBJECT
Q_PROPERTY(QMap deviceList READ getDeviceList NOTIFY DeviceListUpdated)
public:
explicit UserProfile(QObject *parent = 0);
QMap<QString, QString> getDeviceList();
Q_INVOKABLE void fetchDeviceList(const QString &userID);
signals:
void DeviceListUpdated();
private:
QMap<QString, QString> deviceList;
};