diff --git a/app/src/view/view_arranger.rs b/app/src/view/view_arranger.rs index bd06a8fe..f4c92c27 100644 --- a/app/src/view/view_arranger.rs +++ b/app/src/view/view_arranger.rs @@ -60,49 +60,6 @@ impl Tek { *self.arranger.write().unwrap() = output.buffer; } - /// Display the current scene scroll state. - fn scene_scrollbar (&self) -> impl Content + use<'_> { - let offset = self.scene_scroll; - let length = self.h_tracks_area() as usize; - let total = self.h_scenes() as usize; - Fill::y(Fixed::x(1, ScrollbarV { offset, length, total })) - } - - /// Display the current track scroll state. - fn track_scrollbar (&self) -> impl Content + use<'_> { - let offset = self.track_scroll; - let length = self.w_tracks_area() as usize; - let total = self.w_tracks() as usize; - Fill::x(Fixed::y(1, ScrollbarH { offset, length, total })) - } - - /// Render something centered for each track. - fn per_track <'a, T: Content + 'a> ( - &'a self, f: impl Fn(usize, &'a Track)->T + Send + Sync + 'a - ) -> impl Content + 'a { - self.per_track_top(move|index, track|Fill::y(Align::y(f(index, track)))) - } - - /// Render something top-aligned for each track. - fn per_track_top <'a, T: Content + 'a> ( - &'a self, f: impl Fn(usize, &'a Track)->T + Send + Sync + 'a - ) -> impl Content + 'a { - let width = self.w_tracks_area(); - let filter = move|(t, track, x1, x2)|if x2 as u16 >= width { - None - } else { - Some((t, track, x1, x2)) - }; - let tracks = move||self.tracks_sizes().map_while(filter); - Align::x(Tui::bg(Reset, Map::new(tracks, move|(index, track, x1, x2), _|{ - let width = (x2 - x1) as u16; - map_east(x1 as u16, width, Fixed::x(width, Tui::fg_bg( - track.color.lightest.rgb, - track.color.base.rgb, - f(index, track)))) - }))) - } - pub fn view_tracks (&self) -> impl Content + use<'_> { let w = (self.size.w() as u16).saturating_sub(2 * self.w_sidebar()); let s = self.w_sidebar() as u16; @@ -123,8 +80,18 @@ impl Tek { let h_area = self.h_tracks_area(); let selected_track = self.selected().track(); let selected_scene = self.selected().scene(); - let track_scroll = self.track_scrollbar(); - let scene_scroll = self.scene_scrollbar(); + let track_scroll = { + let offset = self.track_scroll; + let length = self.w_tracks_area() as usize; + let total = self.w_tracks() as usize; + Fill::x(Fixed::y(1, ScrollbarH { offset, length, total })) + }; + let scene_scroll = { + let offset = self.scene_scroll; + let length = self.h_tracks_area() as usize; + let total = self.h_scenes() as usize; + Fill::y(Fixed::x(1, ScrollbarV { offset, length, total })) + }; Tui::bg(Reset, Bsp::s(track_scroll, Bsp::e(scene_scroll, Fixed::y(h_area, row(w, h, s, Map::new( move||self.scenes_with_colors(editing, h_area), @@ -281,6 +248,40 @@ impl Tek { ) } + /// Render something centered for each track. + fn per_track <'a, T: Content + 'a> ( + &'a self, f: impl Fn(usize, &'a Track)->T + Send + Sync + 'a + ) -> impl Content + 'a { + self.per_track_top( + move|index, track|Fill::y(Align::y(f(index, track))) + ) + } + + /// Render something top-aligned for each track. + fn per_track_top <'a, T: Content + 'a> ( + &'a self, callback: impl Fn(usize, &'a Track)->T + Send + Sync + 'a + ) -> impl Content + 'a { + let width = self.w_tracks_area(); + let sizes = move||self.tracks_sizes().map_while(move|(t, track, x1, x2)|{ + (width > x2 as u16).then_some((t, track, x1, x2)) + }); + per_track_top(width, sizes, callback) + } + +} + +fn per_track_top <'a, T: Content + 'a, U: TracksSizes<'a>> ( + width: u16, + tracks: impl Fn() -> U + Send + Sync + 'a, + callback: impl Fn(usize, &'a Track)->T + Send + Sync + 'a +) -> impl Content + 'a { + Align::x(Tui::bg(Reset, Map::new(tracks, move|(index, track, x1, x2), _|{ + let width = (x2 - x1) as u16; + map_east(x1 as u16, width, Fixed::x(width, Tui::fg_bg( + track.color.lightest.rgb, + track.color.base.rgb, + callback(index, track)))) + }))) } fn scene_cell <'a> (