aboutsummaryrefslogtreecommitdiffstats
path: root/config/quickshell/modules/common/widgets/CliphistImage.qml
blob: 9de344507888646562c4110ecc90d59194a0dfba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import "root:/modules/common"
import "root:/modules/common/widgets"
import "root:/services"
import "root:/modules/common/functions/string_utils.js" as StringUtils
import "root:/modules/common/functions/file_utils.js" as FileUtils
import Qt5Compat.GraphicalEffects
import Qt.labs.platform
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Io
import Quickshell.Widgets
import Quickshell.Hyprland

Rectangle {
    id: root
    property string entry
    property real maxWidth
    property real maxHeight

    property string imageDecodePath: Directories.cliphistDecode
    property string imageDecodeFileName: `${entryNumber}`
    property string imageDecodeFilePath: `${imageDecodePath}/${imageDecodeFileName}`
    property string source

    property int entryNumber: {
        if (!root.entry) return 0
        const match = root.entry.match(/^(\d+)\t/)
        return match ? parseInt(match[1]) : 0
    }
    property int imageWidth: {
        if (!root.entry) return 0
        const match = root.entry.match(/(\d+)x(\d+)/)
        return match ? parseInt(match[1]) : 0
    }
    property int imageHeight: {
        if (!root.entry) return 0
        const match = root.entry.match(/(\d+)x(\d+)/)
        return match ? parseInt(match[2]) : 0
    }
    property real scale: {
        return Math.min(
            root.maxWidth / imageWidth,
            root.maxHeight / imageHeight,
            1
        )
    }

    color: Appearance.colors.colLayer1
    radius: Appearance.rounding.small
    implicitHeight: imageHeight * scale
    implicitWidth: imageWidth * scale

    Component.onCompleted: {
        decodeImageProcess.running = true
    }

    Process {
        id: decodeImageProcess
        command: ["bash", "-c", 
            `[ -f ${imageDecodeFilePath} ] || echo '${StringUtils.shellSingleQuoteEscape(root.entry)}' | cliphist decode > '${imageDecodeFilePath}'`
        ]
        onExited: (exitCode, exitStatus) => {
            if (exitCode === 0) {
                root.source = imageDecodeFilePath
            } else {
                console.error("[CliphistImage] Failed to decode image for entry:", root.entry)
                root.source = ""
            }
        }
    }

    Component.onDestruction: {
        Hyprland.dispatch(`exec bash -c "[ -f '${imageDecodeFilePath}' ] && rm -f '${imageDecodeFilePath}'"`)
    }

    Image {
        id: image
        anchors.fill: parent

        source: Qt.resolvedUrl(root.source)
        fillMode: Image.PreserveAspectFit
        antialiasing: true
        asynchronous: true

        width: root.imageWidth * root.scale
        height: root.imageHeight * root.scale
        sourceSize.width: width
        sourceSize.height: height

        layer.enabled: true
        layer.effect: OpacityMask {
            maskSource: Rectangle {
                width: image.width
                height: image.height
                radius: root.radius
            }
        }
    }
}

send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage