mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 20:26: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) {
|
pub fn activate (&mut self) {
|
||||||
match self.arrangement.selected {
|
match self.arrangement.selected {
|
||||||
ArrangementEditorFocus::Scene(s) => {
|
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 {
|
impl Content for ArrangerStatusBar {
|
||||||
type Engine = Tui;
|
type Engine = Tui;
|
||||||
fn content (&self) -> impl Widget<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 {
|
key!(KeyCode::Char(',')) => match state.selected {
|
||||||
ArrangementEditorFocus::Mix => Cmd::Zoom(0),
|
ArrangementEditorFocus::Mix => Cmd::Zoom(0),
|
||||||
ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0))),
|
ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0, 0))),
|
||||||
ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(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))),
|
ArrangementEditorFocus::Clip(t, s) => Cmd::Edit(Edit::Clip(Clip::Set(t, s, None))),
|
||||||
},
|
},
|
||||||
|
|
||||||
key!(KeyCode::Char('.')) => match state.selected {
|
key!(KeyCode::Char('.')) => match state.selected {
|
||||||
ArrangementEditorFocus::Mix => Cmd::Zoom(0),
|
ArrangementEditorFocus::Mix => Cmd::Zoom(0),
|
||||||
ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0))),
|
ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0, 0))),
|
||||||
ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(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))),
|
ArrangementEditorFocus::Clip(t, s) => Cmd::Edit(Edit::Clip(Clip::Set(t, s, None))),
|
||||||
},
|
},
|
||||||
|
|
||||||
key!(KeyCode::Char('<')) => match state.selected {
|
key!(KeyCode::Char('<')) => match state.selected {
|
||||||
ArrangementEditorFocus::Mix => Cmd::Zoom(0),
|
ArrangementEditorFocus::Mix => Cmd::Zoom(0),
|
||||||
ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0))),
|
ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0, 0))),
|
||||||
ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(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))),
|
ArrangementEditorFocus::Clip(t, s) => Cmd::Edit(Edit::Clip(Clip::Set(t, s, None))),
|
||||||
},
|
},
|
||||||
|
|
||||||
key!(KeyCode::Char('>')) => match state.selected {
|
key!(KeyCode::Char('>')) => match state.selected {
|
||||||
ArrangementEditorFocus::Mix => Cmd::Zoom(0),
|
ArrangementEditorFocus::Mix => Cmd::Zoom(0),
|
||||||
ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0))),
|
ArrangementEditorFocus::Track(t) => Cmd::Edit(Edit::Track(Track::Swap(0, 0))),
|
||||||
ArrangementEditorFocus::Scene(s) => Cmd::Edit(Edit::Scene(Scene::Swap(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))),
|
ArrangementEditorFocus::Clip(t, s) => Cmd::Edit(Edit::Clip(Clip::Set(t, s, None))),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
/// Sections in the arranger app that may be focused
|
/// Sections in the arranger app that may be focused
|
||||||
#[derive(Copy, Clone, PartialEq, Eq)]
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
pub enum ArrangerViewFocus {
|
pub enum ArrangerViewFocus {
|
||||||
/// The transport (toolbar) is focused
|
/// The transport (toolbar) is focused
|
||||||
Transport,
|
Transport,
|
||||||
|
|
@ -57,13 +57,11 @@ impl<E: Engine> FocusGrid for ArrangerView<E> {
|
||||||
fn update_focus (&mut self) {
|
fn update_focus (&mut self) {
|
||||||
use ArrangerViewFocus::*;
|
use ArrangerViewFocus::*;
|
||||||
let focused = self.focused();
|
let focused = self.focused();
|
||||||
if let Some(transport) = self.transport.as_ref() {
|
|
||||||
transport.write().unwrap().focused = focused == Transport
|
|
||||||
}
|
|
||||||
self.arrangement.focused = focused == Arrangement;
|
self.arrangement.focused = focused == Arrangement;
|
||||||
self.phrases.write().unwrap().focused = focused == PhrasePool;
|
self.sequencer.transport.focused = focused == Transport;
|
||||||
self.editor.focused = focused == PhraseEditor;
|
self.sequencer.phrases.focused = focused == PhrasePool;
|
||||||
self.update_status();
|
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_mix (&self) -> bool {
|
||||||
pub fn is_track (&self) -> bool { match self { Self::Track(_) => true, _ => false } }
|
match self { Self::Mix => 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_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> {
|
pub fn track (&self) -> Option<usize> {
|
||||||
match self { Self::Clip(t, _) => Some(*t), Self::Track(t) => Some(*t), _ => None }
|
use ArrangementEditorFocus::*;
|
||||||
}
|
match self {
|
||||||
pub fn track_next (&mut self, last_track: usize) {
|
Clip(t, _) => Some(*t),
|
||||||
*self = match self {
|
Track(t) => Some(*t),
|
||||||
Self::Mix =>
|
_ => None
|
||||||
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) }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn scene (&self) -> Option<usize> {
|
pub fn scene (&self) -> Option<usize> {
|
||||||
match self { Self::Clip(_, s) => Some(*s), Self::Scene(s) => Some(*s), _ => None }
|
use ArrangementEditorFocus::*;
|
||||||
}
|
match self {
|
||||||
pub fn scene_next (&mut self, last_scene: usize) {
|
Clip(_, s) => Some(*s),
|
||||||
*self = match self {
|
Scene(s) => Some(*s),
|
||||||
Self::Mix =>
|
_ => None
|
||||||
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)) }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//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.model.phrases.insert(self.phrase + 1, Arc::new(RwLock::new(phrase)));
|
||||||
self.phrase += 1;
|
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) {
|
pub fn move_up (&mut self) {
|
||||||
if self.phrase > 1 {
|
if self.phrase > 1 {
|
||||||
self.model.phrases.swap(self.phrase - 1, self.phrase);
|
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 {
|
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::*;
|
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 {
|
match self {
|
||||||
Set(s) => {
|
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())))
|
return Ok(Some(Self::Set(old_name.clone())))
|
||||||
},
|
},
|
||||||
Confirm => {
|
Confirm => {
|
||||||
let old_name = old_name.clone();
|
let old_name = old_name.clone();
|
||||||
state.mode = None;
|
view.mode = None;
|
||||||
return Ok(Some(Self::Set(old_name)))
|
return Ok(Some(Self::Set(old_name)))
|
||||||
},
|
},
|
||||||
Cancel => {
|
Cancel => {
|
||||||
let mut phrase = state.model.phrases[phrase].write().unwrap();
|
let mut phrase = view.model.phrases[phrase].write().unwrap();
|
||||||
phrase.name = old_name.clone();
|
phrase.name = old_name.clone();
|
||||||
},
|
},
|
||||||
_ => unreachable!()
|
_ => unreachable!()
|
||||||
};
|
};
|
||||||
Ok(None)
|
Ok(None)
|
||||||
} else if self == Begin {
|
} else if self == Begin {
|
||||||
state.mode = Some(PhrasePoolMode::Rename(
|
view.mode = Some(PhrasePoolMode::Rename(
|
||||||
state.phrase,
|
view.phrase,
|
||||||
state.model.phrases[state.phrase].read().unwrap().name.clone()
|
view.model.phrases[view.phrase].read().unwrap().name.clone()
|
||||||
));
|
));
|
||||||
Ok(None)
|
Ok(None)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,9 @@ pub struct SequencerView<E: Engine> {
|
||||||
impl Content for SequencerView<Tui> {
|
impl Content for SequencerView<Tui> {
|
||||||
type Engine = Tui;
|
type Engine = Tui;
|
||||||
fn content (&self) -> impl Widget<Engine = Tui> {
|
fn content (&self) -> impl Widget<Engine = Tui> {
|
||||||
Stack::down(move|add|{
|
col!(
|
||||||
add(&self.transport)?;
|
self.transport,
|
||||||
add(&self.phrases
|
Split::right(20, widget(&self.phrases), widget(&self.editor)).min_y(20)
|
||||||
.split(Direction::Right, 20, &self.editor as &dyn Widget<Engine = Tui>)
|
)
|
||||||
.min_y(20))
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
/// Sections in the sequencer app that may be focused
|
/// 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
|
/// The transport (toolbar) is focused
|
||||||
Transport,
|
Transport,
|
||||||
/// The phrase list (pool) is focused
|
/// The phrase list (pool) is focused
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue