summaryrefslogblamecommitdiffstats
path: root/native/src/style.rs
blob: b1c49fd49137fe17955ec7cd1ade59e73737aa38 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                                    
                   






                                          





                           
            










                                                              



                                                   
                                                  






                                                     
                                                    






                                                           
                                                          






                                                           
                                                          






                                                             
                                                            






                                                             
                                                            



                                                               
                                                     



                                                                       
                                                               














                                                                              
                                                  




















                                                           
                                                       






                                                                       





                                                        


     





                                                      


     







                                                                     

     
use crate::{Align, Justify, Length};

use stretch::style;

/// The appearance of a [`Node`].
///
/// [`Node`]: struct.Node.html
#[derive(Debug, Clone, Copy)]
pub struct Style(pub(crate) style::Style);

impl Default for Style {
    fn default() -> Style {
        Style::new()
    }
}

impl Style {
    /// Creates a new [`Style`].
    ///
    /// [`Style`]: struct.Style.html
    pub fn new() -> Self {
        Style(style::Style {
            align_items: style::AlignItems::FlexStart,
            justify_content: style::JustifyContent::FlexStart,
            ..style::Style::default()
        })
    }

    /// Defines the width of a [`Node`].
    ///
    /// [`Node`]: struct.Node.html
    pub fn width(mut self, width: Length) -> Self {
        self.0.size.width = into_dimension(width);
        self
    }

    /// Defines the height of a [`Node`].
    ///
    /// [`Node`]: struct.Node.html
    pub fn height(mut self, height: Length) -> Self {
        self.0.size.height = into_dimension(height);
        self
    }

    /// Defines the minimum width of a [`Node`].
    ///
    /// [`Node`]: struct.Node.html
    pub fn min_width(mut self, min_width: Length) -> Self {
        self.0.min_size.width = into_dimension(min_width);
        self
    }

    /// Defines the maximum width of a [`Node`].
    ///
    /// [`Node`]: struct.Node.html
    pub fn max_width(mut self, max_width: Length) -> Self {
        self.0.max_size.width = into_dimension(max_width);
        self
    }

    /// Defines the minimum height of a [`Node`].
    ///
    /// [`Node`]: struct.Node.html
    pub fn min_height(mut self, min_height: Length) -> Self {
        self.0.min_size.height = into_dimension(min_height);
        self
    }

    /// Defines the maximum height of a [`Node`].
    ///
    /// [`Node`]: struct.Node.html
    pub fn max_height(mut self, max_height: Length) -> Self {
        self.0.max_size.height = into_dimension(max_height);
        self
    }

    pub(crate) fn align_items(mut self, align: Align) -> Self {
        self.0.align_items = into_align_items(align);
        self
    }

    pub(crate) fn justify_content(mut self, justify: Justify) -> Self {
        self.0.justify_content = into_justify_content(justify);
        self
    }

    /// Sets the alignment of a [`Node`].
    ///
    /// If the [`Node`] is inside a...
    ///
    ///   * [`Column`], this setting will affect its __horizontal__ alignment.
    ///   * [`Row`], this setting will affect its __vertical__ alignment.
    ///
    /// [`Node`]: struct.Node.html
    /// [`Column`]: widget/struct.Column.html
    /// [`Row`]: widget/struct.Row.html
    pub fn align_self(mut self, align: Option<Align>) -> Self {
        self.0.align_self = match align {
            Some(align) => into_align_self(align),
            None => stretch::style::AlignSelf::Auto,
        };

        self
    }

    /// Sets the padding of a [`Node`].
    ///
    /// [`Node`]: struct.Node.html
    pub fn padding(mut self, units: u16) -> Self {
        self.0.padding = stretch::geometry::Rect {
            start: style::Dimension::Points(units as f32),
            end: style::Dimension::Points(units as f32),
            top: style::Dimension::Points(units as f32),
            bottom: style::Dimension::Points(units as f32),
        };

        self
    }
}

fn into_dimension(length: Length) -> style::Dimension {
    match length {
        Length::Shrink => style::Dimension::Undefined,
        Length::Fill => style::Dimension::Percent(1.0),
        Length::Units(units) => style::Dimension::Points(units as f32),
    }
}

fn into_align_items(align: Align) -> style::AlignItems {
    match align {
        Align::Start => style::AlignItems::FlexStart,
        Align::Center => style::AlignItems::Center,
        Align::End => style::AlignItems::FlexEnd,
        Align::Stretch => style::AlignItems::Stretch,
    }
}

fn into_align_self(align: Align) -> style::AlignSelf {
    match align {
        Align::Start => style::AlignSelf::FlexStart,
        Align::Center => style::AlignSelf::Center,
        Align::End => style::AlignSelf::FlexEnd,
        Align::Stretch => style::AlignSelf::Stretch,
    }
}

fn into_justify_content(justify: Justify) -> style::JustifyContent {
    match justify {
        Justify::Start => style::JustifyContent::FlexStart,
        Justify::Center => style::JustifyContent::Center,
        Justify::End => style::JustifyContent::FlexEnd,
        Justify::SpaceBetween => style::JustifyContent::SpaceBetween,
        Justify::SpaceAround => style::JustifyContent::SpaceAround,
        Justify::SpaceEvenly => style::JustifyContent::SpaceEvenly,
    }
}