Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implementing Custom widgets #26

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand Down
72 changes: 72 additions & 0 deletions src/custom_widgets/circle/mod.rs
Original file line number Diff line number Diff line change
@@ -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 }
}

Check warning on line 14 in src/custom_widgets/circle/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/circle/mod.rs#L12-L14

Added lines #L12 - L14 were not covered by tests
}

pub fn circle(radius: f32) -> Circle {
Circle::new(radius)
}

Check warning on line 19 in src/custom_widgets/circle/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/circle/mod.rs#L17-L19

Added lines #L17 - L19 were not covered by tests

impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> for Circle
where
Renderer: renderer::Renderer,
{
fn size(&self) -> Size<Length> {
Size {
width: Length::Shrink,
height: Length::Shrink,
}
}

Check warning on line 30 in src/custom_widgets/circle/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/circle/mod.rs#L25-L30

Added lines #L25 - L30 were not covered by tests

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))
}

Check warning on line 39 in src/custom_widgets/circle/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/circle/mod.rs#L32-L39

Added lines #L32 - L39 were not covered by tests

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,
);
}

Check warning on line 62 in src/custom_widgets/circle/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/circle/mod.rs#L41-L62

Added lines #L41 - L62 were not covered by tests
}

impl<'a, Message, Theme, Renderer> From<Circle> for Element<'a, Message, Theme, Renderer>
where
Renderer: renderer::Renderer,
{
fn from(circle: Circle) -> Self {
Self::new(circle)
}

Check warning on line 71 in src/custom_widgets/circle/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/circle/mod.rs#L69-L71

Added lines #L69 - L71 were not covered by tests
}
69 changes: 69 additions & 0 deletions src/custom_widgets/line/mod.rs
Original file line number Diff line number Diff line change
@@ -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 }
}

Check warning on line 15 in src/custom_widgets/line/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/line/mod.rs#L13-L15

Added lines #L13 - L15 were not covered by tests
}

pub fn line(length: f32) -> Line {
Line::new(length)
}

Check warning on line 20 in src/custom_widgets/line/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/line/mod.rs#L18-L20

Added lines #L18 - L20 were not covered by tests

impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> for Line
where
Renderer: renderer::Renderer,
{
fn size(&self) -> Size<Length> {
Size {
width: Length::Shrink,
height: Length::Fixed(1f32),
}
}

Check warning on line 31 in src/custom_widgets/line/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/line/mod.rs#L26-L31

Added lines #L26 - L31 were not covered by tests

fn layout(
&self,
_tree: &mut widget::Tree,
_renderer: &Renderer,
_limits: &layout::Limits,
) -> layout::Node {
layout::Node::new(Size::new(self.length, 1.0))
}

Check warning on line 40 in src/custom_widgets/line/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/line/mod.rs#L33-L40

Added lines #L33 - L40 were not covered by tests

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,
);
}

Check warning on line 59 in src/custom_widgets/line/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/line/mod.rs#L42-L59

Added lines #L42 - L59 were not covered by tests
}

impl<'a, Message, Theme, Renderer> From<Line> for Element<'a, Message, Theme, Renderer>
where
Renderer: renderer::Renderer,
{
fn from(line: Line) -> Self {
Self::new(line)
}

Check warning on line 68 in src/custom_widgets/line/mod.rs

View check run for this annotation

Codecov / codecov/patch

src/custom_widgets/line/mod.rs#L66-L68

Added lines #L66 - L68 were not covered by tests
}
52 changes: 39 additions & 13 deletions src/piggui.rs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -66,7 +72,7 @@
}

fn scale_factor(&self) -> f64 {
0.75
0.54

Check warning on line 75 in src/piggui.rs

View check run for this annotation

Codecov / codecov/patch

src/piggui.rs#L75

Added line #L75 was not covered by tests
}

fn theme(&self) -> iced::Theme {
Expand All @@ -75,26 +81,46 @@
}

fn pin_view(pin_descriptions: &[PinDescription; 40]) -> Element<'static, Message> {

// TODO: Align Layout

Check warning on line 85 in src/piggui.rs

View check run for this annotation

Codecov / codecov/patch

src/piggui.rs#L84-L85

Added lines #L84 - L85 were not covered by tests
let mut column = Column::new()
.spacing(20)
.align_items(iced::Alignment::Center)
.width(Length::Fill)
.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(

Check warning on line 105 in src/piggui.rs

View check run for this annotation

Codecov / codecov/patch

src/piggui.rs#L93-L105

Added lines #L93 - L105 were not covered by tests
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(

Check warning on line 110 in src/piggui.rs

View check run for this annotation

Codecov / codecov/patch

src/piggui.rs#L108-L110

Added lines #L108 - L110 were not covered by tests
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));

Check warning on line 121 in src/piggui.rs

View check run for this annotation

Codecov / codecov/patch

src/piggui.rs#L113-L121

Added lines #L113 - L121 were not covered by tests
column = column.push(row);
}
container(column).height(2000).width(2000).into()

container(column).into()

Check warning on line 125 in src/piggui.rs

View check run for this annotation

Codecov / codecov/patch

src/piggui.rs#L125

Added line #L125 was not covered by tests
}
Loading