mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
arranger: open and close rename modal
This commit is contained in:
parent
b0f4919030
commit
c8bdee060c
7 changed files with 92 additions and 17 deletions
|
|
@ -52,4 +52,4 @@ impl Exit for SetupModal {
|
||||||
fn exit (&mut self) {
|
fn exit (&mut self) {
|
||||||
self.1 = true
|
self.1 = true
|
||||||
}
|
}
|
||||||
}
|
t }
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ pub struct Arranger {
|
||||||
pub transport: Option<Arc<RwLock<TransportToolbar>>>,
|
pub transport: Option<Arc<RwLock<TransportToolbar>>>,
|
||||||
pub show_sequencer: Option<Direction>,
|
pub show_sequencer: Option<Direction>,
|
||||||
pub focus_sequencer: bool,
|
pub focus_sequencer: bool,
|
||||||
|
pub modal: Option<Box<dyn ExitableComponent>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Arranger {
|
impl Arranger {
|
||||||
|
|
@ -35,6 +36,7 @@ impl Arranger {
|
||||||
transport: None,
|
transport: None,
|
||||||
show_sequencer: Some(Direction::Down),
|
show_sequencer: Some(Direction::Down),
|
||||||
focus_sequencer: false,
|
focus_sequencer: false,
|
||||||
|
modal: None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn activate (&mut self) {
|
pub fn activate (&mut self) {
|
||||||
|
|
@ -145,4 +147,7 @@ impl Arranger {
|
||||||
pub fn scene_default_name (&self) -> String {
|
pub fn scene_default_name (&self) -> String {
|
||||||
format!("Scene {}", self.scenes.len() + 1)
|
format!("Scene {}", self.scenes.len() + 1)
|
||||||
}
|
}
|
||||||
|
pub fn rename_selected (&mut self) {
|
||||||
|
self.modal = Some(Box::new(ArrangerRenameModal::new(self.selected)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq, Clone, Copy)]
|
||||||
/// Represents the current user selection in the arranger
|
/// Represents the current user selection in the arranger
|
||||||
pub enum ArrangerFocus {
|
pub enum ArrangerFocus {
|
||||||
/** The whole mix is selected */
|
/** The whole mix is selected */
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,30 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
handle!(Arranger |self, e| {
|
handle!(Arranger |self, e| {
|
||||||
match e {
|
if let Some(modal) = self.modal.as_mut() {
|
||||||
AppEvent::Input(Event::Key(k)) => {
|
let result = modal.handle(e)?;
|
||||||
if k.code == KeyCode::Tab {
|
if modal.exited() {
|
||||||
self.focus_sequencer = !self.focus_sequencer;
|
self.modal = None;
|
||||||
Ok(true)
|
}
|
||||||
} else if self.focus_sequencer {
|
Ok(result)
|
||||||
if let Some(sequencer) = self.sequencer_mut() {
|
} else {
|
||||||
handle_keymap(sequencer, e, KEYMAP_SEQUENCER)
|
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 {
|
} 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)?;
|
arranger.track_add(None)?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}],
|
}],
|
||||||
|
[Char('n'), NONE, "rename", "rename item at cursor", |arranger: &mut Arranger| {
|
||||||
|
arranger.rename_selected();
|
||||||
|
Ok(true)
|
||||||
|
}],
|
||||||
});
|
});
|
||||||
|
|
|
||||||
51
crates/tek_sequencer/src/arranger_modal.rs
Normal file
51
crates/tek_sequencer/src/arranger_modal.rs
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -31,7 +31,7 @@ render!(Arranger |self, buf, area| {
|
||||||
ArrangerViewMode::VerticalExpanded =>
|
ArrangerViewMode::VerticalExpanded =>
|
||||||
super::arranger_view_v::draw_expanded(self, buf, area),
|
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)?;
|
let arrangement = arrangement(buf, area)?;
|
||||||
match direction {
|
match direction {
|
||||||
Direction::Down => {
|
Direction::Down => {
|
||||||
|
|
@ -66,5 +66,11 @@ render!(Arranger |self, buf, area| {
|
||||||
Ok(area)
|
Ok(area)
|
||||||
} else {
|
} else {
|
||||||
arrangement(buf, area)
|
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)
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ submod! {
|
||||||
arranger_handle
|
arranger_handle
|
||||||
arranger_track
|
arranger_track
|
||||||
arranger_view
|
arranger_view
|
||||||
|
arranger_modal
|
||||||
midi
|
midi
|
||||||
phrase
|
phrase
|
||||||
scene
|
scene
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue