From 6b9099b0873bc54d6719bb209f7ed5fced6bcb18 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Wed, 23 Apr 2025 15:04:48 +0300 Subject: [PATCH] track down and fix clip color bug --- crates/app/src/view.rs | 97 ++++++++++++++++++++----------- crates/app/src/view/view_color.rs | 32 ---------- 2 files changed, 62 insertions(+), 67 deletions(-) delete mode 100644 crates/app/src/view/view_color.rs diff --git a/crates/app/src/view.rs b/crates/app/src/view.rs index bb8cca96..253263e6 100644 --- a/crates/app/src/view.rs +++ b/crates/app/src/view.rs @@ -1,6 +1,5 @@ use crate::*; mod view_clock; pub use self::view_clock::*; -mod view_color; pub use self::view_color::*; mod view_memo; pub use self::view_memo::*; mod view_meter; pub use self::view_meter::*; mod view_ports; pub use self::view_ports::*; @@ -118,45 +117,72 @@ impl<'a> ArrangerView<'a> { let scene_headers = Map::new(||self.scenes_with_scene_colors(), move|(index, scene, y1, y2, previous): SceneWithColor, _|{ - let same_track = true; let height = (1 + y2 - y1) as u16; let name = Some(scene.name.clone()); + let content = Fill::x(Align::w(Tui::bold(true, Bsp::e(" ⯈ ", name)))); + let same_track = true; + let selected = same_track && *scene_selected == Some(index); + let neighbor = same_track && index > 0 && *scene_selected == Some(index - 1); + let is_last = *scene_last == index; + let theme = scene.color; + let fg = theme.lightest.rgb; + let bg = if selected { theme.light } else { theme.base }.rgb; + let hi = if let Some(previous) = previous { + if neighbor { + previous.light.rgb + } else { + previous.base.rgb + } + } else { + Reset + }; + let lo = if is_last { + Reset + } else if selected { + theme.light.rgb + } else { + theme.base.rgb + }; Fill::x(map_south(y1 as u16, height, Fixed::y(height, Phat { - width: 0, - height: 0, - content: Fill::x(Align::w(Tui::bold(true, Bsp::e(" ⯈ ", name)))), - colors: Tek::colors( - &scene.color, - previous, - same_track && *scene_selected == Some(index), - same_track && index > 0 && *scene_selected == Some(index - 1), - *scene_last == index - ) + width: 0, height: 0, content, colors: [fg, bg, hi, lo] }))) }); let scene_track_clips = per_track(*width_mid, ||self.tracks_with_sizes_scrolled(), - move|track_index, track|Map::new(||self.scenes_with_track_colors(), - move|(scene_index, scene, y1, y2, prev_scene): SceneWithColor<'a>, _|{ - let (name, _fg, bg) = if let Some(clip) = &scene.clips[track_index] { + move|track_index, track|Map::new(move||self.scenes_with_track_colors(track_index), + move|(scene_index, scene, y1, y2, previous): SceneWithColor<'a>, _|{ + let (name, theme) = if let Some(clip) = &scene.clips[track_index] { let clip = clip.read().unwrap(); - (Some(clip.name.clone()), clip.color.lightest.rgb, clip.color) + (Some(clip.name.clone()), clip.color) } else { - (None, Tui::g(96), ItemPalette::G[32]) + (None, ItemPalette::G[32]) }; + let height = (1 + y2 - y1) as u16; + let content = Fill::x(Align::w(Tui::bold(true, Bsp::e(" ⏹ ", name)))); let same_track = *track_selected == Some(track_index); - let height = (1 + y2 - y1) as u16; + let selected = same_track && *scene_selected == Some(scene_index); + let neighbor = same_track && scene_index > 0 && *scene_selected == Some(scene_index - 1); + let is_last = *scene_last == scene_index; + let fg = theme.lightest.rgb; + let bg = if selected { theme.light } else { theme.base }.rgb; + let hi = if let Some(previous) = previous { + if neighbor { + previous.light.rgb + } else { + previous.base.rgb + } + } else { + Reset + }; + let lo = if is_last { + Reset + } else if selected { + theme.light.rgb + } else { + theme.base.rgb + }; map_south(y1 as u16, height, Bsp::b(Fixed::y(height, Phat { - width: 0, - height: 0, - content: Fill::x(Align::w(Tui::bold(true, Bsp::e(" ⏹ ", name)))), - colors: Tek::colors( - &bg, - None, - same_track && *scene_selected == Some(scene_index), - same_track && scene_index > 0 && *scene_selected == Some(scene_index - 1), - *scene_last == scene_index - ) + width: 0, height: 0, content, colors: [fg, bg, hi, lo] }), When( *is_editing && same_track && *scene_selected == Some(scene_index), editor @@ -183,15 +209,16 @@ impl<'a> ArrangerView<'a> { self.app.scenes_with_sizes(self.is_editing, Tek::H_SCENE, Tek::H_EDITOR).map_while( move|(s, scene, y1, y2)|if y2 as u16 > self.scenes_height { None - } else { Some((s, scene, y1, y2, if s == 0 { - None } else { - Some(self.app.scenes()[s-1].color) - })) - }) + Some((s, scene, y1, y2, if s == 0 { + None + } else { + Some(self.app.scenes()[s-1].color) + })) + }) } - pub(crate) fn scenes_with_track_colors (&self) + pub(crate) fn scenes_with_track_colors (&self, track: usize) -> impl ScenesColors<'_> { self.app.scenes_with_sizes(self.is_editing, Tek::H_SCENE, Tek::H_EDITOR).map_while( @@ -201,7 +228,7 @@ impl<'a> ArrangerView<'a> { Some((s, scene, y1, y2, if s == 0 { None } else { - Some(self.app.scenes[s-1].clips[self.track_selected.unwrap_or(0)].as_ref() + Some(self.app.scenes[s-1].clips[track].as_ref() .map(|c|c.read().unwrap().color) .unwrap_or(ItemPalette::G[32])) })) diff --git a/crates/app/src/view/view_color.rs b/crates/app/src/view/view_color.rs deleted file mode 100644 index 8edcc48a..00000000 --- a/crates/app/src/view/view_color.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::*; -impl Tek { - pub(crate) fn colors ( - theme: &ItemPalette, - prev: Option, - selected: bool, - neighbor: bool, - is_last: bool, - ) -> [Color;4] { - let fg = theme.lightest.rgb; - let bg = if selected { theme.light } else { theme.base }.rgb; - let hi = Self::color_hi(prev, neighbor); - let lo = Self::color_lo(theme, is_last, selected); - [fg, bg, hi, lo] - } - pub(crate) fn color_hi (prev: Option, neighbor: bool) -> Color { - prev.map(|prev|if neighbor { - prev.light.rgb - } else { - prev.base.rgb - }).unwrap_or(Reset) - } - pub(crate) fn color_lo (theme: &ItemPalette, is_last: bool, selected: bool) -> Color { - if is_last { - Reset - } else if selected { - theme.light.rgb - } else { - theme.base.rgb - } - } -}