Files
z-bar-qt/cli/src/zshell/subcommands/preset.py
T

63 lines
1.9 KiB
Python

from __future__ import annotations
import json
import os
from pathlib import Path
import typer
from zshell.utils.presets import build_palette, list_presets, load_preset_file
app = typer.Typer()
OUTPUT = Path(os.getenv("HOME", "")) / ".local/state/zshell/scheme.json"
def _split_preset(value: str) -> tuple[str, str | None, str | None]:
parts = value.split(":")
if len(parts) == 1:
return parts[0], None, None
if len(parts) == 3:
return parts[0], parts[1], parts[2]
raise typer.BadParameter("Preset must be <name> or <name>:<flavor>:<accent>")
@app.command()
def list():
for preset_name in list_presets():
data = load_preset_file(preset_name)
flavors = [item["id"] for item in data["variants"]["flavors"]]
accents = [item["id"] for item in data["variants"]["accents"]]
for flavor in flavors:
for accent in accents:
typer.echo(f"{preset_name}:{flavor}:{accent}")
@app.command()
def set(
preset: str = typer.Argument(
..., help="Preset in form <name> or <name>:<flavor>:<accent>"
),
mode: str = typer.Option("dark", help="Mode for preset colors."),
):
name, flavor, accent = _split_preset(preset)
data = load_preset_file(name)
if flavor is None or accent is None:
defaults = data["variants"]["defaults"][mode]
flavor = defaults["flavor"]
accent = defaults["accent"]
palette = build_palette(data, flavor, accent, mode)
out = {
"name": palette.name,
"flavor": f"{palette.flavor}:{palette.accent}",
"mode": palette.mode,
"variant": name,
"colors": dict(palette.colors),
"seed": int(palette.colors["primary"].lstrip("#"), 16),
}
OUTPUT.parent.mkdir(parents=True, exist_ok=True)
OUTPUT.write_text(json.dumps(out, indent=4), encoding="utf-8")
typer.echo(f"applied: {name}:{flavor}:{accent}")