diff --git a/crates/tek_core/src/focus.rs b/crates/tek_core/src/focus.rs index 014e3ff2..bcc93170 100644 --- a/crates/tek_core/src/focus.rs +++ b/crates/tek_core/src/focus.rs @@ -11,7 +11,7 @@ pub trait FocusGrid { fn focus_up (&mut self) { let layout = self.layout(); let (x, y) = self.cursor(); - let next_y = if y == 0 { layout.len() - 1 } else { y - 1 }; + let next_y = if y == 0 { layout.len().saturating_sub(1) } else { y - 1 }; let next_x = if layout[y].len() == layout[next_y].len() { x } else { ((x as f32 / layout[y].len() as f32) * layout[next_y].len() as f32) as usize }; @@ -20,7 +20,7 @@ pub trait FocusGrid { fn focus_down (&mut self) { let layout = self.layout(); let (x, y) = self.cursor(); - let next_y = if y >= layout.len() - 1 { 0 } else { y + 1 }; + let next_y = if y >= layout.len().saturating_sub(1) { 0 } else { y + 1 }; let next_x = if layout[y].len() == layout[next_y].len() { x } else { ((x as f32 / layout[y].len() as f32) * layout[next_y].len() as f32) as usize }; @@ -29,20 +29,34 @@ pub trait FocusGrid { fn focus_left (&mut self) { let layout = self.layout(); let (x, y) = self.cursor(); - let next_x = if x == 0 { layout[y].len() - 1 } else { x - 1 }; + let next_x = if x == 0 { layout[y].len().saturating_sub(1) } else { x - 1 }; *self.cursor_mut() = (next_x, y); } fn focus_right (&mut self) { let layout = self.layout(); let (x, y) = self.cursor(); - let next_x = if x >= layout[y].len() - 1 { 0 } else { x - 1 }; + let next_x = if x >= layout[y].len().saturating_sub(1) { 0 } else { x + 1 }; *self.cursor_mut() = (next_x, y); } fn focus_next (&mut self) { - todo!(); + let (x, y) = self.cursor(); + if x < self.layout()[y].len().saturating_sub(1) { + self.focus_right(); + } else { + self.focus_down(); + self.cursor_mut().0 = 0; + } } fn focus_prev (&mut self) { - todo!(); + let (x, _) = self.cursor(); + if x > 0 { + self.focus_left(); + } else { + self.focus_up(); + let (_, y) = self.cursor(); + let next_x = self.layout()[y].len().saturating_sub(1); + self.cursor_mut().0 = next_x; + } } } diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index 07d9f2a6..ee4811c9 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -2,8 +2,6 @@ use crate::*; /// Root level object for standalone `tek_arranger` pub struct Arranger { - /// Index of currently focused component - pub focus: ArrangerFocus, /// Controls the JACK transport. pub transport: Option>>>, /// Contains all the sequencers. @@ -29,8 +27,8 @@ impl FocusGrid for Arranger { fn layout (&self) -> &[&[ArrangerFocus]] { &[ &[ArrangerFocus::Transport], - &[ArrangerFocus::Arrangement], - &[ArrangerFocus::PhrasePool, ArrangerFocus::PhraseEditor], + &[ArrangerFocus::Arrangement, ArrangerFocus::Arrangement], + &[ArrangerFocus::PhrasePool, ArrangerFocus::PhraseEditor], ] } } @@ -184,12 +182,12 @@ impl Arrangement { for track_index in 0..self.tracks.len() { if let Some(phrase) = scene.clip(track_index) { let len = phrase.read().unwrap().name.read().unwrap().len(); - lens[track_index] = lens[track_index].max(len); + lens[track_index] = lens[track_index].max(len + 16); } } } let mut total = 0; - let mut to_x_and_w = |len: &usize|{ total = total + *len; (total - *len, *len) }; + let to_x_and_w = |len: &usize|{ total = total + *len; (*len, total - *len) }; let mut lens: Vec<(usize, usize)> = lens.iter().map(to_x_and_w).collect(); lens.push((0, total)); lens diff --git a/crates/tek_sequencer/src/arranger_cli.rs b/crates/tek_sequencer/src/arranger_cli.rs index 7ef8e928..99dae7b3 100644 --- a/crates/tek_sequencer/src/arranger_cli.rs +++ b/crates/tek_sequencer/src/arranger_cli.rs @@ -36,7 +36,7 @@ impl ArrangerCli { *arrangement.name.write().unwrap() = name.clone(); } for _ in 0..self.tracks { - //let track = arrangement.track_add(None)?; + let track = arrangement.track_add(None)?; //for _ in 0..self.scenes { //track.phrases.push( //Arc::new(RwLock::new(Phrase::new("", true, PPQ * 4, None))) @@ -61,7 +61,6 @@ impl ArrangerCli { focus_cursor: (0, 1), transport: self.transport.then_some(transport), show_sequencer: Some(tek_core::Direction::Down), - focus: ArrangerFocus::Arrangement, modal: None, editor: PhraseEditor::new(), arrangement, diff --git a/crates/tek_sequencer/src/arranger_tui.rs b/crates/tek_sequencer/src/arranger_tui.rs index a95eec8b..84aa1257 100644 --- a/crates/tek_sequencer/src/arranger_tui.rs +++ b/crates/tek_sequencer/src/arranger_tui.rs @@ -88,11 +88,19 @@ impl Focusable for Arrangement { impl Handle for Arrangement { fn handle (&mut self, from: &TuiInput) -> Perhaps { match from.event() { - // mode_switch: switch the display mode - key!(KeyCode::Char('`')) => { - self.mode.to_next() + key!(KeyCode::Char('`')) => { self.mode.to_next(); }, + key!(KeyCode::Delete) => { self.phrase_del(); self.show_phrase(); }, + key!(KeyCode::Char('.')) => { self.phrase_next(); self.show_phrase(); }, + key!(KeyCode::Char(',')) => { self.phrase_prev(); self.show_phrase(); }, + // TODO: next/prev scene + key!(KeyCode::Enter) => { self.activate(); }, + key!(Ctrl-KeyCode::Char('a')) => { self.scene_add(None)?; }, + key!(Ctrl-KeyCode::Char('t')) => { self.track_add(None)?; }, + key!(KeyCode::Char('n')) => { todo!("rename selected"); }, + key!(KeyCode::Char('c')) => { todo!("recolor selected"); }, + key!(KeyCode::Char('l')) => if let Some(phrase) = self.phrase() { + phrase.write().unwrap().toggle_loop() }, - // cursor_up: move cursor up key!(KeyCode::Up) => { match self.mode { ArrangementViewMode::Horizontal => self.track_prev(), @@ -100,7 +108,6 @@ impl Handle for Arrangement { }; self.show_phrase(); }, - // cursor_down key!(KeyCode::Down) => { match self.mode { ArrangementViewMode::Horizontal => self.track_next(), @@ -108,7 +115,6 @@ impl Handle for Arrangement { }; self.show_phrase(); }, - // cursor left key!(KeyCode::Left) => { match self.mode { ArrangementViewMode::Horizontal => self.scene_prev(), @@ -116,7 +122,6 @@ impl Handle for Arrangement { }; self.show_phrase(); }, - // cursor right key!(KeyCode::Right) => { match self.mode { ArrangementViewMode::Horizontal => self.scene_next(), @@ -124,45 +129,6 @@ impl Handle for Arrangement { }; self.show_phrase(); }, - // increment: remove clip - key!(KeyCode::Delete) => { - self.phrase_del(); - self.show_phrase(); - }, - // increment: use next clip here - key!(KeyCode::Char('.')) => { - self.phrase_next(); - self.show_phrase(); - }, - // decrement: use previous next clip here - key!(KeyCode::Char(',')) => { - self.phrase_prev(); - self.show_phrase(); - }, - // decrement: use previous clip here - key!(KeyCode::Enter) => { - self.activate(); - }, - // scene_add: add a new scene - key!(Ctrl-KeyCode::Char('a')) => { - self.scene_add(None)?; - }, - // track_add: add a new scene - key!(Ctrl-KeyCode::Char('t')) => { - self.track_add(None)?; - }, - // rename: add a new scene - //key!(KeyCode::Char('n')) => { - //self.rename_selected(); - //}, - // length: add a new scene - key!(KeyCode::Char('l')) => if let Some(phrase) = self.phrase() { - phrase.write().unwrap().toggle_loop() - }, - // color: set color of item at cursor - key!(KeyCode::Char('c')) => { - todo!(); - }, _ => return Ok(None) } Ok(Some(true))