Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F114350
D40.1732539551.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
16 KB
Referenced Files
None
Subscribers
None
D40.1732539551.diff
View Options
diff --git a/src/contents/ui/Notifier.qml b/src/contents/ui/Notifier.qml
--- a/src/contents/ui/Notifier.qml
+++ b/src/contents/ui/Notifier.qml
@@ -18,6 +18,7 @@
}
property var nameProvider: Kazv.UserNameProvider {}
+ property var roomNameProvider: Kazv.RoomNameProvider {}
property var conn: Connections {
target: matrixSdk
@@ -35,7 +36,7 @@
roomId,
});
notification.eventId = matrixSdk.shouldPlaySound(event) ? 'message' : 'messageWithoutSound';
- notification.title = Helpers.roomNameOrHeroes(room, l10n);
+ notification.title = roomNameProvider.getName(room);
const message = event.content.body;
notification.text = message
? l10n.get('notification-message', { user: senderName, message })
diff --git a/src/contents/ui/RoomListViewItemDelegate.qml b/src/contents/ui/RoomListViewItemDelegate.qml
--- a/src/contents/ui/RoomListViewItemDelegate.qml
+++ b/src/contents/ui/RoomListViewItemDelegate.qml
@@ -22,7 +22,10 @@
property var item
property var iconSize: 1
property var isFavourite: item.tagIds.includes('m.favourite')
- property var roomDisplayName: Helpers.roomNameOrHeroes(item, l10n)
+ property var roomNameProvider: Kazv.RoomNameProvider {
+ room: upper.item
+ }
+ property var roomDisplayName: roomNameProvider.name
property var roomTimeline: item.timeline()
property var lastUnreadMessage: getLastUnreadMessage(roomTimeline, roomTimeline.count)
property var lastUnreadMessageReaders: lastUnreadMessage ? lastUnreadMessage.readers() : null
@@ -63,6 +66,7 @@
}
Label {
+ objectName: 'roomDisplayNameLabel'
text: roomDisplayName
Layout.fillWidth: true
elide: Text.ElideRight
diff --git a/src/contents/ui/RoomNameProvider.qml b/src/contents/ui/RoomNameProvider.qml
new file mode 100644
--- /dev/null
+++ b/src/contents/ui/RoomNameProvider.qml
@@ -0,0 +1,29 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2024 tusooa <tusooa@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import QtQuick 2.15
+import QtQuick.Layouts 1.15
+import QtQuick.Controls 2.15
+
+import 'matrix-helpers.js' as Helpers
+
+QtObject {
+ property var room
+ property var name: getName(room)
+
+ function getName(r) {
+ if (!r) {
+ return '';
+ }
+
+ return Helpers.roomNameOrHeroes(
+ r,
+ r.heroEvents,
+ sdkVars.userGivenNicknameMap.map,
+ l10n,
+ );
+ }
+}
diff --git a/src/contents/ui/RoomPage.qml b/src/contents/ui/RoomPage.qml
--- a/src/contents/ui/RoomPage.qml
+++ b/src/contents/ui/RoomPage.qml
@@ -19,13 +19,16 @@
id: roomPage
property string roomId: ''
property var room: sdkVars.roomList.room(roomId)
+ property var roomNameProvider: Kazv.RoomNameProvider {
+ room: roomPage.room
+ }
property var roomTimeline: room.timeline()
property var lastReceiptableEventId: getLastReceiptableEventId(roomTimeline, roomTimeline.count)
signal mentionUserRequested(string userId)
signal replaceDraftRequested(string newDraft)
- title: room.name || roomId
+ title: roomNameProvider.name
property var isInvite: room.membership === MK.MatrixRoom.Invite
property var isJoin: room.membership === MK.MatrixRoom.Join
diff --git a/src/contents/ui/UserPage.qml b/src/contents/ui/UserPage.qml
--- a/src/contents/ui/UserPage.qml
+++ b/src/contents/ui/UserPage.qml
@@ -24,7 +24,10 @@
user: userPage.user
}
property var room
- property var roomName: Helpers.roomNameOrHeroes(room, l10n)
+ property var roomNameProvider: Kazv.RoomNameProvider {
+ room: userPage.room
+ }
+ property var roomName: roomNameProvider.name
property var editingPowerLevel: false
property var submittingPowerLevel: false
property var powerLevelsLoaded: false
diff --git a/src/contents/ui/room-settings/RoomInvitePage.qml b/src/contents/ui/room-settings/RoomInvitePage.qml
--- a/src/contents/ui/room-settings/RoomInvitePage.qml
+++ b/src/contents/ui/room-settings/RoomInvitePage.qml
@@ -17,7 +17,10 @@
id: roomInvitePage
property var room
- property var roomDisplayName: Helpers.roomNameOrHeroes(room, l10n)
+ property var roomNameProvider: Kazv.RoomNameProvider {
+ room: roomInvitePage.room
+ }
+ property var roomDisplayName: roomNameProvider.name
property var inviting: false
title: l10n.get('room-invite-page-title', { room: roomDisplayName })
diff --git a/src/contents/ui/room-settings/RoomMemberListPage.qml b/src/contents/ui/room-settings/RoomMemberListPage.qml
--- a/src/contents/ui/room-settings/RoomMemberListPage.qml
+++ b/src/contents/ui/room-settings/RoomMemberListPage.qml
@@ -19,7 +19,10 @@
property var room
required property var members
- property var roomDisplayName: Helpers.roomNameOrHeroes(room, l10n)
+ property var roomNameProvider: Kazv.RoomNameProvider {
+ room: roomSettingsPage.room
+ }
+ property var roomDisplayName: roomNameProvider.name
title: l10n.get('room-member-list-page-title', { room: roomDisplayName })
Kazv.RoomMemberListView {
diff --git a/src/contents/ui/room-settings/RoomSettingsPage.qml b/src/contents/ui/room-settings/RoomSettingsPage.qml
--- a/src/contents/ui/room-settings/RoomSettingsPage.qml
+++ b/src/contents/ui/room-settings/RoomSettingsPage.qml
@@ -19,7 +19,10 @@
id: roomSettingsPage
property var room
- property var roomDisplayName: Helpers.roomNameOrHeroes(room, l10n)
+ property var roomNameProvider: Kazv.RoomNameProvider {
+ room: roomSettingsPage.room
+ }
+ property var roomDisplayName: roomNameProvider.name
property var customTagIds: room.tagIds.filter(k => k.startsWith('u.'))
title: l10n.get('room-settings-page-title', { room: roomDisplayName })
diff --git a/src/contents/ui/room-settings/RoomTagHandler.qml b/src/contents/ui/room-settings/RoomTagHandler.qml
--- a/src/contents/ui/room-settings/RoomTagHandler.qml
+++ b/src/contents/ui/room-settings/RoomTagHandler.qml
@@ -15,8 +15,12 @@
import '..' as Kazv
QtObject {
+ id: roomTagHandler
property var room
- property var roomDisplayName: Helpers.roomNameOrHeroes(room, l10n)
+ property var roomNameProvider: Kazv.RoomNameProvider {
+ room: roomTagHandler.room
+ }
+ property var roomDisplayName: roomNameProvider.name
property var tagIds: room.tagIds
property var available: true
property var tagIdInProgress: ''
diff --git a/src/js/matrix-helpers.js b/src/js/matrix-helpers.js
--- a/src/js/matrix-helpers.js
+++ b/src/js/matrix-helpers.js
@@ -4,7 +4,7 @@
return room.name || room.heroNames[0] || room.roomId;
}
-function roomNameOrHeroes(room, l10n)
+function roomNameOrHeroes(room, heroes, userNameOverrides, l10n)
{
if (room.name) {
return l10n.get(
@@ -13,13 +13,19 @@
name: room.name,
}
);
- } else if (room.heroNames.length) {
+ } else if (room.heroEvents && room.heroEvents.length) {
+ const heroNames = room.heroEvents.map(ev => {
+ const displayName = ev.content && ev.content.displayname || '';
+ const userId = ev.state_key;
+ return userDisplayName(displayName, userId, userNameOverrides, l10n);
+ });
+
return l10n.get(
'room-list-view-room-item-title-heroes',
{
- hero: room.heroNames[0],
- secondHero: room.heroNames[1],
- otherNum: room.heroNames.length - 1,
+ hero: heroNames[0],
+ secondHero: heroNames[1],
+ otherNum: heroNames.length - 1,
}
);
} else {
diff --git a/src/matrix-room.hpp b/src/matrix-room.hpp
--- a/src/matrix-room.hpp
+++ b/src/matrix-room.hpp
@@ -51,6 +51,7 @@
LAGER_QT_READER(QString, roomId);
LAGER_QT_READER(QString, name);
LAGER_QT_READER(QStringList, heroNames);
+ LAGER_QT_READER(QVariant, heroEvents);
LAGER_QT_READER(QString, avatarMxcUri);
LAGER_QT_READER(QString, roomOrHeroAvatarMxcUri);
LAGER_QT_READER(QString, localDraft);
diff --git a/src/matrix-room.cpp b/src/matrix-room.cpp
--- a/src/matrix-room.cpp
+++ b/src/matrix-room.cpp
@@ -22,7 +22,7 @@
#include "matrix-promise.hpp"
#include "matrix-event.hpp"
#include "kazv-markdown.hpp"
-
+#include "qt-json.hpp"
#include "qfunctionutils.hpp"
#include "helper.hpp"
@@ -42,6 +42,17 @@
, LAGER_QT(roomId)(m_room.roomId().xform(strToQt))
, LAGER_QT(name)(m_room.nameOpt()[lager::lenses::or_default].xform(strToQt))
, LAGER_QT(heroNames)(m_room.heroDisplayNames().xform(strListToQt))
+ , LAGER_QT(heroEvents)(m_room.heroMemberEvents()
+ .map([](const auto &events) {
+ auto res = QList<QVariant>{};
+ res.reserve(events.size());
+ std::transform(events.begin(), events.end(),
+ std::back_inserter(res),
+ [](const auto &event) -> QVariant {
+ return event.originalJson().get().template get<QJsonObject>();
+ });
+ return QVariant(res);
+ }))
, LAGER_QT(avatarMxcUri)(m_room.avatarMxcUri().xform(strToQt))
, LAGER_QT(roomOrHeroAvatarMxcUri)(lager::with(m_room.heroMemberEvents(), m_room.avatarMxcUri())
.map([](const auto &heroes, const auto &roomAvatar) {
diff --git a/src/resources.qrc b/src/resources.qrc
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -49,6 +49,7 @@
<file alias="RoomMemberListView.qml">contents/ui/RoomMemberListView.qml</file>
<file alias="RoomMemberListViewItemDelegate.qml">contents/ui/RoomMemberListViewItemDelegate.qml</file>
<file alias="UserNameProvider.qml">contents/ui/UserNameProvider.qml</file>
+ <file alias="RoomNameProvider.qml">contents/ui/RoomNameProvider.qml</file>
<file alias="AsyncHandler.qml">contents/ui/AsyncHandler.qml</file>
<file alias="UploadFileHelper.qml">contents/ui/UploadFileHelper.qml</file>
diff --git a/src/tests/quick-tests/tst_RoomListViewItemDelegate.qml b/src/tests/quick-tests/tst_RoomListViewItemDelegate.qml
--- a/src/tests/quick-tests/tst_RoomListViewItemDelegate.qml
+++ b/src/tests/quick-tests/tst_RoomListViewItemDelegate.qml
@@ -121,6 +121,13 @@
property var matrixSdk: TestHelpers.MatrixSdkMock {
property var userId: '@foo:example.org'
}
+ property var sdkVars: QtObject {
+ property var userGivenNicknameMap: QtObject {
+ property var map: ({
+ '@foo:example.com': 'something',
+ })
+ }
+ }
property string testRoomId: 'room-test'
signal switchToRoomRequested(string roomId)
@@ -153,6 +160,34 @@
roomId: testRoomId
})
}
+
+ Kazv.RoomListViewItemDelegate {
+ id: delegateRoomWithName
+ item: QtObject {
+ property var roomId: testRoomId
+ property var name: 'some name'
+ }
+ }
+
+ Kazv.RoomListViewItemDelegate {
+ id: delegateRoomWithHeroes
+ item: QtObject {
+ property var roomId: testRoomId
+ property var heroEvents: [{
+ type: 'm.room.member',
+ state_key: '@foo:example.com',
+ content: {
+ displayname: 'foo',
+ },
+ }, {
+ type: 'm.room.member',
+ state_key: '@bar:example.com',
+ content: {
+ displayname: 'bar',
+ },
+ }]
+ }
+ }
}
TestCase {
@@ -204,5 +239,21 @@
tryCompare(switchToRoomSpy, 'count', 1);
verify(Helpers.deepEqual(switchToRoomSpy.signalArguments[0], [testRoomId]));
}
+
+ function test_roomName() {
+ compare(
+ findChild(delegateRoomWithName, 'roomDisplayNameLabel').text,
+ l10n.get('room-list-view-room-item-title-name', { name: 'some name' }));
+
+ compare(
+ findChild(delegateRoomWithHeroes, 'roomDisplayNameLabel').text,
+ l10n.get('room-list-view-room-item-title-heroes', {
+ hero: l10n.get(
+ 'user-name-overrided',
+ { overridedName: 'something', globalName: 'foo' }),
+ secondHero: 'bar',
+ otherNum: 1,
+ }));
+ }
}
}
diff --git a/src/tests/quick-tests/tst_RoomNameProvider.qml b/src/tests/quick-tests/tst_RoomNameProvider.qml
new file mode 100644
--- /dev/null
+++ b/src/tests/quick-tests/tst_RoomNameProvider.qml
@@ -0,0 +1,164 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2023 tusooa <tusooa@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import QtQuick 2.15
+import QtQuick.Layouts 1.15
+import QtTest 1.0
+
+import '../../contents/ui' as Kazv
+import './test-helpers' as TestHelpers
+import 'test-helpers.js' as Helpers
+
+TestCase {
+ id: roomNameProviderTest
+ name: 'RoomNameProviderTest'
+ when: true
+
+ property var sdkVars: QtObject {
+ property var userGivenNicknameMap: QtObject {
+ property var map: ({})
+ }
+ }
+ property var l10n: Helpers.fluentMock
+
+ property var providerFunctional: Kazv.RoomNameProvider {}
+ property var providerReactive: Kazv.RoomNameProvider {}
+ property var roomComp: Component {
+ QtObject {
+ property var name
+ property var heroEvents
+ property var roomId
+ }
+ }
+ property var heroEvents: [{
+ type: 'm.room.member',
+ state_key: '@foo:example.com',
+ content: {
+ displayname: 'foo',
+ },
+ }, {
+ type: 'm.room.member',
+ state_key: '@bar:example.com',
+ content: {
+ displayname: 'bar',
+ },
+ }]
+
+ function init() {
+ sdkVars.userGivenNicknameMap.map = {
+ '@foo:example.com': 'something',
+ };
+ }
+
+ function test_functional() {
+ compare(
+ providerFunctional.getName({ name: 'some name' }),
+ l10n.get(
+ 'room-list-view-room-item-title-name',
+ { name: 'some name' }));
+
+ compare(providerFunctional.getName({
+ heroEvents
+ }), l10n.get('room-list-view-room-item-title-heroes', {
+ hero: l10n.get(
+ 'user-name-overrided',
+ { overridedName: 'something', globalName: 'foo' }),
+ secondHero: 'bar',
+ otherNum: 1,
+ }));
+
+ compare(
+ providerFunctional.getName({ roomId: '!room:example.com' }),
+ l10n.get(
+ 'room-list-view-room-item-title-id',
+ { roomId: '!room:example.com' }));
+ }
+
+ function test_reactiveAgainstRoom() {
+ providerReactive.room = roomComp.createObject(roomNameProviderTest, {
+ name: 'some name',
+ heroEvents,
+ roomId: '!room:example.com',
+ });
+ compare(
+ providerReactive.name,
+ l10n.get(
+ 'room-list-view-room-item-title-name',
+ { name: 'some name' }));
+ providerReactive.room.name = 'other name';
+ compare(
+ providerReactive.name,
+ l10n.get(
+ 'room-list-view-room-item-title-name',
+ { name: 'other name' }));
+ providerReactive.room.name = undefined;
+ compare(
+ providerReactive.name,
+ l10n.get('room-list-view-room-item-title-heroes', {
+ hero: l10n.get(
+ 'user-name-overrided',
+ { overridedName: 'something', globalName: 'foo' }),
+ secondHero: 'bar',
+ otherNum: 1,
+ }));
+
+ providerReactive.room.heroEvents = [heroEvents[0]];
+ compare(
+ providerReactive.name,
+ l10n.get('room-list-view-room-item-title-heroes', {
+ hero: l10n.get(
+ 'user-name-overrided',
+ { overridedName: 'something', globalName: 'foo' }),
+ secondHero: undefined,
+ otherNum: 0,
+ }));
+
+ providerReactive.room.heroEvents = [];
+ compare(
+ providerReactive.name,
+ l10n.get('room-list-view-room-item-title-id', {
+ roomId: '!room:example.com',
+ }));
+
+ providerReactive.room = roomComp.createObject(roomNameProviderTest, {
+ name: 'some name 2',
+ heroEvents,
+ roomId: '!room:example.com',
+ });
+ compare(
+ providerReactive.name,
+ l10n.get(
+ 'room-list-view-room-item-title-name',
+ { name: 'some name 2' }));
+ }
+
+ function test_reactiveAgainstOverrides() {
+ providerReactive.room = roomComp.createObject(roomNameProviderTest, {
+ heroEvents,
+ roomId: '!room:example.com',
+ });
+
+ compare(
+ providerReactive.name,
+ l10n.get('room-list-view-room-item-title-heroes', {
+ hero: l10n.get(
+ 'user-name-overrided',
+ { overridedName: 'something', globalName: 'foo' }),
+ secondHero: 'bar',
+ otherNum: 1,
+ }));
+ sdkVars.userGivenNicknameMap.map = {
+ };
+
+ compare(
+ providerReactive.name,
+ l10n.get('room-list-view-room-item-title-heroes', {
+ hero: 'foo',
+ secondHero: 'bar',
+ otherNum: 1,
+ }));
+ }
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Nov 25, 4:59 AM (10 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39849
Default Alt Text
D40.1732539551.diff (16 KB)
Attached To
Mode
D40: Display overrided room hero names for unnamed rooms
Attached
Detach File
Event Timeline
Log In to Comment