@@ -17,7 +17,7 @@ use efx_core::Element;
1717pub use hyperlink:: Hyperlink ;
1818pub use label:: render_label_stmt;
1919use proc_macro2:: TokenStream ;
20- use quote:: ToTokens ;
20+ use quote:: { quote , ToTokens } ;
2121pub use row:: Row ;
2222pub use scroll_area:: render_scroll_area_stmt;
2323pub 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+
4171pub ( crate ) trait TagAttributes {
4272 fn new ( el : & Element ) -> Result < Self , TokenStream >
4373 where
0 commit comments