diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index e0a998a3..67843d0d 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -357,17 +357,59 @@ impl<'a, 'b> Content for ArrangerViewVertical<'a, 'b, Tui> { type Engine = Tui; fn content (&self) -> impl Widget { let Self(state, cols, rows) = self; - let tracks = state.tracks.as_ref(); + let tracks: &[Sequencer] = state.tracks.as_ref(); let scenes = state.scenes.as_ref(); let offset = 4 + scene_name_max_len(scenes) as u16; Layers::new(move |add|{ - //.add_ref(&Background(Color::Rgb(30, 33, 36)))//COLOR_BG1))//bg_lo(state.focused, state.entered))) add(&ColumnSeparators(offset, cols))?; add(&RowSeparators(rows))?; add(&CursorFocus(state.focused, state.selected, offset, cols, rows))?; add(&Split::down(|add|{ - add(&TracksHeader(offset, cols, tracks))?; - add(&SceneRows(offset, cols, rows, tracks, scenes)) + add(&Plus::X(offset, Split::right(move |add|{ + for (track, (w, _)) in tracks.iter().zip(*cols) { + add(&Min::XY(*w as u16, 2, Layers::new(|add|{ + add(&Background(COLOR_BG1))?; + add(&track.name.read().unwrap().as_str()) + })))?; + } + Ok(()) + })))?; + add(&Split::down(move |add| { + for (scene, (pulses, _)) in scenes.iter().zip(*rows) { + let height = 1.max((pulses / 96) as u16); + let playing = scene.is_playing(tracks); + add(&Fixed::Y(height, Split::right(move |add| { + add(&Fixed::XY(offset.saturating_sub(1), height, Split::right(|add|{ + add(&if playing { "▶ " } else { " " })?; + add(&scene.name.read().unwrap().as_str()) + })))?; + for (track, (w, _x)) in cols.iter().enumerate() { + add(&Fixed::XY(*w as u16, height, Layers::new(move |add|{ + let mut color = COLOR_BG0; + if let (Some(track), Some(Some(clip))) = ( + tracks.get(track), + scene.clips.get(track), + ) { + if let Some(phrase) = track.phrases.get(*clip) { + add(&Plus::X(1, format!( + "{clip:02} {}", + phrase.read().unwrap().name.read().unwrap() + ).as_str()))?; + color = if track.sequence == Some(*clip) { + Nord::PLAYING + } else { + COLOR_BG1 + }; + } + } + add(&Background(color)) + })))?; + } + Ok(()) + })))?; + } + Ok(()) + })) })) }) } @@ -489,73 +531,6 @@ impl<'a> Widget for CursorFocus<'a> { } } -struct TracksHeader<'a>( - u16, &'a[(usize, usize)], &'a [Sequencer] -); - -impl<'a> Content for TracksHeader<'a> { - type Engine = Tui; - fn content (&self) -> impl Widget { - let Self(offset, columns, tracks) = *self; - Plus::X(offset, Split::right(move |add|{ - for (track, (w, _)) in tracks.iter().zip(columns) { - add(&Min::XY(*w as u16, 2, Layers::new(|add|{ - add(&Background(COLOR_BG1))?; - add(&track.name.read().unwrap().as_str()) - })))?; - } - Ok(()) - })) - } -} - -struct SceneRows<'a>( - u16, &'a[(usize, usize)], &'a[(usize, usize)], &'a[Sequencer], &'a[Scene] -); - -impl<'a> Content for SceneRows<'a> { - type Engine = Tui; - fn content (&self) -> impl Widget { - let Self(offset, columns, rows, tracks, scenes) = *self; - Split::down(move |add| { - for (scene, (pulses, _)) in scenes.iter().zip(rows) { - let height = 1.max((pulses / 96) as u16); - let playing = scene.is_playing(tracks); - add(&Fixed::Y(height, Split::right(move |add| { - add(&Fixed::XY(offset.saturating_sub(1), height, Split::right(|add|{ - add(&if playing { "▶ " } else { " " })?; - add(&scene.name.read().unwrap().as_str()) - })))?; - for (track, (w, _x)) in columns.iter().enumerate() { - add(&Fixed::XY(*w as u16, height, Layers::new(move |add|{ - let mut color = COLOR_BG0; - if let (Some(track), Some(Some(clip))) = ( - tracks.get(track), - scene.clips.get(track), - ) { - if let Some(phrase) = track.phrases.get(*clip) { - add(&Plus::X(1, format!( - "{clip:02} {}", - phrase.read().unwrap().name.read().unwrap() - ).as_str()))?; - color = if track.sequence == Some(*clip) { - Nord::PLAYING - } else { - COLOR_BG1 - }; - } - } - add(&Background(color)) - })))?; - } - Ok(()) - })))?; - } - Ok(()) - }) - } -} - struct ArrangerViewHorizontal<'a, E: Engine>( &'a Arranger ); diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index 262d3adc..81ab3c60 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -1,5 +1,4 @@ use crate::*; -use tek_core::Direction; /// Phrase editor. pub struct Sequencer {