From bcd747280cc78916ec41f091d81a288dd96e490a Mon Sep 17 00:00:00 2001 From: unspeaker Date: Wed, 23 Apr 2025 08:55:10 +0300 Subject: [PATCH] simplify arranger grid rendering considerably --- crates/app/src/view/view_track.rs | 181 ++++++++++-------------------- 1 file changed, 58 insertions(+), 123 deletions(-) diff --git a/crates/app/src/view/view_track.rs b/crates/app/src/view/view_track.rs index 9520f179..c660799c 100644 --- a/crates/app/src/view/view_track.rs +++ b/crates/app/src/view/view_track.rs @@ -1,147 +1,82 @@ use crate::*; impl<'a> ArrangerView<'a> { - /// Render track headers pub(crate) fn tracks (&'a self) -> impl Content + 'a { let Self { width_side, width_mid, track_count, track_selected, is_editing, .. } = self; Tryptich::center(3) .left(*width_side, button_3("t", "track", format!("{}", *track_count), *is_editing)) .right(*width_side, button_2("T", "add track", *is_editing)) - .middle(*width_mid, per_track(*width_mid, - ||self.tracks_with_sizes_scrolled(), - |t, track|view_track_header(t, track, *track_selected == Some(t)))) + .middle(*width_mid, per_track(*width_mid, ||self.tracks_with_sizes_scrolled(), + |index, track|wrap( + if *track_selected == Some(index) { + track.color.light + } else { + track.color.base + }.rgb, + track.color.lightest.rgb, + Tui::bold(true, Fill::x(Align::nw(&track.name))) + ))) } - /// Render scenes with clips pub(crate) fn scenes (&'a self) -> impl Content + 'a { + let Self { width, width_side, width_mid, scenes_height, scene_last, scene_selected, track_selected, is_editing, app: Tek { editor, .. }, .. } = self; + Tryptich::center(*scenes_height) .left(*width_side, Map::new(||self.scenes_with_scene_colors(), - move|(index, scene, y1, y2, previous): SceneWithColor, _|view_scene_name( - *width, - (1 + y2 - y1) as u16, - y1 as u16, - index, - scene, - previous, - *scene_last == index, - *scene_selected - ))) + move|(index, scene, y1, y2, previous): SceneWithColor, _|{ + let name = Some(scene.name.clone()); + let color = scene.color; + let prev_color = previous; + let is_last = *scene_last == index; + let selected = *scene_selected; + let same_track = true; + let scene = index; + let height = (1 + y2 - y1) as u16; + Fill::x(map_south(y1 as u16, (1 + y2 - y1) as u16, Fixed::y(height, Phat { + width: 0, + height: 0, + content: Fill::x(Align::w(Tui::bold(true, Bsp::e(" ⯈ ", name)))), + colors: Tek::colors( + &color, + prev_color, + same_track && *scene_selected == Some(index), + same_track && index > 0 && *scene_selected == Some(index - 1), + *scene_last == index + ) + }))) + })) .middle(*width_mid, 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>, _| - view_scene_clip( - *width_mid, - (1 + y2 - y1) as u16, - y1 as u16, - scene, - prev_scene, - scene_index, - track_index, - *is_editing, - *track_selected == Some(track_index), - *scene_selected, - *scene_last == scene_index, + move|(scene_index, scene, y1, y2, prev_scene): SceneWithColor<'a>, _|{ + let (name, _fg, bg) = if let Some(clip) = &scene.clips[track_index] { + let clip = clip.read().unwrap(); + (Some(clip.name.clone()), clip.color.lightest.rgb, clip.color) + } else { + (None, Tui::g(96), ItemPalette::G[32]) + }; + let same_track = *track_selected == Some(track_index); + let height = (1 + y2 - y1) as u16; + 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 + ) + }), When( + *is_editing && same_track && *scene_selected == Some(scene_index), editor - )))) - } - - fn scene_add (&'a self) -> impl Content + 'a { - ViewCache::scene_add( - &self.app.view_cache, - self.scene_selected.unwrap_or(0), - self.scene_count, - self.is_editing, - ) - } - - fn track_counter (&'a self) -> Arc> { - ViewCache::track_counter( - &self.app.view_cache, - self.track_selected.unwrap_or(0), - self.track_count, - ) - } - -} - -fn view_track_header <'a> ( - index: usize, track: &'a Track, active: bool -) -> impl Content + use<'a> { - let fg = track.color.lightest.rgb; - let bg = if active { track.color.light.rgb } else { track.color.base.rgb }; - let bg2 = Reset;//if index > 0 { self.tracks()[index - 1].color.base.rgb } else { Reset }; - wrap(bg, fg, Tui::bold(true, Fill::x(Align::nw(&track.name)))) -} - -pub(crate) fn view_scene_name ( - width: u16, - height: u16, - offset: u16, - index: usize, - scene: &Scene, - prev: Option, - last: bool, - select: Option, -) -> impl Content { - Fill::x(map_south(offset, height, Fixed::y(height, view_scene_cell( - " ⯈ ", Some(scene.name.clone()), &scene.color, prev, last, select, true, index, - )))) -} - -pub(crate) fn view_scene_clip <'a> ( - width: u16, - height: u16, - offset: u16, - scene: &'a Scene, - prev_bg: Option, - scene_index: usize, - track_index: usize, - editing: bool, - same_track: bool, - scene_selected: Option, - scene_is_last: bool, - editor: &'a Option, -) -> impl Content + use<'a> { - let (name, _fg, bg) = if let Some(clip) = &scene.clips[track_index] { - let clip = clip.read().unwrap(); - (Some(clip.name.clone()), clip.color.lightest.rgb, clip.color) - } else { - (None, Tui::g(96), ItemPalette::G[32]) - }; - let active = editing && same_track && scene_selected == Some(scene_index); - let with_editor = |x|Bsp::b(x, When(active, editor)); - map_south(offset, height, with_editor(Fixed::y(height, view_scene_cell( - " ⏹ ", name, &bg, prev_bg, - scene_is_last, scene_selected, same_track, scene_index, - )))) -} - -pub(crate) fn view_scene_cell <'a> ( - icon: &'a str, - name: Option>, - color: &ItemPalette, - prev_color: Option, - is_last: bool, - selected: Option, - same_track: bool, - scene: usize, -) -> impl Content + use<'a> { - Phat { - width: 0, - height: 0, - content: Fill::x(Align::w(Tui::bold(true, Bsp::e(icon, name)))), - colors: Tek::colors( - color, - prev_color, - same_track && selected == Some(scene), - same_track && scene > 0 && selected == Some(scene - 1), - is_last - ) + ))) + }))) } }