mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 04:06:45 +01:00
implement deleting of tracks and scenes
This commit is contained in:
parent
0b71a57ead
commit
a0eef1f626
2 changed files with 47 additions and 50 deletions
|
|
@ -97,6 +97,26 @@ impl<E: Engine> Arranger<E> {
|
|||
}
|
||||
Ok(Some(true))
|
||||
}
|
||||
pub fn rename_selected (&mut self) {
|
||||
let Arrangement { selected, ref name, ref tracks, ref scenes, .. } = self.arrangement;
|
||||
todo!("rename selected");
|
||||
//self.modal = match selected {
|
||||
//ArrangementFocus::Mix => {
|
||||
//Some(Box::new(ArrangerRenameModal::new(selected, &*name.read().unwrap())))
|
||||
//},
|
||||
//ArrangementFocus::Track(t) => {
|
||||
//Some(Box::new(ArrangerRenameModal::new(selected, &*tracks[t].name.read().unwrap())))
|
||||
//},
|
||||
//ArrangementFocus::Scene(s) => {
|
||||
//Some(Box::new(ArrangerRenameModal::new(selected, &*scenes[s].name.read().unwrap())))
|
||||
//},
|
||||
//ArrangementFocus::Clip(t, s) => if let Some(ref clip) = scenes[s].clips[t] {
|
||||
//Some(Box::new(ArrangerRenameModal::new(selected, &clip.read().unwrap().name)))
|
||||
//} else {
|
||||
//None
|
||||
//}
|
||||
//};
|
||||
}
|
||||
}
|
||||
/// Focus layout of arranger app
|
||||
impl<E: Engine> FocusGrid<ArrangerFocus> for Arranger<E> {
|
||||
|
|
@ -260,7 +280,12 @@ impl<E: Engine> Arrangement<E> {
|
|||
Ok(&mut self.tracks[index])
|
||||
}
|
||||
pub fn track_del (&mut self) {
|
||||
unimplemented!("Arranger::track_del");
|
||||
if let Some(index) = self.selected.track() {
|
||||
self.tracks.remove(index);
|
||||
for scene in self.scenes.iter_mut() {
|
||||
scene.clips.remove(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
pub fn track_default_name (&self) -> String {
|
||||
format!("Track {}", self.tracks.len() + 1)
|
||||
|
|
@ -299,7 +324,9 @@ impl<E: Engine> Arrangement<E> {
|
|||
Ok(&mut self.scenes[index])
|
||||
}
|
||||
pub fn scene_del (&mut self) {
|
||||
unimplemented!("Arranger::scene_del");
|
||||
if let Some(index) = self.selected.scene() {
|
||||
self.scenes.remove(index);
|
||||
}
|
||||
}
|
||||
pub fn scene_default_name (&self) -> String {
|
||||
format!("Scene {}", self.scenes.len() + 1)
|
||||
|
|
|
|||
|
|
@ -3,49 +3,21 @@ use crate::*;
|
|||
impl Content for Arranger<Tui> {
|
||||
type Engine = Tui;
|
||||
fn content (&self) -> impl Widget<Engine = Tui> {
|
||||
Layers::new(move|add|{
|
||||
add(&Stack::down(move|add|{
|
||||
add(&self.transport)?;
|
||||
let arrangement = &self.arrangement as &dyn Widget<Engine = Tui>;
|
||||
if let Some(direction) = self.show_sequencer {
|
||||
let editor = &self.editor as &dyn Widget<Engine = Tui>;
|
||||
add(&arrangement.split(direction, 20, self.phrases.clone()
|
||||
.split(direction.ccw(), 20, editor)
|
||||
.min_y(20)).fill_y())
|
||||
} else {
|
||||
add(&self.arrangement)
|
||||
}
|
||||
}))?;
|
||||
//if let Some(ref modal) = self.modal {
|
||||
//add(&Background(COLOR_BG1))?;
|
||||
//add(&Foreground(COLOR_BG2))?;
|
||||
////add(modal as &dyn Widget<Engine = Tui>)?;
|
||||
//}
|
||||
Ok(())
|
||||
Stack::down(move|add|{
|
||||
add(&self.transport)?;
|
||||
let arrangement = &self.arrangement as &dyn Widget<Engine = Tui>;
|
||||
if let Some(direction) = self.show_sequencer {
|
||||
add(&arrangement.split(direction, 20,
|
||||
self.phrases.clone().split(direction.ccw(), 20,
|
||||
&self.editor as &dyn Widget<Engine = Tui>
|
||||
).min_y(20)
|
||||
).fill_y())
|
||||
} else {
|
||||
add(&self.arrangement)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
impl Arranger<Tui> {
|
||||
pub fn rename_selected (&mut self) {
|
||||
let Arrangement { selected, ref name, ref tracks, ref scenes, .. } = self.arrangement;
|
||||
//self.modal = match selected {
|
||||
//ArrangementFocus::Mix => {
|
||||
//Some(Box::new(ArrangerRenameModal::new(selected, &*name.read().unwrap())))
|
||||
//},
|
||||
//ArrangementFocus::Track(t) => {
|
||||
//Some(Box::new(ArrangerRenameModal::new(selected, &*tracks[t].name.read().unwrap())))
|
||||
//},
|
||||
//ArrangementFocus::Scene(s) => {
|
||||
//Some(Box::new(ArrangerRenameModal::new(selected, &*scenes[s].name.read().unwrap())))
|
||||
//},
|
||||
//ArrangementFocus::Clip(t, s) => if let Some(ref clip) = scenes[s].clips[t] {
|
||||
//Some(Box::new(ArrangerRenameModal::new(selected, &clip.read().unwrap().name)))
|
||||
//} else {
|
||||
//None
|
||||
//}
|
||||
//};
|
||||
}
|
||||
}
|
||||
impl Content for Arrangement<Tui> {
|
||||
type Engine = Tui;
|
||||
fn content (&self) -> impl Widget<Engine = Tui> {
|
||||
|
|
@ -88,20 +60,17 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
|
|||
let rows: &[(usize, usize)] = rows.as_ref();
|
||||
let cols: &[(usize, usize)] = cols.as_ref();
|
||||
|
||||
// grid
|
||||
add(&CustomWidget::new(|_|Ok(Some([0,0])), move|to: &mut TuiOutput|{
|
||||
let area = to.area();
|
||||
let style = Some(Style::default().fg(COLOR_SEPARATOR));
|
||||
for (_, x) in cols.iter() {
|
||||
let x = offset + area.x() + *x as u16 - 1;
|
||||
for y in area.y()..area.y2() {
|
||||
to.blit(&"▎", x, y, style);
|
||||
}
|
||||
for y in area.y()..area.y2() { to.blit(&"▎", x, y, style); }
|
||||
}
|
||||
for (_, y) in rows.iter() {
|
||||
let y = area.y() + (*y / PPQ) as u16 + 1;
|
||||
if y >= to.buffer.area.height {
|
||||
break
|
||||
}
|
||||
if y >= to.buffer.area.height { break }
|
||||
for x in area.x()..area.x2().saturating_sub(2) {
|
||||
if x < to.buffer.area.x && y < to.buffer.area.y {
|
||||
let cell = to.buffer.get_mut(x, y);
|
||||
|
|
@ -113,9 +82,10 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
|
|||
Ok(())
|
||||
}))?;
|
||||
|
||||
// cursor
|
||||
add(&CustomWidget::new(|_|Ok(Some([0,0])), move|to: &mut TuiOutput|{
|
||||
let area = to.area();
|
||||
let focused = state.focused;
|
||||
let area = to.area();
|
||||
let focused = state.focused;
|
||||
let selected = state.selected;
|
||||
let get_track_area = |t: usize| [
|
||||
offset + area.x() + cols[t].1 as u16 - 1, area.y(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue