Crate embedded_layout

source ·
Expand description

Enable simple layout operations in embedded-graphics

This crate extends embedded-graphics with tools that ease positioning of drawable objects.

embedded-layout consists of three main parts:

  • alignments that can be used to position two objects relative to one another
    • horizontal
      • NoAlignment, Left, Right, Center
      • LeftToRight, RightToLeft
    • vertical
      • NoAlignment, Top, Bottom, Center
      • TopToBottom, BottomToTop
  • layouts that can be used to arrange multiple views
    • LinearLayout
  • view groups which are collections of view objects
    • Chain to create ad-hoc collections (can hold views of different types)
    • Views to create view groups from arrays and slices (can only hold views of a single type)
    • derive(ViewGroup) to turn any plain old Rust struct into a view group

Views

The term “view” refers to anything embedded-layout can work with. Basically, a view is an object that can be displayed. View is the most basic trait in embedded-layout. Views implement the View trait to enable translation and alignment operations on them, and also to allow them to be used with layouts.

View is implemented for embedded-graphics display objects. There’s also an example about how you can implement custom View objects.

Examples

The examples are based on the embedded-graphics simulator. The simulator is built on top of SDL2. See the simulator README for more information.

Draw some text to the center of the display

use embedded_graphics::{
    mono_font::{ascii::FONT_6X9, MonoTextStyle},
    pixelcolor::BinaryColor,
    prelude::*,
    text::Text,
};
use embedded_layout::prelude::*;

// Create a Rectangle from the display's dimensions
let display_area = display.bounding_box();

let text_style = MonoTextStyle::new(&FONT_6X9, BinaryColor::On);

Text::new("Hello!", Point::zero(), text_style)
    // align text to the center of the display
    .align_to(&display_area, horizontal::Center, vertical::Center)
    .draw(&mut display)
    .unwrap();

Use LinearLayout to arrange multiple objects

use embedded_graphics::{
    mono_font::{ascii::FONT_6X9, MonoTextStyle},
    pixelcolor::BinaryColor,
    prelude::*,
    text::Text,
};
use embedded_layout::{layout::linear::LinearLayout, prelude::*};

let display_area = display.bounding_box();

let text_style = MonoTextStyle::new(&FONT_6X9, BinaryColor::On);

LinearLayout::vertical(
    Chain::new(Text::new("Vertical", Point::zero(), text_style))
        .append(Text::new("Linear", Point::zero(), text_style))
        .append(Text::new("Layout", Point::zero(), text_style))
)
.with_alignment(horizontal::Center)
.arrange()
.align_to(&display_area, horizontal::Center, vertical::Center)
.draw(&mut display)
.unwrap();

Modules

  • Alignment operations
  • Layouts - arrange multiple views
  • Create static chains of objects with different types.
  • The essentials. Also contains most of embedded-graphics' prelude.
  • Utility collection module
  • ViewGroup definition and implementation for common types.

Macros

  • Creates an object chain from the argument types.

Traits

  • A View is the base unit for most of the embedded-layout operations.

Derive Macros