wip: full screen editor in arranger

This commit is contained in:
🪞👃🪞 2025-05-17 19:27:27 +03:00
parent 4f575246ef
commit f938ade839
4 changed files with 44 additions and 37 deletions

View file

@ -3,12 +3,12 @@
(info "A session grid.") (info "A session grid.")
(keys (keys
(layer-if :is-editing "./keys_editor.edn")
(layer-if :focus-message "./keys_message.edn") (layer-if :focus-message "./keys_message.edn")
(layer-if :focus-device-add "./keys_device_add.edn") (layer-if :focus-device-add "./keys_device_add.edn")
(layer-if :focus-browser "./keys_browser.edn") (layer-if :focus-browser "./keys_browser.edn")
(layer-if :focus-pool-rename "./keys_rename.edn") (layer-if :focus-pool-rename "./keys_rename.edn")
(layer-if :focus-pool-length "./keys_length.edn") (layer-if :focus-pool-length "./keys_length.edn")
(layer-if :focus-editor "./keys_editor.edn")
(layer-if :focus-clip "./keys_clip.edn") (layer-if :focus-clip "./keys_clip.edn")
(layer-if :focus-track "./keys_track.edn") (layer-if :focus-track "./keys_track.edn")
(layer-if :focus-scene "./keys_scene.edn") (layer-if :focus-scene "./keys_scene.edn")
@ -26,4 +26,6 @@
(bsp/s (fill/x (align/w :view-tracks-names)) (bsp/s (fill/x (align/w :view-tracks-names))
(bsp/s (fill/x (align/w :view-tracks-outputs)) (bsp/s (fill/x (align/w :view-tracks-outputs))
(bsp/s (fill/x (align/w :view-tracks-devices)) (bsp/s (fill/x (align/w :view-tracks-devices))
:view-tracks-scenes))))))))) (either :is-editing
:view-editor
:view-tracks-scenes))))))))))

View file

