1use 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#[allow(missing_debug_implementations)]
16pub struct Quad {
17 pub width: Length,
19 pub height: Length,
21
22 pub inner_bounds: InnerBounds,
24
25 pub quad_color: Background,
27 pub quad_border: Border,
29 pub quad_shadow: Shadow,
31
32 pub bg_color: Option<Background>,
34 pub bg_border: Border,
36 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}