diff --git a/solitaire_data/src/settings.rs b/solitaire_data/src/settings.rs index 391c93c..c7e47ea 100644 --- a/solitaire_data/src/settings.rs +++ b/solitaire_data/src/settings.rs @@ -143,10 +143,10 @@ pub struct Settings { #[serde(default)] pub window_geometry: Option, /// Identifier of the active card-art theme. Matches `meta.id` from - /// the theme's `theme.ron` manifest. `"classic"` and `"dark"` are + /// the theme's `theme.ron` manifest. `"dark"` and `"classic"` are /// always present; user-supplied themes register under their own ids. - /// Older `settings.json` files that stored `"default"` will fall - /// back to the dark embedded theme at runtime. + /// Older `settings.json` files that stored `"default"` or `"classic"` + /// are migrated to `"dark"` by [`Settings::sanitized`]. #[serde(default = "default_theme_id")] pub selected_theme_id: String, /// Set to `true` once the achievement-onboarding info-toast has been @@ -272,7 +272,7 @@ fn default_music_volume() -> f32 { } fn default_theme_id() -> String { - "classic".to_string() + "dark".to_string() } /// Default tooltip-hover dwell delay in seconds. Mirrors @@ -395,6 +395,13 @@ impl Settings { /// their respective ranges after deserialization or hand-editing of /// `settings.json`. pub fn sanitized(self) -> Self { + // Migrate stale theme IDs: "default" was removed when the theme was + // renamed to "dark"; "classic" was briefly the default before "dark" + // was restored as the shipped default. + let selected_theme_id = match self.selected_theme_id.as_str() { + "default" | "classic" => "dark".to_string(), + _ => self.selected_theme_id, + }; Self { sfx_volume: self.sfx_volume.clamp(0.0, 1.0), music_volume: self.music_volume.clamp(0.0, 1.0), @@ -407,6 +414,7 @@ impl Settings { replay_move_interval_secs: self .replay_move_interval_secs .clamp(REPLAY_MOVE_INTERVAL_MIN_SECS, REPLAY_MOVE_INTERVAL_MAX_SECS), + selected_theme_id, ..self } } diff --git a/solitaire_engine/src/theme/registry.rs b/solitaire_engine/src/theme/registry.rs index 3c32316..918a859 100644 --- a/solitaire_engine/src/theme/registry.rs +++ b/solitaire_engine/src/theme/registry.rs @@ -100,8 +100,8 @@ fn build_registry_on_startup(mut registry: bevy::ecs::system::ResMut ThemeRegistry { let mut entries = Vec::new(); - entries.push(classic_entry()); entries.push(dark_entry()); + entries.push(classic_entry()); entries.extend(discover_user_themes(user_dir)); ThemeRegistry { entries } } @@ -264,8 +264,8 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let registry = build_registry(tmp.path()); assert_eq!(registry.len(), BUNDLED_COUNT); - assert_eq!(registry.entries[0].id, "classic"); - assert_eq!(registry.entries[1].id, "dark"); + assert_eq!(registry.entries[0].id, "dark"); + assert_eq!(registry.entries[1].id, "classic"); } #[test]