diff options
| author | 2020-11-23 17:19:21 +0000 | |
|---|---|---|
| committer | 2021-06-01 19:05:39 +0700 | |
| commit | fe0a27c56d9d75fb521e69352259f1d737402a20 (patch) | |
| tree | f7f77430b63983717036a81e734276123d139ca6 /native/src | |
| parent | a9eb591628017caaf7aa9af505d1206f7a143a9a (diff) | |
| download | iced-fe0a27c56d9d75fb521e69352259f1d737402a20.tar.gz iced-fe0a27c56d9d75fb521e69352259f1d737402a20.tar.bz2 iced-fe0a27c56d9d75fb521e69352259f1d737402a20.zip | |
Add support for asymmetrical padding
Diffstat (limited to '')
| -rw-r--r-- | native/src/layout/flex.rs | 12 | ||||
| -rw-r--r-- | native/src/layout/limits.rs | 9 | ||||
| -rw-r--r-- | native/src/lib.rs | 4 | ||||
| -rw-r--r-- | native/src/overlay/menu.rs | 32 | ||||
| -rw-r--r-- | native/src/renderer/null.rs | 4 | ||||
| -rw-r--r-- | native/src/widget/button.rs | 28 | ||||
| -rw-r--r-- | native/src/widget/column.rs | 20 | ||||
| -rw-r--r-- | native/src/widget/container.rs | 29 | ||||
| -rw-r--r-- | native/src/widget/pane_grid/title_bar.rs | 29 | ||||
| -rw-r--r-- | native/src/widget/pick_list.rs | 26 | ||||
| -rw-r--r-- | native/src/widget/row.rs | 20 | ||||
| -rw-r--r-- | native/src/widget/scrollable.rs | 13 | ||||
| -rw-r--r-- | native/src/widget/text_input.rs | 28 | 
13 files changed, 161 insertions, 93 deletions
| diff --git a/native/src/layout/flex.rs b/native/src/layout/flex.rs index 4f6523fb..3d3ff82c 100644 --- a/native/src/layout/flex.rs +++ b/native/src/layout/flex.rs @@ -16,9 +16,10 @@  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  // See the License for the specific language governing permissions and  // limitations under the License. +  use crate::{      layout::{Limits, Node}, -    Align, Element, Point, Size, +    Align, Element, Padding, Point, Size,  };  /// The main axis of a flex layout. @@ -62,7 +63,7 @@ pub fn resolve<Message, Renderer>(      axis: Axis,      renderer: &Renderer,      limits: &Limits, -    padding: f32, +    padding: Padding,      spacing: f32,      align_items: Align,      items: &[Element<'_, Message, Renderer>], @@ -141,14 +142,15 @@ where          }      } -    let mut main = padding; +    let pad = axis.pack(padding.left as f32, padding.top as f32); +    let mut main = pad.0;      for (i, node) in nodes.iter_mut().enumerate() {          if i > 0 {              main += spacing;          } -        let (x, y) = axis.pack(main, padding); +        let (x, y) = axis.pack(main, pad.1);          node.move_to(Point::new(x, y)); @@ -166,7 +168,7 @@ where          main += axis.main(size);      } -    let (width, height) = axis.pack(main - padding, cross); +    let (width, height) = axis.pack(main - pad.0, cross);      let size = limits.resolve(Size::new(width, height));      Node::with_children(size.pad(padding), nodes) diff --git a/native/src/layout/limits.rs b/native/src/layout/limits.rs index a7bb5c9c..0057e3ba 100644 --- a/native/src/layout/limits.rs +++ b/native/src/layout/limits.rs @@ -1,4 +1,4 @@ -use crate::{Length, Size}; +use crate::{Length, Padding, Size};  /// A set of size constraints for layouting.  #[derive(Debug, Clone, Copy)] @@ -117,8 +117,11 @@ impl Limits {      }      /// Shrinks the current [`Limits`] to account for the given padding. -    pub fn pad(&self, padding: f32) -> Limits { -        self.shrink(Size::new(padding * 2.0, padding * 2.0)) +    pub fn pad(&self, padding: Padding) -> Limits { +        self.shrink(Size::new( +            (padding.left + padding.right) as f32, +            (padding.top + padding.bottom) as f32, +        ))      }      /// Shrinks the current [`Limits`] by the given [`Size`]. diff --git a/native/src/lib.rs b/native/src/lib.rs index 20bbb1d0..cd214e36 100644 --- a/native/src/lib.rs +++ b/native/src/lib.rs @@ -61,8 +61,8 @@ mod debug;  mod debug;  pub use iced_core::{ -    Align, Background, Color, Font, HorizontalAlignment, Length, Point, -    Rectangle, Size, Vector, VerticalAlignment, +    Align, Background, Color, Font, HorizontalAlignment, Length, Padding, +    Point, Rectangle, Size, Vector, VerticalAlignment,  };  pub use iced_futures::{executor, futures, Command}; diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index afb17bd3..3c4062fd 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -8,8 +8,8 @@ use crate::scrollable;  use crate::text;  use crate::touch;  use crate::{ -    Clipboard, Container, Element, Hasher, Layout, Length, Point, Rectangle, -    Scrollable, Size, Vector, Widget, +    Clipboard, Container, Element, Hasher, Layout, Length, Padding, Point, +    Rectangle, Scrollable, Size, Vector, Widget,  };  /// A list of selectable options. @@ -20,7 +20,7 @@ pub struct Menu<'a, T, Renderer: self::Renderer> {      hovered_option: &'a mut Option<usize>,      last_selection: &'a mut Option<T>,      width: u16, -    padding: u16, +    padding: Padding,      text_size: Option<u16>,      font: Renderer::Font,      style: <Renderer as self::Renderer>::Style, @@ -45,7 +45,7 @@ where              hovered_option,              last_selection,              width: 0, -            padding: 0, +            padding: Padding::ZERO,              text_size: None,              font: Default::default(),              style: Default::default(), @@ -58,9 +58,14 @@ where          self      } -    /// Sets the padding of the [`Menu`]. -    pub fn padding(mut self, padding: u16) -> Self { -        self.padding = padding; +    /// Sets the [`Padding`] of the [`Menu`]. +    ///```ignore +    /// Menu::new(/*...*/).padding(20);              // 20px on all sides +    /// Menu::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// Menu::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ``` +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.padding = padding.into();          self      } @@ -261,7 +266,7 @@ struct List<'a, T, Renderer: self::Renderer> {      options: &'a [T],      hovered_option: &'a mut Option<usize>,      last_selection: &'a mut Option<T>, -    padding: u16, +    padding: Padding,      text_size: Option<u16>,      font: Renderer::Font,      style: <Renderer as self::Renderer>::Style, @@ -294,7 +299,7 @@ where          let size = {              let intrinsic = Size::new(                  0.0, -                f32::from(text_size + self.padding * 2) +                f32::from(text_size + self.padding.top + self.padding.bottom)                      * self.options.len() as f32,              ); @@ -359,8 +364,11 @@ where                      *self.hovered_option = Some(                          ((cursor_position.y - bounds.y) -                            / f32::from(text_size + self.padding * 2)) -                            as usize, +                            / f32::from( +                                text_size +                                    + self.padding.top +                                    + self.padding.bottom, +                            )) as usize,                      );                      if let Some(index) = *self.hovered_option { @@ -430,7 +438,7 @@ pub trait Renderer:          viewport: &Rectangle,          options: &[T],          hovered_option: Option<usize>, -        padding: u16, +        padding: Padding,          text_size: u16,          font: Self::Font,          style: &<Self as Renderer>::Style, diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs index 9e91d29f..28746585 100644 --- a/native/src/renderer/null.rs +++ b/native/src/renderer/null.rs @@ -1,7 +1,7 @@  use crate::{      button, checkbox, column, container, pane_grid, progress_bar, radio, row,      scrollable, slider, text, text_input, Color, Element, Font, -    HorizontalAlignment, Layout, Point, Rectangle, Renderer, Size, +    HorizontalAlignment, Layout, Padding, Point, Rectangle, Renderer, Size,      VerticalAlignment,  }; @@ -145,7 +145,7 @@ impl text_input::Renderer for Null {  }  impl button::Renderer for Null { -    const DEFAULT_PADDING: u16 = 0; +    const DEFAULT_PADDING: Padding = Padding::ZERO;      type Style = (); diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 99e98fd1..3ad5fa62 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -7,7 +7,8 @@ use crate::mouse;  use crate::overlay;  use crate::touch;  use crate::{ -    Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Widget, +    Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, +    Widget,  };  use std::hash::Hash; @@ -37,7 +38,7 @@ pub struct Button<'a, Message, Renderer: self::Renderer> {      height: Length,      min_width: u32,      min_height: u32, -    padding: u16, +    padding: Padding,      style: Renderer::Style,  } @@ -89,9 +90,14 @@ where          self      } -    /// Sets the padding of the [`Button`]. -    pub fn padding(mut self, padding: u16) -> Self { -        self.padding = padding; +    /// Sets the [`Padding`] of the [`Button`]. +    ///```ignore +    /// Button::new(/*...*/).padding(20);              // 20px on all sides +    /// Button::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// Button::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ```    +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.padding = padding.into();          self      } @@ -140,18 +146,20 @@ where          renderer: &Renderer,          limits: &layout::Limits,      ) -> layout::Node { -        let padding = f32::from(self.padding);          let limits = limits              .min_width(self.min_width)              .min_height(self.min_height)              .width(self.width)              .height(self.height) -            .pad(padding); +            .pad(self.padding);          let mut content = self.content.layout(renderer, &limits); -        content.move_to(Point::new(padding, padding)); +        content.move_to(Point::new( +            self.padding.left.into(), +            self.padding.top.into(), +        )); -        let size = limits.resolve(content.size()).pad(padding); +        let size = limits.resolve(content.size()).pad(self.padding);          layout::Node::with_children(size, vec![content])      } @@ -258,7 +266,7 @@ where  /// [renderer]: crate::renderer  pub trait Renderer: crate::Renderer + Sized {      /// The default padding of a [`Button`]. -    const DEFAULT_PADDING: u16; +    const DEFAULT_PADDING: Padding;      /// The style supported by this renderer.      type Style: Default; diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index d7f0365a..9f25f918 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -5,7 +5,8 @@ use crate::event::{self, Event};  use crate::layout;  use crate::overlay;  use crate::{ -    Align, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Widget, +    Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point, +    Rectangle, Widget,  };  use std::u32; @@ -14,7 +15,7 @@ use std::u32;  #[allow(missing_debug_implementations)]  pub struct Column<'a, Message, Renderer> {      spacing: u16, -    padding: u16, +    padding: Padding,      width: Length,      height: Length,      max_width: u32, @@ -35,7 +36,7 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {      ) -> Self {          Column {              spacing: 0, -            padding: 0, +            padding: Padding::ZERO,              width: Length::Shrink,              height: Length::Shrink,              max_width: u32::MAX, @@ -55,9 +56,14 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {          self      } -    /// Sets the padding of the [`Column`]. -    pub fn padding(mut self, units: u16) -> Self { -        self.padding = units; +    /// Sets the [`Padding`] of the [`Column`]. +    ///```ignore +    /// Column::new(/*...*/).padding(20);              // 20px on all sides +    /// Column::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// Column::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ``` +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.padding = padding.into();          self      } @@ -129,7 +135,7 @@ where              layout::flex::Axis::Vertical,              renderer,              &limits, -            self.padding as f32, +            self.padding,              self.spacing as f32,              self.align_items,              &self.children, diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs index 69fe699b..cf5cb3dc 100644 --- a/native/src/widget/container.rs +++ b/native/src/widget/container.rs @@ -5,7 +5,8 @@ use crate::event::{self, Event};  use crate::layout;  use crate::overlay;  use crate::{ -    Align, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Widget, +    Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point, +    Rectangle, Widget,  };  use std::u32; @@ -15,7 +16,7 @@ use std::u32;  /// It is normally used for alignment purposes.  #[allow(missing_debug_implementations)]  pub struct Container<'a, Message, Renderer: self::Renderer> { -    padding: u16, +    padding: Padding,      width: Length,      height: Length,      max_width: u32, @@ -36,7 +37,7 @@ where          T: Into<Element<'a, Message, Renderer>>,      {          Container { -            padding: 0, +            padding: Padding::ZERO,              width: Length::Shrink,              height: Length::Shrink,              max_width: u32::MAX, @@ -48,9 +49,14 @@ where          }      } -    /// Sets the padding of the [`Container`]. -    pub fn padding(mut self, units: u16) -> Self { -        self.padding = units; +    /// Sets the [`Padding`] of the [`Container`]. +    ///```ignore +    /// Container::new(/*...*/).padding(20);              // 20px on all sides +    /// Container::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// Container::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ``` +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.padding = padding.into();          self      } @@ -127,23 +133,24 @@ where          renderer: &Renderer,          limits: &layout::Limits,      ) -> layout::Node { -        let padding = f32::from(self.padding); -          let limits = limits              .loose()              .max_width(self.max_width)              .max_height(self.max_height)              .width(self.width)              .height(self.height) -            .pad(padding); +            .pad(self.padding);          let mut content = self.content.layout(renderer, &limits.loose());          let size = limits.resolve(content.size()); -        content.move_to(Point::new(padding, padding)); +        content.move_to(Point::new( +            self.padding.left.into(), +            self.padding.top.into(), +        ));          content.align(self.horizontal_alignment, self.vertical_alignment, size); -        layout::Node::with_children(size.pad(padding), vec![content]) +        layout::Node::with_children(size.pad(self.padding), vec![content])      }      fn on_event( diff --git a/native/src/widget/pane_grid/title_bar.rs b/native/src/widget/pane_grid/title_bar.rs index 8e42ce38..8f32992a 100644 --- a/native/src/widget/pane_grid/title_bar.rs +++ b/native/src/widget/pane_grid/title_bar.rs @@ -2,7 +2,9 @@ use crate::container;  use crate::event::{self, Event};  use crate::layout;  use crate::pane_grid; -use crate::{Clipboard, Element, Hasher, Layout, Point, Rectangle, Size}; +use crate::{ +    Clipboard, Element, Hasher, Layout, Padding, Point, Rectangle, Size, +};  /// The title bar of a [`Pane`].  /// @@ -11,7 +13,7 @@ use crate::{Clipboard, Element, Hasher, Layout, Point, Rectangle, Size};  pub struct TitleBar<'a, Message, Renderer: pane_grid::Renderer> {      content: Element<'a, Message, Renderer>,      controls: Option<Element<'a, Message, Renderer>>, -    padding: u16, +    padding: Padding,      always_show_controls: bool,      style: <Renderer as container::Renderer>::Style,  } @@ -28,7 +30,7 @@ where          Self {              content: content.into(),              controls: None, -            padding: 0, +            padding: Padding::ZERO,              always_show_controls: false,              style: Default::default(),          } @@ -43,9 +45,14 @@ where          self      } -    /// Sets the padding of the [`TitleBar`]. -    pub fn padding(mut self, units: u16) -> Self { -        self.padding = units; +    /// Sets the [`Padding`] of the [`TitleBar`]. +    ///```ignore +    /// TitleBar::new(/*...*/).padding(20);              // 20px on all sides +    /// TitleBar::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// TitleBar::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ``` +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.padding = padding.into();          self      } @@ -161,8 +168,7 @@ where          renderer: &Renderer,          limits: &layout::Limits,      ) -> layout::Node { -        let padding = f32::from(self.padding); -        let limits = limits.pad(padding); +        let limits = limits.pad(self.padding);          let max_size = limits.max();          let title_layout = self @@ -192,9 +198,12 @@ where              )          }; -        node.move_to(Point::new(padding, padding)); +        node.move_to(Point::new( +            self.padding.left.into(), +            self.padding.top.into(), +        )); -        layout::Node::with_children(node.size().pad(padding), vec![node]) +        layout::Node::with_children(node.size().pad(self.padding), vec![node])      }      pub(crate) fn on_event( diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index b17d93a3..15fe66b2 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -8,7 +8,8 @@ use crate::scrollable;  use crate::text;  use crate::touch;  use crate::{ -    Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, +    Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, +    Size, Widget,  };  use std::borrow::Cow; @@ -26,7 +27,7 @@ where      options: Cow<'a, [T]>,      selected: Option<T>,      width: Length, -    padding: u16, +    padding: Padding,      text_size: Option<u16>,      font: Renderer::Font,      style: <Renderer as self::Renderer>::Style, @@ -96,9 +97,14 @@ where          self      } -    /// Sets the padding of the [`PickList`]. -    pub fn padding(mut self, padding: u16) -> Self { -        self.padding = padding; +    /// Sets the [`Padding`] of the [`PickList`]. +    ///```ignore +    /// PickList::new(/*...*/).padding(20);              // 20px on all sides +    /// PickList::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// PickList::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ``` +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.padding = padding.into();          self      } @@ -150,7 +156,7 @@ where          let limits = limits              .width(self.width)              .height(Length::Shrink) -            .pad(f32::from(self.padding)); +            .pad(self.padding);          let text_size = self.text_size.unwrap_or(renderer.default_size()); @@ -179,11 +185,11 @@ where              let intrinsic = Size::new(                  max_width as f32                      + f32::from(text_size) -                    + f32::from(self.padding), +                    + f32::from(self.padding.left),                  f32::from(text_size),              ); -            limits.resolve(intrinsic).pad(f32::from(self.padding)) +            limits.resolve(intrinsic).pad(self.padding)          };          layout::Node::new(size) @@ -308,7 +314,7 @@ where  /// [renderer]: crate::renderer  pub trait Renderer: text::Renderer + menu::Renderer {      /// The default padding of a [`PickList`]. -    const DEFAULT_PADDING: u16; +    const DEFAULT_PADDING: Padding;      /// The [`PickList`] style supported by this renderer.      type Style: Default; @@ -324,7 +330,7 @@ pub trait Renderer: text::Renderer + menu::Renderer {          bounds: Rectangle,          cursor_position: Point,          selected: Option<String>, -        padding: u16, +        padding: Padding,          text_size: u16,          font: Self::Font,          style: &<Self as Renderer>::Style, diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index 5634ab12..9aa059c3 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -3,7 +3,8 @@ use crate::event::{self, Event};  use crate::layout;  use crate::overlay;  use crate::{ -    Align, Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Widget, +    Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point, +    Rectangle, Widget,  };  use std::hash::Hash; @@ -13,7 +14,7 @@ use std::u32;  #[allow(missing_debug_implementations)]  pub struct Row<'a, Message, Renderer> {      spacing: u16, -    padding: u16, +    padding: Padding,      width: Length,      height: Length,      max_width: u32, @@ -34,7 +35,7 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {      ) -> Self {          Row {              spacing: 0, -            padding: 0, +            padding: Padding::ZERO,              width: Length::Shrink,              height: Length::Shrink,              max_width: u32::MAX, @@ -54,9 +55,14 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {          self      } -    /// Sets the padding of the [`Row`]. -    pub fn padding(mut self, units: u16) -> Self { -        self.padding = units; +    /// Sets the [`Padding`] of the [`Row`]. +    ///```ignore +    /// Row::new(/*...*/).padding(20);              // 20px on all sides +    /// Row::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// Row::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ``` +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.padding = padding.into();          self      } @@ -128,7 +134,7 @@ where              layout::flex::Axis::Horizontal,              renderer,              &limits, -            self.padding as f32, +            self.padding,              self.spacing as f32,              self.align_items,              &self.children, diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index 70ebebe2..2b699e3b 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -6,7 +6,7 @@ use crate::mouse;  use crate::overlay;  use crate::touch;  use crate::{ -    Align, Clipboard, Column, Element, Hasher, Layout, Length, Point, +    Align, Clipboard, Column, Element, Hasher, Layout, Length, Padding, Point,      Rectangle, Size, Vector, Widget,  }; @@ -51,9 +51,14 @@ impl<'a, Message, Renderer: self::Renderer> Scrollable<'a, Message, Renderer> {          self      } -    /// Sets the padding of the [`Scrollable`]. -    pub fn padding(mut self, units: u16) -> Self { -        self.content = self.content.padding(units); +    /// Sets the [`Padding`] of the [`Scrollable`]. +    ///```ignore +    /// Scrollable::new(/*...*/).padding(20);              // 20px on all sides +    /// Scrollable::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// Scrollable::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ``` +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.content = self.content.padding(padding);          self      } diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index de6032b7..197f1599 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -18,7 +18,8 @@ use crate::mouse::{self, click};  use crate::text;  use crate::touch;  use crate::{ -    Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, +    Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, +    Size, Widget,  };  use std::u32; @@ -56,7 +57,7 @@ pub struct TextInput<'a, Message, Renderer: self::Renderer> {      font: Renderer::Font,      width: Length,      max_width: u32, -    padding: u16, +    padding: Padding,      size: Option<u16>,      on_change: Box<dyn Fn(String) -> Message>,      on_submit: Option<Message>, @@ -92,7 +93,7 @@ where              font: Default::default(),              width: Length::Fill,              max_width: u32::MAX, -            padding: 0, +            padding: Padding::ZERO,              size: None,              on_change: Box::new(on_change),              on_submit: None, @@ -126,9 +127,14 @@ where          self      } -    /// Sets the padding of the [`TextInput`]. -    pub fn padding(mut self, units: u16) -> Self { -        self.padding = units; +    /// Sets the [`Padding`] of the [`TextInput`]. +    ///```ignore +    /// TextInput::new(/*...*/).padding(20);              // 20px on all sides +    /// TextInput::new(/*...*/).padding([10, 20]);        // top/bottom, left/right +    /// TextInput::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left +    /// ``` +    pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self { +        self.padding = padding.into();          self      } @@ -223,19 +229,21 @@ where          renderer: &Renderer,          limits: &layout::Limits,      ) -> layout::Node { -        let padding = self.padding as f32;          let text_size = self.size.unwrap_or(renderer.default_size());          let limits = limits -            .pad(padding) +            .pad(self.padding)              .width(self.width)              .max_width(self.max_width)              .height(Length::Units(text_size));          let mut text = layout::Node::new(limits.resolve(Size::ZERO)); -        text.move_to(Point::new(padding, padding)); +        text.move_to(Point::new( +            self.padding.left.into(), +            self.padding.top.into(), +        )); -        layout::Node::with_children(text.size().pad(padding), vec![text]) +        layout::Node::with_children(text.size().pad(self.padding), vec![text])      }      fn on_event( | 
