From 550fd4cbcde624022fdee73b152d2c5b77e88334 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sun, 17 Nov 2024 06:41:08 +0100 Subject: [PATCH] wip: p.48, e=14, somewhat less todo. --- crates/tek_tui/src/tui_arranger_view.rs | 57 +++++++++++++++++++++--- crates/tek_tui/src/tui_pool_view.rs | 21 +++++---- crates/tek_tui/src/tui_sequencer_view.rs | 51 +++++++++++++++++++-- crates/tek_tui/src/tui_transport_view.rs | 12 ++--- 4 files changed, 118 insertions(+), 23 deletions(-) diff --git a/crates/tek_tui/src/tui_arranger_view.rs b/crates/tek_tui/src/tui_arranger_view.rs index 66913683..36d94774 100644 --- a/crates/tek_tui/src/tui_arranger_view.rs +++ b/crates/tek_tui/src/tui_arranger_view.rs @@ -121,7 +121,7 @@ pub fn arranger_content_vertical ( // track titles let header = row!((track, w) in tracks.iter().zip(cols.iter().map(|col|col.0))=>{ // name and width of track - let name = track.name.read().unwrap(); + let name = track.name().read().unwrap(); let max_w = w.saturating_sub(1).min(name.len()).max(2); let name = format!("▎{}", &name[0..max_w]); let name = TuiStyle::bold(name, true); @@ -159,7 +159,7 @@ pub fn arranger_content_vertical ( .unwrap_or("(none)".into())); col!(name, /*input, output,*/ until_next, elapsed) .min_xy(w as u16, header_h) - .bg(track.color.rgb) + .bg(track.color().rgb) .push_x(scenes_w) }); // tracks and scenes @@ -205,7 +205,7 @@ pub fn arranger_content_vertical ( // cursor add(&CustomWidget::new(any_size, move|to: &mut TuiOutput|{ let area = to.area(); - let focused = view.focused; + let focused = view.is_focused(); let selected = view.selected; let get_track_area = |t: usize| [ scenes_w + area.x() + cols[t].1 as u16, area.y(), @@ -258,7 +258,7 @@ pub fn arranger_content_vertical ( }) })) }).bg(bg.rgb); - let color = TuiTheme::title_fg(view.focused); + let color = TuiTheme::title_fg(view.is_focused()); let size = format!("{}x{}", view.size.w(), view.size.h()); let lower_right = TuiStyle::fg(size, color).pull_x(1).align_se().fill_xy(); lay!(arrangement, lower_right) @@ -267,7 +267,7 @@ pub fn arranger_content_vertical ( pub fn arranger_content_horizontal ( view: &ArrangerTui, ) -> impl Widget + use<'_> { - let focused = view.focused; + let focused = view.is_focused(); let _tracks = view.tracks(); lay!( focused.then_some(Background(TuiTheme::border_bg())), @@ -461,7 +461,7 @@ impl TransportViewState for ArrangerTui { fn focus (&self) -> TransportFocus { self.focus } - fn focused (&self) -> bool { + fn is_focused (&self) -> bool { self.focused } fn transport_state (&self) -> Option { @@ -482,7 +482,52 @@ impl TransportViewState for ArrangerTui { } impl PhrasesViewState for ArrangerTui { + fn focused (&self) -> bool { + todo!() + } + fn entered (&self) -> bool { + todo!() + } + fn phrases (&self) -> Vec<()> { + todo!() + } + fn phrase (&self) -> usize { + todo!() + } + fn mode (&self) -> Option<&PhrasesMode> { + &self.mode + } } impl PhraseViewState for ArrangerTui { + fn focused (&self) -> bool { + todo!() + } + fn entered (&self) -> bool { + todo!() + } + fn keys (&self) -> &Buffer { + todo!() + } + fn phrase (&self) -> &Option>> { + todo!() + } + fn buffer (&self) -> &BigBuffer { + todo!() + } + fn note_len (&self) -> usize { + todo!() + } + fn note_axis (&self) -> &RwLock> { + todo!() + } + fn time_axis (&self) -> &RwLock> { + todo!() + } + fn size (&self) -> &Measure { + todo!() + } + fn now (&self) -> &Arc { + todo!() + } } diff --git a/crates/tek_tui/src/tui_pool_view.rs b/crates/tek_tui/src/tui_pool_view.rs index 76250360..5298675d 100644 --- a/crates/tek_tui/src/tui_pool_view.rs +++ b/crates/tek_tui/src/tui_pool_view.rs @@ -14,8 +14,8 @@ pub trait PhrasesViewState { fn focused (&self) -> bool; fn entered (&self) -> bool; fn phrases (&self) -> Vec<()>; - fn phrase (&self) -> (); - fn mode (&self) -> PhrasesMode; + fn phrase (&self) -> usize; + fn mode (&self) -> Option<&PhrasesMode>; } impl PhrasesViewState for PhrasesTui { @@ -28,11 +28,11 @@ impl PhrasesViewState for PhrasesTui { fn phrases (&self) -> Vec<()> { todo!() } - fn phrase (&self) -> () { + fn phrase (&self) -> usize { todo!() } - fn mode (&self) -> PhrasesMode { - todo!() + fn mode (&self) -> Option<&PhrasesMode> { + &self.mode } } @@ -52,7 +52,7 @@ impl<'a, T: PhrasesViewState> Content for PhrasesView<'a, T> { let Phrase { ref name, color, length, .. } = *phrase.read().unwrap(); let mut length = PhraseLength::new(length, None); if let Some(PhrasesMode::Length(phrase, new_length, focus)) = mode { - if focused && i == phrase { + if focused && i == *phrase { length.pulses = new_length; length.focus = Some(focus); } @@ -61,11 +61,16 @@ impl<'a, T: PhrasesViewState> Content for PhrasesView<'a, T> { let row1 = lay!(format!(" {i}").align_w().fill_x(), length).fill_x(); let mut row2 = format!(" {name}"); if let Some(PhrasesMode::Rename(phrase, _)) = mode { - if focused && i == phrase { row2 = format!("{row2}▄"); } + if focused && i == *phrase { + row2 = format!("{row2}▄"); + } }; let row2 = TuiStyle::bold(row2, true); add(&col!(row1, row2).fill_x().bg(color.base.rgb))?; - Ok(if focused && i == phrase { add(&CORNERS)?; }) + if focused && i == *phrase { + add(&CORNERS)?; + } + Ok(()) }) ); let border_color = if focused {Color::Rgb(100, 110, 40)} else {Color::Rgb(70, 80, 50)}; diff --git a/crates/tek_tui/src/tui_sequencer_view.rs b/crates/tek_tui/src/tui_sequencer_view.rs index b41879cd..96abe94f 100644 --- a/crates/tek_tui/src/tui_sequencer_view.rs +++ b/crates/tek_tui/src/tui_sequencer_view.rs @@ -17,7 +17,7 @@ impl TransportViewState for SequencerTui { fn focus (&self) -> TransportFocus { self.focus } - fn focused (&self) -> bool { + fn is_focused (&self) -> bool { self.focused } fn transport_state (&self) -> Option { @@ -37,8 +37,53 @@ impl TransportViewState for SequencerTui { } } -impl PhrasesViewState for ArrangerTui { +impl PhrasesViewState for SequencerTui { + fn focused (&self) -> bool { + todo!() + } + fn entered (&self) -> bool { + todo!() + } + fn phrases (&self) -> Vec<()> { + todo!() + } + fn phrase (&self) -> usize { + todo!() + } + fn mode (&self) -> Option<&PhrasesMode> { + &self.mode + } } -impl PhraseViewState for ArrangerTui { +impl PhraseViewState for SequencerTui { + fn focused (&self) -> bool { + todo!() + } + fn entered (&self) -> bool { + todo!() + } + fn keys (&self) -> &Buffer { + todo!() + } + fn phrase (&self) -> &Option>> { + todo!() + } + fn buffer (&self) -> &BigBuffer { + todo!() + } + fn note_len (&self) -> usize { + todo!() + } + fn note_axis (&self) -> &RwLock> { + todo!() + } + fn time_axis (&self) -> &RwLock> { + todo!() + } + fn size (&self) -> &Measure { + todo!() + } + fn now (&self) -> &Arc { + todo!() + } } diff --git a/crates/tek_tui/src/tui_transport_view.rs b/crates/tek_tui/src/tui_transport_view.rs index 3fc3e8c2..ef0691de 100644 --- a/crates/tek_tui/src/tui_transport_view.rs +++ b/crates/tek_tui/src/tui_transport_view.rs @@ -14,7 +14,7 @@ pub struct TransportView<'a, T: TransportViewState>(pub &'a T); pub trait TransportViewState: Send + Sync { fn focus (&self) -> TransportFocus; - fn focused (&self) -> bool; + fn is_focused (&self) -> bool; fn transport_state (&self) -> Option; fn bpm_value (&self) -> f64; fn sync_value (&self) -> f64; @@ -26,7 +26,7 @@ impl TransportViewState for TransportTui { fn focus (&self) -> TransportFocus { self.focus } - fn focused (&self) -> bool { + fn is_focused (&self) -> bool { self.focused } fn transport_state (&self) -> Option { @@ -51,7 +51,7 @@ impl<'a, T: TransportViewState> Content for TransportView<'a, T> { fn content (&self) -> impl Widget { let state = self.0; lay!( - state.focus().wrap(state.focused(), TransportFocus::PlayPause, &Styled( + state.focus().wrap(state.is_focused(), TransportFocus::PlayPause, &Styled( None, match state.transport_state() { Some(TransportState::Rolling) => "▶ PLAYING", @@ -62,19 +62,19 @@ impl<'a, T: TransportViewState> Content for TransportView<'a, T> { ).min_xy(11, 2).push_x(1)).align_x().fill_x(), row!( - state.focus().wrap(state.focused(), TransportFocus::Bpm, &Outset::X(1u16, { + state.focus().wrap(state.is_focused(), TransportFocus::Bpm, &Outset::X(1u16, { let bpm = state.bpm_value(); row! { "BPM ", format!("{}.{:03}", bpm as usize, (bpm * 1000.0) % 1000.0) } })), //let quant = state.focus().wrap(state.focused(), TransportFocus::Quant, &Outset::X(1u16, row! { //"QUANT ", ppq_to_name(state.0.quant as usize) //})), - state.focus().wrap(state.focused(), TransportFocus::Sync, &Outset::X(1u16, row! { + state.focus().wrap(state.is_focused(), TransportFocus::Sync, &Outset::X(1u16, row! { "SYNC ", pulses_to_name(state.sync_value() as usize) })) ).align_w().fill_x(), - state.focus().wrap(state.focused(), TransportFocus::Clock, &{ + state.focus().wrap(state.is_focused(), TransportFocus::Clock, &{ let time1 = state.format_beat(); let time2 = state.format_msu(); row!("B" ,time1.as_str(), " T", time2.as_str()).outset_x(1)