enable interior mutability for time/note axis

this will allow to adapt the cursor position
during render, always keeping it visible
This commit is contained in:
🪞👃🪞 2024-10-24 22:47:15 +03:00
parent 03e2e20258
commit dd21f73e9d
4 changed files with 83 additions and 60 deletions

View file

@ -89,35 +89,45 @@ impl Handle<Tui> for PhraseEditor<Tui> {
key!(KeyCode::Char('`')) => { self.mode = !self.mode; },
key!(KeyCode::Enter) => { self.entered = true; },
key!(KeyCode::Esc) => { self.entered = false; },
key!(KeyCode::PageUp) => { self.note_axis.start_dec(3); },
key!(KeyCode::PageDown) => { self.note_axis.start_inc(3); },
key!(KeyCode::PageUp) => { self.note_axis.write().unwrap().start_dec(3); },
key!(KeyCode::PageDown) => { self.note_axis.write().unwrap().start_inc(3); },
key!(KeyCode::Up) => match self.entered {
true => { self.note_axis.point_dec(1); },
false => { self.note_axis.start_dec(1); },
true => { self.note_axis.write().unwrap().point_dec(1); },
false => { self.note_axis.write().unwrap().start_dec(1); },
},
key!(KeyCode::Down) => match self.entered {
true => { self.note_axis.point_inc(1); },
false => { self.note_axis.start_inc(1); },
true => { self.note_axis.write().unwrap().point_inc(1); },
false => { self.note_axis.write().unwrap().start_inc(1); },
},
key!(KeyCode::Left) => match self.entered {
true => { self.time_axis.point_dec(self.time_axis.scale); },
false => { self.time_axis.start_dec(self.time_axis.scale); },
key!(KeyCode::Left) => {
let scale = self.time_axis.read().unwrap().scale;
match self.entered {
true => { self.time_axis.write().unwrap().point_dec(scale); },
false => { self.time_axis.write().unwrap().start_dec(scale); },
};
},
key!(KeyCode::Right) => match self.entered {
true => { self.time_axis.point_inc(self.time_axis.scale); },
false => { self.time_axis.start_inc(self.time_axis.scale); },
key!(KeyCode::Right) => {
let scale = self.time_axis.read().unwrap().scale;
match self.entered {
true => { self.time_axis.write().unwrap().point_inc(scale); },
false => { self.time_axis.write().unwrap().start_inc(scale); },
}
},
key!(KeyCode::Char('-')) => {
self.time_axis.scale = next_note_length(self.time_axis.scale)
let scale = self.time_axis.read().unwrap().scale;
self.time_axis.write().unwrap().scale = next_note_length(scale)
},
key!(KeyCode::Char('_')) => {
self.time_axis.scale = next_note_length(self.time_axis.scale)
let scale = self.time_axis.read().unwrap().scale;
self.time_axis.write().unwrap().scale = next_note_length(scale)
},
key!(KeyCode::Char('=')) => {
self.time_axis.scale = prev_note_length(self.time_axis.scale)
let scale = self.time_axis.read().unwrap().scale;
self.time_axis.write().unwrap().scale = prev_note_length(scale)
},
key!(KeyCode::Char('+')) => {
self.time_axis.scale = prev_note_length(self.time_axis.scale)
let scale = self.time_axis.read().unwrap().scale;
self.time_axis.write().unwrap().scale = prev_note_length(scale)
},
key!(KeyCode::Char('[')) => if self.entered {
self.note_len = prev_note_length(self.note_len)
@ -127,8 +137,10 @@ impl Handle<Tui> for PhraseEditor<Tui> {
},
key!(KeyCode::Char('a')) => if self.entered {
self.put();
self.time_axis.point = self.time_axis.point.map(|time|(time + self.note_len)
% self.phrase.as_ref().map(|p|p.read().unwrap().length).unwrap_or(1));
let point = self.time_axis.read().unwrap().point;
let length = self.phrase.as_ref().map(|p|p.read().unwrap().length).unwrap_or(1);
let forward = |time|(time + self.note_len) % length;
self.time_axis.write().unwrap().point = point.map(forward);
},
key!(KeyCode::Char('s')) => if self.entered {
self.put();