Trait panoramix::Element[][src]

pub trait Element<CpEvent = NoEvent, CpState = ()>: Debug {
    type Event;
    type AggregateChildrenState: Clone + Default + Debug + PartialEq;
    type BuildOutput: VirtualDom<CpEvent, CpState, Event = Self::Event, AggregateChildrenState = Self::AggregateChildrenState>;
    fn build(
        self,
        prev_state: Self::AggregateChildrenState
    ) -> (Self::BuildOutput, Self::AggregateChildrenState); }

The trait implemented by all GUI elements.

Every type you use to explicitly create a GUI in Panoramix (Button, TextBox, any user-made component) implements Element. You usually don’t need to worry about this trait unless you want to implement your own custom element.

For helper methods that can be called on all elements, see ElementExt.

Note about template resolution

This trait is parameterized on two template types: CpEvent and CpState, which represent the event and local-state type of the parent component an element is built in. They are supposed to flow “inwards” with type inference, starting from the -> impl Element<MyEvent, MyState> return type of your function.

To give a concrete example:

#[component]
fn StoreItem(ctx: &CompCtx, item_name: String) -> impl Element<BuyItem, u32> {
    let item_count = ctx.use_local_state::<u32>();
    Column!(
        Label::new(format!("Item: {} x{}", item_name, item_count)),
        Button::new("+")
            .on_click(|item_count, _| {
                *item_count += 1;
            }),
        Button::new("Buy")
            .bubble_up::<BuyItem>()
    )
}

In this example, because the return type is declared to be -> impl Element<BuyItem, u32>, all elements that are returned (Label, Button, Column) will be transitively inferred to implement Element<BuyItem, u32>.

The flip side of this is that constructing an element and not returning it (eg doing let x = Button::new("..."); and then not using x) will lead to a compile error, because the compiler can’t infer what CpEvent and CpState should be.

Associated Types

type Event[src]

The type of events this element can raise.

This is the type that ElementExt::on, ElementExt::map_event and ElementExt::bubble_up can take. It’s different from the CpEvent generic parameter, which is the event the parent component emits.

In the StoreItem example, the Event type of buttons is ButtonClick, and their CpEvent parameter is BuyItem.

type AggregateChildrenState: Clone + Default + Debug + PartialEq[src]

type BuildOutput: VirtualDom<CpEvent, CpState, Event = Self::Event, AggregateChildrenState = Self::AggregateChildrenState>[src]

Loading content...

Required methods

fn build(
    self,
    prev_state: Self::AggregateChildrenState
) -> (Self::BuildOutput, Self::AggregateChildrenState)
[src]

Loading content...

Implementations on Foreign Types

impl<CpEvent, CpState, Child: Element<CpEvent, CpState>> Element<CpEvent, CpState> for Option<Child>[src]

type Event = NoEvent

type AggregateChildrenState = Option<Child::AggregateChildrenState>

type BuildOutput = Option<Child::BuildOutput>

impl<CpState, CpEvent, ChildLeft: Element<CpEvent, CpState>, ChildRight: Element<CpEvent, CpState>> Element<CpEvent, CpState> for Either<ChildLeft, ChildRight>[src]

type Event = NoEvent

type AggregateChildrenState = Option<Either<ChildLeft::AggregateChildrenState, ChildRight::AggregateChildrenState>>

type BuildOutput = Either<ChildLeft::BuildOutput, ChildRight::BuildOutput>

Loading content...

Implementors

impl<Comp: Component, ParentCpEvent, ParentCpState> Element<ParentCpEvent, ParentCpState> for ComponentHolder<Comp, ParentCpEvent, ParentCpState>[src]

type Event = Comp::LocalEvent

type AggregateChildrenState = (Comp::LocalState, Option<AnyStateBox>)

type BuildOutput = ComponentOutput<Comp::LocalEvent, Comp::LocalState, VirtualDomBox<Comp::LocalEvent, Comp::LocalState>, ParentCpEvent, ParentCpState>

impl<CpEvent, CpState> Element<CpEvent, CpState> for ElementBox<CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = Option<AnyStateBox>

type BuildOutput = VirtualDomBox<CpEvent, CpState>

impl<CpEvent, CpState> Element<CpEvent, CpState> for Button<CpEvent, CpState>[src]

type Event = ButtonClick

type AggregateChildrenState = ()

type BuildOutput = ButtonData<CpEvent, CpState>

impl<CpEvent, CpState> Element<CpEvent, CpState> for Checkbox<CpEvent, CpState>[src]

type Event = Toggled

type AggregateChildrenState = ()

type BuildOutput = CheckboxData<CpEvent, CpState>

impl<CpEvent, CpState> Element<CpEvent, CpState> for EmptyElement<CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = ()

type BuildOutput = EmptyElementData<CpEvent, CpState>

impl<CpEvent, CpState> Element<CpEvent, CpState> for Label<CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = ()

type BuildOutput = LabelData<CpEvent, CpState>

impl<CpEvent, CpState> Element<CpEvent, CpState> for TextBox<CpEvent, CpState>[src]

type Event = TextChanged

type AggregateChildrenState = ()

type BuildOutput = TextBoxData<CpEvent, CpState>

impl<CpEvent, CpState, Child: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementList<Child, CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = Vec<(String, Child::AggregateChildrenState)>

type BuildOutput = ElementListData<Child::BuildOutput, CpEvent, CpState>

impl<CpEvent, CpState, Child: Element<CpEvent, CpState>> Element<CpEvent, CpState> for Flex<Child, CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = Child::AggregateChildrenState

type BuildOutput = FlexData<Child::BuildOutput, CpEvent, CpState>

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_1<T0, CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = (T0::AggregateChildrenState, (), (), (), (), (), (), (), (), (), (), ())

type BuildOutput = ElementTupleData<T0::BuildOutput, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, CpEvent, CpState>

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_2<T0, T1, CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = (T0::AggregateChildrenState, T1::AggregateChildrenState, (), (), (), (), (), (), (), (), (), ())

type BuildOutput = ElementTupleData<T0::BuildOutput, T1::BuildOutput, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, CpEvent, CpState>

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_3<T0, T1, T2, CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = (T0::AggregateChildrenState, T1::AggregateChildrenState, T2::AggregateChildrenState, (), (), (), (), (), (), (), (), ())

type BuildOutput = ElementTupleData<T0::BuildOutput, T1::BuildOutput, T2::BuildOutput, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, CpEvent, CpState>

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_4<T0, T1, T2, T3, CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = (T0::AggregateChildrenState, T1::AggregateChildrenState, T2::AggregateChildrenState, T3::AggregateChildrenState, (), (), (), (), (), (), (), ())

type BuildOutput = ElementTupleData<T0::BuildOutput, T1::BuildOutput, T2::BuildOutput, T3::BuildOutput, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, CpEvent, CpState>

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>, T4: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_5<T0, T1, T2, T3, T4, CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = (T0::AggregateChildrenState, T1::AggregateChildrenState, T2::AggregateChildrenState, T3::AggregateChildrenState, T4::AggregateChildrenState, (), (), (), (), (), (), ())

type BuildOutput = ElementTupleData<T0::BuildOutput, T1::BuildOutput, T2::BuildOutput, T3::BuildOutput, T4::BuildOutput, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, CpEvent, CpState>

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>, T4: Element<CpEvent, CpState>, T5: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_6<T0, T1, T2, T3, T4, T5, CpEvent, CpState>[src]

type Event = NoEvent

type AggregateChildrenState = (T0::AggregateChildrenState, T1::AggregateChildrenState, T2::AggregateChildrenState, T3::AggregateChildrenState, T4::AggregateChildrenState, T5::AggregateChildrenState, (), (), (), (), (), ())

type BuildOutput = ElementTupleData<T0::BuildOutput, T1::BuildOutput, T2::BuildOutput, T3::BuildOutput, T4::BuildOutput, T5::BuildOutput, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, EmptyElementData<CpEvent, CpState>, CpEvent, CpState>

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>, T4: Element<CpEvent, CpState>, T5: Element<CpEvent, CpState>, T6: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_7<T0, T1, T2, T3, T4, T5, T6, CpEvent, CpState>[src]

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>, T4: Element<CpEvent, CpState>, T5: Element<CpEvent, CpState>, T6: Element<CpEvent, CpState>, T7: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_8<T0, T1, T2, T3, T4, T5, T6, T7, CpEvent, CpState>[src]

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>, T4: Element<CpEvent, CpState>, T5: Element<CpEvent, CpState>, T6: Element<CpEvent, CpState>, T7: Element<CpEvent, CpState>, T8: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_9<T0, T1, T2, T3, T4, T5, T6, T7, T8, CpEvent, CpState>[src]

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>, T4: Element<CpEvent, CpState>, T5: Element<CpEvent, CpState>, T6: Element<CpEvent, CpState>, T7: Element<CpEvent, CpState>, T8: Element<CpEvent, CpState>, T9: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_10<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, CpEvent, CpState>[src]

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>, T4: Element<CpEvent, CpState>, T5: Element<CpEvent, CpState>, T6: Element<CpEvent, CpState>, T7: Element<CpEvent, CpState>, T8: Element<CpEvent, CpState>, T9: Element<CpEvent, CpState>, T10: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_11<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, CpEvent, CpState>[src]

impl<CpEvent, CpState, T0: Element<CpEvent, CpState>, T1: Element<CpEvent, CpState>, T2: Element<CpEvent, CpState>, T3: Element<CpEvent, CpState>, T4: Element<CpEvent, CpState>, T5: Element<CpEvent, CpState>, T6: Element<CpEvent, CpState>, T7: Element<CpEvent, CpState>, T8: Element<CpEvent, CpState>, T9: Element<CpEvent, CpState>, T10: Element<CpEvent, CpState>, T11: Element<CpEvent, CpState>> Element<CpEvent, CpState> for ElementTuple_12<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, CpEvent, CpState>[src]

Loading content...