summaryrefslogblamecommitdiffstats
path: root/core/src/padding.rs
blob: a0915fbc09699282c4992864bf85ab8b9cd69eda (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
                                     
                          
 
                                                    







                                                                           




















                                                                                  
       
                             

                    
                 
                     
                   
                      
                    
                    
                  

 




































                                                      


                                       



                    

      
                                                        
                                               






                            
 



                                                      
              

                              


         



                                                            
              

                                    


         



                                                        
              

                                


         



                                                          
              

                                  


         
                                                         
                                  



                                                           
                                    

                              
 

                                                                               
                                                        

                                                      

                 



                                                                

         

 
                            

                             


















                                    


                             







                      

                                  








                         




                                                           
//! Space stuff around the perimeter.
use crate::{Pixels, Size};

/// An amount of space to pad for each side of a box
///
/// You can leverage the `From` trait to build [`Padding`] conveniently:
///
/// ```
/// # use iced_core::Padding;
/// #
/// let padding = Padding::from(20);              // 20px on all sides
/// let padding = Padding::from([10, 20]);        // top/bottom, left/right
/// ```
///
/// Normally, the `padding` method of a widget will ask for an `Into<Padding>`,
/// so you can easily write:
///
/// ```
/// # use iced_core::Padding;
/// #
/// # struct Widget;
/// #
/// impl Widget {
///     # pub fn new() -> Self { Self }
///     #
///     pub fn padding(mut self, padding: impl Into<Padding>) -> Self {
///         // ...
///         self
///     }
/// }
///
/// let widget = Widget::new().padding(20);              // 20px on all sides
/// let widget = Widget::new().padding([10, 20]);        // top/bottom, left/right
/// ```
#[derive(Debug, Copy, Clone)]
pub struct Padding {
    /// Top padding
    pub top: f32,
    /// Right padding
    pub right: f32,
    /// Bottom padding
    pub bottom: f32,
    /// Left padding
    pub left: f32,
}

/// Create a [`Padding`] that is equal on all sides.
pub fn all(padding: impl Into<Pixels>) -> Padding {
    Padding::new(padding.into().0)
}

/// Create some top [`Padding`].
pub fn top(padding: impl Into<Pixels>) -> Padding {
    Padding {
        top: padding.into().0,
        ..Padding::ZERO
    }
}

/// Create some bottom [`Padding`].
pub fn bottom(padding: impl Into<Pixels>) -> Padding {
    Padding {
        bottom: padding.into().0,
        ..Padding::ZERO
    }
}

/// Create some left [`Padding`].
pub fn left(padding: impl Into<Pixels>) -> Padding {
    Padding {
        left: padding.into().0,
        ..Padding::ZERO
    }
}

/// Create some right [`Padding`].
pub fn right(padding: impl Into<Pixels>) -> Padding {
    Padding {
        right: padding.into().0,
        ..Padding::ZERO
    }
}

impl Padding {
    /// Padding of zero
    pub const ZERO: Padding = Padding {
        top: 0.0,
        right: 0.0,
        bottom: 0.0,
        left: 0.0,
    };

    /// Create a [`Padding`] that is equal on all sides.
    pub const fn new(padding: f32) -> Padding {
        Padding {
            top: padding,
            right: padding,
            bottom: padding,
            left: padding,
        }
    }

    /// Sets the [`top`] of the [`Padding`].
    ///
    /// [`top`]: Self::top
    pub fn top(self, top: impl Into<Pixels>) -> Self {
        Self {
            top: top.into().0,
            ..self
        }
    }

    /// Sets the [`bottom`] of the [`Padding`].
    ///
    /// [`bottom`]: Self::bottom
    pub fn bottom(self, bottom: impl Into<Pixels>) -> Self {
        Self {
            bottom: bottom.into().0,
            ..self
        }
    }

    /// Sets the [`left`] of the [`Padding`].
    ///
    /// [`left`]: Self::left
    pub fn left(self, left: impl Into<Pixels>) -> Self {
        Self {
            left: left.into().0,
            ..self
        }
    }

    /// Sets the [`right`] of the [`Padding`].
    ///
    /// [`right`]: Self::right
    pub fn right(self, right: impl Into<Pixels>) -> Self {
        Self {
            right: right.into().0,
            ..self
        }
    }

    /// Returns the total amount of vertical [`Padding`].
    pub fn vertical(self) -> f32 {
        self.top + self.bottom
    }

    /// Returns the total amount of horizontal [`Padding`].
    pub fn horizontal(self) -> f32 {
        self.left + self.right
    }

    /// Fits the [`Padding`] between the provided `inner` and `outer` [`Size`].
    pub fn fit(self, inner: Size, outer: Size) -> Self {
        let available = (outer - inner).max(Size::ZERO);
        let new_top = self.top.min(available.height);
        let new_left = self.left.min(available.width);

        Padding {
            top: new_top,
            bottom: self.bottom.min(available.height - new_top),
            left: new_left,
            right: self.right.min(available.width - new_left),
        }
    }
}

impl From<u16> for Padding {
    fn from(p: u16) -> Self {
        Padding {
            top: f32::from(p),
            right: f32::from(p),
            bottom: f32::from(p),
            left: f32::from(p),
        }
    }
}

impl From<[u16; 2]> for Padding {
    fn from(p: [u16; 2]) -> Self {
        Padding {
            top: f32::from(p[0]),
            right: f32::from(p[1]),
            bottom: f32::from(p[0]),
            left: f32::from(p[1]),
        }
    }
}

impl From<f32> for Padding {
    fn from(p: f32) -> Self {
        Padding {
            top: p,
            right: p,
            bottom: p,
            left: p,
        }
    }
}

impl From<[f32; 2]> for Padding {
    fn from(p: [f32; 2]) -> Self {
        Padding {
            top: p[0],
            right: p[1],
            bottom: p[0],
            left: p[1],
        }
    }
}

impl From<Padding> for Size {
    fn from(padding: Padding) -> Self {
        Self::new(padding.horizontal(), padding.vertical())
    }
}