diff --git a/crates/tek/src/setup.rs b/crates/tek/src/setup.rs index 666479c5..60517a4f 100644 --- a/crates/tek/src/setup.rs +++ b/crates/tek/src/setup.rs @@ -52,4 +52,4 @@ impl Exit for SetupModal { fn exit (&mut self) { self.1 = true } -} +t } diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index 59ac48a4..17e7d5fb 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -20,6 +20,7 @@ pub struct Arranger { pub transport: Option>>, pub show_sequencer: Option, pub focus_sequencer: bool, + pub modal: Option>, } 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))); + } } diff --git a/crates/tek_sequencer/src/arranger_focus.rs b/crates/tek_sequencer/src/arranger_focus.rs index d93a67b6..5ed9097d 100644 --- a/crates/tek_sequencer/src/arranger_focus.rs +++ b/crates/tek_sequencer/src/arranger_focus.rs @@ -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 */ diff --git a/crates/tek_sequencer/src/arranger_handle.rs b/crates/tek_sequencer/src/arranger_handle.rs index d846af41..bdf13c21 100644 --- a/crates/tek_sequencer/src/arranger_handle.rs +++ b/crates/tek_sequencer/src/arranger_handle.rs @@ -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] = keymap!(Arranger { arranger.track_add(None)?; Ok(true) }], + [Char('n'), NONE, "rename", "rename item at cursor", |arranger: &mut Arranger| { + arranger.rename_selected(); + Ok(true) + }], }); diff --git a/crates/tek_sequencer/src/arranger_modal.rs b/crates/tek_sequencer/src/arranger_modal.rs new file mode 100644 index 00000000..c9b57f02 --- /dev/null +++ b/crates/tek_sequencer/src/arranger_modal.rs @@ -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 + } +} diff --git a/crates/tek_sequencer/src/arranger_view.rs b/crates/tek_sequencer/src/arranger_view.rs index d994b896..14ea851e 100644 --- a/crates/tek_sequencer/src/arranger_view.rs +++ b/crates/tek_sequencer/src/arranger_view.rs @@ -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) }); diff --git a/crates/tek_sequencer/src/lib.rs b/crates/tek_sequencer/src/lib.rs index 0afd645e..2f96b26b 100644 --- a/crates/tek_sequencer/src/lib.rs +++ b/crates/tek_sequencer/src/lib.rs @@ -14,6 +14,7 @@ submod! { arranger_handle arranger_track arranger_view + arranger_modal midi phrase scene