wip: phrases by reference instead of index

This commit is contained in:
🪞👃🪞 2024-10-08 13:56:46 +03:00
parent 25e54eba4e
commit 5b2b04dcf9
2 changed files with 147 additions and 113 deletions

View file

@ -58,9 +58,7 @@ impl Handle<Tui> for Arranger<Tui> {
} else if focus == 1 && is_last_row {
self.focus_next();
} else {
return
return self.focused_mut().handle(from)
}
},
key!(KeyCode::Up) => {
@ -93,12 +91,22 @@ impl Focus<3, Tui> for Arranger<Tui> {
impl Arranger<Tui> {
pub fn rename_selected (&mut self) {
let Arrangement { selected, ref name, ref tracks, ref scenes, .. } = self.arrangement;
self.modal = Some(Box::new(ArrangerRenameModal::new(selected, &match selected {
ArrangementFocus::Mix => name.clone(),
ArrangementFocus::Track(t) => tracks[t].name.clone(),
ArrangementFocus::Scene(s) => scenes[s].name.clone(),
ArrangementFocus::Clip(t, s) => tracks[t].phrases[s].read().unwrap().name.clone(),
})));
self.modal = match selected {
ArrangementFocus::Mix => {
Some(Box::new(ArrangerRenameModal::new(selected, &name)))
},
ArrangementFocus::Track(t) => {
Some(Box::new(ArrangerRenameModal::new(selected, &tracks[t].name)))
},
ArrangementFocus::Scene(s) => {
Some(Box::new(ArrangerRenameModal::new(selected, &scenes[s].name)))
},
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 Focusable<Tui> for Arrangement<Tui> {
@ -212,10 +220,12 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
fn content (&self) -> impl Widget<Engine = Tui> {
let Self(state, factor) = self;
let (cols, rows) = if *factor == 0 {(
ArrangementTrack::clip_name_lengths(state.tracks.as_slice()),
state.track_widths(),
//ArrangementTrack::clip_name_lengths(state.tracks.as_slice()),
Scene::ppqs(state.tracks.as_slice(), state.scenes.as_slice()),
)} else {(
ArrangementTrack::clip_name_lengths(state.tracks.as_slice()),
state.track_widths(),
//ArrangementTrack::clip_name_lengths(state.tracks.as_slice()),
(0..=state.scenes.len()).map(|i|(factor*PPQ, factor*PPQ*i)).collect::<Vec<_>>(),
)};
//let height = rows.last().map(|(w,y)|(y+w)/PPQ).unwrap_or(16);
@ -241,8 +251,7 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
(Some(track), Some(Some(clip))) => match track.phrases.get(*clip) {
Some(phrase) => {
let name = &(phrase as &Arc<RwLock<Phrase>>).read().unwrap().name;
let name = name.read().unwrap();
let name = format!("{clip:02} {}", name);
let name = format!("{}", name.read().unwrap());
add(&name.as_str().push_x(1).fixed_x(w))?;
if (track as &PhrasePlayer<_>).phrase == Some(*clip) {
color = COLOR_PLAYING
@ -262,7 +271,7 @@ impl<'a> Content for VerticalArranger<'a, Tui> {
let playing = scene.is_playing(tracks);
Stack::right(move |add| {
add(&scene_name(scene, playing, height))?;
for (track, (w, _x)) in cols.iter().enumerate() {
for (track, (w, _)) in cols.iter().enumerate() {
add(&scene_clip(scene, track, *w as u16, height))?;
}
Ok(())
@ -572,10 +581,7 @@ impl<'a> Content for HorizontalArranger<'a, Tui> {
let active_track = selected.track() == Some(i);
if let Some(clip) = clip {
let y2 = y + 2 + i as u16 * 2;
let label = match tracks[i].phrases.get(*clip) {
Some(phrase) => &format!("{}", phrase.read().unwrap().name.read().unwrap()),
None => "...."
};
let label = format!("{}", clip.read().unwrap().name.read().unwrap());
to.blit(&label, x + x2, y2, Some(if active_track && active_scene {
Style::default().not_dim().yellow().bold()
} else {
@ -617,7 +623,7 @@ impl Content for ArrangerRenameModal<Tui> {
//to.blit(&"▂", area.x() + 3 + label.len() as u16 + 1 + self.cursor as u16, y, style);
//Ok(Some(area))
//Ok(())
}
}
}
impl Handle<Tui> for ArrangerRenameModal<Tui> {
fn handle (&mut self, from: &TuiInput) -> Perhaps<bool> {