104 lines
2.7 KiB
QML
104 lines
2.7 KiB
QML
// import QtQuick
|
|
// import Quickshell.Widgets
|
|
//
|
|
// Item {
|
|
// id: root
|
|
//
|
|
// property string icon: ""
|
|
// property int size: 16
|
|
//
|
|
// implicitWidth: size
|
|
// implicitHeight: size
|
|
//
|
|
// readonly property url resolvedSource: {
|
|
// if (!icon) return ""
|
|
// if (icon.startsWith("/") || icon.startsWith("file://") || icon.startsWith("image://"))
|
|
// return icon
|
|
// if (icon.includes("?path=")) {
|
|
// const [name, path] = icon.split("?path=")
|
|
// const baseName = name.slice(name.lastIndexOf("/") + 1)
|
|
// return `file://${path}/${baseName}`
|
|
// }
|
|
// return `image://icon/${icon}`
|
|
// }
|
|
//
|
|
// readonly property bool isIconTheme: resolvedSource.toString().startsWith("image://icon/")
|
|
// readonly property bool hasSource: resolvedSource.toString() !== ""
|
|
//
|
|
// IconImage {
|
|
// anchors.fill: parent
|
|
// source: root.resolvedSource
|
|
// visible: root.hasSource && root.isIconTheme
|
|
// asynchronous: true
|
|
// }
|
|
//
|
|
// Image {
|
|
// anchors.fill: parent
|
|
// source: root.hasSource && !root.isIconTheme ? root.resolvedSource : ""
|
|
// visible: root.hasSource && !root.isIconTheme
|
|
// asynchronous: true
|
|
// fillMode: Image.PreserveAspectFit
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
// pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
// import Quickshell
|
|
import Quickshell.Widgets
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property string icon: ""
|
|
property int size: 16
|
|
|
|
implicitWidth: size
|
|
implicitHeight: size
|
|
|
|
readonly property url resolvedSource: {
|
|
if (!icon) return ""
|
|
if (icon.startsWith("/") || icon.startsWith("file://") || icon.startsWith("image://"))
|
|
return icon
|
|
if (icon.includes("?path=")) {
|
|
const [name, path] = icon.split("?path=")
|
|
const baseName = name.slice(name.lastIndexOf("/") + 1)
|
|
return `file://${path}/${baseName}`
|
|
}
|
|
// Use Quickshell's icon image provider instead of iconPath()
|
|
return `image://icon/${icon}`
|
|
}
|
|
|
|
Loader {
|
|
anchors.fill: parent
|
|
// asynchronous: true
|
|
sourceComponent: root.resolvedSource && root.resolvedSource.toString() !== ""
|
|
? root.resolvedSource.toString().startsWith("image://icon/")
|
|
? iconComponent
|
|
: imageComponent
|
|
: null
|
|
}
|
|
|
|
Component {
|
|
id: iconComponent
|
|
IconImage {
|
|
source: root.resolvedSource
|
|
asynchronous: true
|
|
// mipmap: true
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: imageComponent
|
|
Image {
|
|
source: root.resolvedSource
|
|
asynchronous: true
|
|
// mipmap: true
|
|
fillMode: Image.PreserveAspectFit
|
|
}
|
|
}
|
|
}
|
|
|