Skip to content

Commit ae3e833

Browse files
committed
Added Block trait
1 parent 9c5af56 commit ae3e833

3 files changed

Lines changed: 36 additions & 28 deletions

File tree

efx/src/tags/column.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ use quote::{ToTokens, quote};
44

55
use crate::render::render_nodes_as_stmts;
66
use crate::tags::util::{attr_map, f32_opt};
7-
use crate::tags::{Tag, TagAttributes};
7+
use crate::tags::{Block, Tag, TagAttributes};
88
use efx_attrnames::AttrNames;
99

1010
pub struct Column {
1111
attributes: Attributes,
1212
element: Element,
1313
}
1414

15-
impl Tag for Column {
15+
impl Block for Column {
1616
fn from_element(el: &Element) -> Result<Self, TokenStream> {
1717
let attributes = Attributes::new(el)?;
1818
Ok(Self {
@@ -51,19 +51,6 @@ impl Tag for Column {
5151
}
5252
}
5353

54-
/// Full render: prologue → content → epilogue.
55-
fn render<UI: ToTokens>(&self, ui: &UI) -> TokenStream {
56-
let (prolog, epilogue) = self.prolog_epilogue(ui);
57-
let content = self.content(ui);
58-
quote! {{
59-
#prolog
60-
#content
61-
#epilogue
62-
}}
63-
}
64-
}
65-
66-
impl Column {
6754
fn prolog_epilogue<UI: ToTokens>(&self, ui: &UI) -> (TokenStream, TokenStream) {
6855
let mut prolog = TokenStream::new();
6956
let mut epilogue = TokenStream::new();

efx/src/tags/mod.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use efx_core::Element;
1717
pub use hyperlink::Hyperlink;
1818
pub use label::render_label_stmt;
1919
use proc_macro2::TokenStream;
20-
use quote::ToTokens;
20+
use quote::{quote, ToTokens};
2121
pub use row::Row;
2222
pub use scroll_area::render_scroll_area_stmt;
2323
pub use separator::Separator;
@@ -38,6 +38,36 @@ pub trait Tag: Sized {
3838
fn render<UI: ToTokens>(&self, ui: &UI) -> TokenStream;
3939
}
4040

41+
pub trait Block: Sized {
42+
fn from_element(el: &Element) -> Result<Self, TokenStream>
43+
where
44+
Self: Sized;
45+
/// Render contents
46+
fn content<UI: ToTokens>(&self, ui: &UI) -> TokenStream;
47+
fn prolog_epilogue<UI: ToTokens>(&self, ui: &UI) -> (TokenStream, TokenStream);
48+
49+
/// Full render: prologue → content → epilogue.
50+
fn render<UI: ToTokens>(&self, ui: &UI) -> TokenStream {
51+
let (prolog, epilogue) = self.prolog_epilogue(ui);
52+
let content = self.content(ui);
53+
quote! {{ #prolog #content #epilogue }}
54+
}
55+
}
56+
57+
impl<T: Block> Tag for T {
58+
fn from_element(el: &Element) -> Result<Self, TokenStream> {
59+
<T as Block>::from_element(el)
60+
}
61+
62+
fn content<UI: ToTokens>(&self, ui: &UI) -> TokenStream {
63+
<T as Block>::content(self, ui)
64+
}
65+
66+
fn render<UI: ToTokens>(&self, ui: &UI) -> TokenStream {
67+
<T as Block>::render(self, ui)
68+
}
69+
}
70+
4171
pub(crate) trait TagAttributes {
4272
fn new(el: &Element) -> Result<Self, TokenStream>
4373
where

efx/src/tags/row.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ use quote::{ToTokens, quote};
44
use efx_attrnames::AttrNames;
55
use crate::render::render_nodes_as_stmts;
66
use crate::tags::util::{attr_map, bool_or, f32_opt};
7-
use crate::tags::{Tag, TagAttributes};
7+
use crate::tags::{Block, Tag, TagAttributes};
88

99
pub struct Row {
1010
attributes: Attributes,
1111
element: Element,
1212
}
1313

14-
impl Tag for Row {
14+
impl Block for Row {
1515
fn from_element(el: &Element) -> Result<Self, TokenStream> {
1616
let attributes = Attributes::new(el)?;
1717
Ok(Self {
@@ -58,20 +58,11 @@ impl Tag for Row {
5858
}
5959
}
6060

61-
/// Full render: prologue → content → epilogue.
62-
fn render<UI: ToTokens>(&self, ui: &UI) -> TokenStream {
63-
let (prolog, epilogue) = self.prolog_epilogue(ui);
64-
let content = self.content(ui);
65-
quote! {{ #prolog #content #epilogue }}
66-
}
67-
}
68-
69-
impl Row {
7061
fn prolog_epilogue<UI: ToTokens>(&self, ui: &UI) -> (TokenStream, TokenStream) {
7162
let mut prolog = TokenStream::new();
7263
let mut epilogue = TokenStream::new();
7364

74-
if let Some(n) = self.attributes.gap {
65+
if let Some(n) = &self.attributes.gap {
7566
prolog.extend(quote! {
7667
let __efx_old_gap_x = #ui.spacing().item_spacing.x;
7768
#ui.spacing_mut().item_spacing.x = #n as _;

0 commit comments

Comments
 (0)