diff --git a/Helpers/WallpaperPath.qml b/Helpers/WallpaperPath.qml index 89e9a06..d6beb9f 100644 --- a/Helpers/WallpaperPath.qml +++ b/Helpers/WallpaperPath.qml @@ -17,7 +17,10 @@ Singleton { watchChanges: true onAdapterUpdated: writeAdapter() - onFileChanged: reload() + onFileChanged: { + reload(); + Wallpapers.previewColorLock = false; + } JsonAdapter { id: adapter diff --git a/Helpers/Wallpapers.qml b/Helpers/Wallpapers.qml index 1334f06..ba4b64c 100644 --- a/Helpers/Wallpapers.qml +++ b/Helpers/Wallpapers.qml @@ -6,7 +6,7 @@ import Quickshell.Io import QtQuick import ZShell.Models import ZShell.Config -import qs.Modules +import qs.Services import qs.Helpers import qs.Paths @@ -17,6 +17,8 @@ Searcher { property alias crops: adapter.monitorCrops readonly property string current: showPreview ? previewPath : actualCurrent property alias monitorCrops: monitorCrops + property bool pendingPreviewClear + property bool previewColorLock property string previewPath property bool recentlyChanged property bool showPreview: false @@ -34,9 +36,10 @@ Searcher { function preview(path: string): void { previewPath = path; - if (Config.general.color.schemeGeneration) - Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--image-path", `${previewPath}`, "--scheme", `${Config.colors.schemeType}`, "--mode", `${Config.general.color.mode}`]); showPreview = true; + + if (Config.general.color.schemeGeneration) + previewColorsProc.running = true; } function setCrop(screen: string, rect: rect, zoom: real): void { @@ -52,7 +55,6 @@ Searcher { height: rect.height, zoom: zoom }; - // root.crops = updated; } function setWallpaper(path: string): void { @@ -66,8 +68,10 @@ Searcher { function stopPreview(): void { showPreview = false; - if (Config.general.color.schemeGeneration) - Quickshell.execDetached(["zshell-cli", "scheme", "generate", "--image-path", `${root.actualCurrent}`, "--scheme", `${Config.colors.schemeType}`, "--mode", `${Config.general.color.mode}`]); + if (previewColorLock) + pendingPreviewClear = true; + else + Colors.showPreview = false; } extraOpts: useFuzzy ? ({}) : ({ @@ -77,6 +81,11 @@ Searcher { list: wallpapers.entries useFuzzy: true + onPreviewColorLockChanged: { + if (!previewColorLock && pendingPreviewClear) + Colors.showPreview = false; + } + IpcHandler { function set(path: string): void { root.setWallpaper(path); @@ -118,4 +127,17 @@ Searcher { path: Config.general.wallpaperPath recursive: true } + + Process { + id: previewColorsProc + + command: ["zshell-cli", "scheme", "generate", "-p", "-i", root.previewPath] + + stdout: StdioCollector { + onStreamFinished: { + Colors.load(text, true); + Colors.showPreview = true; + } + } + } } diff --git a/Modules/Launcher/Content.qml b/Modules/Launcher/Content.qml index 88d776b..da6ac31 100644 --- a/Modules/Launcher/Content.qml +++ b/Modules/Launcher/Content.qml @@ -79,7 +79,7 @@ Item { if (currentItem) { if (list.showWallpapers) { if (Colors.scheme === "dynamic" && currentItem.modelData.path !== Wallpapers.actualCurrent) - Wallpapers.previewColourLock = true; + Wallpapers.previewColorLock = true; Wallpapers.setWallpaper(currentItem.modelData.path); root.visibilities.launcher = false; } else if (text.startsWith(Config.launcher.actionPrefix)) { diff --git a/Services/Colors.qml b/Services/Colors.qml index bff79f1..863c03f 100644 --- a/Services/Colors.qml +++ b/Services/Colors.qml @@ -69,7 +69,7 @@ Singleton { } for (const [name, color] of Object.entries(scheme.colors)) { - const propName = name.startsWith("term") ? name : `m3${name}`; + const propName = `m3${name}`; if (colors.hasOwnProperty(propName)) colors[propName] = `${color}`; } diff --git a/cli/src/zshell/subcommands/scheme.py b/cli/src/zshell/subcommands/scheme.py index 7ba1dd1..ed60e8b 100644 --- a/cli/src/zshell/subcommands/scheme.py +++ b/cli/src/zshell/subcommands/scheme.py @@ -116,10 +116,15 @@ def list_presets( @app.command() def generate( image_path: Path | None = typer.Option( - None, help="Path to source image. Required for image mode." + None, + "--image-path", + "-i", + help="Path to source image. Required for image mode.", ), scheme: str | None = typer.Option( None, + "--scheme", + "-s", help="Color scheme algorithm to use for image mode. Ignored in preset mode.", autocompletion=_complete_scheme_name, ), @@ -130,16 +135,26 @@ def generate( ), mode: str | None = typer.Option( None, + "--mode", + "-m", help="Mode of the preset scheme (dark or light).", autocompletion=_complete_mode, ), accent: str | None = typer.Option( None, + "--accent", + "-a", help="Accent for schemes that support it (e.g. mauve).", autocompletion=_complete_accent, ), + preview: bool = typer.Option( + False, + "--preview", + "-p", + help="Preview scheme - internal use", + ), ): - if not any([image_path, scheme, preset, mode, accent]): + if not any([image_path, scheme, preset, mode, accent, preview]): print( "Hint: use --preset : or --image-path ", file=sys.stderr, @@ -685,10 +700,6 @@ def generate( variant_val = scheme if not preset else p_variant - if smart and not preset: - apply_gtk_mode(effective_mode) - apply_qt_mode(effective_mode, HOME) - output_dict = { "name": name, "flavor": flavor, @@ -698,6 +709,14 @@ def generate( "seed": seed.to_int(), } + if preview: + print(json.dumps(output_dict)) + return + + if smart and not preset: + apply_gtk_mode(effective_mode) + apply_qt_mode(effective_mode, HOME) + if TEMPLATE_DIR is not None: wp = str(WALL_PATH) ctx = build_template_context(