arranger: open and close rename modal

This commit is contained in:
🪞👃🪞 2024-08-20 14:09:03 +03:00
parent b0f4919030
commit c8bdee060c
7 changed files with 92 additions and 17 deletions

View file

@ -52,4 +52,4 @@ impl Exit for SetupModal {
fn exit (&mut self) {
self.1 = true
}
}
t }

View file

@ -20,6 +20,7 @@ pub struct Arranger {
pub transport: Option<Arc<RwLock<TransportToolbar>>>,
pub show_sequencer: Option<Direction>,
pub focus_sequencer: bool,
pub modal: Option<Box<dyn ExitableComponent>>,
}
impl Arranger {
@ -35,6 +36,7 @@ impl Arranger {
transport: None,
show_sequencer: Some(Direction::Down),
focus_sequencer: false,
modal: None
}
}
pub fn activate (&mut self) {
@ -145,4 +147,7 @@ impl Arranger {
pub fn scene_default_name (&self) -> String {
format!("Scene {}", self.scenes.len() + 1)
}
pub fn rename_selected (&mut self) {
self.modal = Some(Box::new(ArrangerRenameModal::new(self.selected)));
}
}

View file

@ -1,6 +1,6 @@
use crate::*;
#[derive(PartialEq)]
#[derive(PartialEq, Clone, Copy)]
/// Represents the current user selection in the arranger
pub enum ArrangerFocus {
/** The whole mix is selected */

View file

@ -1,22 +1,30 @@
use crate::*;
handle!(Arranger |self, e| {
match e {
AppEvent::Input(Event::Key(k)) => {
if k.code == KeyCode::Tab {
self.focus_sequencer = !self.focus_sequencer;
Ok(true)
} else if self.focus_sequencer {
if let Some(sequencer) = self.sequencer_mut() {
handle_keymap(sequencer, e, KEYMAP_SEQUENCER)
if let Some(modal) = self.modal.as_mut() {
let result = modal.handle(e)?;
if modal.exited() {
self.modal = None;
}
Ok(result)
} else {
match e {
AppEvent::Input(Event::Key(k)) => {
if k.code == KeyCode::Tab {
self.focus_sequencer = !self.focus_sequencer;
Ok(true)
} else if self.focus_sequencer {
if let Some(sequencer) = self.sequencer_mut() {
handle_keymap(sequencer, e, KEYMAP_SEQUENCER)
} else {
Ok(false)
}
} else {
Ok(false)
handle_keymap(self, e, KEYMAP_ARRANGER)
}
} else {
handle_keymap(self, e, KEYMAP_ARRANGER)
}
},
_ => Ok(false),
},
_ => Ok(false),
}
}
});
@ -78,4 +86,8 @@ pub const KEYMAP_ARRANGER: &'static [KeyBinding<Arranger>] = keymap!(Arranger {
arranger.track_add(None)?;
Ok(true)
}],
[Char('n'), NONE, "rename", "rename item at cursor", |arranger: &mut Arranger| {
arranger.rename_selected();
Ok(true)
}],
});

View file

@ -0,0 +1,51 @@
use crate::*;
/// Appears on first run (i.e. if state dir is missing).
pub struct ArrangerRenameModal(bool, ArrangerFocus);
impl ArrangerRenameModal {
pub fn new (focus: ArrangerFocus) -> Self {
Self(false, focus)
}
}
render!(ArrangerRenameModal |self, buf, area| {
let y = area.y + area.height / 2;
Lozenge(Style::default().bold().white().dim()).draw(buf, Rect {
x: 1,
y: y - 1,
width: area.width - 2,
height: 3
})?;
let label = match self.1 {
ArrangerFocus::Mix => "Rename project:",
ArrangerFocus::Track(_) => "Rename track:",
ArrangerFocus::Scene(_) => "Rename scene:",
ArrangerFocus::Clip(_, _) => "Rename clip:",
};
label.blit(buf, area.x + 3, y, Some(Style::default().not_bold().white().not_dim()))?;
Ok(area)
});
handle!(ArrangerRenameModal |self, e| {
match e {
AppEvent::Input(Event::Key(k)) => {
if k.code == KeyCode::Esc {
self.exit();
} else {
todo!();
};
Ok(true)
},
_ => Ok(false),
}
});
impl Exit for ArrangerRenameModal {
fn exited (&self) -> bool {
self.0
}
fn exit (&mut self) {
self.0 = true
}
}

View file

@ -31,7 +31,7 @@ render!(Arranger |self, buf, area| {
ArrangerViewMode::VerticalExpanded =>
super::arranger_view_v::draw_expanded(self, buf, area),
};
if let Some(direction) = self.show_sequencer {
let area = if let Some(direction) = self.show_sequencer {
let arrangement = arrangement(buf, area)?;
match direction {
Direction::Down => {
@ -66,5 +66,11 @@ render!(Arranger |self, buf, area| {
Ok(area)
} else {
arrangement(buf, area)
}?;
if let Some(ref modal) = self.modal {
fill_bg(buf, area, Nord::bg_lo(false, false));
fill_fg(buf, area, Nord::bg_hi(false, false));
modal.render(buf, area)?;
}
Ok(area)
});

View file

@ -14,6 +14,7 @@ submod! {
arranger_handle
arranger_track
arranger_view
arranger_modal
midi
phrase
scene