From 2061babb432674a2c7392f6c12a45abef7072ac7 Mon Sep 17 00:00:00 2001 From: SRHTNIN Date: Tue, 13 Oct 2026 19:24:35 +0200 Subject: [PATCH] Create the shared themes folder with the built-in themes Co-Authored-By: Claude Opus 5.5 --- Core.py | 45 ++++++++++++++++++++++++++++++++++++++++++--- Settings.py | 7 ++++--- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/Core.py b/Core.py index 294cacc..f1cdc6f 100644 --- a/Core.py +++ b/Core.py @@ -109,11 +109,50 @@ _ThemeRoleMap = { } +# The themes every SaraSuite program seeds into ThemesDir if they're missing +# (same values as SaraFem's and SaraView's), so whichever program is installed +# first, the folder and these three are there to choose from. +BuiltinThemes: dict[str, dict[str, str]] = { + "CatppuccinMocha": { + "Background": "#1e1e2e", "Surface": "#181825", "SurfaceAlt": "#313244", "Border": "#45475a", + "Text": "#cdd6f4", "TextMuted": "#6c7086", "Black": "#11111b", "White": "#cdd6f4", + "Red": "#f38ba8", "Orange": "#fab387", "Yellow": "#f9e2af", "Green": "#a6e3a1", + "Blue": "#89b4fa", "Purple": "#cba6f7", + }, + "Forest": { + "Background": "#1b2420", "Surface": "#141b17", "SurfaceAlt": "#243029", "Border": "#334539", + "Text": "#d6e5d0", "TextMuted": "#7c9184", "Black": "#0d120f", "White": "#eef5ea", + "Red": "#e0685a", "Orange": "#e0a458", "Yellow": "#e0c458", "Green": "#7fb069", + "Blue": "#5c9e8f", "Purple": "#9b7fb0", + }, + "Gruvbox": { + "Background": "#282828", "Surface": "#1d2021", "SurfaceAlt": "#3c3836", "Border": "#504945", + "Text": "#ebdbb2", "TextMuted": "#a89984", "Black": "#1d2021", "White": "#fbf1c7", + "Red": "#fb4934", "Orange": "#fe8019", "Yellow": "#fabd2f", "Green": "#b8bb26", + "Blue": "#83a598", "Purple": "#d3869b", + }, +} + + +def EnsureSharedThemes() -> None: + """Create ThemesDir with the built-in themes that aren't there yet + (never overwriting one: it may have been edited).""" + try: + ThemesDir.mkdir(parents=True, exist_ok=True) + for Name, RoleValues in BuiltinThemes.items(): + ThemeFile = ThemesDir / f"{Name}.toml" + if not ThemeFile.exists(): + ThemeFile.write_text(tomlkit.dumps({"Palette": RoleValues})) + except OSError: + pass # read-only or full: the built-in Catppuccin Mocha values still apply + + def ApplyTheme(ThemeName: str) -> None: """Mutate Palette in place from ~/.config/SaraSuite/Themes/.toml. - Falls back to the built-in Catppuccin Mocha values if the file is missing - (SaraFem seeds that directory; SaraSuite only reads it). Must run before - any control reads Palette.X.""" + Seeds the built-in themes first (EnsureSharedThemes); a missing file keeps + the built-in Catppuccin Mocha values. Must run before any control reads + Palette.X.""" + EnsureSharedThemes() ThemeFile = ThemesDir / f"{ThemeName}.toml" if not ThemeFile.exists(): return diff --git a/Settings.py b/Settings.py index 3f1a5ba..9d525e8 100644 --- a/Settings.py +++ b/Settings.py @@ -8,8 +8,8 @@ from typing import Callable import flet as ft from Core import ( - AppConfig, BundledFontFamily, ChildEnvironment, ChipButtonStyle, IsWindows, LoadSharedSettings, Palette, - SharedSettings, ThemesDir, + AppConfig, BundledFontFamily, ChildEnvironment, ChipButtonStyle, EnsureSharedThemes, IsWindows, + LoadSharedSettings, Palette, SharedSettings, ThemesDir, ) from Installer import DefaultAnswers, DefaultOptions from Manifests import Program @@ -25,8 +25,9 @@ def _Note(Text: str) -> ft.Text: def _Themes() -> list[str]: + EnsureSharedThemes() Names = {Path.stem for Path in ThemesDir.glob("*.toml")} if ThemesDir.is_dir() else set() - Names.add("CatppuccinMocha") # built in, even before SaraFem seeds the folder + Names.add("CatppuccinMocha") # built in, even where the folder can't be written return sorted(Names)