mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
wip: midi import/export browser, pt.7
This commit is contained in:
parent
f12a1dc2ca
commit
86f37fb278
3 changed files with 33 additions and 6 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
use tek_core::midly::Smf;
|
use tek_core::midly::Smf;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
pub trait HasPhrases {
|
pub trait HasPhrases {
|
||||||
fn phrases (&self) -> &Vec<Arc<RwLock<Phrase>>>;
|
fn phrases (&self) -> &Vec<Arc<RwLock<Phrase>>>;
|
||||||
|
|
@ -11,8 +12,8 @@ pub enum PhrasePoolCommand {
|
||||||
Add(usize, Phrase),
|
Add(usize, Phrase),
|
||||||
Delete(usize),
|
Delete(usize),
|
||||||
Swap(usize, usize),
|
Swap(usize, usize),
|
||||||
Import(usize, String),
|
Import(usize, PathBuf),
|
||||||
Export(usize, String),
|
Export(usize, PathBuf),
|
||||||
SetName(usize, String),
|
SetName(usize, String),
|
||||||
SetLength(usize, usize),
|
SetLength(usize, usize),
|
||||||
SetColor(usize, ItemColor),
|
SetColor(usize, ItemColor),
|
||||||
|
|
@ -54,7 +55,7 @@ impl<T: HasPhrases> Command<T> for PhrasePoolCommand {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let mut phrase = Phrase::new(&path, true, t as usize + 1, None, None);
|
let mut phrase = Phrase::new("imported", true, t as usize + 1, None, None);
|
||||||
for event in events.iter() {
|
for event in events.iter() {
|
||||||
phrase.notes[event.0 as usize].push(event.2);
|
phrase.notes[event.0 as usize].push(event.2);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -265,20 +265,28 @@ pub enum FileBrowserCommand {
|
||||||
impl<T: PhrasesControl> Command<T> for FileBrowserCommand {
|
impl<T: PhrasesControl> Command<T> for FileBrowserCommand {
|
||||||
fn execute (self, state: &mut T) -> Perhaps<Self> {
|
fn execute (self, state: &mut T) -> Perhaps<Self> {
|
||||||
use FileBrowserCommand::*;
|
use FileBrowserCommand::*;
|
||||||
|
use PhrasesMode::{Import, Export};
|
||||||
let mode = state.phrases_mode_mut();
|
let mode = state.phrases_mode_mut();
|
||||||
match mode {
|
match mode {
|
||||||
Some(PhrasesMode::Import(index, ref mut browser)) => match self {
|
Some(Import(index, ref mut browser)) => match self {
|
||||||
Cancel => {
|
Cancel => {
|
||||||
*mode = None;
|
*mode = None;
|
||||||
},
|
},
|
||||||
Chdir(cwd) => {
|
Chdir(cwd) => {
|
||||||
*mode = Some(PhrasesMode::Import(*index, FileBrowser::new(Some(cwd))?));
|
*mode = Some(Import(*index, FileBrowser::new(Some(cwd))?));
|
||||||
},
|
},
|
||||||
Select(index) => {
|
Select(index) => {
|
||||||
browser.index = index;
|
browser.index = index;
|
||||||
},
|
},
|
||||||
Confirm => {
|
Confirm => {
|
||||||
todo!("import midi to phrase");
|
if browser.is_file() {
|
||||||
|
let index = *index;
|
||||||
|
let path = browser.path();
|
||||||
|
*mode = None;
|
||||||
|
PhrasePoolCommand::Import(index, path).execute(state)?;
|
||||||
|
} else if browser.is_dir() {
|
||||||
|
*mode = Some(Import(*index, browser.chdir()?));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
_ => unreachable!()
|
_ => unreachable!()
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,24 @@ impl FileBrowser {
|
||||||
pub fn len (&self) -> usize {
|
pub fn len (&self) -> usize {
|
||||||
self.dirs.len() + self.files.len()
|
self.dirs.len() + self.files.len()
|
||||||
}
|
}
|
||||||
|
pub fn is_dir (&self) -> bool {
|
||||||
|
self.index < self.dirs.len()
|
||||||
|
}
|
||||||
|
pub fn is_file (&self) -> bool {
|
||||||
|
self.index >= self.dirs.len()
|
||||||
|
}
|
||||||
|
pub fn path (&self) -> PathBuf {
|
||||||
|
self.cwd.join(if self.is_dir() {
|
||||||
|
&self.dirs[self.index].0
|
||||||
|
} else if self.is_file() {
|
||||||
|
&self.files[self.index - self.dirs.len()].0
|
||||||
|
} else {
|
||||||
|
unreachable!()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
pub fn chdir (&self) -> Usually<Self> {
|
||||||
|
Self::new(Some(self.path()))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Displays and edits phrase length.
|
/// Displays and edits phrase length.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue