1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-04-15 02:02:08 -04:00

meta: many resource usage improvements and consolidations

This commit is contained in:
bbedward
2025-07-24 12:44:11 -04:00
parent ee2cbd708d
commit e3e3788a37
34 changed files with 1614 additions and 1382 deletions

View File

@@ -5,59 +5,133 @@ import Quickshell.Widgets
import qs.Common
import qs.Widgets
Variants {
model: Quickshell.screens
LazyLoader {
active: Prefs.wallpaperPath !== ""
PanelWindow {
id: wallpaperWindow
Variants {
model: Quickshell.screens
property var modelData
PanelWindow {
id: wallpaperWindow
screen: modelData
required property var modelData
WlrLayershell.layer: WlrLayer.Background
WlrLayershell.exclusionMode: ExclusionMode.Ignore
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
screen: modelData
anchors.top: true
anchors.bottom: true
anchors.left: true
anchors.right: true
WlrLayershell.layer: WlrLayer.Background
WlrLayershell.exclusionMode: ExclusionMode.Ignore
visible: true
color: "transparent"
anchors.top: true
anchors.bottom: true
anchors.left: true
anchors.right: true
Image {
id: wallpaperImage
color: "black"
anchors.fill: parent
source: Prefs.wallpaperPath ? "file://" + Prefs.wallpaperPath : ""
fillMode: Image.PreserveAspectCrop
visible: Prefs.wallpaperPath !== ""
smooth: true
cache: true
Item {
id: root
anchors.fill: parent
// Smooth transition when wallpaper changes
Behavior on opacity {
NumberAnimation {
duration: Appearance.anim.durations.normal
easing.type: Easing.BezierSpline
easing.bezierCurve: Appearance.anim.curves.standard
property string source: Prefs.wallpaperPath || ""
property Image current: one
onSourceChanged: {
if (!source)
current = null;
else if (current === one)
two.update();
else
one.update();
}
Loader {
anchors.fill: parent
active: !root.source
asynchronous: true
sourceComponent: Rectangle {
color: Theme.surface
Row {
anchors.centerIn: parent
spacing: Theme.spacingL
DankIcon {
name: "sentiment_stressed"
color: Theme.surfaceVariantText
size: Theme.iconSize * 5
anchors.verticalCenter: parent.verticalCenter
}
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingS
StyledText {
text: "Wallpaper missing?"
color: Theme.surfaceVariantText
font.pixelSize: Theme.fontSizeXLarge * 2
font.weight: Font.Bold
}
StyledText {
text: "Set wallpaper in Settings"
color: Theme.primary
font.pixelSize: Theme.fontSizeLarge
}
}
}
}
}
Img {
id: one
}
Img {
id: two
}
component Img: Image {
id: img
function update(): void {
source = "";
source = root.source;
}
anchors.fill: parent
fillMode: Image.PreserveAspectCrop
smooth: true
asynchronous: true
cache: true
opacity: 0
onStatusChanged: {
if (status === Image.Ready)
root.current = this;
}
states: State {
name: "visible"
when: root.current === img
PropertyChanges {
img.opacity: 1
}
}
transitions: Transition {
NumberAnimation {
target: img
properties: "opacity"
duration: Theme.mediumDuration
easing.type: Easing.OutCubic
}
}
}
}
onStatusChanged: {
if (status === Image.Error) {
console.warn("Failed to load wallpaper:", source);
}
}
}
// Fallback background color when no wallpaper is set
StyledRect {
anchors.fill: parent
color: Theme.surface
visible: !wallpaperImage.visible
}
}
}