summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml1
-rw-r--r--examples/pure/stateless_component/Cargo.toml12
-rw-r--r--examples/pure/stateless_component/src/main.rs101
3 files changed, 114 insertions, 0 deletions
diff --git a/Cargo.toml b/Cargo.toml
index c6ccc5df..b11be495 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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)
+ }
+ }
+}