From ec81cbf2f1c9966e7c4e2f0cf3273b1abf0ce37c Mon Sep 17 00:00:00 2001 From: unspeaker Date: Tue, 22 Oct 2024 19:20:03 +0300 Subject: [PATCH] scale grid rows; one/two still missing --- crates/tek_core/src/space.rs | 12 ++++----- crates/tek_sequencer/src/arranger.rs | 33 ++++++++++++++++-------- crates/tek_sequencer/src/arranger_tui.rs | 14 +++++----- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/crates/tek_core/src/space.rs b/crates/tek_core/src/space.rs index b36beefa..7b8ff912 100644 --- a/crates/tek_core/src/space.rs +++ b/crates/tek_core/src/space.rs @@ -135,14 +135,14 @@ impl Area for [N;4] { pub trait Layout: Widget + Sized { fn align_center (self) -> Align { Align::Center(self) } - fn align_nw (self) -> Align { Align::NW(self) } - fn align_w (self) -> Align { Align::W(self) } - fn align_sw (self) -> Align { Align::SW(self) } - fn align_ne (self) -> Align { Align::NE(self) } - fn align_e (self) -> Align { Align::E(self) } - fn align_se (self) -> Align { Align::SE(self) } fn align_n (self) -> Align { Align::N(self) } fn align_s (self) -> Align { Align::S(self) } + fn align_e (self) -> Align { Align::E(self) } + fn align_w (self) -> Align { Align::W(self) } + fn align_nw (self) -> Align { Align::NW(self) } + fn align_sw (self) -> Align { Align::SW(self) } + fn align_ne (self) -> Align { Align::NE(self) } + fn align_se (self) -> Align { Align::SE(self) } fn align_x (self) -> Align { Align::X(self) } fn align_y (self) -> Align { Align::Y(self) } fn fixed_x (self, x: E::Unit) -> Fixed { Fixed::X(x, self) } diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index 6f4dc345..3eea544a 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -76,7 +76,7 @@ pub struct ArrangementTrack { /// Identifying color of track pub color: Color, } -#[derive(Default)] +#[derive(Default, Debug)] pub struct Scene { /// Name of scene pub name: Arc>, @@ -251,7 +251,9 @@ impl Arrangement { ArrangementFocus::Track(_) => self.track_width_inc(), ArrangementFocus::Scene(_) => self.scene_next(), ArrangementFocus::Clip(_, _) => self.phrase_next(), - _ => {} + ArrangementFocus::Mix => if let ArrangementViewMode::Vertical(factor) = self.mode { + self.mode = ArrangementViewMode::Vertical(factor + 1) + } } } pub fn decrement (&mut self) { @@ -259,7 +261,9 @@ impl Arrangement { ArrangementFocus::Track(_) => self.track_width_dec(), ArrangementFocus::Scene(_) => self.scene_prev(), ArrangementFocus::Clip(_, _) => self.phrase_prev(), - _ => {} + ArrangementFocus::Mix => if let ArrangementViewMode::Vertical(factor) = self.mode { + self.mode = ArrangementViewMode::Vertical(factor.saturating_sub(1)) + } } } pub fn is_first_row (&self) -> bool { @@ -675,15 +679,22 @@ impl Scene { None => true }) } - pub fn ppqs (scenes: &[Self]) -> Vec<(usize, usize)> { + pub fn ppqs (scenes: &[Self], factor: usize) -> Vec<(usize, usize)> { let mut total = 0; - let mut scenes: Vec<(usize, usize)> = scenes.iter().map(|scene|{ - let pulses = scene.pulses().max(PPQ); - total = total + pulses; - (pulses, total - pulses) - }).collect(); - scenes.push((0, total)); - scenes + if factor == 0 { + let mut scenes: Vec<(usize, usize)> = scenes.iter().map(|scene|{ + let pulses = scene.pulses().max(PPQ); + total = total + pulses; + (pulses, total - pulses) + }).collect(); + scenes.push((0, total)); + scenes + } else { + let scenes: Vec<(usize, usize)> = (0..=scenes.len()).map(|i|{ + (factor*PPQ, factor*PPQ*i) + }).collect::>(); + scenes + } } pub fn longest_name (scenes: &[Self]) -> usize { scenes.iter() diff --git a/crates/tek_sequencer/src/arranger_tui.rs b/crates/tek_sequencer/src/arranger_tui.rs index d910c978..0d526348 100644 --- a/crates/tek_sequencer/src/arranger_tui.rs +++ b/crates/tek_sequencer/src/arranger_tui.rs @@ -40,6 +40,7 @@ impl Content for ArrangerStatusBar { .bold(true); let commands = match self { Self::ArrangementMix => command(&[ + ["", ",.", "scale rows"], ["", "<>", "resize view"], ]), Self::ArrangementClip => command(&[ @@ -116,14 +117,11 @@ impl<'a> Content for VerticalArranger<'a, Tui> { type Engine = Tui; fn content (&self) -> impl Widget { let Self(state, factor) = self; - let cols = state.track_widths(); - let rows = if *factor == 0 { - Scene::ppqs(state.scenes.as_slice()) - } else { - (0..=state.scenes.len()).map(|i|(factor*PPQ, factor*PPQ*i)).collect::>() - }; - let tracks: &[ArrangementTrack] = state.tracks.as_ref(); - let scenes: &[Scene] = state.scenes.as_ref(); + let cols = state.track_widths(); + let rows = Scene::ppqs(state.scenes.as_slice(), *factor); + let tracks = state.tracks.as_ref() as &[ArrangementTrack]; + let scenes = state.scenes.as_ref(); + //panic!("{scenes:#?} {rows:#?}"); let offset = 3 + Scene::longest_name(scenes) as u16; // x of 1st track let bg = state.color; let clip_bg = Color::Rgb(40, 50, 30);