mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-09 21:26:43 +01:00
51 lines
1.7 KiB
Rust
51 lines
1.7 KiB
Rust
use crate::*;
|
|
|
|
impl Render<Tui> for Sampler {
|
|
fn render (&self, to: &mut Tui) -> Perhaps<Rect> {
|
|
tui_render_sampler(self, to)
|
|
}
|
|
}
|
|
|
|
pub fn tui_render_sampler (sampler: &Sampler, to: &mut Tui) -> Perhaps<Rect> {
|
|
let Rect { x, y, height, .. } = to.area();
|
|
let style = Style::default().gray();
|
|
let title = format!(" {} ({})", sampler.name, sampler.voices.read().unwrap().len());
|
|
to.blit(&title, x+1, y, Some(style.white().bold().not_dim()))?;
|
|
let mut width = title.len() + 2;
|
|
let mut y1 = 1;
|
|
let mut j = 0;
|
|
for (note, sample) in sampler.mapped.iter()
|
|
.map(|(note, sample)|(Some(note), sample))
|
|
.chain(sampler.unmapped.iter().map(|sample|(None, sample)))
|
|
{
|
|
if y1 >= height {
|
|
break
|
|
}
|
|
let active = j == sampler.cursor.0;
|
|
width = width.max(
|
|
draw_sample(to, x, y + y1, note, &*sample.read().unwrap(), active)?
|
|
);
|
|
y1 = y1 + 1;
|
|
j = j + 1;
|
|
}
|
|
let height = ((2 + y1) as u16).min(height);
|
|
Ok(Some(Rect { x, y, width: (width as u16).min(to.area().width), height }))
|
|
}
|
|
|
|
fn draw_sample (
|
|
to: &mut Tui, x: u16, y: u16, note: Option<&u7>, sample: &Sample, focus: bool
|
|
) -> Usually<usize> {
|
|
let style = if focus { Style::default().green() } else { Style::default() };
|
|
if focus {
|
|
to.blit(&"🬴", x+1, y, Some(style.bold()))?;
|
|
}
|
|
let label1 = format!("{:3} {:12}",
|
|
note.map(|n|n.to_string()).unwrap_or(String::default()),
|
|
sample.name);
|
|
let label2 = format!("{:>6} {:>6} +0.0",
|
|
sample.start,
|
|
sample.end);
|
|
to.blit(&label1, x+2, y, Some(style.bold()))?;
|
|
to.blit(&label2, x+3+label1.len()as u16, y, Some(style))?;
|
|
Ok(label1.len() + label2.len() + 4)
|
|
}
|