fix: collect enum, break: Render for Option<&T>

This commit is contained in:
🪞👃🪞 2024-08-21 18:22:35 +03:00
parent 72f47bc837
commit 33bdf65e8d
8 changed files with 37 additions and 33 deletions

View file

@ -137,6 +137,7 @@ mod plugin {
let features = FeaturesBuilder { min_block_length: 1, max_block_length: 65536 }; let features = FeaturesBuilder { min_block_length: 1, max_block_length: 65536 };
let features = world.build_features(features); let features = world.build_features(features);
let mut plugin = None; let mut plugin = None;
#[allow(clippy::never_loop)]
for p in world.iter_plugins() { for p in world.iter_plugins() {
plugin = Some(p); plugin = Some(p);
break break

View file

@ -76,23 +76,23 @@ impl Render for () {
} }
} }
impl<T: Render> Render for &T { //impl<T: Render> Render for &T {
fn render (&self, buf: &mut Buffer, area: Rect) -> Usually<Rect> { //fn render (&self, buf: &mut Buffer, area: Rect) -> Usually<Rect> {
(*self).render(buf, area) //(*self).render(buf, area)
} //}
fn into_collected <'a> (self) -> Collected<'a> where Self: Sized + 'a { //fn into_collected <'a> (self) -> Collected<'a> where Self: Sized + 'a {
Collected::Ref(self) //Collected::Ref(self)
} //}
} //}
impl<T: Render> Render for &mut T { //impl<T: Render> Render for &mut T {
fn render (&self, buf: &mut Buffer, area: Rect) -> Usually<Rect> { //fn render (&self, buf: &mut Buffer, area: Rect) -> Usually<Rect> {
(**self).render(buf, area) //(**self).render(buf, area)
} //}
fn into_collected <'a> (self) -> Collected<'a> where Self: Sized + 'a { //fn into_collected <'a> (self) -> Collected<'a> where Self: Sized + 'a {
Collected::Ref(self) //Collected::Ref(self)
} //}
} //}
impl<T: Render> Render for Option<T> { impl<T: Render> Render for Option<T> {
fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> { fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> {
@ -103,21 +103,27 @@ impl<T: Render> Render for Option<T> {
} }
} }
impl Render for Box<dyn Render> { impl<'a> Render for Box<dyn Render + 'a> {
fn render (&self, buf: &mut Buffer, area: Rect) -> Usually<Rect> { fn render (&self, buf: &mut Buffer, area: Rect) -> Usually<Rect> {
(**self).render(buf, area) (**self).render(buf, area)
} }
fn into_collected <'a> (self) -> Collected<'a> where Self: Sized + 'a { fn into_collected <'b> (self) -> Collected<'b> where Self: Sized + 'b {
Collected::Box(self) Collected::Box(self)
} }
} }
impl Render for Box<dyn Fn(&mut Buffer, Rect) -> Usually<Rect> + Send + Sync> { impl<'a, T: Fn(&mut Buffer, Rect) -> Usually<Rect> + Send + Sync + 'a> Render for T {
fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> { fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> {
(*self)(b, a) (*self)(b, a)
} }
} }
//impl<'a> Render for Box<dyn Fn(&mut Buffer, Rect) -> Usually<Rect> + Send + Sync + 'a> {
//fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> {
//(*self)(b, a)
//}
//}
impl<T: Render> Render for Arc<Mutex<T>> { impl<T: Render> Render for Arc<Mutex<T>> {
fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> { fn render (&self, b: &mut Buffer, a: Rect) -> Usually<Rect> {
self.lock().unwrap().render(b, a) self.lock().unwrap().render(b, a)

View file

@ -25,12 +25,12 @@ impl<'a> Collection<'a> {
} }
pub trait Collect<'a> { pub trait Collect<'a> {
fn add_box (self, item: Box<dyn Render>) -> Self; fn add_box (self, item: Box<dyn Render + 'a>) -> Self;
fn add_ref (self, item: &'a dyn Render) -> Self; fn add_ref (self, item: &'a dyn Render) -> Self;
} }
impl<'a> Collect<'a> for Collection<'a> { impl<'a> Collect<'a> for Collection<'a> {
fn add_box (mut self, item: Box<dyn Render>) -> Self { fn add_box (mut self, item: Box<dyn Render + 'a>) -> Self {
self.0.push(Collected::Box(item)); self.0.push(Collected::Box(item));
self self
} }

View file

@ -44,9 +44,8 @@ impl LV2Plugin {
let features = FeaturesBuilder { min_block_length: 1, max_block_length: 65536 }; let features = FeaturesBuilder { min_block_length: 1, max_block_length: 65536 };
let features = world.build_features(features); let features = world.build_features(features);
let mut plugin = None; let mut plugin = None;
for p in world.iter_plugins() { if let Some(p) = world.iter_plugins().next() {
plugin = Some(p); plugin = Some(p);
break
} }
let plugin = plugin.unwrap(); let plugin = plugin.unwrap();
let err = &format!("init {uri}"); let err = &format!("init {uri}");

View file

@ -20,8 +20,6 @@ impl ArrangerViewMode {
} }
} }
use std::iter::IntoIterator;
struct Split<'a>(Collection<'a>, Direction); struct Split<'a>(Collection<'a>, Direction);
impl<'a> Split<'a> { impl<'a> Split<'a> {
@ -37,8 +35,8 @@ impl<'a> Render for Split<'a> {
} }
impl<'a> Collect<'a> for Split<'a> { impl<'a> Collect<'a> for Split<'a> {
fn add (mut self, item: Box<dyn Render>) -> Self { fn add_box (mut self, item: Box<dyn Render + 'a>) -> Self {
self.0 = self.0.add(item); self.0 = self.0.add_box(item);
self self
} }
fn add_ref (mut self, item: &'a dyn Render) -> Self { fn add_ref (mut self, item: &'a dyn Render) -> Self {
@ -79,10 +77,10 @@ render!(Arranger |self, buf, area| {
}); });
if let Some(direction) = self.show_sequencer { if let Some(direction) = self.show_sequencer {
layout = layout.add(Box::new(Split::new(direction) let sequencer = Box::new(Split::new(direction).add_box(arrangement));
.add(arrangement))); layout = layout.add_box(sequencer);
} else { } else {
layout = layout.add(arrangement); layout = layout.add_box(arrangement);
} }
layout.render(buf, area) layout.render(buf, area)

View file

@ -3,7 +3,7 @@ use crate::*;
pub fn draw (state: &Arranger, buf: &mut Buffer, mut area: Rect) -> Usually<Rect> { pub fn draw (state: &Arranger, buf: &mut Buffer, mut area: Rect) -> Usually<Rect> {
area.height = area.height.min((2 + state.tracks.len() * 2) as u16); area.height = area.height.min((2 + state.tracks.len() * 2) as u16);
Layered([ Layered([
&to_fill_bg(Nord::bg_lo(state.focused, state.entered)), &FillBg(Nord::bg_lo(state.focused, state.entered)),
&Split::right([ &Split::right([
&track_name_column(state), &track_name_column(state),
&track_mon_column(state), &track_mon_column(state),

View file

@ -31,7 +31,7 @@ pub fn draw (
area.height = 2 + (rows[rows.len() - 1].1 / 96) as u16; area.height = 2 + (rows[rows.len() - 1].1 / 96) as u16;
let offset = 3 + scene_name_max_len(state.scenes.as_ref()) as u16; let offset = 3 + scene_name_max_len(state.scenes.as_ref()) as u16;
Layered([ Layered([
&to_fill_bg(Nord::bg_lo(state.focused, state.entered)), &FillBg(Nord::bg_lo(state.focused, state.entered)),
&column_separators(offset, cols), &column_separators(offset, cols),
&cursor_focus(state, offset, cols, rows), &cursor_focus(state, offset, cols, rows),
&Split::down([ &Split::down([

View file

@ -37,7 +37,7 @@ render!(TransportToolbar |self, buf, area| {
// Beats per minute // Beats per minute
&|buf: &mut Buffer, Rect { x, y, .. }: Rect|{ &|buf: &mut Buffer, Rect { x, y, .. }: Rect|{
"BPM".blit(buf, x, y, Some(not_dim))?; "BPM".blit(buf, x, y, Some(not_dim))?;
let width = format!("{}.{:03}", bpm, bpm % 1).blit(buf, x, y + 1, Some(not_dim_bold))?.width; let width = format!("{}.{:03}", bpm, bpm * 1000 % 1000).blit(buf, x, y + 1, Some(not_dim_bold))?.width;
let area = Rect { x, y, width: (width + 2).max(10), height: 2 }; let area = Rect { x, y, width: (width + 2).max(10), height: 2 };
if self.focused && self.entered && self.selected == TransportFocus::BPM { if self.focused && self.entered && self.selected == TransportFocus::BPM {
corners.draw(buf, Rect { x: area.x - 1, ..area })?; corners.draw(buf, Rect { x: area.x - 1, ..area })?;