From 9c8583fd3ab29c007f005da8f3e5f0447f72756f Mon Sep 17 00:00:00 2001 From: vasilito Date: Sat, 20 Jun 2026 14:35:02 +0300 Subject: [PATCH] tlc: canonicalize skin_name to resolved theme name FileManager.skin_name now stores the canonical MC skin name (e.g. "julia256") rather than the user-config alias (e.g. "default-dark"). When by_name() resolves a legacy alias to a real .ini skin, the resulting theme.name is what gets persisted. apply_skin_selection follows the same rule. Skin dialog tests use real MC skin names (dark, nicedark) and verify the catalog contains no TLC hardcoded presets (no more "default-dark", "mc-classic", etc. in the list). --- .../tlc/source/src/filemanager/dialog_ops.rs | 10 +++-- .../tui/tlc/source/src/filemanager/mod.rs | 8 ++-- .../tlc/source/src/filemanager/skin_dialog.rs | 43 +++++++++++++------ 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/local/recipes/tui/tlc/source/src/filemanager/dialog_ops.rs b/local/recipes/tui/tlc/source/src/filemanager/dialog_ops.rs index 381f259126..7d37b0915a 100644 --- a/local/recipes/tui/tlc/source/src/filemanager/dialog_ops.rs +++ b/local/recipes/tui/tlc/source/src/filemanager/dialog_ops.rs @@ -368,14 +368,16 @@ impl FileManager { /// Apply a confirmed skin selection: switch the active theme, /// persist the new name to the user config, post a status. pub fn apply_skin_selection(&mut self, name: String) { - self.theme = Theme::by_name(&name); - self.skin_name = name.clone(); - if let Err(e) = self.persist_skin_name(&name) { + let theme = Theme::by_name(&name); + let canonical = theme.name.to_string(); + self.theme = theme; + self.skin_name = canonical.clone(); + if let Err(e) = self.persist_skin_name(&canonical) { self.status .set_message(format!("skin: {e}")); } else { self.status - .set_message(format!("Skin: {name}")); + .set_message(format!("Skin: {canonical}")); } self.dialog = None; } diff --git a/local/recipes/tui/tlc/source/src/filemanager/mod.rs b/local/recipes/tui/tlc/source/src/filemanager/mod.rs index 52383c2c1b..21535168f3 100644 --- a/local/recipes/tui/tlc/source/src/filemanager/mod.rs +++ b/local/recipes/tui/tlc/source/src/filemanager/mod.rs @@ -368,7 +368,7 @@ impl FileManager { let left = Panel::new(start, &cfg.filemanager)?; let right = Panel::new(&parent, &cfg.filemanager)?; let theme: Theme = Theme::by_name(&cfg.skin.name); - let skin_name = cfg.skin.name.clone(); + let skin_name = theme.name.to_string(); Ok(Self { left, right, @@ -1116,13 +1116,13 @@ mod tests { let original = fm.theme.name; fm.dispatch(Cmd::SkinSelect).unwrap(); if let Some(DialogState::Skin(d)) = fm.dialog.as_mut() { - d.set_selected("nord"); + d.set_selected("dark"); } let consumed = fm.handle_dialog_key(Key::ENTER); assert!(consumed); assert!(fm.dialog.is_none()); - assert_eq!(fm.theme.name, "nord"); - assert_eq!(fm.skin_name, "nord"); + assert_eq!(fm.theme.name, "dark"); + assert_eq!(fm.skin_name, "dark"); assert_ne!(fm.theme.name, original); let _ = fs::remove_dir_all(&dir); } diff --git a/local/recipes/tui/tlc/source/src/filemanager/skin_dialog.rs b/local/recipes/tui/tlc/source/src/filemanager/skin_dialog.rs index 7dd6699699..a162e8319c 100644 --- a/local/recipes/tui/tlc/source/src/filemanager/skin_dialog.rs +++ b/local/recipes/tui/tlc/source/src/filemanager/skin_dialog.rs @@ -324,16 +324,17 @@ mod tests { #[test] fn new_finds_named_skin() { - let d = SkinDialog::new("nord"); - assert_eq!(d.selected_name(), Some("nord")); - assert_eq!(d.current_skin(), "nord"); + let d = SkinDialog::new("dark"); + assert_eq!(d.selected_name(), Some("dark")); + assert_eq!(d.current_skin(), "dark"); } #[test] fn new_falls_back_to_default_for_unknown_skin() { - let d = SkinDialog::new("no-such-skin"); + let d = SkinDialog::new("no-such-skin-xyz"); assert_eq!(d.selected_index(), 0); - assert_eq!(d.selected_name(), Some("default-dark")); + // First skin in the list (whatever the .ini sort order yields) + assert_eq!(d.selected_name(), d.skins().first().map(|s| s.name.as_str())); } #[test] @@ -342,45 +343,59 @@ mod tests { assert!(d.skins().len() >= 8); let names: Vec<&str> = d.skins().iter().map(|s| s.name.as_str()).collect(); for required in [ + "julia256", + "dark", + "nicedark", + "sand256", + "default", + ] { + assert!(names.contains(&required), "missing {required} in {names:?}"); + } + // TLC no longer maintains its own presets; only MC .ini skins. + for forbidden in [ "default-dark", "default-light", "mc-classic", + "mc-dark", "high-contrast", "solarized-dark", "nord", ] { - assert!(names.contains(&required), "missing {required} in {names:?}"); + assert!( + !names.contains(&forbidden), + "{forbidden} should not appear; got {names:?}" + ); } } #[test] fn enter_returns_selected_name() { - let mut d = SkinDialog::new("default-dark"); - d.set_selected("nord"); + let mut d = SkinDialog::new("dark"); + d.set_selected("nicedark"); let outcome = d.handle_key(Key::ENTER); assert_eq!( outcome, - Some(SkinDialogOutcome::Selected("nord".to_string())) + Some(SkinDialogOutcome::Selected("nicedark".to_string())) ); } #[test] fn esc_cancels() { - let mut d = SkinDialog::new("default-dark"); + let mut d = SkinDialog::new("dark"); let outcome = d.handle_key(Key::ESCAPE); assert_eq!(outcome, Some(SkinDialogOutcome::Cancelled)); } #[test] fn q_cancels() { - let mut d = SkinDialog::new("default-dark"); + let mut d = SkinDialog::new("dark"); let outcome = d.handle_key(Key::from_char('q')); assert_eq!(outcome, Some(SkinDialogOutcome::Cancelled)); } #[test] fn down_advances_cursor() { - let mut d = SkinDialog::new("default-dark"); + let mut d = SkinDialog::new("dark"); let initial = d.selected_index(); let outcome = d.handle_key(Key { code: 0x2193, @@ -392,7 +407,7 @@ mod tests { #[test] fn up_retreats_cursor() { - let mut d = SkinDialog::new("nord"); + let mut d = SkinDialog::new("nicedark"); let initial = d.selected_index(); let outcome = d.handle_key(Key { code: 0x2191, @@ -405,7 +420,7 @@ mod tests { #[test] fn down_clamps_at_last() { let mut d = SkinDialog::new(""); - d.set_selected("nord"); + d.set_selected("sand256"); for _ in 0..100 { d.handle_key(Key { code: 0x2193,