summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/custom_quad/Cargo.toml10
-rw-r--r--examples/custom_quad/src/main.rs160
-rw-r--r--examples/custom_widget/src/main.rs2
-rw-r--r--examples/game_of_life/src/main.rs6
-rw-r--r--examples/modal/Cargo.toml10
-rw-r--r--examples/modal/src/main.rs479
-rw-r--r--examples/slider/Cargo.toml9
-rw-r--r--examples/slider/README.md14
-rw-r--r--examples/slider/sliders.gifbin0 -> 87275 bytes
-rw-r--r--examples/slider/src/main.rs63
-rw-r--r--examples/svg/src/main.rs71
11 files changed, 804 insertions, 20 deletions
diff --git a/examples/custom_quad/Cargo.toml b/examples/custom_quad/Cargo.toml
new file mode 100644
index 00000000..39154786
--- /dev/null
+++ b/examples/custom_quad/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "custom_quad"
+version = "0.1.0"
+authors = ["Robert Krahn"]
+edition = "2021"
+publish = false
+
+[dependencies]
+iced = { path = "../.." }
+iced_native = { path = "../../native" }
diff --git a/examples/custom_quad/src/main.rs b/examples/custom_quad/src/main.rs
new file mode 100644
index 00000000..6509887c
--- /dev/null
+++ b/examples/custom_quad/src/main.rs
@@ -0,0 +1,160 @@
+//! This example showcases a drawing a quad.
+mod quad {
+ use iced_native::layout::{self, Layout};
+ use iced_native::renderer;
+ use iced_native::widget::{self, Widget};
+ use iced_native::{Color, Element, Length, Point, Rectangle, Size};
+
+ pub struct CustomQuad {
+ size: f32,
+ radius: [f32; 4],
+ border_width: f32,
+ }
+
+ impl CustomQuad {
+ pub fn new(size: f32, radius: [f32; 4], border_width: f32) -> Self {
+ Self {
+ size,
+ radius,
+ border_width,
+ }
+ }
+ }
+
+ impl<Message, Renderer> Widget<Message, Renderer> for CustomQuad
+ where
+ Renderer: renderer::Renderer,
+ {
+ fn width(&self) -> Length {
+ Length::Shrink
+ }
+
+ fn height(&self) -> Length {
+ Length::Shrink
+ }
+
+ fn layout(
+ &self,
+ _renderer: &Renderer,
+ _limits: &layout::Limits,
+ ) -> layout::Node {
+ layout::Node::new(Size::new(self.size, self.size))
+ }
+
+ fn draw(
+ &self,
+ _state: &widget::Tree,
+ renderer: &mut Renderer,
+ _theme: &Renderer::Theme,
+ _style: &renderer::Style,
+ layout: Layout<'_>,
+ _cursor_position: Point,
+ _viewport: &Rectangle,
+ ) {
+ renderer.fill_quad(
+ renderer::Quad {
+ bounds: layout.bounds(),
+ border_radius: self.radius.into(),
+ border_width: self.border_width,
+ border_color: Color::from_rgb(1.0, 0.0, 0.0),
+ },
+ Color::BLACK,
+ );
+ }
+ }
+
+ impl<'a, Message, Renderer> From<CustomQuad> for Element<'a, Message, Renderer>
+ where
+ Renderer: renderer::Renderer,
+ {
+ fn from(circle: CustomQuad) -> Self {
+ Self::new(circle)
+ }
+ }
+}
+
+use iced::widget::{column, container, slider, text};
+use iced::{Alignment, Element, Length, Sandbox, Settings};
+
+pub fn main() -> iced::Result {
+ Example::run(Settings::default())
+}
+
+struct Example {
+ radius: [f32; 4],
+ border_width: f32,
+}
+
+#[derive(Debug, Clone, Copy)]
+#[allow(clippy::enum_variant_names)]
+enum Message {
+ RadiusTopLeftChanged(f32),
+ RadiusTopRightChanged(f32),
+ RadiusBottomRightChanged(f32),
+ RadiusBottomLeftChanged(f32),
+ BorderWidthChanged(f32),
+}
+
+impl Sandbox for Example {
+ type Message = Message;
+
+ fn new() -> Self {
+ Self {
+ radius: [50.0; 4],
+ border_width: 0.0,
+ }
+ }
+
+ fn title(&self) -> String {
+ String::from("Custom widget - Iced")
+ }
+
+ fn update(&mut self, message: Message) {
+ let [tl, tr, br, bl] = self.radius;
+ match message {
+ Message::RadiusTopLeftChanged(radius) => {
+ self.radius = [radius, tr, br, bl];
+ }
+ Message::RadiusTopRightChanged(radius) => {
+ self.radius = [tl, radius, br, bl];
+ }
+ Message::RadiusBottomRightChanged(radius) => {
+ self.radius = [tl, tr, radius, bl];
+ }
+ Message::RadiusBottomLeftChanged(radius) => {
+ self.radius = [tl, tr, br, radius];
+ }
+ Message::BorderWidthChanged(width) => {
+ self.border_width = width;
+ }
+ }
+ }
+
+ fn view(&self) -> Element<Message> {
+ let [tl, tr, br, bl] = self.radius;
+
+ let content = column![
+ quad::CustomQuad::new(200.0, self.radius, self.border_width),
+ text(format!("Radius: {tl:.2}/{tr:.2}/{br:.2}/{bl:.2}")),
+ slider(1.0..=100.0, tl, Message::RadiusTopLeftChanged).step(0.01),
+ slider(1.0..=100.0, tr, Message::RadiusTopRightChanged).step(0.01),
+ slider(1.0..=100.0, br, Message::RadiusBottomRightChanged)
+ .step(0.01),
+ slider(1.0..=100.0, bl, Message::RadiusBottomLeftChanged)
+ .step(0.01),
+ slider(1.0..=10.0, self.border_width, Message::BorderWidthChanged)
+ .step(0.01),
+ ]
+ .padding(20)
+ .spacing(20)
+ .max_width(500)
+ .align_items(Alignment::Center);
+
+ container(content)
+ .width(Length::Fill)
+ .height(Length::Fill)
+ .center_x()
+ .center_y()
+ .into()
+ }
+}
diff --git a/examples/custom_widget/src/main.rs b/examples/custom_widget/src/main.rs
index c37a1a12..f6bb3b1e 100644
--- a/examples/custom_widget/src/main.rs
+++ b/examples/custom_widget/src/main.rs
@@ -61,7 +61,7 @@ mod circle {
renderer.fill_quad(
renderer::Quad {
bounds: layout.bounds(),
- border_radius: self.radius,
+ border_radius: self.radius.into(),
border_width: 0.0,
border_color: Color::TRANSPARENT,
},
diff --git a/examples/game_of_life/src/main.rs b/examples/game_of_life/src/main.rs
index 2a8b3721..b0f1c96d 100644
--- a/examples/game_of_life/src/main.rs
+++ b/examples/game_of_life/src/main.rs
@@ -492,8 +492,10 @@ mod grid {
let old_scaling = self.scaling;
let scaling = (self.scaling * (1.0 + y / 30.0))
- .max(Self::MIN_SCALING)
- .min(Self::MAX_SCALING);
+ .clamp(
+ Self::MIN_SCALING,
+ Self::MAX_SCALING,
+ );
let translation =
if let Some(cursor_to_center) =
diff --git a/examples/modal/Cargo.toml b/examples/modal/Cargo.toml
new file mode 100644
index 00000000..8770acac
--- /dev/null
+++ b/examples/modal/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "modal"
+version = "0.1.0"
+authors = ["tarkah <admin@tarkah.dev>"]
+edition = "2021"
+publish = false
+
+[dependencies]
+iced = { path = "../..", features = [] }
+iced_native = { path = "../../native" }
diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs
new file mode 100644
index 00000000..5afafd0d
--- /dev/null
+++ b/examples/modal/src/main.rs
@@ -0,0 +1,479 @@
+use iced::widget::{
+ self, button, column, container, horizontal_space, row, text, text_input,
+};
+use iced::{
+ executor, keyboard, subscription, theme, Alignment, Application, Command,
+ Element, Event, Length, Settings, Subscription,
+};
+
+use self::modal::Modal;
+
+pub fn main() -> iced::Result {
+ App::run(Settings::default())
+}
+
+#[derive(Default)]
+struct App {
+ show_modal: bool,
+ email: String,
+ password: String,
+}
+
+#[derive(Debug, Clone)]
+enum Message {
+ ShowModal,
+ HideModal,
+ Email(String),
+ Password(String),
+ Submit,
+ Event(Event),
+}
+
+impl Application for App {
+ type Executor = executor::Default;
+ type Message = Message;
+ type Theme = iced::Theme;
+ type Flags = ();
+
+ fn new(_flags: ()) -> (Self, Command<Message>) {
+ (App::default(), Command::none())
+ }
+
+ fn title(&self) -> String {
+ String::from("Modal - Iced")
+ }
+
+ fn subscription(&self) -> Subscription<Self::Message> {
+ subscription::events().map(Message::Event)
+ }
+
+ fn update(&mut self, message: Message) -> Command<Message> {
+ match message {
+ Message::ShowModal => {
+ self.show_modal = true;
+ widget::focus_next()
+ }
+ Message::HideModal => {
+ self.hide_modal();
+ Command::none()
+ }
+ Message::Email(email) => {
+ self.email = email;
+ Command::none()
+ }
+ Message::Password(password) => {
+ self.password = password;
+ Command::none()
+ }
+ Message::Submit => {
+ if !self.email.is_empty() && !self.password.is_empty() {
+ self.hide_modal();
+ }
+
+ Command::none()
+ }
+ Message::Event(event) => match event {
+ Event::Keyboard(keyboard::Event::KeyPressed {
+ key_code: keyboard::KeyCode::Tab,
+ modifiers,
+ }) => {
+ if modifiers.shift() {
+ widget::focus_previous()
+ } else {
+ widget::focus_next()
+ }
+ }
+ Event::Keyboard(keyboard::Event::KeyPressed {
+ key_code: keyboard::KeyCode::Escape,
+ ..
+ }) => {
+ self.hide_modal();
+ Command::none()
+ }
+ _ => Command::none(),
+ },
+ }
+ }
+
+ fn view(&self) -> Element<Message> {
+ let content = container(
+ column![
+ row![
+ text("Top Left"),
+ horizontal_space(Length::Fill),
+ text("Top Right")
+ ]
+ .align_items(Alignment::Start)
+ .height(Length::Fill),
+ container(
+ button(text("Show Modal")).on_press(Message::ShowModal)
+ )
+ .center_x()
+ .center_y()
+ .width(Length::Fill)
+ .height(Length::Fill),
+ row![
+ text("Bottom Left"),
+ horizontal_space(Length::Fill),
+ text("Bottom Right")
+ ]
+ .align_items(Alignment::End)
+ .height(Length::Fill),
+ ]
+ .height(Length::Fill),
+ )
+ .padding(10)
+ .width(Length::Fill)
+ .height(Length::Fill);
+
+ if self.show_modal {
+ let modal = container(
+ column![
+ text("Sign Up").size(24),
+ column![
+ column![
+ text("Email").size(12),
+ text_input(
+ "abc@123.com",
+ &self.email,
+ Message::Email
+ )
+ .on_submit(Message::Submit)
+ .padding(5),
+ ]
+ .spacing(5),
+ column![
+ text("Password").size(12),
+ text_input("", &self.password, Message::Password)
+ .on_submit(Message::Submit)
+ .password()
+ .padding(5),
+ ]
+ .spacing(5),
+ button(text("Submit")).on_press(Message::HideModal),
+ ]
+ .spacing(10)
+ ]
+ .spacing(20),
+ )
+ .width(Length::Units(300))
+ .padding(10)
+ .style(theme::Container::Box);
+
+ Modal::new(content, modal)
+ .on_blur(Message::HideModal)
+ .into()
+ } else {
+ content.into()
+ }
+ }
+}
+
+impl App {
+ fn hide_modal(&mut self) {
+ self.show_modal = false;
+ self.email.clear();
+ self.password.clear();
+ }
+}
+
+mod modal {
+ use iced_native::alignment::Alignment;
+ use iced_native::widget::{self, Tree};
+ use iced_native::{
+ event, layout, mouse, overlay, renderer, Clipboard, Color, Element,
+ Event, Layout, Length, Point, Rectangle, Shell, Size, Widget,
+ };
+
+ /// A widget that centers a modal element over some base element
+ pub struct Modal<'a, Message, Renderer> {
+ base: Element<'a, Message, Renderer>,
+ modal: Element<'a, Message, Renderer>,
+ on_blur: Option<Message>,
+ }
+
+ impl<'a, Message, Renderer> Modal<'a, Message, Renderer> {
+ /// Returns a new [`Modal`]
+ pub fn new(
+ base: impl Into<Element<'a, Message, Renderer>>,
+ modal: impl Into<Element<'a, Message, Renderer>>,
+ ) -> Self {
+ Self {
+ base: base.into(),
+ modal: modal.into(),
+ on_blur: None,
+ }
+ }
+
+ /// Sets the message that will be produces when the background
+ /// of the [`Modal`] is pressed
+ pub fn on_blur(self, on_blur: Message) -> Self {
+ Self {
+ on_blur: Some(on_blur),
+ ..self
+ }
+ }
+ }
+
+ impl<'a, Message, Renderer> Widget<Message, Renderer>
+ for Modal<'a, Message, Renderer>
+ where
+ Renderer: iced_native::Renderer,
+ Message: Clone,
+ {
+ fn children(&self) -> Vec<Tree> {
+ vec![Tree::new(&self.base), Tree::new(&self.modal)]
+ }
+
+ fn diff(&self, tree: &mut Tree) {
+ tree.diff_children(&[&self.base, &self.modal]);
+ }
+
+ fn width(&self) -> Length {
+ self.base.as_widget().width()
+ }
+
+ fn height(&self) -> Length {
+ self.base.as_widget().height()
+ }
+
+ fn layout(
+ &self,
+ renderer: &Renderer,
+ limits: &layout::Limits,
+ ) -> layout::Node {
+ self.base.as_widget().layout(renderer, limits)
+ }
+
+ fn on_event(
+ &mut self,
+ state: &mut Tree,
+ event: Event,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ renderer: &Renderer,
+ clipboard: &mut dyn Clipboard,
+ shell: &mut Shell<'_, Message>,
+ ) -> event::Status {
+ self.base.as_widget_mut().on_event(
+ &mut state.children[0],
+ event,
+ layout,
+ cursor_position,
+ renderer,
+ clipboard,
+ shell,
+ )
+ }
+
+ fn draw(
+ &self,
+ state: &Tree,
+ renderer: &mut Renderer,
+ theme: &<Renderer as iced_native::Renderer>::Theme,
+ style: &renderer::Style,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ viewport: &Rectangle,
+ ) {
+ self.base.as_widget().draw(
+ &state.children[0],
+ renderer,
+ theme,
+ style,
+ layout,
+ cursor_position,
+ viewport,
+ );
+ }
+
+ fn overlay<'b>(
+ &'b mut self,
+ state: &'b mut Tree,
+ layout: Layout<'_>,
+ _renderer: &Renderer,
+ ) -> Option<overlay::Element<'b, Message, Renderer>> {
+ Some(overlay::Element::new(
+ layout.position(),
+ Box::new(Overlay {
+ content: &mut self.modal,
+ tree: &mut state.children[1],
+ size: layout.bounds().size(),
+ on_blur: self.on_blur.clone(),
+ }),
+ ))
+ }
+
+ fn mouse_interaction(
+ &self,
+ state: &Tree,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ viewport: &Rectangle,
+ renderer: &Renderer,
+ ) -> mouse::Interaction {
+ self.base.as_widget().mouse_interaction(
+ &state.children[0],
+ layout,
+ cursor_position,
+ viewport,
+ renderer,
+ )
+ }
+
+ fn operate(
+ &self,
+ state: &mut Tree,
+ layout: Layout<'_>,
+ renderer: &Renderer,
+ operation: &mut dyn widget::Operation<Message>,
+ ) {
+ self.base.as_widget().operate(
+ &mut state.children[0],
+ layout,
+ renderer,
+ operation,
+ );
+ }
+ }
+
+ struct Overlay<'a, 'b, Message, Renderer> {
+ content: &'b mut Element<'a, Message, Renderer>,
+ tree: &'b mut Tree,
+ size: Size,
+ on_blur: Option<Message>,
+ }
+
+ impl<'a, 'b, Message, Renderer> overlay::Overlay<Message, Renderer>
+ for Overlay<'a, 'b, Message, Renderer>
+ where
+ Renderer: iced_native::Renderer,
+ Message: Clone,
+ {
+ fn layout(
+ &self,
+ renderer: &Renderer,
+ _bounds: Size,
+ position: Point,
+ ) -> layout::Node {
+ let limits = layout::Limits::new(Size::ZERO, self.size)
+ .width(Length::Fill)
+ .height(Length::Fill);
+
+ let mut child = self.content.as_widget().layout(renderer, &limits);
+ child.align(Alignment::Center, Alignment::Center, limits.max());
+
+ let mut node = layout::Node::with_children(self.size, vec![child]);
+ node.move_to(position);
+
+ node
+ }
+
+ fn on_event(
+ &mut self,
+ event: Event,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ renderer: &Renderer,
+ clipboard: &mut dyn Clipboard,
+ shell: &mut Shell<'_, Message>,
+ ) -> event::Status {
+ let content_bounds = layout.children().next().unwrap().bounds();
+
+ if let Some(message) = self.on_blur.as_ref() {
+ if let Event::Mouse(mouse::Event::ButtonPressed(
+ mouse::Button::Left,
+ )) = &event
+ {
+ if !content_bounds.contains(cursor_position) {
+ shell.publish(message.clone());
+ return event::Status::Captured;
+ }
+ }
+ }
+
+ self.content.as_widget_mut().on_event(
+ self.tree,
+ event,
+ layout.children().next().unwrap(),
+ cursor_position,
+ renderer,
+ clipboard,
+ shell,
+ )
+ }
+
+ fn draw(
+ &self,
+ renderer: &mut Renderer,
+ theme: &Renderer::Theme,
+ style: &renderer::Style,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ ) {
+ renderer.fill_quad(
+ renderer::Quad {
+ bounds: layout.bounds(),
+ border_radius: renderer::BorderRadius::from(0.0),
+ border_width: 0.0,
+ border_color: Color::TRANSPARENT,
+ },
+ Color {
+ a: 0.80,
+ ..Color::BLACK
+ },
+ );
+
+ self.content.as_widget().draw(
+ self.tree,
+ renderer,
+ theme,
+ style,
+ layout.children().next().unwrap(),
+ cursor_position,
+ &layout.bounds(),
+ );
+ }
+
+ fn operate(
+ &mut self,
+ layout: Layout<'_>,
+ renderer: &Renderer,
+ operation: &mut dyn widget::Operation<Message>,
+ ) {
+ self.content.as_widget().operate(
+ self.tree,
+ layout.children().next().unwrap(),
+ renderer,
+ operation,
+ );
+ }
+
+ fn mouse_interaction(
+ &self,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ viewport: &Rectangle,
+ renderer: &Renderer,
+ ) -> mouse::Interaction {
+ self.content.as_widget().mouse_interaction(
+ self.tree,
+ layout.children().next().unwrap(),
+ cursor_position,
+ viewport,
+ renderer,
+ )
+ }
+ }
+
+ impl<'a, Message, Renderer> From<Modal<'a, Message, Renderer>>
+ for Element<'a, Message, Renderer>
+ where
+ Renderer: 'a + iced_native::Renderer,
+ Message: 'a + Clone,
+ {
+ fn from(modal: Modal<'a, Message, Renderer>) -> Self {
+ Element::new(modal)
+ }
+ }
+}
diff --git a/examples/slider/Cargo.toml b/examples/slider/Cargo.toml
new file mode 100644
index 00000000..112d7cff
--- /dev/null
+++ b/examples/slider/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "slider"
+version = "0.1.0"
+authors = ["Casper Rogild Storm<casper@rogildstorm.com>"]
+edition = "2021"
+publish = false
+
+[dependencies]
+iced = { path = "../.." }
diff --git a/examples/slider/README.md b/examples/slider/README.md
new file mode 100644
index 00000000..829d8285
--- /dev/null
+++ b/examples/slider/README.md
@@ -0,0 +1,14 @@
+## Slider
+
+A `Slider` is a bar and a handle that selects a single value from a range of values.
+There exists both `Slider` and `VerticalSlider` depending on which orientation you need.
+
+<div align="center">
+ <img src="sliders.gif">
+</div>
+
+You can run it with `cargo run`:
+
+```
+cargo run --package slider
+```
diff --git a/examples/slider/sliders.gif b/examples/slider/sliders.gif
new file mode 100644
index 00000000..f906d05a
--- /dev/null
+++ b/examples/slider/sliders.gif
Binary files differ
diff --git a/examples/slider/src/main.rs b/examples/slider/src/main.rs
new file mode 100644
index 00000000..6286d625
--- /dev/null
+++ b/examples/slider/src/main.rs
@@ -0,0 +1,63 @@
+use iced::widget::{column, container, slider, text, vertical_slider};
+use iced::{Element, Length, Sandbox, Settings};
+
+pub fn main() -> iced::Result {
+ Slider::run(Settings::default())
+}
+
+#[derive(Debug, Clone)]
+pub enum Message {
+ SliderChanged(u8),
+}
+
+pub struct Slider {
+ slider_value: u8,
+}
+
+impl Sandbox for Slider {
+ type Message = Message;
+
+ fn new() -> Slider {
+ Slider { slider_value: 50 }
+ }
+
+ fn title(&self) -> String {
+ String::from("Slider - Iced")
+ }
+
+ fn update(&mut self, message: Message) {
+ match message {
+ Message::SliderChanged(value) => {
+ self.slider_value = value;
+ }
+ }
+ }
+
+ fn view(&self) -> Element<Message> {
+ let value = self.slider_value;
+
+ let h_slider =
+ container(slider(0..=100, value, Message::SliderChanged))
+ .width(Length::Units(250));
+
+ let v_slider =
+ container(vertical_slider(0..=100, value, Message::SliderChanged))
+ .height(Length::Units(200));
+
+ let text = text(format!("{value}"));
+
+ container(
+ column![
+ container(v_slider).width(Length::Fill).center_x(),
+ container(h_slider).width(Length::Fill).center_x(),
+ container(text).width(Length::Fill).center_x(),
+ ]
+ .spacing(25),
+ )
+ .height(Length::Fill)
+ .width(Length::Fill)
+ .center_x()
+ .center_y()
+ .into()
+ }
+}
diff --git a/examples/svg/src/main.rs b/examples/svg/src/main.rs
index 27d175da..4dc92416 100644
--- a/examples/svg/src/main.rs
+++ b/examples/svg/src/main.rs
@@ -1,39 +1,76 @@
-use iced::widget::{container, svg};
-use iced::{Element, Length, Sandbox, Settings};
+use iced::theme;
+use iced::widget::{checkbox, column, container, svg};
+use iced::{color, Element, Length, Sandbox, Settings};
pub fn main() -> iced::Result {
Tiger::run(Settings::default())
}
-struct Tiger;
+#[derive(Debug, Default)]
+struct Tiger {
+ apply_color_filter: bool,
+}
+
+#[derive(Debug, Clone, Copy)]
+pub enum Message {
+ ToggleColorFilter(bool),
+}
impl Sandbox for Tiger {
- type Message = ();
+ type Message = Message;
fn new() -> Self {
- Tiger
+ Tiger::default()
}
fn title(&self) -> String {
String::from("SVG - Iced")
}
- fn update(&mut self, _message: ()) {}
+ fn update(&mut self, message: Self::Message) {
+ match message {
+ Message::ToggleColorFilter(apply_color_filter) => {
+ self.apply_color_filter = apply_color_filter;
+ }
+ }
+ }
- fn view(&self) -> Element<()> {
- let svg = svg(svg::Handle::from_path(format!(
+ fn view(&self) -> Element<Self::Message> {
+ let handle = svg::Handle::from_path(format!(
"{}/resources/tiger.svg",
env!("CARGO_MANIFEST_DIR")
- )))
- .width(Length::Fill)
- .height(Length::Fill);
+ ));
+
+ let svg = svg(handle).width(Length::Fill).height(Length::Fill).style(
+ if self.apply_color_filter {
+ theme::Svg::custom_fn(|_theme| svg::Appearance {
+ color: Some(color!(0x0000ff)),
+ })
+ } else {
+ theme::Svg::Default
+ },
+ );
- container(svg)
+ let apply_color_filter = checkbox(
+ "Apply a color filter",
+ self.apply_color_filter,
+ Message::ToggleColorFilter,
+ );
+
+ container(
+ column![
+ svg,
+ container(apply_color_filter).width(Length::Fill).center_x()
+ ]
+ .spacing(20)
.width(Length::Fill)
- .height(Length::Fill)
- .padding(20)
- .center_x()
- .center_y()
- .into()
+ .height(Length::Fill),
+ )
+ .width(Length::Fill)
+ .height(Length::Fill)
+ .padding(20)
+ .center_x()
+ .center_y()
+ .into()
}
}