focus: exit on next/prev

This commit is contained in:
🪞👃🪞 2024-11-09 14:30:17 +01:00
parent adb666c527
commit ac8e8b2bf0
4 changed files with 18 additions and 16 deletions

View file

@ -5,9 +5,9 @@ pub trait Command<S>: Sized {
fn execute (self, state: &mut S) -> Perhaps<Self>;
}
pub fn delegate <B, C: Command<S>, S> (
cmd: C,
wrap: impl Fn(C)->B,
state: &mut S,
cmd: C
) -> Perhaps<B> {
Ok(cmd.execute(state)?.map(|x|wrap(x)))
}

View file

@ -64,6 +64,7 @@ pub trait FocusGrid {
if self.focused() == current { // FIXME: prevent infinite loop
self.focus_next()
}
self.focus_exit();
self.update_focus();
}
fn focus_prev (&mut self) {
@ -80,6 +81,7 @@ pub trait FocusGrid {
if self.focused() == current { // FIXME: prevent infinite loop
self.focus_prev()
}
self.focus_exit();
self.update_focus();
}
}

View file

@ -38,21 +38,21 @@ impl<E: Engine> Command<Arranger<E>> for ArrangerCommand {
fn execute (self, state: &mut Arranger<E>) -> Perhaps<Self> {
let undo = match self {
Self::Focus(cmd) => {
delegate(Self::Focus, state, cmd)
},
Self::Transport(cmd) => if let Some(ref transport) = state.transport {
delegate(Self::Transport, &mut*transport.write().unwrap(), cmd)
} else {
Ok(None)
delegate(cmd, Self::Focus, state)
},
Self::Phrases(cmd) => {
delegate(Self::Phrases, &mut*state.phrases.write().unwrap(), cmd)
delegate(cmd, Self::Phrases, &mut*state.phrases.write().unwrap())
},
Self::Editor(cmd) => {
delegate(Self::Editor, &mut state.editor, cmd)
delegate(cmd, Self::Editor, &mut state.editor)
},
Self::Arrangement(cmd) => {
delegate(Self::Arrangement, &mut state.arrangement, cmd)
delegate(cmd, Self::Arrangement, &mut state.arrangement)
},
Self::Transport(cmd) => if let Some(ref transport) = state.transport {
delegate(cmd, Self::Transport, &mut*transport.write().unwrap())
} else {
Ok(None)
},
}?;
state.show_phrase();

View file

@ -75,16 +75,16 @@ impl<E: Engine> Command<Sequencer<E>> for SequencerCommand {
fn execute (self, state: &mut Sequencer<E>) -> Perhaps<Self> {
match self {
Self::Focus(cmd) => {
return delegate(Self::Focus, state, cmd)
},
Self::Transport(cmd) => if let Some(ref transport) = state.transport {
return delegate(Self::Transport, &mut*transport.write().unwrap(), cmd)
return delegate(cmd, Self::Focus, state)
},
Self::Phrases(cmd) => {
return delegate(Self::Phrases, &mut*state.phrases.write().unwrap(), cmd)
return delegate(cmd, Self::Phrases, &mut*state.phrases.write().unwrap())
},
Self::Editor(cmd) => {
return delegate(Self::Editor, &mut state.editor, cmd)
return delegate(cmd, Self::Editor, &mut state.editor)
},
Self::Transport(cmd) => if let Some(ref transport) = state.transport {
return delegate(cmd, Self::Transport, &mut*transport.write().unwrap())
},
}
Ok(None)