embedded-layout 0.4.2

Extend embedded-graphics with simple layout functions
Documentation
use embedded_graphics::{
    pixelcolor::BinaryColor,
    prelude::{PixelColor, Point, Size},
    primitives::{Circle, Primitive, PrimitiveStyle, Rectangle, Styled, Triangle},
    Drawable,
};
use embedded_graphics_simulator::{
    BinaryColorTheme, OutputSettingsBuilder, SimulatorDisplay, Window,
};
use embedded_layout::view_group::Views;
use embedded_layout_macros::ViewGroup;

#[derive(ViewGroup)]
enum LayoutViews<C: PixelColor> {
    TriangleView(Styled<Triangle, PrimitiveStyle<C>>),
    CircleView(Styled<Circle, PrimitiveStyle<C>>),
    RectangleView(Styled<Rectangle, PrimitiveStyle<C>>),
    CombinedView(
        Styled<Circle, PrimitiveStyle<C>>,
        Styled<Rectangle, PrimitiveStyle<C>>,
    ),
    CombinedViewStruct {
        circle: Styled<Circle, PrimitiveStyle<C>>,
        square: Styled<Rectangle, PrimitiveStyle<C>>,
    },
    EmptyView,
}

fn main() -> Result<(), core::convert::Infallible> {
    let mut display: SimulatorDisplay<BinaryColor> = SimulatorDisplay::new(Size::new(100, 50));
    let output_settings = OutputSettingsBuilder::new()
        .theme(BinaryColorTheme::OledBlue)
        .build();

    let mut views = Vec::new();

    (0..6).for_each(|col_idx| {
        (0..2).for_each(|row_idx| {
            let view = match (col_idx + (row_idx * 5)) % 5 {
                0 => {
                    let p1 = Point::new(col_idx * 20, row_idx * 30);
                    let p2 = Point::new((col_idx + 1) * 20, row_idx * 30);
                    let p3 = Point::new((col_idx * 20) + 10, 20 + (row_idx * 30));

                    LayoutViews::TriangleView(
                        Triangle::new(p1, p2, p3)
                            .into_styled(PrimitiveStyle::with_stroke(BinaryColor::On, 1)),
                    )
                }
                1 => LayoutViews::CircleView(
                    Circle::new(Point::new(col_idx * 20, row_idx * 30), 20)
                        .into_styled(PrimitiveStyle::with_stroke(BinaryColor::On, 1)),
                ),
                2 => LayoutViews::RectangleView(
                    Rectangle::new(Point::new(col_idx * 20, row_idx * 30), Size::new(20, 20))
                        .into_styled(PrimitiveStyle::with_stroke(BinaryColor::On, 1)),
                ),
                3 => {
                    let circle = Circle::new(Point::new(col_idx * 20, row_idx * 30), 20)
                        .into_styled(PrimitiveStyle::with_stroke(BinaryColor::On, 1));
                    let square =
                        Rectangle::new(Point::new(col_idx * 20, row_idx * 30), Size::new(20, 20))
                            .into_styled(PrimitiveStyle::with_stroke(BinaryColor::On, 1));

                    LayoutViews::CombinedView(circle, square)
                }
                4 => {
                    let circle = Circle::new(Point::new(col_idx * 20, row_idx * 30), 20)
                        .into_styled(PrimitiveStyle::with_stroke(BinaryColor::On, 1));
                    let square =
                        Rectangle::new(Point::new(col_idx * 20, row_idx * 30), Size::new(20, 20))
                            .into_styled(PrimitiveStyle::with_stroke(BinaryColor::On, 1));

                    LayoutViews::CombinedViewStruct { circle, square }
                }
                5 => LayoutViews::EmptyView,
                _ => panic!("Out of bounds number"),
            };

            views.push(view);
        });
    });

    Views::new(views.as_mut_slice()).draw(&mut display).unwrap();

    Window::new("Dynamic Layout Example", &output_settings).show_static(&display);
    Ok(())
}