arranger: rename track/scene/clip

This commit is contained in:
🪞👃🪞 2024-08-22 19:00:58 +03:00
parent ea463db139
commit 70b1ec5a02
15 changed files with 53 additions and 40 deletions

View file

@ -0,0 +1,107 @@
use crate::*;
impl Arranger {
pub fn rename_selected (&mut self) {
self.modal = Some(Box::new(ArrangerRenameModal::new(
self.selected,
&match self.selected {
ArrangerFocus::Mix => self.name.clone(),
ArrangerFocus::Track(t) => self.tracks[t].name.clone(),
ArrangerFocus::Scene(s) => self.scenes[s].name.clone(),
ArrangerFocus::Clip(t, s) => self.tracks[t].phrases[s].read().unwrap().name.clone(),
}
)));
}
}
/// Appears on first run (i.e. if state dir is missing).
pub struct ArrangerRenameModal {
done: bool,
target: ArrangerFocus,
value: String,
result: Arc<RwLock<String>>,
cursor: usize
}
impl ArrangerRenameModal {
pub fn new (target: ArrangerFocus, value: &Arc<RwLock<String>>) -> Self {
Self {
done: false,
target,
value: value.read().unwrap().clone(),
cursor: value.read().unwrap().len(),
result: value.clone(),
}
}
}
render!(ArrangerRenameModal |self, buf, area| {
let y = area.y + area.height / 2;
let bg_area = Rect {
x: 1,
y: y - 1,
width: area.width - 2,
height: 3
};
fill_bg(buf, bg_area, Nord::BG0);
Lozenge(Style::default().bold().white().dim()).draw(buf, bg_area)?;
let label = match self.target {
ArrangerFocus::Mix => "Rename project:",
ArrangerFocus::Track(_) => "Rename track:",
ArrangerFocus::Scene(_) => "Rename scene:",
ArrangerFocus::Clip(_, _) => "Rename clip:",
};
let style = Some(Style::default().not_bold().white().not_dim());
label.blit(buf, area.x + 3, y, style)?;
let style = Some(Style::default().bold().white().not_dim());
self.value.blit(buf, area.x + 3 + label.len() as u16 + 1, y, style)?;
let style = Some(Style::default().bold().white().not_dim().reversed());
"".blit(buf, area.x + 3 + label.len() as u16 + 1 + self.cursor as u16, y, style)?;
Ok(area)
});
handle!(ArrangerRenameModal |self, e| {
match e {
AppEvent::Input(Event::Key(k)) => {
match k.code {
KeyCode::Esc => {
self.exit();
},
KeyCode::Enter => {
*self.result.write().unwrap() = self.value.clone();
self.exit();
},
KeyCode::Left => {
self.cursor = self.cursor.saturating_sub(1);
},
KeyCode::Right => {
self.cursor = self.value.len().min(self.cursor + 1)
},
KeyCode::Backspace => {
let last = self.value.len().saturating_sub(1);
self.value = format!("{}{}",
&self.value[0..self.cursor.min(last)],
&self.value[self.cursor.min(last)..last]
);
self.cursor = self.cursor.saturating_sub(1)
}
KeyCode::Char(c) => {
self.value.insert(self.cursor, c);
self.cursor = self.value.len().min(self.cursor + 1)
},
_ => {}
}
Ok(true)
},
_ => Ok(false),
}
});
impl Exit for ArrangerRenameModal {
fn exited (&self) -> bool {
self.done
}
fn exit (&mut self) {
self.done = true
}
}