diff --git a/crates/tek_tui/src/tui_arranger.rs b/crates/tek_tui/src/tui_arranger.rs index de6dca3b..d6a8db74 100644 --- a/crates/tek_tui/src/tui_arranger.rs +++ b/crates/tek_tui/src/tui_arranger.rs @@ -152,23 +152,6 @@ impl ArrangerView { }, } } - /// Update status bar - pub fn update_status (&mut self) { - self.status = match self.focused() { - ArrangerViewFocus::Transport => ArrangerStatusBar::Transport, - ArrangerViewFocus::Arrangement => match self.arrangement.selected { - ArrangementEditorFocus::Mix => ArrangerStatusBar::ArrangementMix, - ArrangementEditorFocus::Track(_) => ArrangerStatusBar::ArrangementTrack, - ArrangementEditorFocus::Scene(_) => ArrangerStatusBar::ArrangementScene, - ArrangementEditorFocus::Clip(_, _) => ArrangerStatusBar::ArrangementClip, - }, - ArrangerViewFocus::PhrasePool => ArrangerStatusBar::PhrasePool, - ArrangerViewFocus::PhraseEditor => match self.editor.entered { - true => ArrangerStatusBar::PhraseEdit, - false => ArrangerStatusBar::PhraseView, - }, - } - } pub fn activate (&mut self) { match self.arrangement.selected { ArrangementEditorFocus::Scene(s) => { diff --git a/crates/tek_tui/src/tui_arranger_bar.rs b/crates/tek_tui/src/tui_arranger_bar.rs index e9a05a73..e3d0602d 100644 --- a/crates/tek_tui/src/tui_arranger_bar.rs +++ b/crates/tek_tui/src/tui_arranger_bar.rs @@ -18,6 +18,25 @@ impl StatusBar for ArrangerStatusBar { } } +impl ArrangerStatusBar { + fn update (&mut self, state: &ArrangerView) { + *self = match state.focused() { + ArrangerViewFocus::Transport => ArrangerStatusBar::Transport, + ArrangerViewFocus::Arrangement => match state.arrangement.selected { + ArrangementEditorFocus::Mix => ArrangerStatusBar::ArrangementMix, + ArrangementEditorFocus::Track(_) => ArrangerStatusBar::ArrangementTrack, + ArrangementEditorFocus::Scene(_) => ArrangerStatusBar::ArrangementScene, + ArrangementEditorFocus::Clip(_, _) => ArrangerStatusBar::ArrangementClip, + }, + ArrangerViewFocus::PhrasePool => ArrangerStatusBar::PhrasePool, + ArrangerViewFocus::PhraseEditor => match state.sequencer.editor.entered { + true => ArrangerStatusBar::PhraseEdit, + false => ArrangerStatusBar::PhraseView, + }, + } + } +} + impl Content for ArrangerStatusBar { type Engine = Tui; fn content (&self) -> impl Widget { diff --git a/crates/tek_tui/src/tui_arranger_cmd.rs b/crates/tek_tui/src/tui_arranger_cmd.rs index 1879e070..69882540 100644 --- a/crates/tek_tui/src/tui_arranger_cmd.rs +++ b/crates/tek_tui/src/tui_arranger_cmd.rs @@ -154,29 +154,29 @@ impl InputToCommand> for ArrangementEditorCommand { key!(KeyCode::Char(',')) => match state.selected { ArrangementEditorFocus::Mix => Cmd::Zoom(0), - ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0))), - ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(0))), + ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0, 0))), + ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(0, 0))), ArrangementEditorFocus::Clip(t, s) => Cmd::Edit(Edit::Clip(Clip::Set(t, s, None))), }, key!(KeyCode::Char('.')) => match state.selected { ArrangementEditorFocus::Mix => Cmd::Zoom(0), - ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0))), - ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(0))), + ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0, 0))), + ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(0, 0))), ArrangementEditorFocus::Clip(t, s) => Cmd::Edit(Edit::Clip(Clip::Set(t, s, None))), }, key!(KeyCode::Char('<')) => match state.selected { ArrangementEditorFocus::Mix => Cmd::Zoom(0), - ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0))), - ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(0))), + ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0, 0))), + ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(0, 0))), ArrangementEditorFocus::Clip(t, s) => Cmd::Edit(Edit::Clip(Clip::Set(t, s, None))), }, key!(KeyCode::Char('>')) => match state.selected { ArrangementEditorFocus::Mix => Cmd::Zoom(0), - ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0))), - ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(0))), + ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0, 0))), + ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(0, 0))), ArrangementEditorFocus::Clip(t, s) => Cmd::Edit(Edit::Clip(Clip::Set(t, s, None))), }, diff --git a/crates/tek_tui/src/tui_arranger_foc.rs b/crates/tek_tui/src/tui_arranger_foc.rs index 871d8240..283c36f5 100644 --- a/crates/tek_tui/src/tui_arranger_foc.rs +++ b/crates/tek_tui/src/tui_arranger_foc.rs @@ -1,7 +1,7 @@ use crate::*; /// Sections in the arranger app that may be focused -#[derive(Copy, Clone, PartialEq, Eq)] +#[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum ArrangerViewFocus { /// The transport (toolbar) is focused Transport, @@ -57,13 +57,11 @@ impl FocusGrid for ArrangerView { fn update_focus (&mut self) { use ArrangerViewFocus::*; let focused = self.focused(); - if let Some(transport) = self.transport.as_ref() { - transport.write().unwrap().focused = focused == Transport - } self.arrangement.focused = focused == Arrangement; - self.phrases.write().unwrap().focused = focused == PhrasePool; - self.editor.focused = focused == PhraseEditor; - self.update_status(); + self.sequencer.transport.focused = focused == Transport; + self.sequencer.phrases.focused = focused == PhrasePool; + self.sequencer.editor.focused = focused == PhraseEditor; + //self.update_status(); } } @@ -106,62 +104,68 @@ impl ArrangementEditorFocus { } }) } - pub fn is_mix (&self) -> bool { match self { Self::Mix => true, _ => false } } - pub fn is_track (&self) -> bool { match self { Self::Track(_) => true, _ => false } } - pub fn is_scene (&self) -> bool { match self { Self::Scene(_) => true, _ => false } } - pub fn is_clip (&self) -> bool { match self { Self::Clip(_, _) => true, _ => false } } + pub fn is_mix (&self) -> bool { + match self { Self::Mix => true, _ => false } + } + pub fn is_track (&self) -> bool { + match self { Self::Track(_) => true, _ => false } + } + pub fn is_scene (&self) -> bool { + match self { Self::Scene(_) => true, _ => false } + } + pub fn is_clip (&self) -> bool { + match self { Self::Clip(_, _) => true, _ => false } + } pub fn track (&self) -> Option { - match self { Self::Clip(t, _) => Some(*t), Self::Track(t) => Some(*t), _ => None } - } - pub fn track_next (&mut self, last_track: usize) { - *self = match self { - Self::Mix => - Self::Track(0), - Self::Track(t) => - Self::Track(last_track.min(*t + 1)), - Self::Scene(s) => - Self::Clip(0, *s), - Self::Clip(t, s) => - Self::Clip(last_track.min(*t + 1), *s), - } - } - pub fn track_prev (&mut self) { - *self = match self { - Self::Mix => - Self::Mix, - Self::Scene(s) => - Self::Scene(*s), - Self::Track(t) => - if *t == 0 { Self::Mix } else { Self::Track(*t - 1) }, - Self::Clip(t, s) => - if *t == 0 { Self::Scene(*s) } else { Self::Clip(t.saturating_sub(1), *s) } + use ArrangementEditorFocus::*; + match self { + Clip(t, _) => Some(*t), + Track(t) => Some(*t), + _ => None } } pub fn scene (&self) -> Option { - match self { Self::Clip(_, s) => Some(*s), Self::Scene(s) => Some(*s), _ => None } - } - pub fn scene_next (&mut self, last_scene: usize) { - *self = match self { - Self::Mix => - Self::Scene(0), - Self::Track(t) => - Self::Clip(*t, 0), - Self::Scene(s) => - Self::Scene(last_scene.min(*s + 1)), - Self::Clip(t, s) => - Self::Clip(*t, last_scene.min(*s + 1)), - } - } - pub fn scene_prev (&mut self) { - *self = match self { - Self::Mix => - Self::Mix, - Self::Track(t) => - Self::Track(*t), - Self::Scene(s) => - if *s == 0 { Self::Mix } else { Self::Scene(*s - 1) }, - Self::Clip(t, s) => - if *s == 0 { Self::Track(*t) } else { Self::Clip(*t, s.saturating_sub(1)) } + use ArrangementEditorFocus::*; + match self { + Clip(_, s) => Some(*s), + Scene(s) => Some(*s), + _ => None } } } + //pub fn track_next (&mut self, last_track: usize) { + //use ArrangementEditorFocus::*; + //*self = match self { + //Mix => Track(0), + //Track(t) => Track(last_track.min(*t + 1)), + //Scene(s) => Clip(0, *s), + //Clip(t, s) => Clip(last_track.min(*t + 1), *s), + //} + //} + //pub fn track_prev (&mut self) { + //use ArrangementEditorFocus::*; + //*self = match self { + //Mix => Mix, + //Scene(s) => Scene(*s), + //Track(t) => if *t == 0 { Mix } else { Track(*t - 1) }, + //Clip(t, s) => if *t == 0 { Scene(*s) } else { Clip(t.saturating_sub(1), *s) } + //} + //} + //pub fn scene_next (&mut self, last_scene: usize) { + //use ArrangementEditorFocus::*; + //*self = match self { + //Mix => Scene(0), + //Track(t) => Clip(*t, 0), + //Scene(s) => Scene(last_scene.min(*s + 1)), + //Clip(t, s) => Clip(*t, last_scene.min(*s + 1)), + //} + //} + //pub fn scene_prev (&mut self) { + //use ArrangementEditorFocus::*; + //*self = match self { + //Mix => Mix, + //Track(t) => Track(*t), + //Scene(s) => if *s == 0 { Mix } else { Scene(*s - 1) }, + //Clip(t, s) => if *s == 0 { Track(*t) } else { Clip(*t, s.saturating_sub(1)) } + //} + //} diff --git a/crates/tek_tui/src/tui_pool.rs b/crates/tek_tui/src/tui_pool.rs index b6988dbb..d33a94b8 100644 --- a/crates/tek_tui/src/tui_pool.rs +++ b/crates/tek_tui/src/tui_pool.rs @@ -78,19 +78,6 @@ impl PhrasePoolView { self.model.phrases.insert(self.phrase + 1, Arc::new(RwLock::new(phrase))); self.phrase += 1; } - pub fn begin_rename (&mut self) { - self.mode = Some(PhrasePoolMode::Rename( - self.phrase, - self.model.phrases[self.phrase].read().unwrap().name.clone() - )); - } - pub fn begin_length (&mut self) { - self.mode = Some(PhrasePoolMode::Length( - self.phrase, - self.model.phrases[self.phrase].read().unwrap().length, - PhraseLengthFocus::Bar - )); - } pub fn move_up (&mut self) { if self.phrase > 1 { self.model.phrases.swap(self.phrase - 1, self.phrase); diff --git a/crates/tek_tui/src/tui_pool_rename.rs b/crates/tek_tui/src/tui_pool_rename.rs index a6720bb3..33902b21 100644 --- a/crates/tek_tui/src/tui_pool_rename.rs +++ b/crates/tek_tui/src/tui_pool_rename.rs @@ -33,30 +33,30 @@ impl InputToCommand> for PhraseRenameCommand { } impl Command> for PhraseRenameCommand { - fn execute (self, state: &mut PhrasePoolView) -> Perhaps { + fn execute (self, view: &mut PhrasePoolView) -> Perhaps { use PhraseRenameCommand::*; - if let Some(PhrasePoolMode::Rename(phrase, ref mut old_name)) = state.mode { + if let Some(PhrasePoolMode::Rename(phrase, ref mut old_name)) = view.mode { match self { Set(s) => { - state.model.phrases[phrase].write().unwrap().name = s.into(); + view.model.phrases[phrase].write().unwrap().name = s.into(); return Ok(Some(Self::Set(old_name.clone()))) }, Confirm => { let old_name = old_name.clone(); - state.mode = None; + view.mode = None; return Ok(Some(Self::Set(old_name))) }, Cancel => { - let mut phrase = state.model.phrases[phrase].write().unwrap(); + let mut phrase = view.model.phrases[phrase].write().unwrap(); phrase.name = old_name.clone(); }, _ => unreachable!() }; Ok(None) } else if self == Begin { - state.mode = Some(PhrasePoolMode::Rename( - state.phrase, - state.model.phrases[state.phrase].read().unwrap().name.clone() + view.mode = Some(PhrasePoolMode::Rename( + view.phrase, + view.model.phrases[view.phrase].read().unwrap().name.clone() )); Ok(None) } else { diff --git a/crates/tek_tui/src/tui_sequencer.rs b/crates/tek_tui/src/tui_sequencer.rs index 2e5d78a3..b07b2b17 100644 --- a/crates/tek_tui/src/tui_sequencer.rs +++ b/crates/tek_tui/src/tui_sequencer.rs @@ -18,11 +18,9 @@ pub struct SequencerView { impl Content for SequencerView { type Engine = Tui; fn content (&self) -> impl Widget { - Stack::down(move|add|{ - add(&self.transport)?; - add(&self.phrases - .split(Direction::Right, 20, &self.editor as &dyn Widget) - .min_y(20)) - }) + col!( + self.transport, + Split::right(20, widget(&self.phrases), widget(&self.editor)).min_y(20) + ) } } diff --git a/crates/tek_tui/src/tui_sequencer_foc.rs b/crates/tek_tui/src/tui_sequencer_foc.rs index 38e11534..56d8f72c 100644 --- a/crates/tek_tui/src/tui_sequencer_foc.rs +++ b/crates/tek_tui/src/tui_sequencer_foc.rs @@ -1,7 +1,8 @@ use crate::*; /// Sections in the sequencer app that may be focused -#[derive(Copy, Clone, PartialEq, Eq)] pub enum SequencerFocus { +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum SequencerFocus { /// The transport (toolbar) is focused Transport, /// The phrase list (pool) is focused