summaryrefslogtreecommitdiffstats
path: root/examples/component/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-07-27 06:49:20 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-07-27 06:49:20 +0200
commitff2519b1d43d481987351a83b6dd7237524c21f0 (patch)
tree5731eeb7eb1247d4a8951de0d5bc5d8102640559 /examples/component/src
parentc44267b85f7aaa2997e3caf1323b837d95818c22 (diff)
downloadiced-ff2519b1d43d481987351a83b6dd7237524c21f0.tar.gz
iced-ff2519b1d43d481987351a83b6dd7237524c21f0.tar.bz2
iced-ff2519b1d43d481987351a83b6dd7237524c21f0.zip
Replace stateful widgets with new `iced_pure` API
Diffstat (limited to 'examples/component/src')
-rw-r--r--examples/component/src/main.rs114
1 files changed, 48 insertions, 66 deletions
diff --git a/examples/component/src/main.rs b/examples/component/src/main.rs
index 6a8f53e2..06b1e53a 100644
--- a/examples/component/src/main.rs
+++ b/examples/component/src/main.rs
@@ -1,5 +1,7 @@
-use iced::{Container, Element, Length, Sandbox, Settings};
-use numeric_input::NumericInput;
+use iced::widget::container;
+use iced::{Element, Length, Sandbox, Settings};
+
+use numeric_input::numeric_input;
pub fn main() -> iced::Result {
Component::run(Settings::default())
@@ -7,7 +9,6 @@ pub fn main() -> iced::Result {
#[derive(Default)]
struct Component {
- numeric_input: numeric_input::State,
value: Option<u32>,
}
@@ -35,39 +36,31 @@ impl Sandbox for Component {
}
}
- fn view(&mut self) -> Element<Message> {
- Container::new(NumericInput::new(
- &mut self.numeric_input,
- self.value,
- Message::NumericInputChanged,
- ))
- .padding(20)
- .height(Length::Fill)
- .center_y()
- .into()
+ fn view(&self) -> Element<Message> {
+ container(numeric_input(self.value, Message::NumericInputChanged))
+ .padding(20)
+ .height(Length::Fill)
+ .center_y()
+ .into()
}
}
mod numeric_input {
- use iced_lazy::component::{self, Component};
- use iced_native::alignment::{self, Alignment};
- use iced_native::text;
- use iced_native::widget::button::{self, Button};
- use iced_native::widget::text_input::{self, TextInput};
- use iced_native::widget::{self, Row, Text};
- use iced_native::{Element, Length};
-
- pub struct NumericInput<'a, Message> {
- state: &'a mut State,
+ use iced::alignment::{self, Alignment};
+ use iced::widget::{self, button, row, text, text_input};
+ use iced::{Element, Length};
+ use iced_lazy::{self, Component};
+
+ pub struct NumericInput<Message> {
value: Option<u32>,
on_change: Box<dyn Fn(Option<u32>) -> Message>,
}
- #[derive(Default)]
- pub struct State {
- input: text_input::State,
- decrement_button: button::State,
- increment_button: button::State,
+ pub fn numeric_input<Message>(
+ value: Option<u32>,
+ on_change: impl Fn(Option<u32>) -> Message + 'static,
+ ) -> NumericInput<Message> {
+ NumericInput::new(value, on_change)
}
#[derive(Debug, Clone)]
@@ -77,31 +70,33 @@ mod numeric_input {
DecrementPressed,
}
- impl<'a, Message> NumericInput<'a, Message> {
+ impl<Message> NumericInput<Message> {
pub fn new(
- state: &'a mut State,
value: Option<u32>,
on_change: impl Fn(Option<u32>) -> Message + 'static,
) -> Self {
Self {
- state,
value,
on_change: Box::new(on_change),
}
}
}
- impl<'a, Message, Renderer> Component<Message, Renderer>
- for NumericInput<'a, Message>
+ impl<Message, Renderer> Component<Message, Renderer> for NumericInput<Message>
where
- Renderer: 'a + text::Renderer,
- Renderer::Theme: button::StyleSheet
- + text_input::StyleSheet
+ Renderer: iced_native::text::Renderer + 'static,
+ Renderer::Theme: widget::button::StyleSheet
+ + widget::text_input::StyleSheet
+ widget::text::StyleSheet,
{
+ type State = ();
type Event = Event;
- fn update(&mut self, event: Event) -> Option<Message> {
+ fn update(
+ &mut self,
+ _state: &mut Self::State,
+ event: Event,
+ ) -> Option<Message> {
match event {
Event::IncrementPressed => Some((self.on_change)(Some(
self.value.unwrap_or_default().saturating_add(1),
@@ -123,11 +118,10 @@ mod numeric_input {
}
}
- fn view(&mut self) -> Element<Event, Renderer> {
- let button = |state, label, on_press| {
- Button::new(
- state,
- Text::new(label)
+ fn view(&self, _state: &Self::State) -> Element<Event, Renderer> {
+ let button = |label, on_press| {
+ button(
+ text(label)
.width(Length::Fill)
.height(Length::Fill)
.horizontal_alignment(alignment::Horizontal::Center)
@@ -137,15 +131,9 @@ mod numeric_input {
.on_press(on_press)
};
- Row::with_children(vec![
- button(
- &mut self.state.decrement_button,
- "-",
- Event::DecrementPressed,
- )
- .into(),
- TextInput::new(
- &mut self.state.input,
+ row![
+ button("-", Event::DecrementPressed),
+ text_input(
"Type a number",
self.value
.as_ref()
@@ -154,32 +142,26 @@ mod numeric_input {
.unwrap_or(""),
Event::InputChanged,
)
- .padding(10)
- .into(),
- button(
- &mut self.state.increment_button,
- "+",
- Event::IncrementPressed,
- )
- .into(),
- ])
+ .padding(10),
+ button("+", Event::IncrementPressed),
+ ]
.align_items(Alignment::Fill)
.spacing(10)
.into()
}
}
- impl<'a, Message, Renderer> From<NumericInput<'a, Message>>
+ impl<'a, Message, Renderer> From<NumericInput<Message>>
for Element<'a, Message, Renderer>
where
Message: 'a,
- Renderer: text::Renderer + 'a,
- Renderer::Theme: button::StyleSheet
- + text_input::StyleSheet
+ Renderer: 'static + iced_native::text::Renderer,
+ Renderer::Theme: widget::button::StyleSheet
+ + widget::text_input::StyleSheet
+ widget::text::StyleSheet,
{
- fn from(numeric_input: NumericInput<'a, Message>) -> Self {
- component::view(numeric_input)
+ fn from(numeric_input: NumericInput<Message>) -> Self {
+ iced_lazy::component(numeric_input)
}
}
}