diff options
author | 2024-01-20 13:52:15 +0100 | |
---|---|---|
committer | 2024-01-20 13:52:15 +0100 | |
commit | 545cc909c9f356dd733d273173694db9b8c28594 (patch) | |
tree | c8132edab4386bbccb07a372c3776f22abefbda3 /core | |
parent | b3e3f6e3c9fc6879e6681810f54d7eaa7c0f3d30 (diff) | |
parent | 1c1667c3c99fa9b1009ef416b9b3c7e5a1d53a97 (diff) | |
download | iced-545cc909c9f356dd733d273173694db9b8c28594.tar.gz iced-545cc909c9f356dd733d273173694db9b8c28594.tar.bz2 iced-545cc909c9f356dd733d273173694db9b8c28594.zip |
Merge pull request #1882 from nicksenger/shadows
Quad shadows
Diffstat (limited to 'core')
-rw-r--r-- | core/src/border.rs | 54 | ||||
-rw-r--r-- | core/src/element.rs | 12 | ||||
-rw-r--r-- | core/src/lib.rs | 6 | ||||
-rw-r--r-- | core/src/renderer.rs | 21 | ||||
-rw-r--r-- | core/src/shadow.rs | 14 |
5 files changed, 94 insertions, 13 deletions
diff --git a/core/src/border.rs b/core/src/border.rs new file mode 100644 index 00000000..21823341 --- /dev/null +++ b/core/src/border.rs @@ -0,0 +1,54 @@ +//! Draw lines around containers. +use crate::Color; + +/// A border. +#[derive(Debug, Clone, Copy, PartialEq, Default)] +pub struct Border { + /// The color of the border. + pub color: Color, + + /// The width of the border. + pub width: f32, + + /// The radius of the border. + pub radius: Radius, +} + +impl Border { + /// Creates a new default [`Border`] with the given [`Radius`]. + pub fn with_radius(radius: impl Into<Radius>) -> Self { + Self { + radius: radius.into(), + ..Self::default() + } + } +} + +/// The border radii for the corners of a graphics primitive in the order: +/// top-left, top-right, bottom-right, bottom-left. +#[derive(Debug, Clone, Copy, PartialEq, Default)] +pub struct Radius([f32; 4]); + +impl From<f32> for Radius { + fn from(w: f32) -> Self { + Self([w; 4]) + } +} + +impl From<u8> for Radius { + fn from(w: u8) -> Self { + Self([f32::from(w); 4]) + } +} + +impl From<[f32; 4]> for Radius { + fn from(radi: [f32; 4]) -> Self { + Self(radi) + } +} + +impl From<Radius> for [f32; 4] { + fn from(radi: Radius) -> Self { + radi.0 + } +} diff --git a/core/src/element.rs b/core/src/element.rs index 8b510218..4d4bfa36 100644 --- a/core/src/element.rs +++ b/core/src/element.rs @@ -6,7 +6,8 @@ use crate::renderer; use crate::widget; use crate::widget::tree::{self, Tree}; use crate::{ - Clipboard, Color, Layout, Length, Rectangle, Shell, Size, Vector, Widget, + Border, Clipboard, Color, Layout, Length, Rectangle, Shell, Size, Vector, + Widget, }; use std::any::Any; @@ -537,9 +538,12 @@ where renderer.fill_quad( renderer::Quad { bounds: layout.bounds(), - border_color: color, - border_width: 1.0, - border_radius: 0.0.into(), + border: Border { + color, + width: 1.0, + ..Border::default() + }, + ..renderer::Quad::default() }, Color::TRANSPARENT, ); diff --git a/core/src/lib.rs b/core/src/lib.rs index 864df6e6..bbc973f0 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -17,6 +17,7 @@ rustdoc::broken_intra_doc_links )] pub mod alignment; +pub mod border; pub mod clipboard; pub mod event; pub mod font; @@ -36,7 +37,6 @@ pub mod window; mod angle; mod background; -mod border_radius; mod color; mod content_fit; mod element; @@ -46,6 +46,7 @@ mod padding; mod pixels; mod point; mod rectangle; +mod shadow; mod shell; mod size; mod vector; @@ -53,7 +54,7 @@ mod vector; pub use alignment::Alignment; pub use angle::{Degrees, Radians}; pub use background::Background; -pub use border_radius::BorderRadius; +pub use border::Border; pub use clipboard::Clipboard; pub use color::Color; pub use content_fit::ContentFit; @@ -70,6 +71,7 @@ pub use pixels::Pixels; pub use point::Point; pub use rectangle::Rectangle; pub use renderer::Renderer; +pub use shadow::Shadow; pub use shell::Shell; pub use size::Size; pub use text::Text; diff --git a/core/src/renderer.rs b/core/src/renderer.rs index 1b327e56..a2a66aa8 100644 --- a/core/src/renderer.rs +++ b/core/src/renderer.rs @@ -5,7 +5,7 @@ mod null; #[cfg(debug_assertions)] pub use null::Null; -use crate::{Background, BorderRadius, Color, Rectangle, Vector}; +use crate::{Background, Border, Color, Rectangle, Shadow, Size, Vector}; /// A component that can be used by widgets to draw themselves on a screen. pub trait Renderer: Sized { @@ -37,14 +37,21 @@ pub struct Quad { /// The bounds of the [`Quad`]. pub bounds: Rectangle, - /// The border radius of the [`Quad`]. - pub border_radius: BorderRadius, + /// The [`Border`] of the [`Quad`]. + pub border: Border, - /// The border width of the [`Quad`]. - pub border_width: f32, + /// The [`Shadow`] of the [`Quad`]. + pub shadow: Shadow, +} - /// The border color of the [`Quad`]. - pub border_color: Color, +impl Default for Quad { + fn default() -> Self { + Self { + bounds: Rectangle::with_size(Size::ZERO), + border: Border::default(), + shadow: Shadow::default(), + } + } } /// The styling attributes of a [`Renderer`]. diff --git a/core/src/shadow.rs b/core/src/shadow.rs new file mode 100644 index 00000000..803101ed --- /dev/null +++ b/core/src/shadow.rs @@ -0,0 +1,14 @@ +use crate::{Color, Vector}; + +/// A shadow. +#[derive(Debug, Clone, Copy, PartialEq, Default)] +pub struct Shadow { + /// The color of the shadow. + pub color: Color, + + /// The offset of the shadow. + pub offset: Vector, + + /// The blur radius of the shadow. + pub blur_radius: f32, +} |