use crate::prelude::*; use super::Sampler; impl WidgetRef for Sampler { fn render_ref (&self, area: Rect, buf: &mut Buffer) { } } pub fn render ( state: &mut Sampler, stdout: &mut Stdout, offset: (u16, u16), ) -> Result<(), Box> { render_table(state, stdout, offset)?; render_meters(state, stdout, offset)?; Ok(()) } fn render_table ( state: &mut Sampler, stdout: &mut Stdout, offset: (u16, u16), ) -> Result<(), Box> { let move_to = |col, row| crossterm::cursor::MoveTo(offset.0 + col, offset.1 + row); stdout.queue(move_to(0, 3))?.queue( Print(" Name Rate Trigger Route") )?; for (i, sample) in state.samples.lock().unwrap().iter().enumerate() { let row = 4 + i as u16; for (j, (column, field)) in [ (0, format!(" {:7} ", sample.name)), (9, format!(" {:.1}Hz ", sample.rate)), (18, format!(" MIDI C{} {} ", sample.trigger.0, sample.trigger.1)), (33, format!(" {:.1}dB -> Output ", sample.gain)), (50, format!(" {} ", sample.playing.unwrap_or(0))), ].into_iter().enumerate() { stdout.queue(move_to(column, row))?; if state.selected_sample == i && state.selected_column == j { stdout.queue(PrintStyledContent(field.to_string().bold().reverse()))?; } else { stdout.queue(PrintStyledContent(field.to_string().bold()))?; } } } Ok(()) } fn render_meters ( state: &mut Sampler, stdout: &mut Stdout, offset: (u16, u16), ) -> Result<(), Box> { let move_to = |col, row| crossterm::cursor::MoveTo(offset.0 + col, offset.1 + row); for (i, sample) in state.samples.lock().iter().enumerate() { let row = 4 + i as u16; stdout.queue(move_to(32, row))?.queue( PrintStyledContent("▁".green()) )?; } Ok(()) }