Files

122 lines
3.5 KiB
QML

import QtQuick
import QtQuick.Effects
import Quickshell
import Quickshell.Wayland
import qs.Commons
import qs.Services.Compositor
import qs.Services.Power
import qs.Services.UI
Loader {
active: CompositorService.isNiri && Settings.data.wallpaper.enabled && Settings.data.wallpaper.overviewEnabled && (!PowerProfileService.noctaliaPerformanceMode || !Settings.data.noctaliaPerformance.disableWallpaper)
sourceComponent: Variants {
model: Quickshell.screens
delegate: PanelWindow {
id: panelWindow
required property ShellScreen modelData
property string wallpaper: ""
property string preprocessedWallpaper: "" // Pre-resized wallpaper from Background.qml
property bool isSolidColor: Settings.data.wallpaper.useSolidColor
property color solidColor: Settings.data.wallpaper.solidColor
property color tintColor: Settings.data.colorSchemes.darkMode ? Color.mSurface : Color.mOnSurface
visible: wallpaper !== "" || isSolidColor
Component.onCompleted: {
if (modelData) {
Logger.d("Overview", "Loading overview for Niri on", modelData.name);
}
}
Component.onDestruction: {
bgImage.source = "";
}
// External state management - wait for wallpaper processing to complete
// Reuses the same cached image as Background.qml for memory efficiency + GPU blur
Connections {
target: WallpaperService
function onWallpaperProcessingComplete(screenName, path, cachedPath) {
if (screenName === modelData.name) {
preprocessedWallpaper = cachedPath || "";
wallpaper = path;
}
}
}
// Handle wallpaper changes (solid color detection)
onWallpaperChanged: {
if (!wallpaper)
return;
// Check if this is a solid color path
if (WallpaperService.isSolidColorPath(wallpaper)) {
isSolidColor = true;
var colorStr = WallpaperService.getSolidColor(wallpaper);
solidColor = colorStr;
return;
}
isSolidColor = false;
}
color: "transparent"
screen: modelData
WlrLayershell.layer: WlrLayer.Background
WlrLayershell.exclusionMode: ExclusionMode.Ignore
WlrLayershell.namespace: "noctalia-overview-" + (screen?.name || "unknown")
anchors {
top: true
bottom: true
right: true
left: true
}
// Solid color background
Rectangle {
anchors.fill: parent
visible: isSolidColor
color: solidColor
Rectangle {
anchors.fill: parent
color: tintColor
opacity: Settings.data.wallpaper.overviewTint
}
}
// Image background with GPU-based blur
Image {
id: bgImage
anchors.fill: parent
visible: !isSolidColor
fillMode: Image.PreserveAspectCrop
source: preprocessedWallpaper || wallpaper
smooth: true
mipmap: false
cache: true // Shares texture with Background's currentWallpaper
asynchronous: true
layer.enabled: Settings.data.wallpaper.overviewBlur > 0 && !PowerProfileService.noctaliaPerformanceMode
layer.smooth: false
layer.effect: MultiEffect {
blurEnabled: true
blur: Settings.data.wallpaper.overviewBlur
blurMax: 48
}
// Tint overlay
Rectangle {
anchors.fill: parent
color: tintColor
opacity: Settings.data.wallpaper.overviewTint
}
}
}
}
}