@ -33,17 +33,22 @@ impl App {
))); )));
{ {
let cache = self.view_cache.read().unwrap(); let cache = self.view_cache.read().unwrap();
add(&Align::w(Bsp::s( add(&Fixed::x(16, Align::w(Bsp::s(
FieldH(theme, "Beat", cache.beat.view.clone()), FieldH(theme, "Beat", cache.beat.view.clone()),
FieldH(theme, "Time", cache.time.view.clone()), FieldH(theme, "Time", cache.time.view.clone()),
))); ))));
add(&Align::w(Bsp::s( add(&Fixed::x(16, Align::w(Bsp::s(
Fill::x(Align::w(FieldH(theme, "BPM", cache.bpm.view.clone()))), Fill::x(Align::w(FieldH(theme, "BPM", cache.bpm.view.clone()))),
Fill::x(Align::w(FieldH(theme, "SR ", cache.sr.view.clone()))), Fill::x(Align::w(FieldH(theme, "SR ", cache.sr.view.clone()))),
))); ))));
add(&FieldH(theme, "Buf", add(&Fixed::x(16, Align::w(Bsp::s(
Bsp::e(cache.buf.view.clone(), Bsp::e(" = ", cache.lat.view.clone())) Fill::x(Align::w(FieldH(theme, "Buf", cache.buf.view.clone()))),
)); Fill::x(Align::w(FieldH(theme, "Lat", cache.lat.view.clone()))),
))));
add(&FieldV(theme, "Selection", Fill::x(Align::w(self.selection().describe(
self.tracks(),
self.scenes()
)))));
} }
})) }))
} }
@ -111,7 +116,7 @@ impl App {
pub fn view_tracks_scenes (&self) -> impl Content<TuiOut> + use<'_> { pub fn view_tracks_scenes (&self) -> impl Content<TuiOut> + use<'_> {
Bsp::e( Bsp::e(
Fixed::x(20, Align::nw(self.project.view_scenes_names())), Fixed::x(20, Align::nw(self.project.view_scenes_names())),
Bsp::w(self.view_pool(), self.project.view_scenes_clips()), self.project.view_scenes_clips(),
) )
} }
pub fn view_tracks_inputs <'a> (&'a self) -> impl Content<TuiOut> + use<'a> { pub fn view_tracks_inputs <'a> (&'a self) -> impl Content<TuiOut> + use<'a> {

View file

@ -10,13 +10,12 @@ impl Arrangement {
self.view_track_row_section( self.view_track_row_section(
theme, theme,
Bsp::s( Bsp::s(
Fill::x(Align::w(button_2("i", "nput", false))), Fixed::y(1, Fill::x(Align::w(button_3("i", "nput ", format!("{}", self.midi_ins.len()), false)))),
Fill::x(Align::nw(Stack::south(move|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{ Fixed::y(h - 1, Fill::x(Align::nw(Stack::south(move|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{
add(&"kyp");
for (index, port) in self.midi_ins.iter().enumerate() { for (index, port) in self.midi_ins.iter().enumerate() {
add(&Fill::x(Align::w(format!("·i{index:02} {}", port.name())))); add(&Fill::x(Align::w(format!("·i{index:02} {}", port.name()))));
} }
})))), }))))),
button_2("I", "+", false), button_2("I", "+", false),
Tui::bg(theme.darker.rgb, Align::w(Fill::x( Tui::bg(theme.darker.rgb, Align::w(Fill::x(
Stack::east(move|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{ Stack::east(move|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{
@ -42,12 +41,13 @@ impl Arrangement {
let h = h + 1; let h = h + 1;
self.view_track_row_section( self.view_track_row_section(
theme, theme,
Bsp::s(Fill::x(Align::w(button_2("o", "utput", false))), Bsp::s(
Fill::xy(Align::nw(Stack::south(|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{ Fixed::y(1, Fill::x(Align::w(button_3("o", "utput", format!("{}", self.midi_outs.len()), false)))),
Fixed::y(h - 1, Fill::xy(Align::nw(Stack::south(|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{
for (index, port) in self.midi_outs().iter().enumerate() { for (index, port) in self.midi_outs().iter().enumerate() {
add(&Fill::x(Align::w(format!("·o{index:02} {}", port.name())))); add(&Fill::x(Align::w(format!("·o{index:02} {}", port.name()))));
} }
})))), }))))),
button_2("O", "+", false), button_2("O", "+", false),
Tui::bg(theme.darker.rgb, Align::w(Fill::x( Tui::bg(theme.darker.rgb, Align::w(Fill::x(
Stack::east(move|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{ Stack::east(move|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{
@ -60,6 +60,24 @@ impl Arrangement {
} }
}))))) })))))
} }
pub fn view_track_devices <'a> (&'a self, theme: ItemTheme) -> impl Content<TuiOut> + 'a {
let mut h = 2u16;
for track in self.tracks().iter() {
h = h.max(track.devices.len() as u16);
}
self.view_track_row_section(
theme,
button_3("d", "evice", format!("{}", self.track().map(|t|t.devices.len()).unwrap_or(0)), false),
button_2("D", "+", false),
Fixed::y(h, Tui::bg(theme.darker.rgb, Align::w(Fill::x(Stack::east(
move|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{
for (index, track, x1, x2) in self.tracks_with_sizes() {
add(&Fixed::xy(self.track_width(index, track), h + 1,
Tui::bg(track.color.dark.rgb, Align::nw(Map::south(1, move||0..h,
|_, index|format!("·d{index:02} {}", "--------"))))));
}
}))))))
}
} }
pub trait HasClipsSize { pub trait HasClipsSize {
@ -167,24 +185,6 @@ pub trait TracksView:
} }
}))))) })))))
} }
fn view_track_devices <'a> (&'a self, theme: ItemTheme) -> impl Content<TuiOut> {
let mut h = 2u16;
for track in self.tracks().iter() {
h = h.max(track.devices.len() as u16);
}
self.view_track_row_section(
theme,
button_2("d", "evice", false),
button_2("D", "+", false),
Fixed::y(h, Tui::bg(theme.darker.rgb, Align::w(Fill::x(Stack::east(
move|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{
for (index, track, x1, x2) in self.tracks_with_sizes() {
add(&Fixed::xy(self.track_width(index, track), h + 1,
Tui::bg(track.color.dark.rgb, Align::nw(Map::south(1, move||0..h,
|_, index|format!("·d{index:02} {}", "--------"))))));
}
}))))))
}
fn view_track_inputs <'a> (&'a self, theme: ItemTheme) -> impl Content<TuiOut> { fn view_track_inputs <'a> (&'a self, theme: ItemTheme) -> impl Content<TuiOut> {
let mut h = 0u16; let mut h = 0u16;
for track in self.tracks().iter() { for track in self.tracks().iter() {

2
deps/tengri vendored

@ -1 +1 @@
Subproject commit c9f01648712a0c3c1a8290fc09c65746decbbbcb Subproject commit b1275265702a835d8cf69fbee2ddee1915f6024b