@@ -9,7 +9,7 @@ use crate::prelude::*;
99/// This render will return the location of which the last element finished rendering.
1010/**
1111`Example`
12- ```rust, no_run
12+ ```rust
1313use crate::prelude::*;
1414
1515// Create a window
@@ -18,8 +18,8 @@ let window = Window::init()?;
1818// Render This works! and Another Element! To the window's buffer
1919render!(
2020 window,
21- vec2 (16, 16) => [ "This works!" ]
22- vec2 (0, 0) => [ "Another Element!" ]
21+ (16, 16) => [ "This works!" ]
22+ (0, 0) => [ "Another Element!" ]
2323);
2424```
2525*/
@@ -29,8 +29,9 @@ macro_rules! render {
2929 #[ allow( unused_mut) ]
3030 let mut loc;
3131 $(
32- loc = $loc;
33- $( loc = $render. render( loc, $buffer. as_mut( ) ) ; ) *
32+ loc = Vec2 :: from( $loc) ;
33+ $( loc = $render. render( loc, $buffer. as_mut( ) ) ) ;* ;
34+ let _ = loc;
3435 ) *
3536 loc
3637 } } ;
@@ -40,6 +41,12 @@ macro_rules! render {
4041/// Render's return type is the location the render ended at.
4142pub trait Render {
4243 fn render ( & self , loc : Vec2 , buffer : & mut Buffer ) -> Vec2 ;
44+ fn size ( & self ) -> Vec2 {
45+ let mut buf = Buffer :: new ( ( u16:: MAX , u16:: MAX ) ) ;
46+ render ! ( buf, vec2( 0 , 0 ) => [ self ] ) ;
47+ buf. shrink ( ) ;
48+ buf. size ( )
49+ }
4350}
4451
4552/* --------------- Implementations --------------- */
@@ -48,12 +55,18 @@ impl Render for char {
4855 buffer. set ( loc, * self ) ;
4956 loc
5057 }
58+ fn size ( & self ) -> Vec2 {
59+ vec2 ( 1 , 1 )
60+ }
5161}
5262
5363impl Render for & str {
5464 fn render ( & self , loc : Vec2 , buffer : & mut Buffer ) -> Vec2 {
5565 render ! ( buffer, loc => [ StyledContent :: new( ContentStyle :: default ( ) , self ) ] )
5666 }
67+ fn size ( & self ) -> Vec2 {
68+ StyledContent :: new ( ContentStyle :: default ( ) , self ) . size ( )
69+ }
5770}
5871
5972impl < R : Render + ' static > From < R > for Box < dyn Render > {
@@ -114,4 +127,13 @@ impl<D: Display> Render for StyledContent<D> {
114127 loc. y -= 1 ;
115128 loc
116129 }
130+ fn size ( & self ) -> Vec2 {
131+ let mut width = 0 ;
132+ let mut height = 0 ;
133+ for line in format ! ( "{}" , self . content( ) ) . split ( '\n' ) {
134+ width = line. chars ( ) . count ( ) . max ( width) ;
135+ height += 1 ;
136+ }
137+ vec2 ( width as u16 , height)
138+ }
117139}
0 commit comments