From 31c1db8a5ce7b890a95acd5286ca520f613b5f44 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 9 Nov 2024 02:22:23 +0100 Subject: [PATCH] cmdsys: focus enter --- crates/tek_sequencer/src/arranger.rs | 23 +++++++++++++++++------ crates/tek_sequencer/src/sequencer.rs | 13 ++++++++++--- crates/tek_sequencer/src/sequencer_cli.rs | 1 + 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index 4e336c76..6e80ceba 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -6,6 +6,8 @@ pub struct Arranger { pub jack: Arc>, /// Which view is focused pub focus_cursor: (usize, usize), + /// Whether the focused view is entered + pub entered: bool, /// Controls the JACK transport. pub transport: Option>>>, /// Global timebase @@ -132,6 +134,7 @@ impl Arranger { let mut app = Self { jack: jack.clone(), focus_cursor: (0, 1), + entered: false, phrases_split: 20, arrangement_split: 15, editor: PhraseEditor::new(), @@ -271,13 +274,21 @@ impl FocusGrid for Arranger { type Item = ArrangerFocus; fn cursor (&self) -> (usize, usize) { self.focus_cursor } fn cursor_mut (&mut self) -> &mut (usize, usize) { &mut self.focus_cursor } - fn layout (&self) -> &[&[ArrangerFocus]] { &[ - &[ArrangerFocus::Transport], - &[ArrangerFocus::Arrangement, ArrangerFocus::Arrangement], - &[ArrangerFocus::PhrasePool, ArrangerFocus::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 layout (&self) -> &[&[ArrangerFocus]] { + use ArrangerFocus::*; + &[ + &[Transport, Transport], + &[Arrangement, Arrangement], + &[PhrasePool, PhraseEditor], + ] + } fn update_focus (&mut self) { - let focused = *self.focused(); + let focused = self.focused(); if let Some(transport) = self.transport.as_ref() { transport.write().unwrap().focused = focused == ArrangerFocus::Transport diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index a269810e..d5187eae 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -10,8 +10,6 @@ pub type PhraseChunk = [Vec]; pub struct Sequencer { /// JACK client handle (needs to not be dropped for standalone mode to work). pub jack: Arc>, - /// Which view is focused - pub focus_cursor: (usize, usize), /// Controls the JACK transport. pub transport: Option>>>, /// Global timebase @@ -22,6 +20,10 @@ pub struct Sequencer { pub editor: PhraseEditor, /// Phrase player pub player: PhrasePlayer, + /// Which view is focused + pub focus_cursor: (usize, usize), + /// Whether the currently focused item is entered + pub entered: bool, } /// Sections in the sequencer app that may be focused #[derive(Copy, Clone, PartialEq, Eq)] pub enum SequencerFocus { @@ -172,8 +174,13 @@ impl FocusGrid for Sequencer { &[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(); + let focused = self.focused(); if let Some(transport) = self.transport.as_ref() { transport.write().unwrap().focused = focused == SequencerFocus::Transport } diff --git a/crates/tek_sequencer/src/sequencer_cli.rs b/crates/tek_sequencer/src/sequencer_cli.rs index 09d425a1..089ce1ff 100644 --- a/crates/tek_sequencer/src/sequencer_cli.rs +++ b/crates/tek_sequencer/src/sequencer_cli.rs @@ -23,6 +23,7 @@ impl SequencerCli { let sequencer = Sequencer { jack: jack.clone(), focus_cursor: (1, 1), + entered: false, phrases: Arc::new(RwLock::new(PhrasePool::new())), editor: PhraseEditor::new(), clock: transport.clock.clone(),