diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml
index 84c22da1..9eb3380e 100644
--- a/resources/qml/Avatar.qml
+++ b/resources/qml/Avatar.qml
@@ -14,6 +14,7 @@ Rectangle {
property alias url: img.source
property string userid
property string displayName
+ property alias textColor: label.color
signal clicked(var mouse)
@@ -26,6 +27,7 @@ Rectangle {
}
Label {
+ id: label
anchors.fill: parent
text: TimelineManager.escapeEmoji(displayName ? String.fromCodePoint(displayName.codePointAt(0)) : "")
textFormat: Text.RichText
diff --git a/resources/qml/ChatPage.qml b/resources/qml/ChatPage.qml
index 0f884d75..5ccdd9f1 100644
--- a/resources/qml/ChatPage.qml
+++ b/resources/qml/ChatPage.qml
@@ -23,13 +23,14 @@ Rectangle {
AdaptiveLayoutElement {
id: communityListC
- minimumWidth: Nheko.avatarSize * 2 + Nheko.paddingSmall * 2
- collapsedWidth: Nheko.avatarSize + Nheko.paddingSmall * 2
- preferredWidth: Nheko.avatarSize + Nheko.paddingSmall * 2
- maximumWidth: Nheko.avatarSize * 7 + Nheko.paddingSmall * 2
+ minimumWidth: communitiesList.avatarSize * 4 + Nheko.paddingMedium * 2
+ collapsedWidth: communitiesList.avatarSize + 2* Nheko.paddingMedium
+ preferredWidth: collapsedWidth
+ maximumWidth: communitiesList.avatarSize * 10 + 2* Nheko.paddingMedium
- Rectangle {
- color: Nheko.theme.sidebarBackground
+ CommunitiesList {
+ id: communitiesList
+ collapsed: parent.collapsed
}
}
diff --git a/resources/qml/CommunitiesList.qml b/resources/qml/CommunitiesList.qml
new file mode 100644
index 00000000..6ca619c4
--- /dev/null
+++ b/resources/qml/CommunitiesList.qml
@@ -0,0 +1,151 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import "./dialogs"
+import Qt.labs.platform 1.1 as Platform
+import QtQml 2.13
+import QtQuick 2.13
+import QtQuick.Controls 2.13
+import QtQuick.Layouts 1.3
+import im.nheko 1.0
+
+
+Page {
+ //leftPadding: Nheko.paddingSmall
+ //rightPadding: Nheko.paddingSmall
+ property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 1.6)
+ property bool collapsed: false
+
+ ListView {
+ id: communitiesList
+
+ anchors.left: parent.left
+ anchors.right: parent.right
+ height: parent.height
+ model: Communities
+
+ ScrollHelper {
+ flickable: parent
+ anchors.fill: parent
+ enabled: !Settings.mobileMode
+ }
+
+ Platform.Menu {
+ id: communityContextMenu
+
+ property string id
+
+ function show(id_, tags_) {
+ id = id_;
+ open();
+ }
+
+ Platform.MenuItem {
+ text: qsTr("Leave room")
+ onTriggered: Rooms.leave(roomContextMenu.roomid)
+ }
+
+ }
+
+ delegate: Rectangle {
+ id: communityItem
+
+ property color background: Nheko.colors.window
+ property color importantText: Nheko.colors.text
+ property color unimportantText: Nheko.colors.buttonText
+ property color bubbleBackground: Nheko.colors.highlight
+ property color bubbleText: Nheko.colors.highlightedText
+
+ color: background
+ height: avatarSize + 2 * Nheko.paddingMedium
+ width: ListView.view.width
+ state: "normal"
+ ToolTip.visible: hovered.hovered && collapsed
+ ToolTip.text: model.tooltip
+ states: [
+ State {
+ name: "highlight"
+ when: hovered.hovered && !(Communities.currentTagId == model.id)
+
+ PropertyChanges {
+ target: communityItem
+ background: Nheko.colors.dark
+ importantText: Nheko.colors.brightText
+ unimportantText: Nheko.colors.brightText
+ bubbleBackground: Nheko.colors.highlight
+ bubbleText: Nheko.colors.highlightedText
+ }
+
+ },
+ State {
+ name: "selected"
+ when: Communities.currentTagId == model.id
+
+ PropertyChanges {
+ target: communityItem
+ background: Nheko.colors.highlight
+ importantText: Nheko.colors.highlightedText
+ unimportantText: Nheko.colors.highlightedText
+ bubbleBackground: Nheko.colors.highlightedText
+ bubbleText: Nheko.colors.highlight
+ }
+
+ }
+ ]
+
+ TapHandler {
+ margin: -Nheko.paddingSmall
+ acceptedButtons: Qt.RightButton
+ onSingleTapped: communityContextMenu.show(model.id);
+
+ gesturePolicy: TapHandler.ReleaseWithinBounds
+ }
+
+ TapHandler {
+ margin: -Nheko.paddingSmall
+ onSingleTapped: Communities.setCurrentTagId(model.id)
+ onLongPressed: communityContextMenu.show(model.id)
+ }
+
+ HoverHandler {
+ id: hovered
+
+ margin: -Nheko.paddingSmall
+ }
+
+ RowLayout {
+ spacing: Nheko.paddingMedium
+ anchors.fill: parent
+ anchors.margins: Nheko.paddingMedium
+
+ Avatar {
+ id: avatar
+
+ enabled: false
+ Layout.alignment: Qt.AlignVCenter
+ height: avatarSize
+ width: avatarSize
+ url: {
+ if (model.avatarUrl.startsWith("mxc://")) {
+ return model.avatarUrl.replace("mxc://", "image://MxcImage/")
+ } else {
+ return "image://colorimage/"+model.avatarUrl+"?" + communityItem.unimportantText
+ }
+ }
+ displayName: model.displayName
+ color: communityItem.background
+
+ }
+
+ }
+
+ }
+
+ }
+
+ background: Rectangle {
+ color: Nheko.theme.sidebarBackground
+ }
+
+}
diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index a6637467..09fb3701 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -32,8 +32,8 @@ Page {
Connections {
onActiveTimelineChanged: {
- roomlist.positionViewAtIndex(Rooms.roomidToIndex(TimelineManager.timeline.roomId()), ListView.Contain);
- console.log("Test" + TimelineManager.timeline.roomId() + " " + Rooms.roomidToIndex(TimelineManager.timeline.roomId));
+ roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId()), ListView.Contain);
+ console.log("Test" + Rooms.currentRoom.roomId() + " " + Rooms.roomidToIndex(Rooms.currentRoom.roomId()));
}
target: TimelineManager
}
@@ -121,7 +121,7 @@ Page {
states: [
State {
name: "highlight"
- when: hovered.hovered && !(TimelineManager.timeline && model.roomId == TimelineManager.timeline.roomId())
+ when: hovered.hovered && !(Rooms.currentRoom && model.roomId == Rooms.currentRoom.roomId())
PropertyChanges {
target: roomItem
diff --git a/resources/qml/device-verification/Success.qml b/resources/qml/device-verification/Success.qml
index b858a1a1..70cfafaf 100644
--- a/resources/qml/device-verification/Success.qml
+++ b/resources/qml/device-verification/Success.qml
@@ -5,6 +5,7 @@
import QtQuick 2.3
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.10
+import im.nheko 1.0
Pane {
property string title: qsTr("Successful Verification")
diff --git a/resources/res.qrc b/resources/res.qrc
index 531e9be2..53c74ae3 100644
--- a/resources/res.qrc
+++ b/resources/res.qrc
@@ -125,6 +125,7 @@
qml/Root.qml
qml/ChatPage.qml
+ qml/CommunitiesList.qml
qml/RoomList.qml
qml/TimelineView.qml
qml/Avatar.qml
diff --git a/src/Cache.cpp b/src/Cache.cpp
index 4a99dd59..5684de37 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -3451,6 +3451,10 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query
if (!updateToWrite.master_keys.keys.empty() &&
update.master_keys.keys != updateToWrite.master_keys.keys) {
+ nhlog::db()->debug("Master key of {} changed:\nold: {}\nnew: {}",
+ user,
+ updateToWrite.master_keys.keys.size(),
+ update.master_keys.keys.size());
updateToWrite.master_key_changed = true;
}
diff --git a/src/Olm.cpp b/src/Olm.cpp
index d08c1b3e..ff4c883b 100644
--- a/src/Olm.cpp
+++ b/src/Olm.cpp
@@ -206,8 +206,11 @@ handle_olm_message(const OlmMessage &msg)
for (const auto &cipher : msg.ciphertext) {
// We skip messages not meant for the current device.
- if (cipher.first != my_key)
+ if (cipher.first != my_key) {
+ nhlog::crypto()->debug(
+ "Skipping message for {} since we are {}.", cipher.first, my_key);
continue;
+ }
const auto type = cipher.second.type;
nhlog::crypto()->info("type: {}", type == 0 ? "OLM_PRE_KEY" : "OLM_MESSAGE");
@@ -661,8 +664,10 @@ try_olm_decryption(const std::string &sender_key, const mtx::events::msg::OlmCip
for (const auto &id : session_ids) {
auto session = cache::getOlmSession(sender_key, id);
- if (!session)
+ if (!session) {
+ nhlog::crypto()->warn("Unknown olm session: {}:{}", sender_key, id);
continue;
+ }
mtx::crypto::BinaryBuf text;
diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp
index cedaacce..c8ebaa96 100644
--- a/src/timeline/CommunitiesModel.cpp
+++ b/src/timeline/CommunitiesModel.cpp
@@ -21,6 +21,7 @@ CommunitiesModel::roleNames() const
{DisplayName, "displayName"},
{Tooltip, "tooltip"},
{ChildrenHidden, "childrenHidden"},
+ {Id, "id"},
};
}
@@ -74,9 +75,9 @@ CommunitiesModel::data(const QModelIndex &index, int role) const
case CommunitiesModel::Roles::AvatarUrl:
return QString(":/icons/icons/ui/tag.png");
case CommunitiesModel::Roles::DisplayName:
- return tag.right(2);
+ return tag.mid(2);
case CommunitiesModel::Roles::Tooltip:
- return tag.right(2);
+ return tag.mid(2);
}
}
@@ -143,7 +144,7 @@ void
CommunitiesModel::setCurrentTagId(QString tagId)
{
if (tagId.startsWith("tag:")) {
- auto tag = tagId.remove(0, 4);
+ auto tag = tagId.mid(4);
for (const auto &t : tags_) {
if (t == tag) {
this->currentTagId_ = tagId;