From f938ade8394b3e80f2695b46644a9ebd71365037 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 17 May 2025 19:27:27 +0300 Subject: [PATCH] wip: full screen editor in arranger --- config/config_arranger.edn | 6 ++- crates/app/src/view.rs | 21 +++++---- crates/device/src/arranger/arranger_view.rs | 52 ++++++++++----------- deps/tengri | 2 +- 4 files changed, 44 insertions(+), 37 deletions(-) diff --git a/config/config_arranger.edn b/config/config_arranger.edn index 828b549d..f1db5933 100644 --- a/config/config_arranger.edn +++ b/config/config_arranger.edn @@ -3,12 +3,12 @@ (info "A session grid.") (keys + (layer-if :is-editing "./keys_editor.edn") (layer-if :focus-message "./keys_message.edn") (layer-if :focus-device-add "./keys_device_add.edn") (layer-if :focus-browser "./keys_browser.edn") (layer-if :focus-pool-rename "./keys_rename.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-track "./keys_track.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-outputs)) (bsp/s (fill/x (align/w :view-tracks-devices)) - :view-tracks-scenes))))))))) + (either :is-editing + :view-editor + :view-tracks-scenes)))))))))) diff --git a/crates/app/src/view.rs b/crates/app/src/view.rs index e42143d7..2f4d9207 100644 --- a/crates/app/src/view.rs +++ b/crates/app/src/view.rs @@ -33,17 +33,22 @@ impl App { ))); { 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, "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, "SR ", cache.sr.view.clone()))), - ))); - add(&FieldH(theme, "Buf", - Bsp::e(cache.buf.view.clone(), Bsp::e(" = ", cache.lat.view.clone())) - )); + )))); + add(&Fixed::x(16, Align::w(Bsp::s( + 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 + use<'_> { Bsp::e( 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 + use<'a> { diff --git a/crates/device/src/arranger/arranger_view.rs b/crates/device/src/arranger/arranger_view.rs index dbf87f2c..183cab93 100644 --- a/crates/device/src/arranger/arranger_view.rs +++ b/crates/device/src/arranger/arranger_view.rs @@ -10,13 +10,12 @@ impl Arrangement { self.view_track_row_section( theme, Bsp::s( - Fill::x(Align::w(button_2("i", "nput", false))), - Fill::x(Align::nw(Stack::south(move|add: &mut dyn FnMut(&dyn Render)|{ - add(&"kyp"); + Fixed::y(1, Fill::x(Align::w(button_3("i", "nput ", format!("{}", self.midi_ins.len()), false)))), + Fixed::y(h - 1, Fill::x(Align::nw(Stack::south(move|add: &mut dyn FnMut(&dyn Render)|{ for (index, port) in self.midi_ins.iter().enumerate() { add(&Fill::x(Align::w(format!("·i{index:02} {}", port.name())))); } - })))), + }))))), button_2("I", "+", false), Tui::bg(theme.darker.rgb, Align::w(Fill::x( Stack::east(move|add: &mut dyn FnMut(&dyn Render)|{ @@ -42,12 +41,13 @@ impl Arrangement { let h = h + 1; self.view_track_row_section( theme, - Bsp::s(Fill::x(Align::w(button_2("o", "utput", false))), - Fill::xy(Align::nw(Stack::south(|add: &mut dyn FnMut(&dyn Render)|{ + Bsp::s( + 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)|{ for (index, port) in self.midi_outs().iter().enumerate() { add(&Fill::x(Align::w(format!("·o{index:02} {}", port.name())))); } - })))), + }))))), button_2("O", "+", false), Tui::bg(theme.darker.rgb, Align::w(Fill::x( Stack::east(move|add: &mut dyn FnMut(&dyn Render)|{ @@ -60,6 +60,24 @@ impl Arrangement { } }))))) } + pub fn view_track_devices <'a> (&'a self, theme: ItemTheme) -> impl Content + '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)|{ + 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 { @@ -125,7 +143,7 @@ pub trait TracksView: fn view_track_names (&self, theme: ItemTheme) -> impl Content { self.view_track_row_section( theme, - button_2("t", "rack", false), + button_2("t", "rack ", false), button_2("T", "+", false), Tui::bg(theme.darker.rgb, Fixed::y(2, Fill::x( Stack::east(move|add: &mut dyn FnMut(&dyn Render)|{ @@ -167,24 +185,6 @@ pub trait TracksView: } }))))) } - fn view_track_devices <'a> (&'a self, theme: ItemTheme) -> impl Content { - 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)|{ - 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 { let mut h = 0u16; for track in self.tracks().iter() { diff --git a/deps/tengri b/deps/tengri index c9f01648..b1275265 160000 --- a/deps/tengri +++ b/deps/tengri @@ -1 +1 @@ -Subproject commit c9f01648712a0c3c1a8290fc09c65746decbbbcb +Subproject commit b1275265702a835d8cf69fbee2ddee1915f6024b