summaryrefslogtreecommitdiffstats
path: root/native/src
diff options
context:
space:
mode:
Diffstat (limited to 'native/src')
-rw-r--r--native/src/layout/flex.rs93
-rw-r--r--native/src/layout/node.rs24
-rw-r--r--native/src/lib.rs5
-rw-r--r--native/src/renderer/null.rs23
-rw-r--r--native/src/widget/checkbox.rs11
-rw-r--r--native/src/widget/column.rs8
-rw-r--r--native/src/widget/container.rs27
-rw-r--r--native/src/widget/radio.rs13
-rw-r--r--native/src/widget/row.rs8
-rw-r--r--native/src/widget/scrollable.rs6
-rw-r--r--native/src/widget/text.rs24
-rw-r--r--native/src/widget/toggler.rs21
12 files changed, 176 insertions, 87 deletions
diff --git a/native/src/layout/flex.rs b/native/src/layout/flex.rs
index 3d3ff82c..5fbcbca0 100644
--- a/native/src/layout/flex.rs
+++ b/native/src/layout/flex.rs
@@ -16,11 +16,8 @@
// 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, Padding, Point, Size,
-};
+use crate::layout::{Limits, Node};
+use crate::{Alignment, Element, Padding, Point, Size};
/// The main axis of a flex layout.
#[derive(Debug)]
@@ -65,7 +62,7 @@ pub fn resolve<Message, Renderer>(
limits: &Limits,
padding: Padding,
spacing: f32,
- align_items: Align,
+ align_items: Alignment,
items: &[Element<'_, Message, Renderer>],
) -> Node
where
@@ -82,6 +79,32 @@ where
let mut nodes: Vec<Node> = Vec::with_capacity(items.len());
nodes.resize(items.len(), Node::default());
+ if align_items == Alignment::Fill {
+ let mut fill_cross = axis.cross(limits.min());
+
+ items.iter().for_each(|child| {
+ let cross_fill_factor = match axis {
+ Axis::Horizontal => child.height(),
+ Axis::Vertical => child.width(),
+ }
+ .fill_factor();
+
+ if cross_fill_factor == 0 {
+ let (max_width, max_height) = axis.pack(available, max_cross);
+
+ let child_limits =
+ Limits::new(Size::ZERO, Size::new(max_width, max_height));
+
+ let layout = child.layout(renderer, &child_limits);
+ let size = layout.size();
+
+ fill_cross = fill_cross.max(axis.cross(size));
+ }
+ });
+
+ cross = fill_cross;
+ }
+
for (i, child) in items.iter().enumerate() {
let fill_factor = match axis {
Axis::Horizontal => child.width(),
@@ -90,16 +113,31 @@ where
.fill_factor();
if fill_factor == 0 {
- let (max_width, max_height) = axis.pack(available, max_cross);
+ let (min_width, min_height) = if align_items == Alignment::Fill {
+ axis.pack(0.0, cross)
+ } else {
+ axis.pack(0.0, 0.0)
+ };
- let child_limits =
- Limits::new(Size::ZERO, Size::new(max_width, max_height));
+ let (max_width, max_height) = if align_items == Alignment::Fill {
+ axis.pack(available, cross)
+ } else {
+ axis.pack(available, max_cross)
+ };
+
+ let child_limits = Limits::new(
+ Size::new(min_width, min_height),
+ Size::new(max_width, max_height),
+ );
let layout = child.layout(renderer, &child_limits);
let size = layout.size();
available -= axis.main(size);
- cross = cross.max(axis.cross(size));
+
+ if align_items != Alignment::Fill {
+ cross = cross.max(axis.cross(size));
+ }
nodes[i] = layout;
} else {
@@ -124,19 +162,28 @@ where
max_main
};
- let (min_main, min_cross) =
- axis.pack(min_main, axis.cross(limits.min()));
+ let (min_width, min_height) = if align_items == Alignment::Fill {
+ axis.pack(min_main, cross)
+ } else {
+ axis.pack(min_main, axis.cross(limits.min()))
+ };
- let (max_main, max_cross) =
- axis.pack(max_main, axis.cross(limits.max()));
+ let (max_width, max_height) = if align_items == Alignment::Fill {
+ axis.pack(max_main, cross)
+ } else {
+ axis.pack(max_main, max_cross)
+ };
let child_limits = Limits::new(
- Size::new(min_main, min_cross),
- Size::new(max_main, max_cross),
+ Size::new(min_width, min_height),
+ Size::new(max_width, max_height),
);
let layout = child.layout(renderer, &child_limits);
- cross = cross.max(axis.cross(layout.size()));
+
+ if align_items != Alignment::Fill {
+ cross = cross.max(axis.cross(layout.size()));
+ }
nodes[i] = layout;
}
@@ -156,10 +203,18 @@ where
match axis {
Axis::Horizontal => {
- node.align(Align::Start, align_items, Size::new(0.0, cross));
+ node.align(
+ Alignment::Start,
+ align_items,
+ Size::new(0.0, cross),
+ );
}
Axis::Vertical => {
- node.align(align_items, Align::Start, Size::new(cross, 0.0));
+ node.align(
+ align_items,
+ Alignment::Start,
+ Size::new(cross, 0.0),
+ );
}
}
diff --git a/native/src/layout/node.rs b/native/src/layout/node.rs
index d7666f31..e9e6058e 100644
--- a/native/src/layout/node.rs
+++ b/native/src/layout/node.rs
@@ -1,4 +1,4 @@
-use crate::{Align, Point, Rectangle, Size};
+use crate::{Alignment, Point, Rectangle, Size};
/// The bounds of an element and its children.
#[derive(Debug, Clone, Default)]
@@ -44,28 +44,34 @@ impl Node {
/// Aligns the [`Node`] in the given space.
pub fn align(
&mut self,
- horizontal_alignment: Align,
- vertical_alignment: Align,
+ horizontal_alignment: Alignment,
+ vertical_alignment: Alignment,
space: Size,
) {
match horizontal_alignment {
- Align::Start => {}
- Align::Center => {
+ Alignment::Start => {}
+ Alignment::Center => {
self.bounds.x += (space.width - self.bounds.width) / 2.0;
}
- Align::End => {
+ Alignment::End => {
self.bounds.x += space.width - self.bounds.width;
}
+ Alignment::Fill => {
+ self.bounds.width = space.width;
+ }
}
match vertical_alignment {
- Align::Start => {}
- Align::Center => {
+ Alignment::Start => {}
+ Alignment::Center => {
self.bounds.y += (space.height - self.bounds.height) / 2.0;
}
- Align::End => {
+ Alignment::End => {
self.bounds.y += space.height - self.bounds.height;
}
+ Alignment::Fill => {
+ self.bounds.height = space.height;
+ }
}
}
diff --git a/native/src/lib.rs b/native/src/lib.rs
index cb0600e2..170a588b 100644
--- a/native/src/lib.rs
+++ b/native/src/lib.rs
@@ -61,9 +61,10 @@ mod debug;
#[path = "debug/null.rs"]
mod debug;
+pub use iced_core::alignment;
pub use iced_core::{
- Align, Background, Color, Font, HorizontalAlignment, Length, Padding,
- Point, Rectangle, Size, Vector, VerticalAlignment,
+ Alignment, Background, Color, Font, Length, Padding, Point, Rectangle,
+ Size, Vector,
};
pub use iced_futures::{executor, futures};
diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs
index 2c47ddf2..b5921582 100644
--- a/native/src/renderer/null.rs
+++ b/native/src/renderer/null.rs
@@ -1,8 +1,19 @@
+use crate::alignment;
+use crate::button;
+use crate::checkbox;
+use crate::column;
+use crate::container;
+use crate::pane_grid;
+use crate::progress_bar;
+use crate::radio;
+use crate::row;
+use crate::scrollable;
+use crate::slider;
+use crate::text;
+use crate::text_input;
+use crate::toggler;
use crate::{
- button, checkbox, column, container, pane_grid, progress_bar, radio, row,
- scrollable, slider, text, text_input, toggler, Color, Element, Font,
- HorizontalAlignment, Layout, Padding, Point, Rectangle, Renderer, Size,
- VerticalAlignment,
+ Color, Element, Font, Layout, Padding, Point, Rectangle, Renderer, Size,
};
/// A renderer that does nothing.
@@ -87,8 +98,8 @@ impl text::Renderer for Null {
_size: u16,
_font: Font,
_color: Option<Color>,
- _horizontal_alignment: HorizontalAlignment,
- _vertical_alignment: VerticalAlignment,
+ _horizontal_alignment: alignment::Horizontal,
+ _vertical_alignment: alignment::Vertical,
) {
}
}
diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs
index 0f21c873..8bdb6b78 100644
--- a/native/src/widget/checkbox.rs
+++ b/native/src/widget/checkbox.rs
@@ -1,6 +1,7 @@
//! Show toggle controls using checkboxes.
use std::hash::Hash;
+use crate::alignment::{self, Alignment};
use crate::event::{self, Event};
use crate::layout;
use crate::mouse;
@@ -8,8 +9,8 @@ use crate::row;
use crate::text;
use crate::touch;
use crate::{
- Align, Clipboard, Color, Element, Hasher, HorizontalAlignment, Layout,
- Length, Point, Rectangle, Row, Text, VerticalAlignment, Widget,
+ Clipboard, Color, Element, Hasher, Layout, Length, Point, Rectangle, Row,
+ Text, Widget,
};
/// A box that can be checked.
@@ -138,7 +139,7 @@ where
Row::<(), Renderer>::new()
.width(self.width)
.spacing(self.spacing)
- .align_items(Align::Center)
+ .align_items(Alignment::Center)
.push(
Row::new()
.width(Length::Units(self.size))
@@ -202,8 +203,8 @@ where
self.text_size.unwrap_or(renderer.default_size()),
self.font,
self.text_color,
- HorizontalAlignment::Left,
- VerticalAlignment::Center,
+ alignment::Horizontal::Left,
+ alignment::Vertical::Center,
);
let is_mouse_over = bounds.contains(cursor_position);
diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs
index 52a2e80c..30cf0781 100644
--- a/native/src/widget/column.rs
+++ b/native/src/widget/column.rs
@@ -5,7 +5,7 @@ use crate::event::{self, Event};
use crate::layout;
use crate::overlay;
use crate::{
- Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point,
+ Alignment, Clipboard, Element, Hasher, Layout, Length, Padding, Point,
Rectangle, Widget,
};
@@ -20,7 +20,7 @@ pub struct Column<'a, Message, Renderer> {
height: Length,
max_width: u32,
max_height: u32,
- align_items: Align,
+ align_items: Alignment,
children: Vec<Element<'a, Message, Renderer>>,
}
@@ -41,7 +41,7 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {
height: Length::Shrink,
max_width: u32::MAX,
max_height: u32::MAX,
- align_items: Align::Start,
+ align_items: Alignment::Start,
children,
}
}
@@ -87,7 +87,7 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {
}
/// Sets the horizontal alignment of the contents of the [`Column`] .
- pub fn align_items(mut self, align: Align) -> Self {
+ pub fn align_items(mut self, align: Alignment) -> Self {
self.align_items = align;
self
}
diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs
index 69aee64d..0e86ab62 100644
--- a/native/src/widget/container.rs
+++ b/native/src/widget/container.rs
@@ -1,12 +1,13 @@
//! Decorate content and apply alignment.
use std::hash::Hash;
+use crate::alignment::{self, Alignment};
use crate::event::{self, Event};
use crate::layout;
use crate::overlay;
use crate::{
- Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point,
- Rectangle, Widget,
+ Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle,
+ Widget,
};
use std::u32;
@@ -21,8 +22,8 @@ pub struct Container<'a, Message, Renderer: self::Renderer> {
height: Length,
max_width: u32,
max_height: u32,
- horizontal_alignment: Align,
- vertical_alignment: Align,
+ horizontal_alignment: alignment::Horizontal,
+ vertical_alignment: alignment::Vertical,
style: Renderer::Style,
content: Element<'a, Message, Renderer>,
}
@@ -42,8 +43,8 @@ where
height: Length::Shrink,
max_width: u32::MAX,
max_height: u32::MAX,
- horizontal_alignment: Align::Start,
- vertical_alignment: Align::Start,
+ horizontal_alignment: alignment::Horizontal::Left,
+ vertical_alignment: alignment::Vertical::Top,
style: Renderer::Style::default(),
content: content.into(),
}
@@ -80,26 +81,26 @@ where
}
/// Sets the content alignment for the horizontal axis of the [`Container`].
- pub fn align_x(mut self, alignment: Align) -> Self {
+ pub fn align_x(mut self, alignment: alignment::Horizontal) -> Self {
self.horizontal_alignment = alignment;
self
}
/// Sets the content alignment for the vertical axis of the [`Container`].
- pub fn align_y(mut self, alignment: Align) -> Self {
+ pub fn align_y(mut self, alignment: alignment::Vertical) -> Self {
self.vertical_alignment = alignment;
self
}
/// Centers the contents in the horizontal axis of the [`Container`].
pub fn center_x(mut self) -> Self {
- self.horizontal_alignment = Align::Center;
+ self.horizontal_alignment = alignment::Horizontal::Center;
self
}
/// Centers the contents in the vertical axis of the [`Container`].
pub fn center_y(mut self) -> Self {
- self.vertical_alignment = Align::Center;
+ self.vertical_alignment = alignment::Vertical::Center;
self
}
@@ -143,7 +144,11 @@ where
self.padding.left.into(),
self.padding.top.into(),
));
- content.align(self.horizontal_alignment, self.vertical_alignment, size);
+ content.align(
+ Alignment::from(self.horizontal_alignment),
+ Alignment::from(self.vertical_alignment),
+ size,
+ );
layout::Node::with_children(size.pad(self.padding), vec![content])
}
diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs
index dee82d1f..513b2fce 100644
--- a/native/src/widget/radio.rs
+++ b/native/src/widget/radio.rs
@@ -1,15 +1,16 @@
//! Create choices using radio buttons.
use std::hash::Hash;
+use crate::alignment::{self, Alignment};
use crate::event::{self, Event};
+use crate::layout;
use crate::mouse;
use crate::row;
use crate::text;
use crate::touch;
-use crate::{layout, Color};
use crate::{
- Align, Clipboard, Element, Hasher, HorizontalAlignment, Layout, Length,
- Point, Rectangle, Row, Text, VerticalAlignment, Widget,
+ Clipboard, Color, Element, Hasher, Layout, Length, Point, Rectangle, Row,
+ Text, Widget,
};
/// A circular button representing a choice.
@@ -153,7 +154,7 @@ where
Row::<(), Renderer>::new()
.width(self.width)
.spacing(self.spacing)
- .align_items(Align::Center)
+ .align_items(Alignment::Center)
.push(
Row::new()
.width(Length::Units(self.size))
@@ -214,8 +215,8 @@ where
self.text_size.unwrap_or(renderer.default_size()),
self.font,
self.text_color,
- HorizontalAlignment::Left,
- VerticalAlignment::Center,
+ alignment::Horizontal::Left,
+ alignment::Vertical::Center,
);
let is_mouse_over = bounds.contains(cursor_position);
diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs
index 9ebc9145..1923f213 100644
--- a/native/src/widget/row.rs
+++ b/native/src/widget/row.rs
@@ -3,7 +3,7 @@ use crate::event::{self, Event};
use crate::layout;
use crate::overlay;
use crate::{
- Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point,
+ Alignment, Clipboard, Element, Hasher, Layout, Length, Padding, Point,
Rectangle, Widget,
};
@@ -19,7 +19,7 @@ pub struct Row<'a, Message, Renderer> {
height: Length,
max_width: u32,
max_height: u32,
- align_items: Align,
+ align_items: Alignment,
children: Vec<Element<'a, Message, Renderer>>,
}
@@ -40,7 +40,7 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {
height: Length::Shrink,
max_width: u32::MAX,
max_height: u32::MAX,
- align_items: Align::Start,
+ align_items: Alignment::Start,
children,
}
}
@@ -86,7 +86,7 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {
}
/// Sets the vertical alignment of the contents of the [`Row`] .
- pub fn align_items(mut self, align: Align) -> Self {
+ pub fn align_items(mut self, align: Alignment) -> Self {
self.align_items = align;
self
}
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs
index 68da2e67..a8e467d3 100644
--- a/native/src/widget/scrollable.rs
+++ b/native/src/widget/scrollable.rs
@@ -6,8 +6,8 @@ use crate::mouse;
use crate::overlay;
use crate::touch;
use crate::{
- Align, Clipboard, Column, Element, Hasher, Layout, Length, Padding, Point,
- Rectangle, Size, Vector, Widget,
+ Alignment, Clipboard, Column, Element, Hasher, Layout, Length, Padding,
+ Point, Rectangle, Size, Vector, Widget,
};
use std::{f32, hash::Hash, u32};
@@ -84,7 +84,7 @@ impl<'a, Message, Renderer: self::Renderer> Scrollable<'a, Message, Renderer> {
}
/// Sets the horizontal alignment of the contents of the [`Scrollable`] .
- pub fn align_items(mut self, align_items: Align) -> Self {
+ pub fn align_items(mut self, align_items: Alignment) -> Self {
self.content = self.content.align_items(align_items);
self
}
diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs
index d8bc0a00..168d49c2 100644
--- a/native/src/widget/text.rs
+++ b/native/src/widget/text.rs
@@ -1,7 +1,8 @@
//! Write some text for your users to read.
+use crate::alignment;
+use crate::layout;
use crate::{
- layout, Color, Element, Hasher, HorizontalAlignment, Layout, Length, Point,
- Rectangle, Size, VerticalAlignment, Widget,
+ Color, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget,
};
pub use iced_core::text::Hit;
@@ -29,8 +30,8 @@ pub struct Text<Renderer: self::Renderer> {
font: Renderer::Font,
width: Length,
height: Length,
- horizontal_alignment: HorizontalAlignment,
- vertical_alignment: VerticalAlignment,
+ horizontal_alignment: alignment::Horizontal,
+ vertical_alignment: alignment::Vertical,
}
impl<Renderer: self::Renderer> Text<Renderer> {
@@ -43,8 +44,8 @@ impl<Renderer: self::Renderer> Text<Renderer> {
font: Default::default(),
width: Length::Shrink,
height: Length::Shrink,
- horizontal_alignment: HorizontalAlignment::Left,
- vertical_alignment: VerticalAlignment::Top,
+ horizontal_alignment: alignment::Horizontal::Left,
+ vertical_alignment: alignment::Vertical::Top,
}
}
@@ -83,14 +84,17 @@ impl<Renderer: self::Renderer> Text<Renderer> {
/// Sets the [`HorizontalAlignment`] of the [`Text`].
pub fn horizontal_alignment(
mut self,
- alignment: HorizontalAlignment,
+ alignment: alignment::Horizontal,
) -> Self {
self.horizontal_alignment = alignment;
self
}
/// Sets the [`VerticalAlignment`] of the [`Text`].
- pub fn vertical_alignment(mut self, alignment: VerticalAlignment) -> Self {
+ pub fn vertical_alignment(
+ mut self,
+ alignment: alignment::Vertical,
+ ) -> Self {
self.vertical_alignment = alignment;
self
}
@@ -215,8 +219,8 @@ pub trait Renderer: crate::Renderer {
size: u16,
font: Self::Font,
color: Option<Color>,
- horizontal_alignment: HorizontalAlignment,
- vertical_alignment: VerticalAlignment,
+ horizontal_alignment: alignment::Horizontal,
+ vertical_alignment: alignment::Vertical,
) -> Self::Output;
}
diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs
index 4035276c..c624be4c 100644
--- a/native/src/widget/toggler.rs
+++ b/native/src/widget/toggler.rs
@@ -1,10 +1,15 @@
//! Show toggle controls using togglers.
use std::hash::Hash;
+use crate::alignment;
+use crate::event;
+use crate::layout;
+use crate::mouse;
+use crate::row;
+use crate::text;
use crate::{
- event, layout, mouse, row, text, Align, Clipboard, Element, Event, Hasher,
- HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text,
- VerticalAlignment, Widget,
+ Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point,
+ Rectangle, Row, Text, Widget,
};
/// A toggler widget
@@ -30,7 +35,7 @@ pub struct Toggler<Message, Renderer: self::Renderer + text::Renderer> {
width: Length,
size: u16,
text_size: Option<u16>,
- text_alignment: HorizontalAlignment,
+ text_alignment: alignment::Horizontal,
spacing: u16,
font: Renderer::Font,
style: Renderer::Style,
@@ -62,7 +67,7 @@ impl<Message, Renderer: self::Renderer + text::Renderer>
width: Length::Fill,
size: <Renderer as self::Renderer>::DEFAULT_SIZE,
text_size: None,
- text_alignment: HorizontalAlignment::Left,
+ text_alignment: alignment::Horizontal::Left,
spacing: 0,
font: Renderer::Font::default(),
style: Renderer::Style::default(),
@@ -88,7 +93,7 @@ impl<Message, Renderer: self::Renderer + text::Renderer>
}
/// Sets the horizontal alignment of the text of the [`Toggler`]
- pub fn text_alignment(mut self, alignment: HorizontalAlignment) -> Self {
+ pub fn text_alignment(mut self, alignment: alignment::Horizontal) -> Self {
self.text_alignment = alignment;
self
}
@@ -132,7 +137,7 @@ where
let mut row = Row::<(), Renderer>::new()
.width(self.width)
.spacing(self.spacing)
- .align_items(Align::Center);
+ .align_items(Alignment::Center);
if let Some(label) = &self.label {
row = row.push(
@@ -202,7 +207,7 @@ where
self.font,
None,
self.text_alignment,
- VerticalAlignment::Center,
+ alignment::Vertical::Center,
))
}