mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-09 13:16:44 +01:00
arranger: text input in rename modal
This commit is contained in:
parent
3cbb2d2e0b
commit
b3ae4ad3db
2 changed files with 55 additions and 20 deletions
|
|
@ -43,10 +43,15 @@ impl ArrangerStandalone {
|
||||||
app.arranger.name = name.clone();
|
app.arranger.name = name.clone();
|
||||||
}
|
}
|
||||||
for _ in 0..args.tracks {
|
for _ in 0..args.tracks {
|
||||||
app.arranger.track_add(None)?;
|
let track = app.arranger.track_add(None)?;
|
||||||
|
for _ in 0..args.scenes {
|
||||||
|
track.phrases.push(
|
||||||
|
Arc::new(RwLock::new(Phrase::new("", 96 * 4, None)))
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for _ in 0..args.scenes {
|
for _ in 0..args.scenes {
|
||||||
app.arranger.scene_add(None)?;
|
let scene = app.arranger.scene_add(None)?;
|
||||||
}
|
}
|
||||||
Ok(app)
|
Ok(app)
|
||||||
}
|
}
|
||||||
|
|
@ -65,7 +70,13 @@ render!(ArrangerStandalone |self, buf, area| {
|
||||||
} else {
|
} else {
|
||||||
layout = layout.add_ref(&self.arranger)
|
layout = layout.add_ref(&self.arranger)
|
||||||
}
|
}
|
||||||
layout.render(buf, area)
|
let result = layout.render(buf, area)?;
|
||||||
|
if let Some(ref modal) = self.arranger.modal {
|
||||||
|
fill_bg(buf, area, Nord::bg_lo(false, false));
|
||||||
|
fill_fg(buf, area, Nord::bg_hi(false, false));
|
||||||
|
modal.render(buf, area)?;
|
||||||
|
}
|
||||||
|
Ok(result)
|
||||||
});
|
});
|
||||||
|
|
||||||
handle!(ArrangerStandalone |self, e| {
|
handle!(ArrangerStandalone |self, e| {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,21 @@
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
/// Appears on first run (i.e. if state dir is missing).
|
/// Appears on first run (i.e. if state dir is missing).
|
||||||
pub struct ArrangerRenameModal(bool, ArrangerFocus, String);
|
pub struct ArrangerRenameModal {
|
||||||
|
done: bool,
|
||||||
|
target: ArrangerFocus,
|
||||||
|
value: String,
|
||||||
|
cursor: usize
|
||||||
|
}
|
||||||
|
|
||||||
impl ArrangerRenameModal {
|
impl ArrangerRenameModal {
|
||||||
pub fn new (focus: ArrangerFocus, name: String) -> Self {
|
pub fn new (target: ArrangerFocus, value: String) -> Self {
|
||||||
Self(false, focus, name)
|
Self {
|
||||||
|
done: false,
|
||||||
|
target,
|
||||||
|
value: value.to_string(),
|
||||||
|
cursor: value.len()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -19,29 +29,43 @@ render!(ArrangerRenameModal |self, buf, area| {
|
||||||
};
|
};
|
||||||
fill_bg(buf, bg_area, Nord::BG0);
|
fill_bg(buf, bg_area, Nord::BG0);
|
||||||
Lozenge(Style::default().bold().white().dim()).draw(buf, bg_area)?;
|
Lozenge(Style::default().bold().white().dim()).draw(buf, bg_area)?;
|
||||||
let label = match self.1 {
|
let label = match self.target {
|
||||||
ArrangerFocus::Mix => "Rename project:",
|
ArrangerFocus::Mix => "Rename project:",
|
||||||
ArrangerFocus::Track(_) => "Rename track:",
|
ArrangerFocus::Track(_) => "Rename track:",
|
||||||
ArrangerFocus::Scene(_) => "Rename scene:",
|
ArrangerFocus::Scene(_) => "Rename scene:",
|
||||||
ArrangerFocus::Clip(_, _) => "Rename clip:",
|
ArrangerFocus::Clip(_, _) => "Rename clip:",
|
||||||
};
|
};
|
||||||
label.blit(
|
let style = Some(Style::default().not_bold().white().not_dim());
|
||||||
buf, area.x + 3, y, 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.2.blit(
|
self.value.blit(buf, area.x + 3 + label.len() as u16 + 1, y, style)?;
|
||||||
buf, area.x + 3 + label.len() as u16 + 1, y, Some(Style::default().bold().white().not_dim())
|
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)
|
Ok(area)
|
||||||
});
|
});
|
||||||
|
|
||||||
handle!(ArrangerRenameModal |self, e| {
|
handle!(ArrangerRenameModal |self, e| {
|
||||||
match e {
|
match e {
|
||||||
AppEvent::Input(Event::Key(k)) => {
|
AppEvent::Input(Event::Key(k)) => {
|
||||||
if k.code == KeyCode::Esc {
|
match k.code {
|
||||||
|
KeyCode::Esc => {
|
||||||
self.exit();
|
self.exit();
|
||||||
} else {
|
},
|
||||||
|
KeyCode::Enter => {
|
||||||
todo!();
|
todo!();
|
||||||
};
|
},
|
||||||
|
KeyCode::Left => {
|
||||||
|
self.cursor = self.cursor.saturating_sub(1);
|
||||||
|
},
|
||||||
|
KeyCode::Right => {
|
||||||
|
self.cursor = self.value.len().min(self.cursor + 1)
|
||||||
|
},
|
||||||
|
KeyCode::Char(c) => {
|
||||||
|
self.value.insert(self.cursor, c);
|
||||||
|
self.cursor = self.value.len().min(self.cursor + 1)
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
Ok(true)
|
Ok(true)
|
||||||
},
|
},
|
||||||
_ => Ok(false),
|
_ => Ok(false),
|
||||||
|
|
@ -50,9 +74,9 @@ handle!(ArrangerRenameModal |self, e| {
|
||||||
|
|
||||||
impl Exit for ArrangerRenameModal {
|
impl Exit for ArrangerRenameModal {
|
||||||
fn exited (&self) -> bool {
|
fn exited (&self) -> bool {
|
||||||
self.0
|
self.done
|
||||||
}
|
}
|
||||||
fn exit (&mut self) {
|
fn exit (&mut self) {
|
||||||
self.0 = true
|
self.done = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue