1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
//! Layouts - arrange multiple views
//!
//! A layout is a piece of code that arranges views on the display according to rules of the
//! particular layout algorithm.
//!
//! # Implementing layouts
//!
//! In embedded-layout, layout objects aren't special in any way. There is no `Layout` trait to
//! implement, no required API to provide. Instead, as a developer, you may decide how to make your
//! layout as comfortable as possible.
//!
//! A layout works on a group of [`View`] objects, in the form of a [`ViewGroup`]. The `ViewGroup`
//! provides an interface to access view objects of any type.
//!
//! As an example, a (admittedly not very useful) layout that aligns all views in a `ViewGroup` to
//! the `(0, 0)` point, would look something like this:
//!
//! ```rust
//! # use embedded_layout::prelude::*;
//! use embedded_layout::view_group::ViewGroup;
//!
//! struct MyLayout;
//!
//! impl MyLayout {
//! pub fn arrange(view_group: &mut impl ViewGroup) {
//! for idx in 0..view_group.len() {
//! let view = view_group.at_mut(idx);
//! let by = -view.bounds().top_left;
//! // Because `ViewGroup` returns a `&[mut] dyn View`, we need to call the object-safe
//! // version of `translate`.
//! view.translate_impl(by);
//! }
//! }
//! }
//! ```
//!
//! As you can see, you can choose not to take ownership of the `ViewGroup`. If you do, make sure
//! you also implement `View` and `Drawable` (you probably don't want to implement `ViewGroup`) for
//! your layout object and you provide a way to retrieve the original `ViewGroup` object!
//!
//! For a more (but not really) complex example, you may check the source of [`LinearLayout`].
//!
//! [`View`]: crate::View
//! [`LinearLayout`]: crate::layout::linear::LinearLayout
pub mod linear;