Add support for asymmetrical padding
This commit is contained in:
parent
a9eb591628
commit
fe0a27c56d
27 changed files with 339 additions and 195 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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`].
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 = ();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue