From 83dafe3e813823e9654bc4c8385257e01aaca5ff Mon Sep 17 00:00:00 2001 From: unspeaker Date: Wed, 16 Oct 2024 10:42:44 +0300 Subject: [PATCH] wip: PhraseLength widget --- crates/tek_sequencer/src/sequencer.rs | 40 +++++++++++++++++++++++ crates/tek_sequencer/src/sequencer_tui.rs | 34 +++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index b8307cc7..ffdcdc22 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -309,3 +309,43 @@ impl PhrasePlayer { self.overdub = !self.overdub; } } +pub struct PhraseLength { + _engine: PhantomData, + pub ppq: usize, + pub bpb: usize, + pub pulses: usize, + pub focused: bool, + pub focus: PhraseLengthFocus +} +impl PhraseLength { + fn new (pulses: usize) -> Self { + Self { + _engine: Default::default(), + ppq: PPQ, + bpb: 4, + pulses, + focused: false, + focus: PhraseLengthFocus::Bar + } + } + pub fn bars (&self) -> usize { + self.pulses / (self.bpb * self.ppq) + } + pub fn beats (&self) -> usize { + self.pulses % (self.bpb * self.ppq) + } + pub fn ticks (&self) -> usize { + self.pulses % self.ppq + } + pub fn bars_string (&self) -> String { + format!("{}", self.bars()) + } + pub fn beats_string (&self) -> String { + format!("{}", self.beats()) + } + pub fn ticks_string (&self) -> String { + format!("{}", self.ticks()) + } +} +#[derive(Copy,Clone)] +pub enum PhraseLengthFocus { Bar, Beat, Tick } diff --git a/crates/tek_sequencer/src/sequencer_tui.rs b/crates/tek_sequencer/src/sequencer_tui.rs index e15f7e3e..e95bf5cd 100644 --- a/crates/tek_sequencer/src/sequencer_tui.rs +++ b/crates/tek_sequencer/src/sequencer_tui.rs @@ -322,3 +322,37 @@ pub(crate) fn keys_vert () -> Buffer { const NTH_OCTAVE: [&'static str;11] = [ "-1", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]; + +impl Content for PhraseLength { + type Engine = Tui; + fn content (&self) -> impl Widget { + Layers::new(move|add|{ + match (self.focused, &self.focus) { + (false, _) => add(&row!( + " ", self.bars_string(), + ".", self.beats_string(), + ".", self.ticks_string(), + " " + )), + (true, PhraseLengthFocus::Bar) => add(&row!( + "[", self.bars_string(), + "]", self.beats_string(), + ".", self.ticks_string(), + " " + )), + (true, PhraseLengthFocus::Beat) => add(&row!( + " ", self.bars_string(), + "[", self.beats_string(), + "]", self.ticks_string(), + " " + )), + (true, PhraseLengthFocus::Tick) => add(&row!( + " ", self.bars_string(), + ".", self.beats_string(), + "[", self.ticks_string(), + "]" + )), + } + }) + } +}