Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F114113
D192.1732508045.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
9 KB
Referenced Files
None
Subscribers
None
D192.1732508045.diff
View Options
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -231,6 +231,7 @@
Notifier.qml
NotificationAction.qml
AvatarAdapter.qml
+ ImageAdapter.qml
FileDialogAdapter.qml
FolderDialogAdapter.qml
ScrollablePageAdapter.qml
diff --git a/src/contents/ui/AvatarAdapter.qml b/src/contents/ui/AvatarAdapter.qml
--- a/src/contents/ui/AvatarAdapter.qml
+++ b/src/contents/ui/AvatarAdapter.qml
@@ -6,6 +6,32 @@
import QtQuick 2.15
import org.kde.kirigamiaddons.components 1.0 as KAC
+import '.' as Kazv
KAC.Avatar {
+ id: avatar
+ property string mxcUri
+ readonly property var manager: kazvIOManager
+ readonly property var sdk: matrixSdk
+ source: fileHandler?.localFile || ''
+
+ property var fileHandlerComp: Component {
+ Kazv.FileHandler {
+ autoCache: true
+ kazvIOManager: avatar.manager
+ matrixSdk: avatar.sdk
+ }
+ }
+ property var fileHandler: null
+
+ onMxcUriChanged: {
+ if (fileHandler) {
+ fileHandler.destroy();
+ fileHandler = null;
+ }
+
+ fileHandler = fileHandlerComp.createObject(avatar, {
+ eventContent: ({ url: avatar.mxcUri }),
+ });
+ }
}
diff --git a/src/contents/ui/Completion.qml b/src/contents/ui/Completion.qml
--- a/src/contents/ui/Completion.qml
+++ b/src/contents/ui/Completion.qml
@@ -49,7 +49,7 @@
Layout.preferredWidth: Kirigami.Units.iconSizes.medium
Layout.preferredHeight: Kirigami.Units.iconSizes.medium
name: nameProvider.name
- source: member.avatarMxcUri ? matrixSdk.mxcUriToHttp(member.avatarMxcUri) : ''
+ mxcUri: member.avatarMxcUri
}
ColumnLayout {
Label {
diff --git a/src/contents/ui/EventReadIndicator.qml b/src/contents/ui/EventReadIndicator.qml
--- a/src/contents/ui/EventReadIndicator.qml
+++ b/src/contents/ui/EventReadIndicator.qml
@@ -37,7 +37,7 @@
}
Layout.preferredWidth: readIndicator.avatarSize
Layout.preferredHeight: readIndicator.avatarSize
- source: member.avatarMxcUri ? matrixSdk.mxcUriToHttp(member.avatarMxcUri) : ''
+ mxcUri: member.avatarMxcUri
name: nameProvider.name
}
}
@@ -82,7 +82,7 @@
objectName: `readIndicatorAvatar${index}`
Layout.preferredWidth: readIndicator.avatarSize
Layout.preferredHeight: readIndicator.avatarSize
- source: member.avatarMxcUri ? matrixSdk.mxcUriToHttp(member.avatarMxcUri) : ''
+ mxcUri: member.avatarMxcUri
name: nameProvider.name
}
diff --git a/src/contents/ui/FileHandler.qml b/src/contents/ui/FileHandler.qml
--- a/src/contents/ui/FileHandler.qml
+++ b/src/contents/ui/FileHandler.qml
@@ -37,6 +37,7 @@
property var iv: ""
property var kazvIOJob
+ readonly property url localFile: kazvIOJob ? '' : cachedFile
property real percent: fileHandler.kazvIOJob ? fileHandler.kazvIOJob.progress : 0.0 // from 0 to 1
property var result
property bool success: fileHandler.result == MK.KazvIOBaseJob.NoError
diff --git a/src/contents/ui/ImageAdapter.qml b/src/contents/ui/ImageAdapter.qml
new file mode 100644
--- /dev/null
+++ b/src/contents/ui/ImageAdapter.qml
@@ -0,0 +1,36 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2024 tusooa <tusooa@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import QtQuick
+import '.' as Kazv
+
+Image {
+ id: image
+ property string mxcUri
+ readonly property var manager: kazvIOManager
+ readonly property var sdk: matrixSdk
+ source: fileHandler?.localFile || ''
+
+ property var fileHandlerComp: Component {
+ Kazv.FileHandler {
+ autoCache: true
+ kazvIOManager: image.manager
+ matrixSdk: image.sdk
+ }
+ }
+ property var fileHandler: null
+
+ onMxcUriChanged: {
+ if (fileHandler) {
+ fileHandler.destroy();
+ fileHandler = null;
+ }
+
+ fileHandler = fileHandlerComp.createObject(image, {
+ eventContent: ({ url: image.mxcUri }),
+ });
+ }
+}
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
@@ -45,7 +45,7 @@
contentItem: RowLayout {
Kazv.AvatarAdapter {
- source: item.roomOrHeroAvatarMxcUri ? matrixSdk.mxcUriToHttp(item.roomOrHeroAvatarMxcUri) : ''
+ mxcUri: item.roomOrHeroAvatarMxcUri
name: Helpers.roomAvatarPlaceholderName(item)
}
diff --git a/src/contents/ui/RoomMemberListViewItemDelegate.qml b/src/contents/ui/RoomMemberListViewItemDelegate.qml
--- a/src/contents/ui/RoomMemberListViewItemDelegate.qml
+++ b/src/contents/ui/RoomMemberListViewItemDelegate.qml
@@ -23,7 +23,7 @@
contentItem: RowLayout {
Kazv.AvatarAdapter {
- source: member.avatarMxcUri ? matrixSdk.mxcUriToHttp(member.avatarMxcUri) : ''
+ mxcUri: member.avatarMxcUri
name: displayName
Layout.preferredWidth: iconSize
}
diff --git a/src/contents/ui/StickerPicker.qml b/src/contents/ui/StickerPicker.qml
--- a/src/contents/ui/StickerPicker.qml
+++ b/src/contents/ui/StickerPicker.qml
@@ -62,12 +62,12 @@
height: stickerPicker.stickerSize + stickerPicker.stickerMargin
width: stickerPicker.stickerSize + stickerPicker.stickerMargin
- Image {
+ Kazv.ImageAdapter {
anchors.centerIn: parent
fillMode: Image.PreserveAspectFit
height: stickerPicker.stickerSize
width: stickerPicker.stickerSize
- source: matrixSdk.mxcUriToHttp(sticker.mxcUri)
+ mxcUri: sticker.mxcUri
}
Rectangle {
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
@@ -157,7 +157,7 @@
Layout.alignment: Qt.AlignHCenter
Layout.preferredHeight: Kirigami.Units.iconSizes.enormous
Layout.preferredWidth: Kirigami.Units.iconSizes.enormous
- source: userPage.user.avatarMxcUri ? matrixSdk.mxcUriToHttp(userPage.user.avatarMxcUri) : ''
+ mxcUri: userPage.user.avatarMxcUri
name: nameProvider.name
}
diff --git a/src/contents/ui/event-types/Simple.qml b/src/contents/ui/event-types/Simple.qml
--- a/src/contents/ui/event-types/Simple.qml
+++ b/src/contents/ui/event-types/Simple.qml
@@ -60,7 +60,7 @@
id: avatar
objectName: 'senderAvatar'
Layout.alignment: Qt.AlignTop
- source: sender.avatarMxcUri ? matrixSdk.mxcUriToHttp(sender.avatarMxcUri) : ''
+ mxcUri: sender.avatarMxcUri
name: senderNickname
visible: !compactMode && !shouldCollapseSender
@@ -88,7 +88,7 @@
id: avatarCompact
Layout.preferredWidth: Kirigami.Units.iconSizes.sizeForLabels
Layout.preferredHeight: Kirigami.Units.iconSizes.sizeForLabels
- source: sender.avatarMxcUri ? matrixSdk.mxcUriToHttp(sender.avatarMxcUri) : ''
+ mxcUri: sender.avatarMxcUri
name: senderNickname
visible: compactMode
}
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
@@ -134,8 +134,7 @@
}
Layout.preferredHeight: Kirigami.Units.iconSizes.huge
Layout.preferredWidth: Kirigami.Units.iconSizes.huge
- source: member.avatarMxcUri ?
- matrixSdk.mxcUriToHttp(member.avatarMxcUri) : ''
+ mxcUri: member.avatarMxcUri
name: nameProvider.name
}
}
diff --git a/src/contents/ui/settings/ProfileSettings.qml b/src/contents/ui/settings/ProfileSettings.qml
--- a/src/contents/ui/settings/ProfileSettings.qml
+++ b/src/contents/ui/settings/ProfileSettings.qml
@@ -25,7 +25,7 @@
Layout.alignment: Qt.AlignHCenter
Layout.preferredHeight: Kirigami.Units.iconSizes.enormous
Layout.preferredWidth: Kirigami.Units.iconSizes.enormous
- source: profileSettings.avatarUrl ? matrixSdk.mxcUriToHttp(profileSettings.avatarUrl) : ''
+ mxcUri: profileSettings.avatarUrl
}
property var saveAvatarUrl: Kazv.AsyncHandler {
diff --git a/src/tests/quick-tests/test-helpers/KazvIOManagerMock.qml b/src/tests/quick-tests/test-helpers/KazvIOManagerMock.qml
--- a/src/tests/quick-tests/test-helpers/KazvIOManagerMock.qml
+++ b/src/tests/quick-tests/test-helpers/KazvIOManagerMock.qml
@@ -20,6 +20,7 @@
])
property var deleteDownloadJob: mockHelper.noop()
property var deleteUploadJob: mockHelper.noop()
+ property var cacheFile: mockHelper.noop()
function getDownloadJob (jobId) {
const component = Qt.createComponent("KazvIOJobMock.qml");
diff --git a/src/tests/quick-tests/tst_AvatarImageAdapters.qml b/src/tests/quick-tests/tst_AvatarImageAdapters.qml
new file mode 100644
--- /dev/null
+++ b/src/tests/quick-tests/tst_AvatarImageAdapters.qml
@@ -0,0 +1,48 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2024 tusooa <tusooa@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import QtQuick
+import QtQuick.Layouts
+import QtTest
+import '../../contents/ui' as Kazv
+import './test-helpers' as QmlHelpers
+
+QmlHelpers.TestItem {
+ id: item
+
+ ColumnLayout {
+ Kazv.AvatarAdapter {
+ id: avatar
+ mxcUri: 'mxc://example.com/xxx'
+ }
+ Kazv.ImageAdapter {
+ id: image
+ mxcUri: 'mxc://example.com/yyy'
+ }
+ }
+
+ TestCase {
+ id: avatarImageAdaptersTest
+ name: 'AvatarImageAdaptersTest'
+ when: windowShown
+
+ function init() {
+ item.mockHelper.clearAll();
+ }
+
+ function test_avatarReactive() {
+ compare(item.kazvIOManager.cacheFile.calledTimes(), 0);
+ avatar.mxcUri = 'mxc://example.com/zzz';
+ compare(item.kazvIOManager.cacheFile.calledTimes(), 1);
+ }
+
+ function test_imageReactive() {
+ compare(item.kazvIOManager.cacheFile.calledTimes(), 0);
+ image.mxcUri = 'mxc://example.com/zzz';
+ compare(item.kazvIOManager.cacheFile.calledTimes(), 1);
+ }
+ }
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Nov 24, 8:14 PM (6 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39904
Default Alt Text
D192.1732508045.diff (9 KB)
Attached To
Mode
D192: Use FileHandler for all images and avatars
Attached
Detach File
Event Timeline
Log In to Comment