freestanding per_track_top

This commit is contained in:
🪞👃🪞 2025-03-05 00:19:46 +02:00
parent c35d505b9c
commit b9d1a82314

View file

@ -60,49 +60,6 @@ impl Tek {
*self.arranger.write().unwrap() = output.buffer;
}
/// Display the current scene scroll state.
fn scene_scrollbar (&self) -> impl Content<TuiOut> + 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<TuiOut> + 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<TuiOut> + 'a> (
&'a self, f: impl Fn(usize, &'a Track)->T + Send + Sync + 'a
) -> impl Content<TuiOut> + '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<TuiOut> + 'a> (
&'a self, f: impl Fn(usize, &'a Track)->T + Send + Sync + 'a
) -> impl Content<TuiOut> + '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<TuiOut> + 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<TuiOut> + 'a> (
&'a self, f: impl Fn(usize, &'a Track)->T + Send + Sync + 'a
) -> impl Content<TuiOut> + '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<TuiOut> + 'a> (
&'a self, callback: impl Fn(usize, &'a Track)->T + Send + Sync + 'a
) -> impl Content<TuiOut> + '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<TuiOut> + '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<TuiOut> + '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> (