wip: implement focus_next and focus_prev

This commit is contained in:
🪞👃🪞 2024-10-09 21:39:52 +03:00
parent a694903bdb
commit cd9244ec88
4 changed files with 37 additions and 60 deletions

View file

@ -11,7 +11,7 @@ pub trait FocusGrid<T> {
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<T> {
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<T> {
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;
}
}
}

View file

@ -2,8 +2,6 @@ use crate::*;
/// Root level object for standalone `tek_arranger`
pub struct Arranger<E: Engine> {
/// Index of currently focused component
pub focus: ArrangerFocus,
/// Controls the JACK transport.
pub transport: Option<Arc<RwLock<TransportToolbar<E>>>>,
/// Contains all the sequencers.
@ -29,8 +27,8 @@ impl<E: Engine> FocusGrid<ArrangerFocus> for Arranger<E> {
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<E: Engine> Arrangement<E> {
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

View file

@ -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,

View file

@ -88,11 +88,19 @@ impl Focusable<Tui> for Arrangement<Tui> {
impl Handle<Tui> for Arrangement<Tui> {
fn handle (&mut self, from: &TuiInput) -> Perhaps<bool> {
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<Tui> for Arrangement<Tui> {
};
self.show_phrase();
},
// cursor_down
key!(KeyCode::Down) => {
match self.mode {
ArrangementViewMode::Horizontal => self.track_next(),
@ -108,7 +115,6 @@ impl Handle<Tui> for Arrangement<Tui> {
};
self.show_phrase();
},
// cursor left
key!(KeyCode::Left) => {
match self.mode {
ArrangementViewMode::Horizontal => self.scene_prev(),
@ -116,7 +122,6 @@ impl Handle<Tui> for Arrangement<Tui> {
};
self.show_phrase();
},
// cursor right
key!(KeyCode::Right) => {
match self.mode {
ArrangementViewMode::Horizontal => self.scene_next(),
@ -124,45 +129,6 @@ impl Handle<Tui> for Arrangement<Tui> {
};
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))