iced_aw/widget/
quad.rs

1//! A dummy widget that draws a quad
2//!
3//! *This API requires the following crate features to be activated: `quad`*
4
5use crate::widget::InnerBounds;
6use iced_core::{
7    Background, Border, Color, Element, Layout, Length, Rectangle, Shadow, Size, Widget,
8    layout::{Limits, Node},
9    mouse::Cursor,
10    renderer,
11    widget::Tree,
12};
13
14/// A dummy widget that draws a quad
15#[allow(missing_debug_implementations)]
16pub struct Quad {
17    /// Width of the quad
18    pub width: Length,
19    /// Height of the quad
20    pub height: Length,
21
22    /// Methods for creating inner bounds
23    pub inner_bounds: InnerBounds,
24
25    /// Color of the quad
26    pub quad_color: Background,
27    /// Border of the quad
28    pub quad_border: Border,
29    /// Shadow of the quad
30    pub quad_shadow: Shadow,
31
32    /// Background color of the quad
33    pub bg_color: Option<Background>,
34    /// Border of the background
35    pub bg_border: Border,
36    /// Shadow of the background
37    pub bg_shadow: Shadow,
38}
39impl Default for Quad {
40    fn default() -> Self {
41        Self {
42            width: Length::Fill,
43            height: Length::Fill,
44            inner_bounds: InnerBounds::Ratio(0.5, 0.5),
45
46            quad_color: Color::from([0.5; 3]).into(),
47            quad_border: Border {
48                color: Color::TRANSPARENT,
49                width: 0.0,
50                radius: 0.0.into(),
51            },
52            quad_shadow: Shadow::default(),
53
54            bg_color: None,
55            bg_border: Border {
56                color: Color::TRANSPARENT,
57                width: 0.0,
58                radius: 0.0.into(),
59            },
60            bg_shadow: Shadow::default(),
61        }
62    }
63}
64
65impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> for Quad
66where
67    Renderer: renderer::Renderer,
68{
69    fn size(&self) -> Size<Length> {
70        Size::new(self.width, self.height)
71    }
72
73    fn layout(&mut self, _tree: &mut Tree, _renderer: &Renderer, limits: &Limits) -> Node {
74        let limits = limits.width(self.width).height(self.height);
75        Node::new(limits.max())
76    }
77
78    fn draw(
79        &self,
80        _state: &Tree,
81        renderer: &mut Renderer,
82        _theme: &Theme,
83        _style: &renderer::Style,
84        layout: Layout<'_>,
85        _cursor: Cursor,
86        viewport: &Rectangle,
87    ) {
88        let bounds = layout.bounds();
89        if bounds.intersects(viewport) {
90            if let Some(b) = self.bg_color {
91                renderer.fill_quad(
92                    renderer::Quad {
93                        bounds,
94                        border: self.bg_border,
95                        shadow: self.bg_shadow,
96                        ..Default::default()
97                    },
98                    b,
99                );
100            }
101            renderer.fill_quad(
102                renderer::Quad {
103                    bounds: self.inner_bounds.get_bounds(bounds),
104                    border: self.quad_border,
105                    shadow: self.quad_shadow,
106                    ..Default::default()
107                },
108                self.quad_color,
109            );
110        }
111    }
112}
113
114impl<'a, Message, Theme, Renderer> From<Quad> for Element<'a, Message, Theme, Renderer>
115where
116    Renderer: 'a + renderer::Renderer,
117    Theme: 'a,
118{
119    fn from(value: Quad) -> Self {
120        Self::new(value)
121    }
122}