diff options
Diffstat (limited to 'examples/pure/stateless_component/src')
| -rw-r--r-- | examples/pure/stateless_component/src/main.rs | 101 | 
1 files changed, 101 insertions, 0 deletions
| diff --git a/examples/pure/stateless_component/src/main.rs b/examples/pure/stateless_component/src/main.rs new file mode 100644 index 00000000..066887c9 --- /dev/null +++ b/examples/pure/stateless_component/src/main.rs @@ -0,0 +1,101 @@ +use iced::pure::{button, text}; +use iced::pure::{Element, Sandbox}; +use iced::Settings; + +use custom_text::custom_text; + +pub fn main() -> iced::Result { +    Mode::run(Settings::default()) +} + +enum Mode { +    Standard, +    Custom, +} + +#[derive(Debug, Clone, Copy)] +enum Message { +    SwitchToComponent, +} + +impl Sandbox for Mode { +    type Message = Message; + +    fn new() -> Self { +        Self::Standard +    } + +    fn title(&self) -> String { +        String::from("Stateless Component Bug") +    } + +    fn update(&mut self, message: Message) { +        match message { +            Message::SwitchToComponent => *self = Mode::Custom, +        } +    } + +    fn view(&self) -> Element<Message> { +        match self { +            Self::Standard => button(text("Click to Panic")) +                .on_press(Message::SwitchToComponent) +                .into(), +            Self::Custom => button(custom_text("..")).into(), +        } +    } +} + +mod custom_text { +    use iced::pure::text; +    use iced_lazy::pure::{self, Component}; +    use iced_native::text; +    use iced_pure::Element; + +    pub struct CustomText<'a> { +        text: &'a str, +    } + +    pub fn custom_text<'a>(text: &'a str) -> CustomText<'a> { +        CustomText { text } +    } + +    #[derive(Debug, Clone)] +    pub enum Event {} + +    impl<'a> CustomText<'a> { +        pub fn new(text: &'a str) -> Self { +            Self { text } +        } +    } + +    impl<'a, Message, Renderer> Component<Message, Renderer> for CustomText<'a> +    where +        Renderer: text::Renderer + 'static, +    { +        type State = (); +        type Event = Event; + +        fn update( +            &mut self, +            _state: &mut Self::State, +            _event: Event, +        ) -> Option<Message> { +            None +        } + +        fn view(&self, _state: &Self::State) -> Element<Event, Renderer> { +            text(self.text).into() +        } +    } + +    impl<'a, Message, Renderer> From<CustomText<'a>> +        for Element<'a, Message, Renderer> +    where +        Message: 'a, +        Renderer: 'static + text::Renderer, +    { +        fn from(x: CustomText<'a>) -> Self { +            pure::component(x) +        } +    } +} | 
