mirror of
https://github.com/danbulant/dots-hyprland
synced 2026-05-19 04:08:48 +00:00
55 lines
1.9 KiB
QML
55 lines
1.9 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
import qs.modules.common
|
|
import qs.modules.common.functions
|
|
|
|
/**
|
|
* Thumbnail image. It currently generates to the right place at the right size, but does not handle metadata/maintenance on modification.
|
|
* See Freedesktop's spec: https://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html
|
|
*/
|
|
Image {
|
|
id: root
|
|
|
|
property bool generateThumbnail: true
|
|
required property string sourcePath
|
|
property string thumbnailSizeName: Images.thumbnailSizeNameForDimensions(sourceSize.width, sourceSize.height)
|
|
property string thumbnailPath: {
|
|
if (sourcePath.length == 0) return;
|
|
const resolvedUrl = Qt.resolvedUrl(sourcePath);
|
|
const md5Hash = Qt.md5(resolvedUrl);
|
|
return `${Directories.genericCache}/thumbnails/${thumbnailSizeName}/${md5Hash}.png`;
|
|
}
|
|
source: thumbnailPath
|
|
|
|
asynchronous: true
|
|
cache: false
|
|
smooth: true
|
|
mipmap: false
|
|
|
|
opacity: status === Image.Ready ? 1 : 0
|
|
Behavior on opacity {
|
|
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
|
}
|
|
|
|
onSourceSizeChanged: {
|
|
if (!root.generateThumbnail) return;
|
|
thumbnailGeneration.running = false;
|
|
thumbnailGeneration.running = true;
|
|
}
|
|
Process {
|
|
id: thumbnailGeneration
|
|
command: {
|
|
const maxSize = Images.thumbnailSizes[root.thumbnailSizeName];
|
|
return ["bash", "-c",
|
|
`[ -f '${FileUtils.trimFileProtocol(root.thumbnailPath)}' ] && exit 0 || { magick '${root.sourcePath}' -resize ${maxSize}x${maxSize} '${FileUtils.trimFileProtocol(root.thumbnailPath)}' && exit 1; }`
|
|
]
|
|
}
|
|
onExited: (exitCode, exitStatus) => {
|
|
if (exitCode === 1) { // Force reload if thumbnail had to be generated
|
|
root.source = "";
|
|
root.source = root.thumbnailPath; // Force reload
|
|
}
|
|
}
|
|
}
|
|
}
|