Implement Container widget

Remove `align_self` and `justify_content` methods
This commit is contained in:
Héctor Ramón Jiménez 2019-11-11 05:26:08 +01:00
parent bfe19193b9
commit ceb02f4a36
25 changed files with 310 additions and 205 deletions

View file

@ -5,7 +5,7 @@
//! [`Button`]: struct.Button.html
//! [`State`]: struct.State.html
use crate::{Align, Background, Length};
use crate::{Background, Length};
/// A generic widget that produces a message when clicked.
pub struct Button<'a, Message, Element> {
@ -24,8 +24,6 @@ pub struct Button<'a, Message, Element> {
pub background: Option<Background>,
pub border_radius: u16,
pub align_self: Option<Align>,
}
impl<'a, Message, Element> std::fmt::Debug for Button<'a, Message, Element>
@ -57,7 +55,6 @@ impl<'a, Message, Element> Button<'a, Message, Element> {
padding: 0,
background: None,
border_radius: 0,
align_self: None,
}
}
@ -84,17 +81,6 @@ impl<'a, Message, Element> Button<'a, Message, Element> {
self
}
/// Sets the alignment of the [`Button`] itself.
///
/// This is useful if you want to override the default alignment given by
/// the parent container.
///
/// [`Button`]: struct.Button.html
pub fn align_self(mut self, align: Align) -> Self {
self.align_self = Some(align);
self
}
/// Sets the message that will be produced when the [`Button`] is pressed.
///
/// [`Button`]: struct.Button.html

View file

@ -1,4 +1,4 @@
use crate::{Align, Justify, Length};
use crate::{Align, Length};
use std::u32;
@ -14,9 +14,7 @@ pub struct Column<Element> {
pub height: Length,
pub max_width: u32,
pub max_height: u32,
pub align_self: Option<Align>,
pub align_items: Align,
pub justify_content: Justify,
pub children: Vec<Element>,
}
@ -32,9 +30,7 @@ impl<Element> Column<Element> {
height: Length::Shrink,
max_width: u32::MAX,
max_height: u32::MAX,
align_self: None,
align_items: Align::Start,
justify_content: Justify::Start,
children: Vec::new(),
}
}
@ -89,17 +85,6 @@ impl<Element> Column<Element> {
self
}
/// Sets the alignment of the [`Column`] itself.
///
/// This is useful if you want to override the default alignment given by
/// the parent container.
///
/// [`Column`]: struct.Column.html
pub fn align_self(mut self, align: Align) -> Self {
self.align_self = Some(align);
self
}
/// Sets the horizontal alignment of the contents of the [`Column`] .
///
/// [`Column`]: struct.Column.html
@ -108,15 +93,6 @@ impl<Element> Column<Element> {
self
}
/// Sets the vertical distribution strategy for the contents of the
/// [`Column`] .
///
/// [`Column`]: struct.Column.html
pub fn justify_content(mut self, justify: Justify) -> Self {
self.justify_content = justify;
self
}
/// Adds an element to the [`Column`].
///
/// [`Column`]: struct.Column.html

View file

@ -0,0 +1,94 @@
use crate::{Align, Length};
use std::u32;
#[derive(Debug)]
pub struct Container<Element> {
pub width: Length,
pub height: Length,
pub max_width: u32,
pub max_height: u32,
pub padding: u16,
pub horizontal_alignment: Align,
pub vertical_alignment: Align,
pub content: Element,
}
impl<Element> Container<Element> {
/// Creates an empty [`Container`].
///
/// [`Container`]: struct.Container.html
pub fn new<T>(content: T) -> Self
where
T: Into<Element>,
{
Container {
width: Length::Shrink,
height: Length::Shrink,
max_width: u32::MAX,
max_height: u32::MAX,
horizontal_alignment: Align::Start,
vertical_alignment: Align::Start,
padding: 0,
content: content.into(),
}
}
/// Sets the width of the [`Container`].
///
/// [`Container`]: struct.Container.html
pub fn width(mut self, width: Length) -> Self {
self.width = width;
self
}
/// Sets the height of the [`Container`].
///
/// [`Container`]: struct.Container.html
pub fn height(mut self, height: Length) -> Self {
self.height = height;
self
}
/// Sets the maximum width of the [`Container`].
///
/// [`Container`]: struct.Container.html
pub fn max_width(mut self, max_width: u32) -> Self {
self.max_width = max_width;
self
}
/// Sets the maximum height of the [`Container`] in pixels.
///
/// [`Container`]: struct.Container.html
pub fn max_height(mut self, max_height: u32) -> Self {
self.max_height = max_height;
self
}
/// Sets the padding of the [`Container`].
///
/// [`Container`]: struct.Container.html
pub fn padding(mut self, units: u16) -> Self {
self.padding = units;
self
}
/// Centers the contents in the horizontal axis of the [`Container`].
///
/// [`Container`]: struct.Container.html
pub fn center_x(mut self) -> Self {
self.horizontal_alignment = Align::Center;
self
}
/// Centers the contents in the vertical axis of the [`Container`].
///
/// [`Container`]: struct.Container.html
pub fn center_y(mut self) -> Self {
self.vertical_alignment = Align::Center;
self
}
}

