From 77ea2a9b0226c7d3e08c3d32b3107a7aadda2c8a Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 19 Dec 2024 17:20:35 +0100 Subject: [PATCH] add from! macro --- crates/tek/src/core.rs | 10 ++++++++++ crates/tek/src/tui/arranger_mode_v.rs | 28 +++++++++++++++------------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/crates/tek/src/core.rs b/crates/tek/src/core.rs index d90e39c8..b23e43b1 100644 --- a/crates/tek/src/core.rs +++ b/crates/tek/src/core.rs @@ -10,3 +10,13 @@ pub use self::{ input::Handle, output::Render }; + +/// Prototypal case of implementor macro. +/// Saves 4loc per data pats. +#[macro_export] macro_rules! from { + (|$self:ident: $Source:ty| $Target:ty = $cb:expr) => { + impl From<$Source> for $Target { + fn from (state: $Source) -> Self { $cb } + } + }; +} diff --git a/crates/tek/src/tui/arranger_mode_v.rs b/crates/tek/src/tui/arranger_mode_v.rs index 92cb17d1..0af95251 100644 --- a/crates/tek/src/tui/arranger_mode_v.rs +++ b/crates/tek/src/tui/arranger_mode_v.rs @@ -5,17 +5,11 @@ pub struct ArrangerVColSep { scenes_w: u16, sep_fg: Color, } - -impl From<&ArrangerTui> for ArrangerVColSep { - fn from (state: &ArrangerTui) -> Self { - Self { - cols: track_widths(state.tracks()), - scenes_w: 3 + ArrangerScene::longest_name(state.scenes()) as u16, - sep_fg: TuiTheme::separator_fg(false), - } - } -} - +from!(|source:&ArrangerTui|ArrangerVColSep = Self { + cols: track_widths(state.tracks()), + scenes_w: 3 + ArrangerScene::longest_name(state.scenes()) as u16, + sep_fg: TuiTheme::separator_fg(false), +}); render!(|self: ArrangerVColSep|render(move|to: &mut TuiOutput|{ let style = Some(Style::default().fg(self.sep_fg)); Ok(for x in self.cols.iter().map(|col|col.1) { @@ -145,8 +139,18 @@ pub struct ArrangerVHead<'a> { timebase: &'a Arc, current: &'a Arc, } +from!(<'a>|state: &'a ArrangerTui|ArrangerVHead<'a>, { // A + tracks: &state.tracks, + cols: track_widths(state.tracks()), + focused: true, + selected: state.selected, + scenes_w: 3 + ArrangerScene::longest_name(state.scenes()) as u16, + header_h: 3, + timebase: state.clock().timebase(), + current: &state.clock().playhead, +}); -impl<'a> From<&'a ArrangerTui> for ArrangerVHead<'a> { +impl<'a> From<&'a ArrangerTui> for ArrangerVHead<'a> { // B fn from (state: &'a ArrangerTui) -> Self { Self { tracks: &state.tracks,