diff options
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | examples/pure/stateless_component/Cargo.toml | 12 | ||||
-rw-r--r-- | examples/pure/stateless_component/src/main.rs | 101 |
3 files changed, 114 insertions, 0 deletions
@@ -93,6 +93,7 @@ members = [ "examples/pure/pick_list", "examples/pure/todos", "examples/pure/tour", + "examples/pure/stateless_component", "examples/websocket", ] diff --git a/examples/pure/stateless_component/Cargo.toml b/examples/pure/stateless_component/Cargo.toml new file mode 100644 index 00000000..d89ebf85 --- /dev/null +++ b/examples/pure/stateless_component/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "stateless_component" +version = "0.1.0" +authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"] +edition = "2021" +publish = false + +[dependencies] +iced = { path = "../../..", features = ["debug", "pure"] } +iced_native = { path = "../../../native" } +iced_lazy = { path = "../../../lazy", features = ["pure"] } +iced_pure = { path = "../../../pure" } 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) + } + } +} |