diff options
Diffstat (limited to 'raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Widgets/AppIconRenderer.qml')
| -rw-r--r-- | raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Widgets/AppIconRenderer.qml | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Widgets/AppIconRenderer.qml b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Widgets/AppIconRenderer.qml new file mode 100644 index 0000000..9cdb71b --- /dev/null +++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Widgets/AppIconRenderer.qml @@ -0,0 +1,130 @@ +import QtQuick +import Quickshell +import Quickshell.Widgets +import qs.Common +import qs.Services + +Item { + id: root + + required property string iconValue + required property int iconSize + property string fallbackText: "A" + property color iconColor: Theme.surfaceText + property color colorOverride: "transparent" + property real brightnessOverride: 0.0 + property real contrastOverride: 0.0 + property real saturationOverride: 0.0 + property color fallbackBackgroundColor: Theme.surfaceLight + property color fallbackTextColor: Theme.primary + property real materialIconSizeAdjustment: Theme.spacingM + property real unicodeIconScale: 0.7 + property real fallbackTextScale: 0.4 + property real iconMargins: 0 + property real fallbackLeftMargin: 0 + property real fallbackRightMargin: 0 + property real fallbackTopMargin: 0 + property real fallbackBottomMargin: 0 + + readonly property bool isMaterial: iconValue && iconValue.startsWith("material:") + readonly property bool isUnicode: iconValue && iconValue.startsWith("unicode:") + readonly property bool isSvgCorner: iconValue && iconValue.startsWith("svg+corner:") + readonly property bool isSvg: iconValue && !isSvgCorner && iconValue.startsWith("svg:") + readonly property bool isImage: iconValue && iconValue.startsWith("image:") + readonly property bool hasColorOverride: colorOverride.a > 0 + readonly property string materialName: isMaterial ? iconValue.substring(9) : "" + readonly property string unicodeChar: isUnicode ? iconValue.substring(8) : "" + readonly property string imagePath: isImage ? iconValue.substring(6) : "" + readonly property string svgSource: { + if (isSvgCorner) { + const parts = iconValue.substring(11).split("|"); + return parts[0] || ""; + } + if (isSvg) + return iconValue.substring(4); + return ""; + } + readonly property string svgCornerIcon: isSvgCorner ? (iconValue.substring(11).split("|")[1] || "") : "" + readonly property bool hasSpecialPrefix: isMaterial || isUnicode || isSvg || isSvgCorner || isImage + readonly property string iconPath: { + if (hasSpecialPrefix || !iconValue) + return ""; + return Paths.resolveIconPath(iconValue); + } + + visible: iconValue !== undefined && iconValue !== "" + + DankIcon { + anchors.centerIn: parent + name: root.materialName + size: root.iconSize - root.materialIconSizeAdjustment + color: root.hasColorOverride ? root.colorOverride : root.iconColor + visible: root.isMaterial + } + + StyledText { + anchors.centerIn: parent + text: root.unicodeChar + font.pixelSize: root.iconSize * root.unicodeIconScale + color: root.hasColorOverride ? root.colorOverride : root.iconColor + visible: root.isUnicode + } + + DankSVGIcon { + anchors.centerIn: parent + source: root.svgSource + size: root.iconSize + cornerIcon: root.svgCornerIcon + colorOverride: root.colorOverride + brightnessOverride: root.brightnessOverride + contrastOverride: root.contrastOverride + saturationOverride: root.saturationOverride + visible: root.isSvg || root.isSvgCorner + } + + CachingImage { + id: cachingImg + anchors.fill: parent + imagePath: root.imagePath + maxCacheSize: root.iconSize * 2 + visible: root.isImage && status === Image.Ready + } + + Loader { + id: iconImgLoader + anchors.fill: parent + anchors.margins: root.iconMargins + active: !root.hasSpecialPrefix && root.iconPath !== "" + sourceComponent: IconImage { + anchors.fill: parent + source: root.iconPath + backer.sourceSize: Qt.size(root.iconSize * 2, root.iconSize * 2) + mipmap: true + asynchronous: true + visible: status === Image.Ready + } + } + + Rectangle { + id: fallbackRect + + anchors.fill: parent + anchors.leftMargin: root.fallbackLeftMargin + anchors.rightMargin: root.fallbackRightMargin + anchors.topMargin: root.fallbackTopMargin + anchors.bottomMargin: root.fallbackBottomMargin + visible: !root.hasSpecialPrefix && (root.iconPath === "" || !iconImgLoader.item || iconImgLoader.item.status !== Image.Ready) + color: root.fallbackBackgroundColor + radius: Theme.cornerRadius + border.width: 0 + border.color: Theme.primarySelected + + StyledText { + anchors.centerIn: parent + text: root.fallbackText + font.pixelSize: root.iconSize * root.fallbackTextScale + color: root.fallbackTextColor + font.weight: Font.Bold + } + } +} |