[][src]Struct coffee::ui::core::Element

pub struct Element<'a, Message, Renderer> { /* fields omitted */ }

A generic Widget.

If you have a widget, you should be able to use widget.into() to turn it into an Element.

Implementations

impl<'a, Message, Renderer> Element<'a, Message, Renderer>[src]

pub fn new(
    widget: impl Widget<Message, Renderer> + 'a
) -> Element<'a, Message, Renderer>
[src]

Create a new Element containing the given Widget.

pub fn map<F, B>(self, f: F) -> Element<'a, B, Renderer> where
    Message: 'static + Copy,
    Renderer: 'a,
    B: 'static,
    F: 'static + Fn(Message) -> B, 
[src]

Applies a transformation to the produced message of the Element.

This method is useful when you want to decouple different parts of your UI.

Example

Let's say that we want to have a main menu and a gameplay overlay in our game. We can decouple the interfaces nicely using modules and nested messages:

mod main_menu {
    use coffee::ui::core::Element;
    use coffee::ui::Renderer;

    pub struct MainMenu {
        // Our main menu state here...
        // Probably a bunch of `button::State` and other stuff.
    }

    #[derive(Debug, Clone, Copy)]
    pub enum Message {
        // The different interactions of the main menu here...
    }

    impl MainMenu {
        // We probably would have our `update` function here too...

        pub fn layout(&mut self) -> Element<Message, Renderer> {
            // We show the main menu here...
            // The returned `Element` produces `main_menu::Message`
        }
    }
}

mod gameplay_overlay {
    // Analogous to the `main_menu` module
}

use coffee::ui::core::Element;
use coffee::ui::Renderer;
use main_menu::MainMenu;
use gameplay_overlay::GameplayOverlay;

// The state of our UI
enum State {
    MainMenu(MainMenu),
    GameplayOverlay(GameplayOverlay),
    // ...
}

// The messages of our UI
// We nest the messages here
#[derive(Debug, Clone, Copy)]
enum Message {
    MainMenu(main_menu::Message),
    GameplayOverlay(gameplay_overlay::Message),
    // ...
}

// We show the UI here, transforming the local messages of each branch
// into the global `Message` type as needed.
pub fn layout(state: &mut State) -> Element<Message, Renderer> {
    match state {
        State::MainMenu(main_menu) => {
            main_menu.layout().map(Message::MainMenu)
        }
        State::GameplayOverlay(gameplay_overlay) => {
            gameplay_overlay.layout().map(Message::GameplayOverlay)
        }
        // ...
    }
}

This way, neither main_menu nor gameplay_overlay know anything about the global Message type. They become reusable, allowing the user of these modules to compose them together freely.

pub fn explain(self, color: Color) -> Element<'a, Message, Renderer> where
    Message: 'static,
    Renderer: 'a + Renderer
[src]

Marks the Element as to-be-explained.

The Renderer will explain the layout of the Element graphically. This can be very useful for debugging your layout!

Trait Implementations

impl<'a, Message, Renderer> Debug for Element<'a, Message, Renderer>[src]

impl<'a, Message, Renderer> From<Button<'a, Message>> for Element<'a, Message, Renderer> where
    Renderer: Renderer,
    Message: 'static + Copy + Debug
[src]

impl<'a, Message, Renderer> From<Checkbox<Message>> for Element<'a, Message, Renderer> where
    Renderer: Renderer + Renderer,
    Message: 'static, 
[src]

impl<'a, Message, Renderer> From<Column<'a, Message, Renderer>> for Element<'a, Message, Renderer> where
    Renderer: 'a,
    Message: 'static, 
[src]

impl<'a, Message, Renderer> From<Image> for Element<'a, Message, Renderer> where
    Renderer: Renderer
[src]

impl<'a, Message, Renderer> From<Panel<'a, Message, Renderer>> for Element<'a, Message, Renderer> where
    Renderer: 'static + Renderer,
    Message: 'static, 
[src]

impl<'a, Message, Renderer> From<ProgressBar> for Element<'a, Message, Renderer> where
    Renderer: Renderer
[src]

impl<'a, Message, Renderer> From<Radio<Message>> for Element<'a, Message, Renderer> where
    Renderer: Renderer + Renderer,
    Message: 'static + Copy + Debug
[src]

impl<'a, Message, Renderer> From<Row<'a, Message, Renderer>> for Element<'a, Message, Renderer> where
    Renderer: 'a,
    Message: 'static, 
[src]

impl<'a, Message, Renderer> From<Slider<'a, Message>> for Element<'a, Message, Renderer> where
    Renderer: Renderer,
    Message: 'static, 
[src]

impl<'a, Message, Renderer> From<Text> for Element<'a, Message, Renderer> where
    Renderer: Renderer
[src]

Auto Trait Implementations

impl<'a, Message, Renderer> !RefUnwindSafe for Element<'a, Message, Renderer>

impl<'a, Message, Renderer> !Send for Element<'a, Message, Renderer>

impl<'a, Message, Renderer> !Sync for Element<'a, Message, Renderer>

impl<'a, Message, Renderer> Unpin for Element<'a, Message, Renderer>

impl<'a, Message, Renderer> !UnwindSafe for Element<'a, Message, Renderer>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T> SetParameter for T

impl<SS, SP> SupersetOf<SS> for SP where
    SS: SubsetOf<SP>, 

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,