diff options
author | 2019-11-10 06:05:20 +0100 | |
---|---|---|
committer | 2019-11-11 03:08:00 +0100 | |
commit | 0240c3981b716c82ecb3364945815335b420a63e (patch) | |
tree | 441eebaa9441649a4e878bde71cdec20d4a67391 /native/src/layout/limits.rs | |
parent | 2303111e09d806ef2a652bddc2b73be6dccf6ae2 (diff) | |
download | iced-0240c3981b716c82ecb3364945815335b420a63e.tar.gz iced-0240c3981b716c82ecb3364945815335b420a63e.tar.bz2 iced-0240c3981b716c82ecb3364945815335b420a63e.zip |
Draft custom layout engine based on `druid`
Diffstat (limited to 'native/src/layout/limits.rs')
-rw-r--r-- | native/src/layout/limits.rs | 131 |
1 files changed, 128 insertions, 3 deletions
diff --git a/native/src/layout/limits.rs b/native/src/layout/limits.rs index ad105119..e5cee5df 100644 --- a/native/src/layout/limits.rs +++ b/native/src/layout/limits.rs @@ -1,6 +1,131 @@ -#[derive(Debug)] -pub struct Limits {} +use crate::{Length, Size}; + +#[derive(Debug, Clone, Copy)] +pub struct Limits { + min: Size, + max: Size, + fill: Size, +} impl Limits { - pub const NONE: Limits = Limits {}; + pub const NONE: Limits = Limits { + min: Size::ZERO, + max: Size::INFINITY, + fill: Size::INFINITY, + }; + + pub fn new(min: Size, max: Size) -> Limits { + Limits { + min, + max, + fill: Size::INFINITY, + } + } + + pub fn width(mut self, width: Length) -> Limits { + match width { + Length::Shrink => { + self.fill.width = self.min.width; + } + Length::Fill => { + self.fill.width = self.fill.width.min(self.max.width); + } + Length::Units(units) => { + let new_width = + (units as f32).min(self.max.width).max(self.min.width); + + self.min.width = new_width; + self.max.width = new_width; + self.fill.width = new_width; + } + } + + self + } + + pub fn height(mut self, height: Length) -> Limits { + match height { + Length::Shrink => { + self.fill.height = self.min.height; + } + Length::Fill => { + self.fill.height = self.fill.height.min(self.max.height); + } + Length::Units(units) => { + let new_height = + (units as f32).min(self.max.height).max(self.min.height); + + self.min.height = new_height; + self.max.height = new_height; + self.fill.height = new_height; + } + } + + self + } + + pub fn min_width(mut self, min_width: u32) -> Limits { + self.min.width = + self.min.width.max(min_width as f32).min(self.max.width); + + self + } + + pub fn max_width(mut self, max_width: u32) -> Limits { + self.max.width = + self.max.width.min(max_width as f32).max(self.min.width); + + self + } + + pub fn max_height(mut self, max_height: u32) -> Limits { + self.max.height = + self.max.height.min(max_height as f32).max(self.min.height); + + self + } + + pub fn resolve(&self, intrinsic_size: Size) -> Size { + Size::new( + intrinsic_size + .width + .min(self.max.width) + .max(self.fill.width), + intrinsic_size + .height + .min(self.max.height) + .max(self.fill.height), + ) + } + + pub fn min(&self) -> Size { + self.min + } + + pub fn max(&self) -> Size { + self.max + } + + pub fn pad(&self, padding: f32) -> Limits { + self.shrink(Size::new(padding * 2.0, padding * 2.0)) + } + + pub fn shrink(&self, size: Size) -> Limits { + let min = Size::new( + (self.min().width - size.width).max(0.0), + (self.min().height - size.height).max(0.0), + ); + + let max = Size::new( + (self.max().width - size.width).max(0.0), + (self.max().height - size.height).max(0.0), + ); + + let fill = Size::new( + (self.fill.width - size.width).max(0.0), + (self.fill.height - size.height).max(0.0), + ); + + Limits { min, max, fill } + } } |