mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-08 12:46:42 +01:00
wip: refactor pt.18: 25 errors
This commit is contained in:
parent
c2b290b3c5
commit
2be2c8aca2
4 changed files with 38 additions and 42 deletions
|
|
@ -50,7 +50,8 @@ where
|
||||||
fn layout (&self) -> &[&[Self::Item]] {
|
fn layout (&self) -> &[&[Self::Item]] {
|
||||||
&[
|
&[
|
||||||
&[AppContainerFocus::Menu],
|
&[AppContainerFocus::Menu],
|
||||||
&[AppContainerFocus::Content(())],
|
FocusGrid::layout(&self.ui)
|
||||||
|
//&[AppContainerFocus::Content(())],
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
fn update_focus (&mut self) {
|
fn update_focus (&mut self) {
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,7 @@ impl Content for ArrangerView<Tui> {
|
||||||
|
|
||||||
/// General methods for arranger
|
/// General methods for arranger
|
||||||
impl<E: Engine> ArrangerView<E> {
|
impl<E: Engine> ArrangerView<E> {
|
||||||
|
|
||||||
pub fn new (
|
pub fn new (
|
||||||
sequencer: SequencerView<E>,
|
sequencer: SequencerView<E>,
|
||||||
arrangement: ArrangementEditor<E>,
|
arrangement: ArrangementEditor<E>,
|
||||||
|
|
@ -111,6 +112,7 @@ impl<E: Engine> ArrangerView<E> {
|
||||||
pub fn toggle_play (&mut self) -> Usually<()> {
|
pub fn toggle_play (&mut self) -> Usually<()> {
|
||||||
self.sequencer.transport.model.toggle_play()
|
self.sequencer.transport.model.toggle_play()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn next_color (&self) -> ItemColor {
|
pub fn next_color (&self) -> ItemColor {
|
||||||
if let ArrangementEditorFocus::Clip(track, scene) = self.arrangement.selected {
|
if let ArrangementEditorFocus::Clip(track, scene) = self.arrangement.selected {
|
||||||
let track_color = self.arrangement.model.tracks[track].color;
|
let track_color = self.arrangement.model.tracks[track].color;
|
||||||
|
|
@ -120,10 +122,12 @@ impl<E: Engine> ArrangerView<E> {
|
||||||
panic!("could not compute next color")
|
panic!("could not compute next color")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Focus the editor with the current phrase
|
/// Focus the editor with the current phrase
|
||||||
pub fn show_phrase (&mut self) {
|
pub fn show_phrase (&mut self) {
|
||||||
self.sequencer.editor.show(self.arrangement.phrase().as_ref());
|
self.sequencer.editor.show(self.arrangement.phrase().as_ref());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Focus the editor with the current phrase
|
/// Focus the editor with the current phrase
|
||||||
pub fn edit_phrase (&mut self) {
|
pub fn edit_phrase (&mut self) {
|
||||||
if self.arrangement.selected.is_clip() && self.arrangement.phrase().is_none() {
|
if self.arrangement.selected.is_clip() && self.arrangement.phrase().is_none() {
|
||||||
|
|
@ -134,24 +138,7 @@ impl<E: Engine> ArrangerView<E> {
|
||||||
self.focus(ArrangerViewFocus::PhraseEditor);
|
self.focus(ArrangerViewFocus::PhraseEditor);
|
||||||
self.sequencer.editor.entered = true;
|
self.sequencer.editor.entered = true;
|
||||||
}
|
}
|
||||||
/// Rename the selected track, scene, or clip
|
|
||||||
pub fn rename_selected (&mut self) {
|
|
||||||
match self.arrangement.selected {
|
|
||||||
ArrangementEditorFocus::Mix => {},
|
|
||||||
ArrangementEditorFocus::Track(_) => { todo!("rename track"); },
|
|
||||||
ArrangementEditorFocus::Scene(_) => { todo!("rename scene"); },
|
|
||||||
ArrangementEditorFocus::Clip(t, s) => {
|
|
||||||
if let Some(ref phrase) = self.arrangement.model.scenes[s].clips[t] {
|
|
||||||
let index = self.sequencer.phrases.index_of(&*phrase.read().unwrap());
|
|
||||||
if let Some(index) = index {
|
|
||||||
self.focus(ArrangerViewFocus::PhrasePool);
|
|
||||||
self.sequencer.phrases.phrase = index;
|
|
||||||
self.sequencer.phrases.begin_rename();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pub fn activate (&mut self) {
|
pub fn activate (&mut self) {
|
||||||
match self.arrangement.selected {
|
match self.arrangement.selected {
|
||||||
ArrangementEditorFocus::Scene(s) => {
|
ArrangementEditorFocus::Scene(s) => {
|
||||||
|
|
@ -175,31 +162,36 @@ impl<E: Engine> ArrangerView<E> {
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn delete (&mut self) {
|
pub fn delete (&mut self) {
|
||||||
match self.arrangement.selected {
|
match self.arrangement.selected {
|
||||||
ArrangementEditorFocus::Track(_) => self.track_del(),
|
ArrangementEditorFocus::Track(_) => self.arrangement.track_del(),
|
||||||
ArrangementEditorFocus::Scene(_) => self.scene_del(),
|
ArrangementEditorFocus::Scene(_) => self.arrangement.scene_del(),
|
||||||
ArrangementEditorFocus::Clip(_, _) => self.phrase_del(),
|
ArrangementEditorFocus::Clip(_, _) => self.arrangement.phrase_del(),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_first_row (&self) -> bool {
|
pub fn is_first_row (&self) -> bool {
|
||||||
let selected = self.selected;
|
let selected = self.arrangement.selected;
|
||||||
selected.is_mix() || selected.is_track()
|
selected.is_mix() || selected.is_track()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_last_row (&self) -> bool {
|
pub fn is_last_row (&self) -> bool {
|
||||||
let selected = self.selected;
|
let selected = self.arrangement.selected;
|
||||||
(self.scenes.len() == 0 && (selected.is_mix() || selected.is_track())) || match selected {
|
(self.arrangement.model.scenes.len() == 0 && (selected.is_mix() || selected.is_track())) || match selected {
|
||||||
ArrangementEditorFocus::Scene(s) => s == self.arrangement.model.scenes.len() - 1,
|
ArrangementEditorFocus::Scene(s) => s == self.arrangement.model.scenes.len() - 1,
|
||||||
ArrangementEditorFocus::Clip(_, s) => s == self.arrangement.model.scenes.len() - 1,
|
ArrangementEditorFocus::Clip(_, s) => s == self.arrangement.model.scenes.len() - 1,
|
||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn toggle_loop (&mut self) {
|
pub fn toggle_loop (&mut self) {
|
||||||
if let Some(phrase) = self.phrase() {
|
if let Some(phrase) = self.arrangement.phrase() {
|
||||||
phrase.write().unwrap().toggle_loop()
|
phrase.write().unwrap().toggle_loop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn randomize_color (&mut self) {
|
pub fn randomize_color (&mut self) {
|
||||||
match self.arrangement.selected {
|
match self.arrangement.selected {
|
||||||
ArrangementEditorFocus::Mix => {
|
ArrangementEditorFocus::Mix => {
|
||||||
|
|
@ -218,6 +210,7 @@ impl<E: Engine> ArrangerView<E> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Arranger display mode can be cycled
|
/// Arranger display mode can be cycled
|
||||||
|
|
@ -308,7 +301,7 @@ impl<E: Engine> ArrangementEditor<E> {
|
||||||
pub fn phrase_put (&mut self) {
|
pub fn phrase_put (&mut self) {
|
||||||
if let ArrangementEditorFocus::Clip(track, scene) = self.selected {
|
if let ArrangementEditorFocus::Clip(track, scene) = self.selected {
|
||||||
self.model.scenes[scene].clips[track] = Some(
|
self.model.scenes[scene].clips[track] = Some(
|
||||||
self.model.phrases.phrase().clone()
|
self.model.phrase().clone()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -328,8 +321,8 @@ impl<E: Engine> ArrangementEditor<E> {
|
||||||
let phrases = self.model.phrases.read().unwrap();
|
let phrases = self.model.phrases.read().unwrap();
|
||||||
let index = phrases.index_of(&*phrase.read().unwrap());
|
let index = phrases.index_of(&*phrase.read().unwrap());
|
||||||
if let Some(index) = index {
|
if let Some(index) = index {
|
||||||
if index < phrases.phrases.len().saturating_sub(1) {
|
if index < phrases.len().saturating_sub(1) {
|
||||||
*phrase = phrases.phrases[index + 1].clone();
|
*phrase = phrases[index + 1].clone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -342,7 +335,7 @@ impl<E: Engine> ArrangementEditor<E> {
|
||||||
let index = phrases.index_of(&*phrase.read().unwrap());
|
let index = phrases.index_of(&*phrase.read().unwrap());
|
||||||
if let Some(index) = index {
|
if let Some(index) = index {
|
||||||
if index > 0 {
|
if index > 0 {
|
||||||
*phrase = phrases.phrases[index - 1].clone();
|
*phrase = phrases[index - 1].clone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,27 +16,29 @@ pub enum ArrangerViewFocus {
|
||||||
/// Focus layout of arranger app
|
/// Focus layout of arranger app
|
||||||
impl<E: Engine> FocusGrid for ArrangerView<E> {
|
impl<E: Engine> FocusGrid for ArrangerView<E> {
|
||||||
type Item = ArrangerViewFocus;
|
type Item = ArrangerViewFocus;
|
||||||
fn cursor (&self) -> (usize, usize) { self.focus_cursor }
|
fn cursor (&self) -> (usize, usize) {
|
||||||
fn cursor_mut (&mut self) -> &mut (usize, usize) { &mut self.focus_cursor }
|
self.focus_cursor
|
||||||
|
}
|
||||||
|
fn cursor_mut (&mut self) -> &mut (usize, usize) {
|
||||||
|
&mut self.focus_cursor
|
||||||
|
}
|
||||||
fn focus_enter (&mut self) {
|
fn focus_enter (&mut self) {
|
||||||
let focused = self.focused();
|
let focused = self.focused();
|
||||||
if !self.entered {
|
if !self.entered {
|
||||||
self.entered = true;
|
self.entered = true;
|
||||||
use ArrangerViewFocus::*;
|
use ArrangerViewFocus::*;
|
||||||
if let Some(transport) = self.transport.as_ref() {
|
|
||||||
//transport.write().unwrap().entered = focused == Transport
|
|
||||||
}
|
|
||||||
self.arrangement.entered = focused == Arrangement;
|
self.arrangement.entered = focused == Arrangement;
|
||||||
self.phrases.write().unwrap().entered = focused == PhrasePool;
|
//self.sequencer.transport.entered = focused == Transport;
|
||||||
self.editor.entered = focused == PhraseEditor;
|
self.sequencer.editor.entered = focused == PhraseEditor;
|
||||||
|
self.sequencer.phrases.entered = focused == PhrasePool;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn focus_exit (&mut self) {
|
fn focus_exit (&mut self) {
|
||||||
if self.entered {
|
if self.entered {
|
||||||
self.entered = false;
|
self.entered = false;
|
||||||
self.arrangement.entered = false;
|
self.arrangement.entered = false;
|
||||||
self.editor.entered = false;
|
self.sequencer.editor.entered = false;
|
||||||
self.phrases.write().unwrap().entered = false;
|
self.sequencer.phrases.entered = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn entered (&self) -> Option<ArrangerViewFocus> {
|
fn entered (&self) -> Option<ArrangerViewFocus> {
|
||||||
|
|
|
||||||
|
|
@ -54,13 +54,13 @@ impl<E: Engine> Command<PhrasePoolView<E>> for PhrasePoolViewCommand {
|
||||||
view.phrase = phrase
|
view.phrase = phrase
|
||||||
},
|
},
|
||||||
Self::Edit(command) => {
|
Self::Edit(command) => {
|
||||||
return Ok(command.execute(&mut view.state)?.map(Self::Edit))
|
return Ok(command.execute(&mut view.model)?.map(Self::Edit))
|
||||||
}
|
}
|
||||||
Self::Rename(command) => match command {
|
Self::Rename(command) => match command {
|
||||||
Rename::Begin => {
|
Rename::Begin => {
|
||||||
view.mode = Some(PhrasePoolMode::Rename(
|
view.mode = Some(PhrasePoolMode::Rename(
|
||||||
view.phrase,
|
view.phrase,
|
||||||
view.state.phrases[view.phrase].read().unwrap().name.clone()
|
view.model.phrases[view.phrase].read().unwrap().name.clone()
|
||||||
))
|
))
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
|
|
@ -71,7 +71,7 @@ impl<E: Engine> Command<PhrasePoolView<E>> for PhrasePoolViewCommand {
|
||||||
Length::Begin => {
|
Length::Begin => {
|
||||||
view.mode = Some(PhrasePoolMode::Length(
|
view.mode = Some(PhrasePoolMode::Length(
|
||||||
view.phrase,
|
view.phrase,
|
||||||
view.state.phrases[view.phrase].read().unwrap().length,
|
view.model.phrases[view.phrase].read().unwrap().length,
|
||||||
PhraseLengthFocus::Bar
|
PhraseLengthFocus::Bar
|
||||||
))
|
))
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue