enter phrase length set mode

This commit is contained in:
🪞👃🪞 2024-10-16 11:14:13 +03:00
parent 83dafe3e81
commit 26d75340f6
3 changed files with 43 additions and 17 deletions

View file

@ -34,7 +34,10 @@ pub struct PhrasePool<E: Engine> {
pub mode: Option<PhrasePoolMode>, pub mode: Option<PhrasePoolMode>,
} }
/// Modes for phrase pool /// Modes for phrase pool
pub enum PhrasePoolMode { Rename(usize, String) } pub enum PhrasePoolMode {
Rename(usize, String),
Length(usize, usize, PhraseLengthFocus),
}
/// A MIDI sequence. /// A MIDI sequence.
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Phrase { pub struct Phrase {
@ -188,8 +191,17 @@ impl<E: Engine> PhrasePool<E> {
phrase.color = random_color(); phrase.color = random_color();
} }
pub fn begin_rename (&mut self) { pub fn begin_rename (&mut self) {
let phrase = self.phrases[self.phrase].read().unwrap(); self.mode = Some(PhrasePoolMode::Rename(
self.mode = Some(PhrasePoolMode::Rename(self.phrase, phrase.name.clone())); self.phrase,
self.phrases[self.phrase].read().unwrap().name.clone()
));
}
pub fn begin_length (&mut self) {
self.mode = Some(PhrasePoolMode::Length(
self.phrase,
self.phrases[self.phrase].read().unwrap().length,
PhraseLengthFocus::Bar
));
} }
pub fn move_up (&mut self) { pub fn move_up (&mut self) {
if self.phrase > 1 { if self.phrase > 1 {
@ -314,18 +326,16 @@ pub struct PhraseLength<E: Engine> {
pub ppq: usize, pub ppq: usize,
pub bpb: usize, pub bpb: usize,
pub pulses: usize, pub pulses: usize,
pub focused: bool, pub focus: Option<PhraseLengthFocus>,
pub focus: PhraseLengthFocus
} }
impl<E: Engine> PhraseLength<E> { impl<E: Engine> PhraseLength<E> {
fn new (pulses: usize) -> Self { pub fn new (pulses: usize, focus: Option<PhraseLengthFocus>) -> Self {
Self { Self {
_engine: Default::default(), _engine: Default::default(),
ppq: PPQ, ppq: PPQ,
bpb: 4, bpb: 4,
pulses, pulses,
focused: false, focus
focus: PhraseLengthFocus::Bar
} }
} }
pub fn bars (&self) -> usize { pub fn bars (&self) -> usize {
@ -344,7 +354,7 @@ impl<E: Engine> PhraseLength<E> {
format!("{}", self.beats()) format!("{}", self.beats())
} }
pub fn ticks_string (&self) -> String { pub fn ticks_string (&self) -> String {
format!("{}", self.ticks()) format!("{:>02}", self.ticks())
} }
} }
#[derive(Copy,Clone)] #[derive(Copy,Clone)]

View file

@ -43,6 +43,18 @@ impl Handle<Tui> for PhrasePool<Tui> {
_ => return Ok(None) _ => return Ok(None)
} }
}, },
Some(PhrasePoolMode::Length(phrase, length, focus)) => {
todo!("edit phrase length");
let mut phrase = self.phrases[phrase].write().unwrap();
match from.event() {
key!(KeyCode::Backspace) => { phrase.name.pop(); },
key!(KeyCode::Char(c)) => { phrase.name.push(*c); },
key!(Shift-KeyCode::Char(c)) => { phrase.name.push(*c); },
//key!(KeyCode::Esc) => { phrase.name = old_name.clone(); self.mode = None; },
key!(KeyCode::Enter) => { self.mode = None; },
_ => return Ok(None)
}
},
None => match from.event() { None => match from.event() {
key!(KeyCode::Up) => { self.select_prev() }, key!(KeyCode::Up) => { self.select_prev() },
key!(KeyCode::Down) => { self.select_next() }, key!(KeyCode::Down) => { self.select_next() },
@ -51,6 +63,7 @@ impl Handle<Tui> for PhrasePool<Tui> {
key!(KeyCode::Char('d')) => { self.insert_dup() }, key!(KeyCode::Char('d')) => { self.insert_dup() },
key!(KeyCode::Char('c')) => { self.randomize_color() }, key!(KeyCode::Char('c')) => { self.randomize_color() },
key!(KeyCode::Char('n')) => { self.begin_rename() }, key!(KeyCode::Char('n')) => { self.begin_rename() },
key!(KeyCode::Char('t')) => { self.begin_length() },
key!(KeyCode::Char(',')) => { self.move_up() }, key!(KeyCode::Char(',')) => { self.move_up() },
key!(KeyCode::Char('.')) => { self.move_down() }, key!(KeyCode::Char('.')) => { self.move_down() },
_ => return Ok(None), _ => return Ok(None),

View file

@ -20,9 +20,12 @@ impl Content for PhrasePool<Tui> {
let ticks = length % PPQ; let ticks = length % PPQ;
let beats = length % (4 * PPQ); let beats = length % (4 * PPQ);
let bars = length / (4 * PPQ); let bars = length / (4 * PPQ);
let row1 = lay!( let row1 = lay!(format!(" {i}").align_w().fill_x(),
format!(" {i}").align_w().fill_x(), if let Some(PhrasePoolMode::Length(phrase, length, focus)) = self.mode {
format!("{bars}.{beats}.{ticks:>02} ").align_e().fill_x(), PhraseLength::new(length, Some(focus))
} else {
PhraseLength::new(length, None)
}.align_e().fill_x()
).fill_x(); ).fill_x();
let row2 = if let Some(PhrasePoolMode::Rename(phrase, _)) = self.mode { let row2 = if let Some(PhrasePoolMode::Rename(phrase, _)) = self.mode {
if self.focused && i == phrase { if self.focused && i == phrase {
@ -327,26 +330,26 @@ impl Content for PhraseLength<Tui> {
type Engine = Tui; type Engine = Tui;
fn content (&self) -> impl Widget<Engine = Tui> { fn content (&self) -> impl Widget<Engine = Tui> {
Layers::new(move|add|{ Layers::new(move|add|{
match (self.focused, &self.focus) { match self.focus {
(false, _) => add(&row!( None => add(&row!(
" ", self.bars_string(), " ", self.bars_string(),
".", self.beats_string(), ".", self.beats_string(),
".", self.ticks_string(), ".", self.ticks_string(),
" " " "
)), )),
(true, PhraseLengthFocus::Bar) => add(&row!( Some(PhraseLengthFocus::Bar) => add(&row!(
"[", self.bars_string(), "[", self.bars_string(),
"]", self.beats_string(), "]", self.beats_string(),
".", self.ticks_string(), ".", self.ticks_string(),
" " " "
)), )),
(true, PhraseLengthFocus::Beat) => add(&row!( Some(PhraseLengthFocus::Beat) => add(&row!(
" ", self.bars_string(), " ", self.bars_string(),
"[", self.beats_string(), "[", self.beats_string(),
"]", self.ticks_string(), "]", self.ticks_string(),
" " " "
)), )),
(true, PhraseLengthFocus::Tick) => add(&row!( Some(PhraseLengthFocus::Tick) => add(&row!(
" ", self.bars_string(), " ", self.bars_string(),
".", self.beats_string(), ".", self.beats_string(),
"[", self.ticks_string(), "[", self.ticks_string(),