diff options
| author | 2024-07-02 23:59:24 +0300 | |
|---|---|---|
| committer | 2024-09-13 00:58:27 +0200 | |
| commit | 7e89015e60d16dabe66dac8b168e212a7ac4b164 (patch) | |
| tree | 1380cc1a56c20cba6e28dafd260a61be30d79dd9 /graphics/src/geometry | |
| parent | aed59bae5033c68fb7e1e1b07e7935d763d3665a (diff) | |
| download | iced-7e89015e60d16dabe66dac8b168e212a7ac4b164.tar.gz iced-7e89015e60d16dabe66dac8b168e212a7ac4b164.tar.bz2 iced-7e89015e60d16dabe66dac8b168e212a7ac4b164.zip | |
Add `rounded_rectangle` to `geometry::Path`
Diffstat (limited to '')
| -rw-r--r-- | graphics/src/geometry/path.rs | 13 | ||||
| -rw-r--r-- | graphics/src/geometry/path/builder.rs | 68 | 
2 files changed, 79 insertions, 2 deletions
| diff --git a/graphics/src/geometry/path.rs b/graphics/src/geometry/path.rs index 3d8fc6fa..c4f51593 100644 --- a/graphics/src/geometry/path.rs +++ b/graphics/src/geometry/path.rs @@ -9,7 +9,8 @@ pub use builder::Builder;  pub use lyon_path; -use iced_core::{Point, Size}; +use crate::core::border; +use crate::core::{Point, Size};  /// An immutable set of points that may or may not be connected.  /// @@ -47,6 +48,16 @@ impl Path {          Self::new(|p| p.rectangle(top_left, size))      } +    /// Creates a new [`Path`] representing a rounded rectangle given its top-left +    /// corner coordinate, its [`Size`] and [`border::Radius`]. +    pub fn rounded_rectangle( +        top_left: Point, +        size: Size, +        radius: border::Radius, +    ) -> Self { +        Self::new(|p| p.rounded_rectangle(top_left, size, radius)) +    } +      /// Creates a new [`Path`] representing a circle given its center      /// coordinate and its radius.      pub fn circle(center: Point, radius: f32) -> Self { diff --git a/graphics/src/geometry/path/builder.rs b/graphics/src/geometry/path/builder.rs index 1ccd83f2..44410f6d 100644 --- a/graphics/src/geometry/path/builder.rs +++ b/graphics/src/geometry/path/builder.rs @@ -1,6 +1,7 @@  use crate::geometry::path::{arc, Arc, Path}; -use iced_core::{Point, Radians, Size}; +use crate::core::border; +use crate::core::{Point, Radians, Size};  use lyon_path::builder::{self, SvgPathBuilder};  use lyon_path::geom; @@ -160,6 +161,71 @@ impl Builder {          self.close();      } +    /// Adds a rounded rectangle to the [`Path`] given its top-left +    /// corner coordinate its [`Size`] and [`border::Radius`]. +    #[inline] +    pub fn rounded_rectangle( +        &mut self, +        top_left: Point, +        size: Size, +        radius: border::Radius, +    ) { +        let min_size = (size.height / 2.0).min(size.width / 2.0); +        let [top_left_corner, top_right_corner, bottom_right_corner, bottom_left_corner] = +            radius.into(); + +        self.move_to(Point::new( +            top_left.x + min_size.min(top_left_corner), +            top_left.y, +        )); +        self.line_to(Point::new( +            top_left.x + size.width - min_size.min(top_right_corner), +            top_left.y, +        )); +        self.arc_to( +            Point::new(top_left.x + size.width, top_left.y), +            Point::new( +                top_left.x + size.width, +                top_left.y + min_size.min(top_right_corner), +            ), +            min_size.min(top_right_corner), +        ); +        self.line_to(Point::new( +            top_left.x + size.width, +            top_left.y + size.height - min_size.min(bottom_right_corner), +        )); +        self.arc_to( +            Point::new(top_left.x + size.width, top_left.y + size.height), +            Point::new( +                top_left.x + size.width - min_size.min(bottom_right_corner), +                top_left.y + size.height, +            ), +            min_size.min(bottom_right_corner), +        ); +        self.line_to(Point::new( +            top_left.x + min_size.min(bottom_left_corner), +            top_left.y + size.height, +        )); +        self.arc_to( +            Point::new(top_left.x, top_left.y + size.height), +            Point::new( +                top_left.x, +                top_left.y + size.height - min_size.min(bottom_left_corner), +            ), +            min_size.min(bottom_left_corner), +        ); +        self.line_to(Point::new( +            top_left.x, +            top_left.y + min_size.min(top_left_corner), +        )); +        self.arc_to( +            Point::new(top_left.x, top_left.y), +            Point::new(top_left.x + min_size.min(top_left_corner), top_left.y), +            min_size.min(top_left_corner), +        ); +        self.close(); +    } +      /// Adds a circle to the [`Path`] given its center coordinate and its      /// radius.      #[inline] | 
