From a0eef1f626f3886f5f9e193fd53f3d0d0b828c74 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 18 Oct 2024 16:14:18 +0300 Subject: [PATCH] implement deleting of tracks and scenes --- crates/tek_sequencer/src/arranger.rs | 31 ++++++++++- crates/tek_sequencer/src/arranger_tui.rs | 66 +++++++----------------- 2 files changed, 47 insertions(+), 50 deletions(-) diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index 2b7553d2..8a58f892 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -97,6 +97,26 @@ impl Arranger { } 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 FocusGrid for Arranger { @@ -260,7 +280,12 @@ impl Arrangement { 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 Arrangement { 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) diff --git a/crates/tek_sequencer/src/arranger_tui.rs b/crates/tek_sequencer/src/arranger_tui.rs index 1e0cb564..994469ff 100644 --- a/crates/tek_sequencer/src/arranger_tui.rs +++ b/crates/tek_sequencer/src/arranger_tui.rs @@ -3,49 +3,21 @@ use crate::*; impl Content for Arranger { type Engine = Tui; fn content (&self) -> impl Widget { - Layers::new(move|add|{ - add(&Stack::down(move|add|{ - add(&self.transport)?; - let arrangement = &self.arrangement as &dyn Widget; - if let Some(direction) = self.show_sequencer { - let editor = &self.editor as &dyn Widget; - 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)?; - //} - Ok(()) + Stack::down(move|add|{ + add(&self.transport)?; + let arrangement = &self.arrangement as &dyn Widget; + if let Some(direction) = self.show_sequencer { + add(&arrangement.split(direction, 20, + self.phrases.clone().split(direction.ccw(), 20, + &self.editor as &dyn Widget + ).min_y(20) + ).fill_y()) + } else { + add(&self.arrangement) + } }) } } -impl Arranger { - 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 { type Engine = Tui; fn content (&self) -> impl Widget { @@ -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(),