summaryrefslogtreecommitdiffstats
path: root/native/src/layout
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-03-04 05:37:11 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-03-04 05:37:11 +0100
commit3a0d34c0240f4421737a6a08761f99d6f8140d02 (patch)
treec9a4a6b8e9c1db1b8fcd05bc98e3f131d5ef4bd5 /native/src/layout
parentc54409d1711e1f615c7ea4b02c082954e340632a (diff)
downloadiced-3a0d34c0240f4421737a6a08761f99d6f8140d02.tar.gz
iced-3a0d34c0240f4421737a6a08761f99d6f8140d02.tar.bz2
iced-3a0d34c0240f4421737a6a08761f99d6f8140d02.zip
Create `iced_widget` subcrate and re-organize the whole codebase
Diffstat (limited to 'native/src/layout')
-rw-r--r--native/src/layout/DRUID_LICENSE202
-rw-r--r--native/src/layout/flex.rs232
-rw-r--r--native/src/layout/limits.rs163
-rw-r--r--native/src/layout/node.rs91
4 files changed, 0 insertions, 688 deletions
diff --git a/native/src/layout/DRUID_LICENSE b/native/src/layout/DRUID_LICENSE
deleted file mode 100644
index d6456956..00000000
--- a/native/src/layout/DRUID_LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- 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.
diff --git a/native/src/layout/flex.rs b/native/src/layout/flex.rs
deleted file mode 100644
index 5d70c2fc..00000000
--- a/native/src/layout/flex.rs
+++ /dev/null
@@ -1,232 +0,0 @@
-//! Distribute elements using a flex-based layout.
-// This code is heavily inspired by the [`druid`] codebase.
-//
-// [`druid`]: https://github.com/xi-editor/druid
-//
-// Copyright 2018 The xi-editor Authors, Héctor Ramón
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// 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::Element;
-
-use crate::layout::{Limits, Node};
-use crate::{Alignment, Padding, Point, Size};
-
-/// The main axis of a flex layout.
-#[derive(Debug)]
-pub enum Axis {
- /// The horizontal axis
- Horizontal,
-
- /// The vertical axis
- Vertical,
-}
-
-impl Axis {
- fn main(&self, size: Size) -> f32 {
- match self {
- Axis::Horizontal => size.width,
- Axis::Vertical => size.height,
- }
- }
-
- fn cross(&self, size: Size) -> f32 {
- match self {
- Axis::Horizontal => size.height,
- Axis::Vertical => size.width,
- }
- }
-
- fn pack(&self, main: f32, cross: f32) -> (f32, f32) {
- match self {
- Axis::Horizontal => (main, cross),
- Axis::Vertical => (cross, main),
- }
- }
-}
-
-/// Computes the flex layout with the given axis and limits, applying spacing,
-/// padding and alignment to the items as needed.
-///
-/// It returns a new layout [`Node`].
-pub fn resolve<Message, Renderer>(
- axis: Axis,
- renderer: &Renderer,
- limits: &Limits,
- padding: Padding,
- spacing: f32,
- align_items: Alignment,
- items: &[Element<'_, Message, Renderer>],
-) -> Node
-where
- Renderer: crate::Renderer,
-{
- let limits = limits.pad(padding);
- let total_spacing = spacing * items.len().saturating_sub(1) as f32;
- let max_cross = axis.cross(limits.max());
-
- let mut fill_sum = 0;
- let mut cross = axis.cross(limits.min()).max(axis.cross(limits.fill()));
- let mut available = axis.main(limits.max()) - total_spacing;
-
- 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.as_widget().height(),
- Axis::Vertical => child.as_widget().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.as_widget().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.as_widget().width(),
- Axis::Vertical => child.as_widget().height(),
- }
- .fill_factor();
-
- if fill_factor == 0 {
- let (min_width, min_height) = if align_items == Alignment::Fill {
- axis.pack(0.0, cross)
- } else {
- axis.pack(0.0, 0.0)
- };
-
- 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.as_widget().layout(renderer, &child_limits);
- let size = layout.size();
-
- available -= axis.main(size);
-
- if align_items != Alignment::Fill {
- cross = cross.max(axis.cross(size));
- }
-
- nodes[i] = layout;
- } else {
- fill_sum += fill_factor;
- }
- }
-
- let remaining = available.max(0.0);
-
- for (i, child) in items.iter().enumerate() {
- let fill_factor = match axis {
- Axis::Horizontal => child.as_widget().width(),
- Axis::Vertical => child.as_widget().height(),
- }
- .fill_factor();
-
- if fill_factor != 0 {
- let max_main = remaining * fill_factor as f32 / fill_sum as f32;
- let min_main = if max_main.is_infinite() {
- 0.0
- } else {
- max_main
- };
-
- 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_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_width, min_height),
- Size::new(max_width, max_height),
- );
-
- let layout = child.as_widget().layout(renderer, &child_limits);
-
- if align_items != Alignment::Fill {
- cross = cross.max(axis.cross(layout.size()));
- }
-
- nodes[i] = layout;
- }
- }
-
- let pad = axis.pack(padding.left, padding.top);
- let mut main = pad.0;
-
- for (i, node) in nodes.iter_mut().enumerate() {
- if i > 0 {
- main += spacing;
- }
-
- let (x, y) = axis.pack(main, pad.1);
-
- node.move_to(Point::new(x, y));
-
- match axis {
- Axis::Horizontal => {
- node.align(
- Alignment::Start,
- align_items,
- Size::new(0.0, cross),
- );
- }
- Axis::Vertical => {
- node.align(
- align_items,
- Alignment::Start,
- Size::new(cross, 0.0),
- );
- }
- }
-
- let size = node.size();
-
- main += axis.main(size);
- }
-
- 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
deleted file mode 100644
index 5d3c1556..00000000
--- a/native/src/layout/limits.rs
+++ /dev/null
@@ -1,163 +0,0 @@
-#![allow(clippy::manual_clamp)]
-use crate::{Length, Padding, Size};
-
-/// A set of size constraints for layouting.
-#[derive(Debug, Clone, Copy)]
-pub struct Limits {
- min: Size,
- max: Size,
- fill: Size,
-}
-
-impl Limits {
- /// No limits
- pub const NONE: Limits = Limits {
- min: Size::ZERO,
- max: Size::INFINITY,
- fill: Size::INFINITY,
- };
-
- /// Creates new [`Limits`] with the given minimum and maximum [`Size`].
- pub const fn new(min: Size, max: Size) -> Limits {
- Limits {
- min,
- max,
- fill: Size::INFINITY,
- }
- }
-
- /// Returns the minimum [`Size`] of the [`Limits`].
- pub fn min(&self) -> Size {
- self.min
- }
-
- /// Returns the maximum [`Size`] of the [`Limits`].
- pub fn max(&self) -> Size {
- self.max
- }
-
- /// Returns the fill [`Size`] of the [`Limits`].
- pub fn fill(&self) -> Size {
- self.fill
- }
-
- /// Applies a width constraint to the current [`Limits`].
- pub fn width(mut self, width: impl Into<Length>) -> Limits {
- match width.into() {
- Length::Shrink => {
- self.fill.width = self.min.width;
- }
- Length::Fill | Length::FillPortion(_) => {
- self.fill.width = self.fill.width.min(self.max.width);
- }
- Length::Fixed(amount) => {
- let new_width = amount.min(self.max.width).max(self.min.width);
-
- self.min.width = new_width;
- self.max.width = new_width;
- self.fill.width = new_width;
- }
- }
-
- self
- }
-
- /// Applies a height constraint to the current [`Limits`].
- pub fn height(mut self, height: impl Into<Length>) -> Limits {
- match height.into() {
- Length::Shrink => {
- self.fill.height = self.min.height;
- }
- Length::Fill | Length::FillPortion(_) => {
- self.fill.height = self.fill.height.min(self.max.height);
- }
- Length::Fixed(amount) => {
- let new_height =
- amount.min(self.max.height).max(self.min.height);
-
- self.min.height = new_height;
- self.max.height = new_height;
- self.fill.height = new_height;
- }
- }
-
- self
- }
-
- /// Applies a minimum width constraint to the current [`Limits`].
- pub fn min_width(mut self, min_width: f32) -> Limits {
- self.min.width = self.min.width.max(min_width).min(self.max.width);
-
- self
- }
-
- /// Applies a maximum width constraint to the current [`Limits`].
- pub fn max_width(mut self, max_width: f32) -> Limits {
- self.max.width = self.max.width.min(max_width).max(self.min.width);
-
- self
- }
-
- /// Applies a minimum height constraint to the current [`Limits`].
- pub fn min_height(mut self, min_height: f32) -> Limits {
- self.min.height = self.min.height.max(min_height).min(self.max.height);
-
- self
- }
-
- /// Applies a maximum height constraint to the current [`Limits`].
- pub fn max_height(mut self, max_height: f32) -> Limits {
- self.max.height = self.max.height.min(max_height).max(self.min.height);
-
- self
- }
-
- /// Shrinks the current [`Limits`] to account for the given padding.
- pub fn pad(&self, padding: Padding) -> Limits {
- self.shrink(Size::new(padding.horizontal(), padding.vertical()))
- }
-
- /// Shrinks the current [`Limits`] by the given [`Size`].
- pub fn shrink(&self, size: Size) -> Limits {
- let min = Size::new(
- (self.min().width - size.width).max(0.0),
- (self.min().height - size.height).max(0.0),
- );
-
- let max = Size::new(
- (self.max().width - size.width).max(0.0),
- (self.max().height - size.height).max(0.0),
- );
-
- let fill = Size::new(
- (self.fill.width - size.width).max(0.0),
- (self.fill.height - size.height).max(0.0),
- );
-
- Limits { min, max, fill }
- }
-
- /// Removes the minimum width constraint for the current [`Limits`].
- pub fn loose(&self) -> Limits {
- Limits {
- min: Size::ZERO,
- max: self.max,
- fill: self.fill,
- }
- }
-
- /// Computes the resulting [`Size`] that fits the [`Limits`] given the
- /// intrinsic size of some content.
- pub fn resolve(&self, intrinsic_size: Size) -> Size {
- Size::new(
- intrinsic_size
- .width
- .min(self.max.width)
- .max(self.fill.width),
- intrinsic_size
- .height
- .min(self.max.height)
- .max(self.fill.height),
- )
- }
-}
diff --git a/native/src/layout/node.rs b/native/src/layout/node.rs
deleted file mode 100644
index e0c7dcb2..00000000
--- a/native/src/layout/node.rs
+++ /dev/null
@@ -1,91 +0,0 @@
-use crate::{Alignment, Point, Rectangle, Size, Vector};
-
-/// The bounds of an element and its children.
-#[derive(Debug, Clone, Default)]
-pub struct Node {
- bounds: Rectangle,
- children: Vec<Node>,
-}
-
-impl Node {
- /// Creates a new [`Node`] with the given [`Size`].
- pub const fn new(size: Size) -> Self {
- Self::with_children(size, Vec::new())
- }
-
- /// Creates a new [`Node`] with the given [`Size`] and children.
- pub const fn with_children(size: Size, children: Vec<Node>) -> Self {
- Node {
- bounds: Rectangle {
- x: 0.0,
- y: 0.0,
- width: size.width,
- height: size.height,
- },
- children,
- }
- }
-
- /// Returns the [`Size`] of the [`Node`].
- pub fn size(&self) -> Size {
- Size::new(self.bounds.width, self.bounds.height)
- }
-
- /// Returns the bounds of the [`Node`].
- pub fn bounds(&self) -> Rectangle {
- self.bounds
- }
-
- /// Returns the children of the [`Node`].
- pub fn children(&self) -> &[Node] {
- &self.children
- }
-
- /// Aligns the [`Node`] in the given space.
- pub fn align(
- &mut self,
- horizontal_alignment: Alignment,
- vertical_alignment: Alignment,
- space: Size,
- ) {
- match horizontal_alignment {
- Alignment::Start => {}
- Alignment::Center => {
- self.bounds.x += (space.width - self.bounds.width) / 2.0;
- }
- Alignment::End => {
- self.bounds.x += space.width - self.bounds.width;
- }
- Alignment::Fill => {
- self.bounds.width = space.width;
- }
- }
-
- match vertical_alignment {
- Alignment::Start => {}
- Alignment::Center => {
- self.bounds.y += (space.height - self.bounds.height) / 2.0;
- }
- Alignment::End => {
- self.bounds.y += space.height - self.bounds.height;
- }
- Alignment::Fill => {
- self.bounds.height = space.height;
- }
- }
- }
-
- /// Moves the [`Node`] to the given position.
- pub fn move_to(&mut self, position: Point) {
- self.bounds.x = position.x;
- self.bounds.y = position.y;
- }
-
- /// Translates the [`Node`] by the given translation.
- pub fn translate(self, translation: Vector) -> Self {
- Self {
- bounds: self.bounds + translation,
- ..self
- }
- }
-}