View file

@ -24,8 +24,6 @@ pub struct Image {
/// The height of the image
pub height: Length,
pub align_self: Option<Align>,
}
impl Image {
@ -38,7 +36,6 @@ impl Image {
clip: None,
width: Length::Shrink,
height: Length::Shrink,
align_self: None,
}
}
@ -65,15 +62,4 @@ impl Image {
self.height = height;
self
}
/// Sets the alignment of the [`Image`] itself.
///
/// This is useful if you want to override the default alignment given by
/// the parent container.
///
/// [`Image`]: struct.Image.html
pub fn align_self(mut self, align: Align) -> Self {
self.align_self = Some(align);
self
}
}

View file

@ -1,4 +1,4 @@
use crate::{Align, Justify, Length};
use crate::{Align, Length};
use std::u32;
@ -14,9 +14,7 @@ pub struct Row<Element> {
pub height: Length,
pub max_width: u32,
pub max_height: u32,
pub align_self: Option<Align>,
pub align_items: Align,
pub justify_content: Justify,
pub children: Vec<Element>,
}
@ -32,9 +30,7 @@ impl<Element> Row<Element> {
height: Length::Shrink,
max_width: u32::MAX,
max_height: u32::MAX,
align_self: None,
align_items: Align::Start,
justify_content: Justify::Start,
children: Vec::new(),
}
}
@ -89,17 +85,6 @@ impl<Element> Row<Element> {
self
}
/// Sets the alignment of the [`Row`] itself.
///
/// This is useful if you want to override the default alignment given by
/// the parent container.
///
/// [`Row`]: struct.Row.html
pub fn align_self(mut self, align: Align) -> Self {
self.align_self = Some(align);
self
}
/// Sets the vertical alignment of the contents of the [`Row`] .
///
/// [`Row`]: struct.Row.html
@ -108,15 +93,6 @@ impl<Element> Row<Element> {
self
}
/// Sets the horizontal distribution strategy for the contents of the
/// [`Row`] .
///
/// [`Row`]: struct.Row.html
pub fn justify_content(mut self, justify: Justify) -> Self {
self.justify_content = justify;
self
}
/// Adds an [`Element`] to the [`Row`].
///
/// [`Element`]: ../struct.Element.html

View file

@ -7,7 +7,6 @@ pub struct Scrollable<'a, Element> {
pub state: &'a mut State,
pub height: Length,
pub max_height: u32,
pub align_self: Option<Align>,
pub content: Column<Element>,
}
@ -17,7 +16,6 @@ impl<'a, Element> Scrollable<'a, Element> {
state,
height: Length::Shrink,
max_height: u32::MAX,
align_self: None,
content: Column::new(),
}
}
@ -72,17 +70,6 @@ impl<'a, Element> Scrollable<'a, Element> {
self
}
/// Sets the alignment of the [`Scrollable`] itself.
///
/// This is useful if you want to override the default alignment given by
/// the parent container.
///
/// [`Scrollable`]: struct.Scrollable.html
pub fn align_self(mut self, align: Align) -> Self {
self.align_self = Some(align);
self
}
/// Sets the horizontal alignment of the contents of the [`Scrollable`] .
///
/// [`Scrollable`]: struct.Scrollable.html
@ -142,9 +129,9 @@ impl State {
pub fn offset(&self, bounds: Rectangle, content_bounds: Rectangle) -> u32 {
let hidden_content =
(content_bounds.height - bounds.height).round() as u32;
(content_bounds.height - bounds.height).max(0.0).round() as u32;
self.offset.min(hidden_content).max(0)
self.offset.min(hidden_content)
}
pub fn is_scrollbar_grabbed(&self) -> bool {