mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 04:06:45 +01:00
freestanding per_track_top
This commit is contained in:
parent
c35d505b9c
commit
b9d1a82314
1 changed files with 46 additions and 45 deletions
|
|
@ -60,49 +60,6 @@ impl Tek {
|
||||||
*self.arranger.write().unwrap() = output.buffer;
|
*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<'_> {
|
pub fn view_tracks (&self) -> impl Content<TuiOut> + use<'_> {
|
||||||
let w = (self.size.w() as u16).saturating_sub(2 * self.w_sidebar());
|
let w = (self.size.w() as u16).saturating_sub(2 * self.w_sidebar());
|
||||||
let s = self.w_sidebar() as u16;
|
let s = self.w_sidebar() as u16;
|
||||||
|
|
@ -123,8 +80,18 @@ impl Tek {
|
||||||
let h_area = self.h_tracks_area();
|
let h_area = self.h_tracks_area();
|
||||||
let selected_track = self.selected().track();
|
let selected_track = self.selected().track();
|
||||||
let selected_scene = self.selected().scene();
|
let selected_scene = self.selected().scene();
|
||||||
let track_scroll = self.track_scrollbar();
|
let track_scroll = {
|
||||||
let scene_scroll = self.scene_scrollbar();
|
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,
|
Tui::bg(Reset, Bsp::s(track_scroll, Bsp::e(scene_scroll, Fixed::y(h_area, row(w, h, s,
|
||||||
Map::new(
|
Map::new(
|
||||||
move||self.scenes_with_colors(editing, h_area),
|
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> (
|
fn scene_cell <'a> (
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue