diff options
author | 2022-11-03 05:15:32 +0100 | |
---|---|---|
committer | 2022-11-03 05:15:32 +0100 | |
commit | d8045e2dc30633553e087ad6f7748235223017d7 (patch) | |
tree | f1e5d3610f00f4d7d8571fbb8517c263b2439b4c /graphics/src/gradient.rs | |
parent | 921c94162e50b09604fafeeb319c4a424d64be0e (diff) | |
download | iced-d8045e2dc30633553e087ad6f7748235223017d7.tar.gz iced-d8045e2dc30633553e087ad6f7748235223017d7.tar.bz2 iced-d8045e2dc30633553e087ad6f7748235223017d7.zip |
Move `Position` and `Location` to `gradient` module
Diffstat (limited to 'graphics/src/gradient.rs')
-rw-r--r-- | graphics/src/gradient.rs | 96 |
1 files changed, 89 insertions, 7 deletions
diff --git a/graphics/src/gradient.rs b/graphics/src/gradient.rs index da0f911d..64f9e4b3 100644 --- a/graphics/src/gradient.rs +++ b/graphics/src/gradient.rs @@ -1,8 +1,9 @@ //! For creating a Gradient. -mod linear; +pub mod linear; -pub use crate::gradient::linear::{Linear, Location, Position}; -use crate::Color; +pub use linear::Linear; + +use crate::{Color, Point, Size}; #[derive(Debug, Clone, PartialEq)] /// A fill which transitions colors progressively along a direction, either linearly, radially (TBD), @@ -13,6 +14,13 @@ pub enum Gradient { Linear(Linear), } +impl Gradient { + /// Creates a new linear [`linear::Builder`]. + pub fn linear(position: impl Into<Position>) -> linear::Builder { + linear::Builder::new(position.into()) + } +} + #[derive(Debug, Clone, Copy, PartialEq)] /// A point along the gradient vector where the specified [`color`] is unmixed. pub struct ColorStop { @@ -22,9 +30,83 @@ pub struct ColorStop { pub color: Color, } -impl Gradient { - /// Creates a new linear [`linear::Builder`]. - pub fn linear(position: impl Into<Position>) -> linear::Builder { - linear::Builder::new(position.into()) +#[derive(Debug)] +/// The position of the gradient within its bounds. +pub enum Position { + /// The gradient will be positioned with respect to two points. + Absolute { + /// The starting point of the gradient. + start: Point, + /// The ending point of the gradient. + end: Point, + }, + /// The gradient will be positioned relative to the provided bounds. + Relative { + /// The top left position of the bounds. + top_left: Point, + /// The width & height of the bounds. + size: Size, + /// The start [Location] of the gradient. + start: Location, + /// The end [Location] of the gradient. + end: Location, + }, +} + +impl From<(Point, Point)> for Position { + fn from((start, end): (Point, Point)) -> Self { + Self::Absolute { start, end } + } +} + +#[derive(Debug)] +/// The location of a relatively-positioned gradient. +pub enum Location { + /// Top left. + TopLeft, + /// Top. + Top, + /// Top right. + TopRight, + /// Right. + Right, + /// Bottom right. + BottomRight, + /// Bottom. + Bottom, + /// Bottom left. + BottomLeft, + /// Left. + Left, +} + +impl Location { + fn to_absolute(&self, top_left: Point, size: Size) -> Point { + match self { + Location::TopLeft => top_left, + Location::Top => { + Point::new(top_left.x + size.width / 2.0, top_left.y) + } + Location::TopRight => { + Point::new(top_left.x + size.width, top_left.y) + } + Location::Right => Point::new( + top_left.x + size.width, + top_left.y + size.height / 2.0, + ), + Location::BottomRight => { + Point::new(top_left.x + size.width, top_left.y + size.height) + } + Location::Bottom => Point::new( + top_left.x + size.width / 2.0, + top_left.y + size.height, + ), + Location::BottomLeft => { + Point::new(top_left.x, top_left.y + size.height) + } + Location::Left => { + Point::new(top_left.x, top_left.y + size.height / 2.0) + } + } } } |