Files
noctalia-shell/Services/Theming/AppThemeService.qml
T

91 lines
2.9 KiB
QML

pragma Singleton
import QtQuick
import Quickshell
import qs.Commons
import qs.Services.UI
Singleton {
id: root
Connections {
target: WallpaperService
// When the wallpaper changes, regenerate theme if necessary
function onWallpaperChanged(screenName, path) {
var effectiveMonitor = Settings.data.colorSchemes.monitorForColors;
if (effectiveMonitor === "" || effectiveMonitor === undefined) {
effectiveMonitor = Screen.name;
}
if (screenName !== effectiveMonitor)
return;
if (Settings.data.colorSchemes.useWallpaperColors) {
generateFromWallpaper();
} else {
// Re-run predefined scheme templates so {{image}} reflects the new wallpaper path
ColorSchemeService.applyScheme(Settings.data.colorSchemes.predefinedScheme);
}
}
}
Connections {
target: Settings.data.colorSchemes
function onDarkModeChanged() {
Logger.d("AppThemeService", "Detected dark mode change");
generate();
}
function onMonitorForColorsChanged() {
if (Settings.data.colorSchemes.useWallpaperColors) {
Logger.d("AppThemeService", "Monitor for colors changed to:", Settings.data.colorSchemes.monitorForColors);
generateFromWallpaper();
}
}
function onGenerationMethodChanged() {
Logger.d("AppThemeService", "Generation method changed to:", Settings.data.colorSchemes.generationMethod);
generate();
}
}
// PUBLIC FUNCTIONS
function init() {
Logger.i("AppThemeService", "Service started");
}
function generate() {
if (Settings.data.colorSchemes.useWallpaperColors) {
generateFromWallpaper();
} else {
// applyScheme will trigger template generation via schemeReader.onLoaded
ColorSchemeService.applyScheme(Settings.data.colorSchemes.predefinedScheme);
}
}
function generateFromWallpaper() {
var effectiveMonitor = Settings.data.colorSchemes.monitorForColors;
if (effectiveMonitor === "" || effectiveMonitor === undefined) {
effectiveMonitor = Screen.name;
}
const wp = WallpaperService.getWallpaper(effectiveMonitor);
if (!wp) {
Logger.e("AppThemeService", "No wallpaper found for monitor:", effectiveMonitor);
return;
}
const mode = Settings.data.colorSchemes.darkMode ? "dark" : "light";
TemplateProcessor.processWallpaperColors(wp, mode);
}
function generateFromPredefinedScheme(schemeData) {
Logger.i("AppThemeService", "Generating templates from predefined color scheme");
const mode = Settings.data.colorSchemes.darkMode ? "dark" : "light";
var effectiveMonitor = Settings.data.colorSchemes.monitorForColors;
if (effectiveMonitor === "" || effectiveMonitor === undefined) {
effectiveMonitor = Screen.name;
}
const wallpaperPath = WallpaperService.getWallpaper(effectiveMonitor) || "";
TemplateProcessor.processPredefinedScheme(schemeData, mode, wallpaperPath);
}
}