mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
wip: refactor pt.17: 44 errors
This commit is contained in:
parent
78c2004282
commit
c2b290b3c5
8 changed files with 104 additions and 112 deletions
|
|
@ -152,23 +152,6 @@ impl<E: Engine> ArrangerView<E> {
|
|||
},
|
||||
}
|
||||
}
|
||||
/// 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) => {
|
||||
|
|
|
|||
|
|
@ -18,6 +18,25 @@ impl StatusBar<Tui> for ArrangerStatusBar {
|
|||
}
|
||||
}
|
||||
|
||||
impl ArrangerStatusBar {
|
||||
fn update <E: Engine> (&mut self, state: &ArrangerView<E>) {
|
||||
*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<Engine = Tui> {
|
||||
|
|
|
|||
|
|
@ -154,29 +154,29 @@ impl InputToCommand<Tui, ArrangementEditor<Tui>> 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))),
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -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<E: Engine> FocusGrid for ArrangerView<E> {
|
|||
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<usize> {
|
||||
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<usize> {
|
||||
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)) }
|
||||
//}
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -78,19 +78,6 @@ impl<E: Engine> PhrasePoolView<E> {
|
|||
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);
|
||||
|
|
|
|||
|
|
@ -33,30 +33,30 @@ impl InputToCommand<Tui, PhrasePoolView<Tui>> for PhraseRenameCommand {
|
|||
}
|
||||
|
||||
impl<E: Engine> Command<PhrasePoolView<E>> for PhraseRenameCommand {
|
||||
fn execute (self, state: &mut PhrasePoolView<E>) -> Perhaps<Self> {
|
||||
fn execute (self, view: &mut PhrasePoolView<E>) -> Perhaps<Self> {
|
||||
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 {
|
||||
|
|
|
|||
|
|
@ -18,11 +18,9 @@ pub struct SequencerView<E: Engine> {
|
|||
impl Content for SequencerView<Tui> {
|
||||
type Engine = Tui;
|
||||
fn content (&self) -> impl Widget<Engine = Tui> {
|
||||
Stack::down(move|add|{
|
||||
add(&self.transport)?;
|
||||
add(&self.phrases
|
||||
.split(Direction::Right, 20, &self.editor as &dyn Widget<Engine = Tui>)
|
||||
.min_y(20))
|
||||
})
|
||||
col!(
|
||||
self.transport,
|
||||
Split::right(20, widget(&self.phrases), widget(&self.editor)).min_y(20)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue