use crate::*; /// Sections in the sequencer app that may be focused #[derive(Copy, Clone, PartialEq, Eq)] pub enum SequencerFocus { /// The transport (toolbar) is focused Transport, /// The phrase list (pool) is focused PhrasePool, /// The phrase editor (sequencer) is focused PhraseEditor, } /// Focus layout of sequencer app impl FocusGrid for SequencerView { type Item = SequencerFocus; fn cursor (&self) -> (usize, usize) { self.focus_cursor } fn cursor_mut (&mut self) -> &mut (usize, usize) { &mut self.focus_cursor } fn layout (&self) -> &[&[SequencerFocus]] { &[ &[SequencerFocus::Transport], &[SequencerFocus::PhrasePool, SequencerFocus::PhraseEditor], ] } fn focus_enter (&mut self) { self.entered = true } fn focus_exit (&mut self) { self.entered = false } fn entered (&self) -> Option { if self.entered { Some(self.focused()) } else { None } } fn update_focus (&mut self) { let focused = self.focused(); if let Some(transport) = self.transport.as_ref() { transport.write().unwrap().focused = focused == SequencerFocus::Transport } self.phrases.write().unwrap().focused = focused == SequencerFocus::PhrasePool; self.editor.focused = focused == SequencerFocus::PhraseEditor; } }