mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
reenable adding phrases with new command system
This commit is contained in:
parent
398f676ae3
commit
d5a37229b9
2 changed files with 107 additions and 71 deletions
|
|
@ -7,7 +7,7 @@ pub trait HasPhrases {
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub enum PhrasePoolCommand {
|
pub enum PhrasePoolCommand {
|
||||||
Add(usize),
|
Add(usize, Phrase),
|
||||||
Delete(usize),
|
Delete(usize),
|
||||||
Duplicate(usize),
|
Duplicate(usize),
|
||||||
Swap(usize, usize),
|
Swap(usize, usize),
|
||||||
|
|
@ -21,9 +21,16 @@ pub enum PhrasePoolCommand {
|
||||||
impl<T: HasPhrases> Command<T> for PhrasePoolCommand {
|
impl<T: HasPhrases> Command<T> for PhrasePoolCommand {
|
||||||
fn execute (self, model: &mut T) -> Perhaps<Self> {
|
fn execute (self, model: &mut T) -> Perhaps<Self> {
|
||||||
match self {
|
match self {
|
||||||
Self::Add(index) => {
|
Self::Add(mut index, phrase) => {
|
||||||
//Self::Append => { view.append_new(None, None) },
|
let phrase = Arc::new(RwLock::new(phrase));
|
||||||
//Self::Insert => { view.insert_new(None, None) },
|
let phrases = model.phrases_mut();
|
||||||
|
if index >= phrases.len() {
|
||||||
|
index = phrases.len();
|
||||||
|
phrases.push(phrase)
|
||||||
|
} else {
|
||||||
|
phrases.insert(index, phrase);
|
||||||
|
}
|
||||||
|
return Ok(Some(Self::Delete(index)))
|
||||||
},
|
},
|
||||||
Self::Delete(index) => {
|
Self::Delete(index) => {
|
||||||
//if view.phrase > 0 {
|
//if view.phrase > 0 {
|
||||||
|
|
@ -125,6 +132,7 @@ impl Phrase {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Phrase {
|
impl Default for Phrase {
|
||||||
fn default () -> Self {
|
fn default () -> Self {
|
||||||
Self::new("(empty)", false, 0, None, Some(ItemColor::from(Color::Rgb(0, 0, 0)).into()))
|
Self::new("(empty)", false, 0, None, Some(ItemColor::from(Color::Rgb(0, 0, 0)).into()))
|
||||||
|
|
|
||||||
|
|
@ -138,23 +138,34 @@ fn to_arranger_command (state: &ArrangerTui, input: &TuiInput) -> Option<Arrange
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
AppFocus::Content(ArrangerFocus::Arranger) => {
|
AppFocus::Content(ArrangerFocus::Arranger) => {
|
||||||
use ArrangerSelection as Select;
|
use ArrangerSelection::*;
|
||||||
use ArrangerTrackCommand as Track;
|
use KeyCode::Char;
|
||||||
use ArrangerClipCommand as Clip;
|
|
||||||
use ArrangerSceneCommand as Scene;
|
|
||||||
use KeyCode::{Char, Up, Down, Left, Right, Enter, Delete};
|
|
||||||
match input.event() {
|
match input.event() {
|
||||||
key!(Char('e')) => Cmd::EditPhrase(state.phrase_editing().clone()),
|
key!(Char('e')) => Cmd::EditPhrase(state.phrase_editing().clone()),
|
||||||
key!(Char('l')) => Cmd::Clip(Clip::SetLoop(false)),
|
key!(Char('l')) => Cmd::Clip(ArrangerClipCommand::SetLoop(false)),
|
||||||
key!(Char('+')) => Cmd::Zoom(0), // TODO
|
key!(Char('+')) => Cmd::Zoom(0), // TODO
|
||||||
key!(Char('=')) => Cmd::Zoom(0), // TODO
|
key!(Char('=')) => Cmd::Zoom(0), // TODO
|
||||||
key!(Char('_')) => Cmd::Zoom(0), // TODO
|
key!(Char('_')) => Cmd::Zoom(0), // TODO
|
||||||
key!(Char('-')) => Cmd::Zoom(0), // TODO
|
key!(Char('-')) => Cmd::Zoom(0), // TODO
|
||||||
key!(Char('`')) => { todo!("toggle state mode") },
|
key!(Char('`')) => { todo!("toggle state mode") },
|
||||||
key!(Ctrl-Char('a')) => Cmd::Scene(Scene::Add),
|
key!(Ctrl-Char('a')) => Cmd::Scene(ArrangerSceneCommand::Add),
|
||||||
key!(Ctrl-Char('t')) => Cmd::Track(Track::Add),
|
key!(Ctrl-Char('t')) => Cmd::Track(ArrangerTrackCommand::Add),
|
||||||
_ => match state.selected() {
|
_ => match state.selected() {
|
||||||
Select::Mix => match input.event() {
|
Mix => to_arranger_mix_command(input)?,
|
||||||
|
Track(t) => to_arranger_track_command(input, t)?,
|
||||||
|
Scene(s) => to_arranger_scene_command(input, s)?,
|
||||||
|
Clip(t, s) => to_arranger_clip_command(input, t, s)?,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_arranger_mix_command (input: &TuiInput) -> Option<ArrangerCommand> {
|
||||||
|
use KeyCode::{Char, Down, Right, Delete};
|
||||||
|
use ArrangerCommand as Cmd;
|
||||||
|
use ArrangerSelection as Select;
|
||||||
|
Some(match input.event() {
|
||||||
key!(Down) => Cmd::Select(Select::Scene(0)),
|
key!(Down) => Cmd::Select(Select::Scene(0)),
|
||||||
key!(Right) => Cmd::Select(Select::Track(0)),
|
key!(Right) => Cmd::Select(Select::Track(0)),
|
||||||
key!(Char(',')) => Cmd::Zoom(0),
|
key!(Char(',')) => Cmd::Zoom(0),
|
||||||
|
|
@ -164,8 +175,15 @@ fn to_arranger_command (state: &ArrangerTui, input: &TuiInput) -> Option<Arrange
|
||||||
key!(Delete) => Cmd::Clear,
|
key!(Delete) => Cmd::Clear,
|
||||||
key!(Char('c')) => Cmd::Color(ItemColor::random()),
|
key!(Char('c')) => Cmd::Color(ItemColor::random()),
|
||||||
_ => return None
|
_ => return None
|
||||||
},
|
})
|
||||||
Select::Track(t) => match input.event() {
|
}
|
||||||
|
|
||||||
|
fn to_arranger_track_command (input: &TuiInput, t: usize) -> Option<ArrangerCommand> {
|
||||||
|
use KeyCode::{Char, Down, Left, Right, Delete};
|
||||||
|
use ArrangerCommand as Cmd;
|
||||||
|
use ArrangerSelection as Select;
|
||||||
|
use ArrangerTrackCommand as Track;
|
||||||
|
Some(match input.event() {
|
||||||
key!(Down) => Cmd::Select(Select::Clip(t, 0)),
|
key!(Down) => Cmd::Select(Select::Clip(t, 0)),
|
||||||
key!(Left) => Cmd::Select(if t > 0 { Select::Track(t - 1) } else { Select::Mix }),
|
key!(Left) => Cmd::Select(if t > 0 { Select::Track(t - 1) } else { Select::Mix }),
|
||||||
key!(Right) => Cmd::Select(Select::Track(t + 1)),
|
key!(Right) => Cmd::Select(Select::Track(t + 1)),
|
||||||
|
|
@ -176,8 +194,15 @@ fn to_arranger_command (state: &ArrangerTui, input: &TuiInput) -> Option<Arrange
|
||||||
key!(Delete) => Cmd::Track(Track::Delete(t)),
|
key!(Delete) => Cmd::Track(Track::Delete(t)),
|
||||||
//key!(Char('c')) => Cmd::Track(Track::Color(t, ItemColor::random())),
|
//key!(Char('c')) => Cmd::Track(Track::Color(t, ItemColor::random())),
|
||||||
_ => return None
|
_ => return None
|
||||||
},
|
})
|
||||||
Select::Scene(s) => match input.event() {
|
}
|
||||||
|
|
||||||
|
fn to_arranger_scene_command (input: &TuiInput, s: usize) -> Option<ArrangerCommand> {
|
||||||
|
use KeyCode::{Char, Up, Down, Right, Enter, Delete};
|
||||||
|
use ArrangerCommand as Cmd;
|
||||||
|
use ArrangerSelection as Select;
|
||||||
|
use ArrangerSceneCommand as Scene;
|
||||||
|
Some(match input.event() {
|
||||||
key!(Up) => Cmd::Select(if s > 0 { Select::Scene(s - 1) } else { Select::Mix }),
|
key!(Up) => Cmd::Select(if s > 0 { Select::Scene(s - 1) } else { Select::Mix }),
|
||||||
key!(Down) => Cmd::Select(Select::Scene(s + 1)),
|
key!(Down) => Cmd::Select(Select::Scene(s + 1)),
|
||||||
key!(Right) => Cmd::Select(Select::Clip(0, s)),
|
key!(Right) => Cmd::Select(Select::Clip(0, s)),
|
||||||
|
|
@ -189,8 +214,15 @@ fn to_arranger_command (state: &ArrangerTui, input: &TuiInput) -> Option<Arrange
|
||||||
key!(Delete) => Cmd::Scene(Scene::Delete(s)),
|
key!(Delete) => Cmd::Scene(Scene::Delete(s)),
|
||||||
//key!(Char('c')) => Cmd::Track(Scene::Color(s, ItemColor::random())),
|
//key!(Char('c')) => Cmd::Track(Scene::Color(s, ItemColor::random())),
|
||||||
_ => return None
|
_ => return None
|
||||||
},
|
})
|
||||||
Select::Clip(t, s) => match input.event() {
|
}
|
||||||
|
|
||||||
|
fn to_arranger_clip_command (input: &TuiInput, t: usize, s: usize) -> Option<ArrangerCommand> {
|
||||||
|
use KeyCode::{Char, Up, Down, Left, Right, Delete};
|
||||||
|
use ArrangerCommand as Cmd;
|
||||||
|
use ArrangerSelection as Select;
|
||||||
|
use ArrangerClipCommand as Clip;
|
||||||
|
Some(match input.event() {
|
||||||
key!(Up) => Cmd::Select(if s > 0 { Select::Clip(t, s - 1) } else { Select::Track(t) }),
|
key!(Up) => Cmd::Select(if s > 0 { Select::Clip(t, s - 1) } else { Select::Track(t) }),
|
||||||
key!(Down) => Cmd::Select(Select::Clip(t, s + 1)),
|
key!(Down) => Cmd::Select(Select::Clip(t, s + 1)),
|
||||||
key!(Left) => Cmd::Select(if t > 0 { Select::Clip(t - 1, s) } else { Select::Scene(s) }),
|
key!(Left) => Cmd::Select(if t > 0 { Select::Clip(t - 1, s) } else { Select::Scene(s) }),
|
||||||
|
|
@ -204,16 +236,12 @@ fn to_arranger_command (state: &ArrangerTui, input: &TuiInput) -> Option<Arrange
|
||||||
//key!(Char('g')) => Cmd::Clip(Clip(Clip::Get(t, s))),
|
//key!(Char('g')) => Cmd::Clip(Clip(Clip::Get(t, s))),
|
||||||
//key!(Char('s')) => Cmd::Clip(Clip(Clip::Set(t, s))),
|
//key!(Char('s')) => Cmd::Clip(Clip(Clip::Set(t, s))),
|
||||||
_ => return None
|
_ => return None
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: PhrasesControl> InputToCommand<Tui, T> for PhrasesCommand {
|
impl<T: PhrasesControl> InputToCommand<Tui, T> for PhrasesCommand {
|
||||||
fn input_to_command (state: &T, input: &TuiInput) -> Option<Self> {
|
fn input_to_command (state: &T, input: &TuiInput) -> Option<Self> {
|
||||||
use PhrasePoolCommand as Phrase;
|
use PhrasePoolCommand as Pool;
|
||||||
use PhraseRenameCommand as Rename;
|
use PhraseRenameCommand as Rename;
|
||||||
use PhraseLengthCommand as Length;
|
use PhraseLengthCommand as Length;
|
||||||
use KeyCode::{Up, Down, Delete, Char};
|
use KeyCode::{Up, Down, Delete, Char};
|
||||||
|
|
@ -224,26 +252,26 @@ impl<T: PhrasesControl> InputToCommand<Tui, T> for PhrasesCommand {
|
||||||
key!(Down) => Self::Select(0),
|
key!(Down) => Self::Select(0),
|
||||||
key!(Char(',')) => if index > 1 {
|
key!(Char(',')) => if index > 1 {
|
||||||
state.set_phrase_index(state.phrase_index().saturating_sub(1));
|
state.set_phrase_index(state.phrase_index().saturating_sub(1));
|
||||||
Self::Phrase(Phrase::Swap(index - 1, index))
|
Self::Phrase(Pool::Swap(index - 1, index))
|
||||||
} else {
|
} else {
|
||||||
return None
|
return None
|
||||||
},
|
},
|
||||||
key!(Char('.')) => if index < count.saturating_sub(1) {
|
key!(Char('.')) => if index < count.saturating_sub(1) {
|
||||||
state.set_phrase_index(state.phrase_index() + 1);
|
state.set_phrase_index(state.phrase_index() + 1);
|
||||||
Self::Phrase(Phrase::Swap(index + 1, index))
|
Self::Phrase(Pool::Swap(index + 1, index))
|
||||||
} else {
|
} else {
|
||||||
return None
|
return None
|
||||||
},
|
},
|
||||||
key!(Delete) => if index > 0 {
|
key!(Delete) => if index > 0 {
|
||||||
state.set_phrase_index(index.min(count.saturating_sub(1)));
|
state.set_phrase_index(index.min(count.saturating_sub(1)));
|
||||||
Self::Phrase(Phrase::Delete(index))
|
Self::Phrase(Pool::Delete(index))
|
||||||
} else {
|
} else {
|
||||||
return None
|
return None
|
||||||
},
|
},
|
||||||
key!(Char('a')) => Self::Phrase(Phrase::Add(count)),
|
key!(Char('a')) => Self::Phrase(Pool::Add(count, Phrase::default())),
|
||||||
key!(Char('i')) => Self::Phrase(Phrase::Add(index + 1)),
|
key!(Char('i')) => Self::Phrase(Pool::Add(index + 1, Phrase::default())),
|
||||||
key!(Char('d')) => Self::Phrase(Phrase::Duplicate(index)),
|
key!(Char('d')) => Self::Phrase(Pool::Duplicate(index)),
|
||||||
key!(Char('c')) => Self::Phrase(Phrase::Color(index, ItemColor::random())),
|
key!(Char('c')) => Self::Phrase(Pool::Color(index, ItemColor::random())),
|
||||||
key!(Char('n')) => Self::Rename(Rename::Begin),
|
key!(Char('n')) => Self::Rename(Rename::Begin),
|
||||||
key!(Char('t')) => Self::Length(Length::Begin),
|
key!(Char('t')) => Self::Length(Length::Begin),
|
||||||
_ => match state.phrases_mode() {
|
_ => match state.phrases_mode() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue