From ccb4a01a297e67be10f0010c32433ff9c7d49196 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Mon, 16 Dec 2024 20:31:23 +0100 Subject: [PATCH] wip: fix note range --- crates/tek/src/layout/bsp.rs | 5 +-- crates/tek/src/tui/piano_horizontal.rs | 48 +++++++++++++++++--------- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/crates/tek/src/layout/bsp.rs b/crates/tek/src/layout/bsp.rs index 68f39d1c..83ffd2ba 100644 --- a/crates/tek/src/layout/bsp.rs +++ b/crates/tek/src/layout/bsp.rs @@ -58,8 +58,9 @@ impl, Y: Render> Render for Bsp { let s = to.area().wh().into(); let s_a = a.min_size(s)?.unwrap_or(n); let s_b = b.min_size(s)?.unwrap_or(n); - to.render_in(to.area().clip(s_a).into(), a)?; - to.render_in(to.area().push_y(s_a.h().into()).into(), b)?; + let s_y = s_a.h().into(); + to.render_in(to.area().clip_h(s_y).into(), a)?; + to.render_in(to.area().push_y(s_y).into(), b)?; }, Self::W(a, b) => { let n = [0.into(), 0.into()].into(); diff --git a/crates/tek/src/tui/piano_horizontal.rs b/crates/tek/src/tui/piano_horizontal.rs index f19fd813..cc63fde1 100644 --- a/crates/tek/src/tui/piano_horizontal.rs +++ b/crates/tek/src/tui/piano_horizontal.rs @@ -48,7 +48,9 @@ render!(|self: PianoHorizontal|{ let time_point = self.point.time_point(); let note_point = self.point.note_point(); let note_len = self.point.note_len(); - let keys = move||PianoHorizontalKeys { color, note_lo, note_hi, note_point: Some(note_point), }; + let range = &self.range; + let point = &self.point; + let keys = move||PianoHorizontalKeys { color, range, point }; //note_lo, note_hi, note_point: Some(note_point), }; let timeline = move||PianoHorizontalTimeline { color, time_start, time_zoom, }; let notes = move||PianoHorizontalNotes { source: &self.buffer, time_start, note_hi, }; let cursor = move||PianoHorizontalCursor { time_zoom, time_point, time_start, note_point, note_len, note_hi, note_lo, }; @@ -56,9 +58,9 @@ render!(|self: PianoHorizontal|{ Tui::fill_xy(Tui::bg(bg, Bsp::s( Tui::fill_x(Tui::push_x(keys_width, timeline())), Bsp::w( - Tui::shrink_x(keys_width, - Tui::fill_x(Tui::debug(lay!([&self.size, notes(), cursor()]))), - ), + Tui::shrink_x(keys_width, Tui::fill_xy( + lay!([&self.size, Tui::debug(Tui::fill_xy(lay!([notes(), cursor()])))]) + )), Tui::fixed_x(keys_width, keys()) ), ))) @@ -75,18 +77,32 @@ render!(|self: PianoHorizontalTimeline|Tui::fg_bg( format!("{}*{}", self.time_start, self.time_zoom).as_str() )); -pub struct PianoHorizontalKeys { - color: ItemPalette, - note_lo: usize, - note_hi: usize, - note_point: Option, +pub struct PianoHorizontalKeys<'a> { + color: ItemPalette, + range: &'a MidiRangeModel, + point: &'a MidiPointModel, } -render!(|self: PianoHorizontalKeys|render(|to|Ok({ - let [x, y0, _, _] = to.area().xywh(); - let key_style = Some(Style::default().fg(Color::Rgb(192, 192, 192)).bg(Color::Rgb(0, 0, 0))); - let off_style = Some(Style::default().fg(TuiTheme::g(160))); - let on_style = Some(Style::default().fg(TuiTheme::g(255)).bg(self.color.light.rgb).bold()); - for (y, note) in (self.note_lo..self.note_hi).rev().enumerate().map(|(y, n)|(y0 + y as u16, n)) { +render!(|self: PianoHorizontalKeys<'a>|render(|to|Ok({ + let color = self.color; + let note_lo = self.range.note_lo(); + let note_hi = self.range.note_hi(); + let note_point = self.point.note_point(); + let [x, y0, ..] = to.area().xywh(); + let key_style = Some(Style::default().fg(Color::Rgb(192, 192, 192)).bg(Color::Rgb(0, 0, 0))); + let off_style = Some(Style::default().fg(TuiTheme::g(160))); + let on_style = Some(Style::default().fg(TuiTheme::g(255)).bg(self.color.light.rgb).bold()); + + let debug = true; + if debug { + to.blit(&format!("XYU"), x, y0, None); + to.blit(&format!("x={x}"), x, y0+1, None); + to.blit(&format!("y0={y0}"), x, y0+2, None); + to.blit(&format!("note_lo={note_lo}"), x, y0+3, None); + to.blit(&format!("note_hi={note_hi}"), x, y0+4, None); + } + + return Ok(()); + for (y, note) in (note_lo..note_hi).rev().enumerate().map(|(y, n)|(y0 + y as u16, n)) { let key = match note % 12 { 11 => "████▌", 10 => " ", @@ -104,7 +120,7 @@ render!(|self: PianoHorizontalKeys|render(|to|Ok({ }; to.blit(&key, x, y, key_style); - if Some(note) == self.note_point { + if note == note_point { to.blit(&format!("{:<5}", to_note_name(note)), x, y, on_style) } else { to.blit(&to_note_name(note), x, y, off_style)