separate cli; optimize arranger grid rendering
Some checks failed
/ build (push) Has been cancelled

This commit is contained in:
i do not exist 2026-08-31 19:05:10 +03:00
parent 3deef0641d
commit d495d97516
16 changed files with 462 additions and 425 deletions

View file

@ -70,6 +70,7 @@ impl Arrangement {
midi_outs: midi_outs.collect(),
audio_ins: audio_ins.collect(),
audio_outs: audio_outs.collect(),
size_inner: Sizer(Arc::new(40.into()), Arc::new(25.into())),
clock,
name,
..Default::default()

View file

@ -50,36 +50,32 @@ pub trait ClipsView: TracksView + ScenesView {
fn view_scenes_clips (&self) -> impl Draw<Tui> {
let select = self.selection();
let editor = self.editor();
let size = self.clips_size();
let editing = self.is_editing();
return size.of(
above(
fg(Green, format!("{}x{}", size.w(), size.h())).align_se().full_wh(),
iter_east(move||self.tracks_with_sizes().map(move|(
track_index, track, _, _
)| {
iter_south(move||self.scenes_with_sizes().map(move|(
scene_index, scene, _, _
)| {
let (name, theme): (Arc<str>, ItemTheme) = view_scene_name_theme(scene, track_index);
let f = theme.lightest.term;
let (b, o) = view_scene_bg(theme, select, track_index, scene_index);
let w = view_scene_w(track, select, track_index, editor);
let y = view_scene_y(select, scene_index, editor);
let is_selected = view_scene_sel(select, track_index, scene_index, editing);
with_clips_size(true, self.clips_size(), iter_east(move||self.tracks_with_sizes()
.map(move|(track_index, track, _, _)|iter_south(move||self.scenes_with_sizes()
.map(move|(scene_index, scene, _, _)|{
let (name, theme): (Arc<str>, ItemTheme) = view_scene_name_theme(scene, track_index);
let f = theme.lightest.term;
let (b, o) = view_scene_bg(theme, select, track_index, scene_index);
let is_selected = view_scene_sel(select, track_index, scene_index, editing);
below(
Outer(true, Style::default().fg(o)).full_wh(),
below(
Outer(true, Style::default().fg(o)).full_wh(),
below(
below(
fg_bg(o, b, "".full_wh()),
fg_bg(f, b, bold(true, name)).align_nw().full_wh(),
),
when(is_selected, editor).full_wh()
).full_wh()
).exact_wh(w, y)
})).full_h().exact_w(track.width as u16)
}))
).full_wh());
fg_bg(o, b, "".full_wh()),
fg_bg(f, b, bold(true, name)).align_nw().full_wh(),
),
when(is_selected, editor).full_wh()
).full_wh()
).exact_wh(
view_scene_w(track, select, track_index, editor),
view_scene_y(select, scene_index, editor),
)
})
)
.full_h()
.exact_w(track.width as u16))
)).align_c()
}
}
@ -92,6 +88,11 @@ fn view_scene_name_theme (scene: &Scene, track_index: usize) -> (Arc<str>, ItemT
}
}
fn with_clips_size (show: bool, size: &Sizer, content: impl Draw<Tui>) -> impl Draw<Tui> {
let wh = east!(size.w() as usize, "x", size.h() as usize);
size.of(above(when(show, fg(Green, wh).align_se().full_wh()), content))
}
fn view_scene_bg (
theme: ItemTheme, select: &Selection, track_index: usize, scene_index: usize
) -> (Color, Color) {

View file

@ -24,13 +24,13 @@ pub fn view_audio_outs_status (theme: ItemTheme, track: Option<&Track>) -> impl
pub fn view_ports_status <'a, T: JackPort> (theme: ItemTheme, title: &'a str, ports: &'a [T])
-> impl Draw<Tui> + use<'a, T>
{
let ins = ports.len() as u16;
let ins = ports.len() as u16;
let frame = Outer(true, Style::default().fg(g(96)));
let names = iter_south(move||ports.iter().enumerate().map(|(index, port)|format!(
" {index} {}", port.port_name()
).align_w().full_h()));
let field = field_v(theme, title, names);
border(true, frame, field.exact_wh(20, 1 + ins)).exact_wh(20, 1 + ins)
border(true, frame, field_v(theme, title, iter_south({
move||ports.iter().enumerate().map(|(index, port)|{
east!(" ", index, " ", port.port_name()).align_w().full_h()
})
})).exact_wh(20, 1 + ins)).exact_wh(20, 1 + ins)
}
pub fn view_io_ports <'a, T: PortsSizes<'a>> (

View file

@ -207,13 +207,9 @@ pub trait ScenesView: HasEditor + HasSelection + HasSceneScroll + HasClipsSize +
let select = self.selection();
let editor = self.editor();
let editing = self.is_editing();
draw(move |to: &mut Tui|{
for (index, scene, ..) in self.scenes_with_sizes() {
view_scene_name(select, editor, index, scene, editing).draw(to)?;
}
Ok(Some(XYWH(1, 1, 1, 1)))
})
.exact_w(20)
iter_south(move||self.scenes_with_sizes().map(move|(index, scene, ..)|{
view_scene_name(select, editor, index, scene, editing)
}))
}
fn scenes_with_sizes (&self) -> impl ScenesSizes<'_> {
@ -259,6 +255,30 @@ impl ScenesView for Arrangement {
}
}
pub fn view_scene_name <'a> (
select: &Selection,
editor: Option<&'a MidiEditor>,
index: usize,
scene: &Scene,
editing: bool
) -> impl Draw<Tui> {
let h = if select.scene() == Some(index) && let Some(_editor) = editor {
7
} else {
Scene::DEFAULT_HEIGHT as u16
};
let a = east!("·s", index, " ", fg(g(255), bold(true, &scene.name))).align_w().full_w();
let b = when(select.scene() == Some(index) && editing, south(
editor.as_ref().map(|e|e.clip_status()),
editor.as_ref().map(|e|e.edit_status())).align_nw().full_wh());
let c = if select.scene() == Some(index) {
scene.color.light.term
} else {
scene.color.base.term
};
bg(c, south(a, b).align_nw()).exact_wh(20, h)
}
pub trait HasSceneScroll: HasScenes {
fn scene_scroll (&self) -> usize;
}
@ -274,28 +294,3 @@ impl HasSceneScroll for App {
self.project.scene_scroll()
}
}
pub fn view_scene_name <'a> (
select: &Selection,
editor: Option<&'a MidiEditor>,
index: usize,
scene: &Scene,
editing: bool
) -> impl Draw<Tui> {
let h = if select.scene() == Some(index) && let Some(_editor) = editor {
7
} else {
Scene::DEFAULT_HEIGHT as u16
};
let a = east(format!("·s{index:02} "),
fg(g(255), bold(true, &scene.name))).align_w().full_w();
let b = when(select.scene() == Some(index) && editing, south(
editor.as_ref().map(|e|e.clip_status()),
editor.as_ref().map(|e|e.edit_status())).align_nw().full_wh());
let c = if select.scene() == Some(index) {
scene.color.light.term
} else {
scene.color.base.term
};
bg(c, south(a, b).align_nw()).exact_wh(20, h)
}

View file

@ -433,8 +433,9 @@ pub trait TracksView: HasTracks + ScenesView + HasMidiIns + HasMidiOuts + HasTra
view_track_row_section(theme,
self.view_track_input_count(),
self.view_track_input_add(),
bg(theme.darker.term,
iter_east(move||self.tracks_with_sizes().map(move|(index, track, _x1, _x2)|{
bg(theme.darker.term, iter_east(move||self
.tracks_with_sizes()
.map(move|(index, track, _x1, _x2)|{
south(
bg(track.color.base.term,
east!(