cacao/src/layout/attributes.rs
2022-07-15 16:13:27 +02:00

220 lines
7.2 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use crate::foundation::{NSInteger, NSUInteger};
/// Represents whether a layout is vertical or horizontal.
#[derive(Debug)]
pub enum LayoutConstraintOrientation {
/// Horizontal orientation.
Horizontal,
/// Vertical orientation.
Vertical,
/// Represents an unknown value. This should never be constructed, but acts as a guard against
/// a change in representation on the framework side. If a new value was ever introduced, it's
/// caught here, and applications can handle it themselves if need be.
Unknown(NSInteger)
}
impl From<NSInteger> for LayoutConstraintOrientation {
fn from(i: NSInteger) -> Self {
match i {
0 => Self::Horizontal,
1 => Self::Vertical,
i => Self::Unknown(i)
}
}
}
/// Represents a relation between layout constraints. Used mostly internally.
#[derive(Debug)]
pub enum LayoutRelation {
/// Relation is less than or equal to another specified relation.
LessThanOrEqual,
/// Relation is equal to another specified relation.
Equal,
/// Relation is greater than or equal to another specified relation.
GreaterThanOrEqual,
/// Represents an unknown value. This should never be constructed, but acts as a guard against
/// a change in representation on the framework side. If a new value was ever introduced, it's
/// caught here, and applications can handle it themselves if need be.
Unknown(NSInteger)
}
impl From<NSInteger> for LayoutRelation {
fn from(i: NSInteger) -> Self {
match i {
-1 => Self::LessThanOrEqual,
0 => Self::Equal,
1 => Self::GreaterThanOrEqual,
i => Self::Unknown(i)
}
}
}
/// Represents attributes for various layouts and constraints.
///
/// Note that this only covers attributes that are shared across platforms. In general, this is enough
/// to build apps that work everywhere - but if you need to specify something else, you can handle
/// it yourself with the `Unknown` variant.
#[derive(Debug)]
pub enum LayoutAttribute {
/// The left side of the objects alignment rectangle.
Left,
/// The right side of the objects alignment rectangle.
Right,
/// The top of the objects alignment rectangle.
Top,
/// The bottom of the objects alignment rectangle.
Bottom,
/// The leading edge of the objects alignment rectangle.
Leading,
/// The trailing edge of the objects alignment rectangle.
Trailing,
/// The width of the objects alignment rectangle.
Width,
/// The height of the objects alignment rectangle.
Height,
/// The center along the x-axis of the objects alignment rectangle.
CenterX,
/// The center along the y-axis of the objects alignment rectangle.
CenterY,
/// The objects baseline. For objects with more than one line of text,
/// this is the baseline for the bottommost line of text.
LastBaseline,
/// The objects baseline. For objects with more than one line of text,
/// this is the baseline for the topmost line of text.
FirstBaseline,
/// A placeholder value that is used to indicate that the constraints
/// second item and second attribute are not used in any calculations.
///
/// This can be useful constraint that assigns a constant to an attribute.
NotAnAttribute,
/// Represents an unknown value. This should never be constructed, but acts as a guard against
/// a change in representation on the framework side. If a new value was ever introduced, it's
/// caught here, and applications can handle it themselves if need be.
Unknown(NSInteger)
}
impl From<NSInteger> for LayoutAttribute {
fn from(i: NSInteger) -> Self {
match i {
1 => Self::Left,
2 => Self::Right,
3 => Self::Top,
4 => Self::Bottom,
5 => Self::Leading,
6 => Self::Trailing,
7 => Self::Width,
8 => Self::Height,
9 => Self::CenterX,
10 => Self::CenterY,
11 => Self::LastBaseline,
12 => Self::FirstBaseline,
0 => Self::NotAnAttribute,
i => Self::Unknown(i)
}
}
}
/// Represents a layout format.
///
/// Note that this only covers formats that are shared across platforms. In general, this is enough
/// to build apps that work everywhere - but if you need to specify something else, you can handle
/// it yourself with the `Unknown` variant.
#[derive(Debug)]
pub enum LayoutFormat {
/// Align all specified interface elements using NSLayoutAttributeLeft on each.
AlignAllLeft,
/// Align all specified interface elements using NSLayoutAttributeRight on each.
AlignAllRight,
/// Align all specified interface elements using NSLayoutAttributeTop on each.
AlignAllTop,
/// Align all specified interface elements using NSLayoutAttributeBottom on each.
AlignAllBottom,
/// Align all specified interface elements using NSLayoutAttributeLeading on each.
AlignAllLeading,
/// Align all specified interface elements using NSLayoutAttributeTrailing on each.
AlignAllTrailing,
/// Align all specified interface elements using NSLayoutAttributeCenterX on each.
AlignAllCenterX,
/// Align all specified interface elements using NSLayoutAttributeCenterY on each.
AlignAllCenterY,
/// Align all specified interface elements using the last baseline of each one.
AlignAllLastBaseline,
/// Arrange objects in order based on the normal text flow for the current user
/// interface language. In left-to-right languages (like English), this arrangement
/// results in the first object being placed farthest to the left, the next one to
/// its right, and so on. In right-to-left languages (like Arabic or Hebrew), the
/// ordering is reversed.
DirectionLeadingToTrailing,
/// Arrange objects in order from left to right.
DirectionLeftToRight,
/// Arrange objects in order from right to left.
DirectionRightToLeft,
/// Represents an unknown value. This should never be constructed, but acts as a guard against
/// a change in representation on the framework side. If a new value was ever introduced, it's
/// caught here, and applications can handle it themselves if need be.
Unknown(NSUInteger)
}
impl From<NSUInteger> for LayoutFormat {
fn from(i: NSUInteger) -> Self {
match i {
2 => Self::AlignAllLeft,
4 => Self::AlignAllRight,
8 => Self::AlignAllTop,
16 => Self::AlignAllBottom,
32 => Self::AlignAllLeading,
64 => Self::AlignAllTrailing,
512 => Self::AlignAllCenterX,
1024 => Self::AlignAllCenterY,
2048 => Self::AlignAllLastBaseline,
0 => Self::DirectionLeadingToTrailing,
65536 => Self::DirectionLeftToRight,
131072 => Self::DirectionRightToLeft,
i => Self::Unknown(i)
}
}
}
/// Specifies layout priority.
#[derive(Debug)]
pub enum LayoutPriority {
/// Highest priority.
Required,
/// High priority. Will bend if absolutely necessary.
High,
/// Low priority.
Low
}