From 99ebfcf0c623db4631c7ac85a60058470e680913 Mon Sep 17 00:00:00 2001 From: Your Name here only Date: Thu, 16 May 2024 20:24:25 +0530 Subject: [PATCH 1/4] adding canvas and advanced in iced features --- Cargo.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index a5bb2b9ed..79e9296e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -681,6 +681,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + [[package]] name = "font-types" version = "0.5.3" @@ -1108,6 +1114,7 @@ dependencies = [ "iced_core 0.12.3", "iced_futures 0.12.0", "log", + "lyon_path", "once_cell", "raw-window-handle", "rustc-hash", @@ -1209,6 +1216,7 @@ dependencies = [ "guillotiere", "iced_graphics", "log", + "lyon", "once_cell", "wgpu", ] @@ -1422,6 +1430,58 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "lyon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7f9cda98b5430809e63ca5197b06c7d191bf7e26dfc467d5a3f0290e2a74f" +dependencies = [ + "lyon_algorithms", + "lyon_tessellation", +] + +[[package]] +name = "lyon_algorithms" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3bca95f9a4955b3e4a821fbbcd5edfbd9be2a9a50bb5758173e5358bfb4c623" +dependencies = [ + "lyon_path", + "num-traits", +] + +[[package]] +name = "lyon_geom" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edecfb8d234a2b0be031ab02ebcdd9f3b9ee418fb35e265f7a540a48d197bff9" +dependencies = [ + "arrayvec", + "euclid", + "num-traits", +] + +[[package]] +name = "lyon_path" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c08a606c7a59638d6c6aa18ac91a06aa9fb5f765a7efb27e6a4da58700740d7" +dependencies = [ + "lyon_geom", + "num-traits", +] + +[[package]] +name = "lyon_tessellation" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4470bd0b1f29eda66068ab1fd47719facda0a136b829bcca69287ed0ac40a134" +dependencies = [ + "float_next_after", + "lyon_path", + "num-traits", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1537,6 +1597,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d3bf2e0cc..afba80eb1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ gui = ["iced", "tokio", "serde"] rppal = { version = "0.17.1", optional = true } # for GUI -iced = { version = "0.12.1", features = ["tokio", "debug"], optional = true } +iced = { version = "0.12.1", features = ["tokio", "debug", "canvas", "advanced"], optional = true } iced_aw = { version = "0.9.3", default-features = false, features = ["tabs", "card", "modal",] , optional = true } iced_native = { version = "0.10.3", optional = true } tokio = { version = "1", features = ["sync"], optional = true } From 9e2765cb774f22087af98d348bffab3bd2b1dea8 Mon Sep 17 00:00:00 2001 From: Your Name here only Date: Thu, 16 May 2024 20:24:50 +0530 Subject: [PATCH 2/4] using custom widgets --- src/piggui.rs | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/src/piggui.rs b/src/piggui.rs index 320e29502..6728b9fce 100644 --- a/src/piggui.rs +++ b/src/piggui.rs @@ -1,11 +1,17 @@ mod gpio; mod hw; +mod custom_widgets { + pub mod circle; + pub mod line; +} // This binary will only be built with the "iced" feature enabled, by use of "required-features" // in Cargo.toml so no need for the feature to be used here for conditional compiling -use iced::widget::{button, container, row, Column, Text}; -use iced::{alignment, window, Element, Length, Sandbox, Settings}; -use crate::gpio::{GPIO_DESCRIPTION, PinDescription}; +use crate::gpio::{PinDescription, GPIO_DESCRIPTION}; +// Using Custom Widgets +use custom_widgets::{circle::circle, line::line}; +use iced::widget::{button, container, Column, Row, Text}; +use iced::{alignment, window, Alignment, Element, Length, Sandbox, Settings}; // Use Hardware via trait //use hw::Hardware; @@ -66,7 +72,7 @@ impl Sandbox for Gpio { } fn scale_factor(&self) -> f64 { - 0.75 + 0.54 } fn theme(&self) -> iced::Theme { @@ -82,19 +88,37 @@ fn pin_view(pin_descriptions: &[PinDescription; 40]) -> Element<'static, Message .height(Length::Fill); for pair in pin_descriptions.chunks(2) { - let row = row!( - Text::new(pair[0].name).size(20), + let mut row = Row::new() + .padding(10) + .spacing(10) + .align_items(Alignment::Center); + + row = row.push(Text::new(pair[0].name).size(20)); + + let mut r1 = Row::new().align_items(Alignment::Center); + r1 = r1.push(circle(5.0)); + r1 = r1.push(line(50.0)); + row = row.push(r1); + + row = row.push( button(Text::new(pair[0].board_pin_number.to_string())) .on_press(Message::Activate) - .width(Length::Fixed( 50f32 )), + .width(Length::Fixed(50f32)), + ); + row = row.push( button(Text::new(pair[1].board_pin_number.to_string())) .on_press(Message::Activate) - .width(Length::Fixed( 50f32 )), - Text::new(pair[1].name).size(20), - ) - .spacing(10) - .align_items(iced::Alignment::Center); + .width(Length::Fixed(50f32)), + ); + let mut r2 = Row::new().align_items(Alignment::Center); + r2 = r2.push(line(50.0)); + r2 = r2.push(circle(5.0)); + row = row.push(r2); + + row = row.push(Text::new(pair[1].name).size(20)); + column = column.push(row); } - container(column).height(2000).width(2000).into() + + container(column).into() } From 1fac89d3b1ba1c3354bea84591b1fc71d8e9e0da Mon Sep 17 00:00:00 2001 From: Your Name here only Date: Thu, 16 May 2024 20:25:05 +0530 Subject: [PATCH 3/4] implementing custom widgets --- src/custom_widgets/circle/mod.rs | 72 ++++++++++++++++++++++++++++++++ src/custom_widgets/line/mod.rs | 69 ++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 src/custom_widgets/circle/mod.rs create mode 100644 src/custom_widgets/line/mod.rs diff --git a/src/custom_widgets/circle/mod.rs b/src/custom_widgets/circle/mod.rs new file mode 100644 index 000000000..5d4d50af8 --- /dev/null +++ b/src/custom_widgets/circle/mod.rs @@ -0,0 +1,72 @@ +use iced::advanced::layout::{self, Layout}; +use iced::advanced::renderer; +use iced::advanced::widget::{self, Widget}; +use iced::mouse; +use iced::{Color, Element, Length, Rectangle, Size}; + +pub struct Circle { + radius: f32, +} + +impl Circle { + pub fn new(radius: f32) -> Self { + Self { radius } + } +} + +pub fn circle(radius: f32) -> Circle { + Circle::new(radius) +} + +impl Widget for Circle +where + Renderer: renderer::Renderer, +{ + fn size(&self) -> Size { + Size { + width: Length::Shrink, + height: Length::Shrink, + } + } + + fn layout( + &self, + _tree: &mut widget::Tree, + _renderer: &Renderer, + _limits: &layout::Limits, + ) -> layout::Node { + layout::Node::new(Size::new(self.radius * 2.0, self.radius * 2.0)) + } + + fn draw( + &self, + _state: &widget::Tree, + renderer: &mut Renderer, + _theme: &Theme, + _style: &renderer::Style, + layout: Layout<'_>, + _cursor: mouse::Cursor, + _viewport: &Rectangle, + ) { + renderer.fill_quad( + renderer::Quad { + bounds: layout.bounds(), + border: iced::border::Border { + radius: self.radius.into(), + ..Default::default() + }, + ..renderer::Quad::default() + }, + Color::WHITE, + ); + } +} + +impl<'a, Message, Theme, Renderer> From for Element<'a, Message, Theme, Renderer> +where + Renderer: renderer::Renderer, +{ + fn from(circle: Circle) -> Self { + Self::new(circle) + } +} diff --git a/src/custom_widgets/line/mod.rs b/src/custom_widgets/line/mod.rs new file mode 100644 index 000000000..f64b7f99e --- /dev/null +++ b/src/custom_widgets/line/mod.rs @@ -0,0 +1,69 @@ +use iced::advanced::layout::{self, Layout}; +use iced::advanced::renderer; +use iced::advanced::widget::{self, Widget}; +use iced::mouse; +use iced::Element; +use iced::{Color, Length, Rectangle, Size}; + +pub struct Line { + length: f32, +} + +impl Line { + pub fn new(length: f32) -> Self { + Self { length } + } +} + +pub fn line(length: f32) -> Line { + Line::new(length) +} + +impl Widget for Line +where + Renderer: renderer::Renderer, +{ + fn size(&self) -> Size { + Size { + width: Length::Shrink, + height: Length::Fixed(1f32), + } + } + + fn layout( + &self, + _tree: &mut widget::Tree, + _renderer: &Renderer, + _limits: &layout::Limits, + ) -> layout::Node { + layout::Node::new(Size::new(self.length, 1.0)) + } + + fn draw( + &self, + _state: &widget::Tree, + renderer: &mut Renderer, + _theme: &Theme, + _style: &renderer::Style, + layout: Layout<'_>, + _cursor: mouse::Cursor, + _viewport: &Rectangle, + ) { + renderer.fill_quad( + renderer::Quad { + bounds: layout.bounds(), + ..renderer::Quad::default() + }, + Color::WHITE, + ); + } +} + +impl<'a, Message, Theme, Renderer> From for Element<'a, Message, Theme, Renderer> +where + Renderer: renderer::Renderer, +{ + fn from(line: Line) -> Self { + Self::new(line) + } +} From debba97f4dd637e712a73ba7e7d65f30f4eead8b Mon Sep 17 00:00:00 2001 From: Your Name here only Date: Thu, 16 May 2024 20:26:11 +0530 Subject: [PATCH 4/4] todo for layout alignment --- src/piggui.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/piggui.rs b/src/piggui.rs index 6728b9fce..d27823f26 100644 --- a/src/piggui.rs +++ b/src/piggui.rs @@ -81,6 +81,8 @@ impl Sandbox for Gpio { } fn pin_view(pin_descriptions: &[PinDescription; 40]) -> Element<'static, Message> { + + // TODO: Align Layout let mut column = Column::new() .spacing(20) .align_items(iced::Alignment::Center)