pub struct Layout { /* private fields */ }Expand description
The primary layout engine for dividing terminal space using constraints and direction.
A layout is a set of constraints that can be applied to a given area to split it into smaller rectangular areas. This is the core building block for creating structured user interfaces in terminal applications.
A layout is composed of:
- a direction (horizontal or vertical)
- a set of constraints (length, ratio, percentage, fill, min, max)
- a margin (horizontal and vertical), the space between the edge of the main area and the split areas
- a flex option that controls space distribution
- a spacing option that controls gaps between segments
The algorithm used to compute the layout is based on the kasuari solver, a linear constraint
solver that computes positions and sizes to satisfy as many constraints as possible in order of
their priorities.
When the layout is computed, the result is cached in a thread-local cache, so that subsequent
calls with the same parameters are faster. The cache is a LruCache, and the size of the cache
can be configured using Layout::init_cache() when the layout-cache feature is enabled.
§Construction
default- Create a layout with default values (vertical direction, no constraints, no margin)new- Create a new layout with a given direction and constraintsvertical- Create a new vertical layout with the given constraintshorizontal- Create a new horizontal layout with the given constraints
§Configuration
direction- Set the direction of the layoutconstraints- Set the constraints of the layoutmargin- Set uniform margin on all sideshorizontal_margin- Set the horizontal margin of the layoutvertical_margin- Set the vertical margin of the layoutflex- Set the way space is distributed when constraints are satisfiedspacing- Set the gap between the constraints of the layout
§Layout Operations
areas- Split area into fixed number of rectangles (compile-time known)spacers- Get spacer rectangles between layout areassplit- Split area into rectangles (runtime determined count)split_with_spacers- Split area and return both areas and spacers
§Cache Management
init_cache- Initialize layout cache with custom size
§Example
use ratatui_core::buffer::Buffer;
use ratatui_core::layout::{Constraint, Direction, Layout, Rect};
use ratatui_core::text::Text;
use ratatui_core::widgets::Widget;
fn render(area: Rect, buf: &mut Buffer) {
let layout = Layout::vertical([Constraint::Length(5), Constraint::Fill(1)]);
let [top, bottom] = layout.areas(area);
Text::from("foo").render(top, buf);
Text::from("bar").render(bottom, buf);
}See the layout, flex, and constraints examples in the Examples folder for more details
about how to use layouts.
For comprehensive layout documentation and examples, see the layout module.
Implementations§
Source§impl Layout
impl Layout
Sourcepub const DEFAULT_CACHE_SIZE: usize = 500usize
Available on crate feature layout-cache only.
pub const DEFAULT_CACHE_SIZE: usize = 500usize
layout-cache only.This is a somewhat arbitrary size for the layout cache based on adding the columns and rows
on my laptop’s terminal (171+51 = 222) and doubling it for good measure and then adding a
bit more to make it a round number. This gives enough entries to store a layout for every
row and every column, twice over, which should be enough for most apps. For those that need
more, the cache size can be set with Layout::init_cache() (requires the layout-cache
feature).
Sourcepub fn new<I>(direction: Direction, constraints: I) -> Self
pub fn new<I>(direction: Direction, constraints: I) -> Self
Creates a new layout with default values.
The constraints parameter accepts any type that implements IntoIterator<Item = Into<Constraint>>. This includes arrays, slices, vectors, iterators. Into<Constraint> is
implemented on u16, so you can pass an array, Vec, etc. of u16 to this function to
create a layout with fixed size chunks.
Default values for the other fields are:
margin: 0, 0flex:Flex::Startspacing: 0
§Examples
use ratatui_core::layout::{Constraint, Direction, Layout};
Layout::new(
Direction::Horizontal,
[Constraint::Length(5), Constraint::Fill(1)],
);
Layout::new(
Direction::Vertical,
[1, 2, 3].iter().map(|&c| Constraint::Length(c)),
);
Layout::new(Direction::Horizontal, vec![1, 2]);Sourcepub fn vertical<I>(constraints: I) -> Self
pub fn vertical<I>(constraints: I) -> Self
Creates a new vertical layout with default values.
The constraints parameter accepts any type that implements IntoIterator<Item = Into<Constraint>>. This includes arrays, slices, vectors, iterators, etc.
§Examples
use ratatui_core::layout::{Constraint, Layout};
let layout = Layout::vertical([Constraint::Length(5), Constraint::Fill(1)]);Sourcepub fn horizontal<I>(constraints: I) -> Self
pub fn horizontal<I>(constraints: I) -> Self
Creates a new horizontal layout with default values.
The constraints parameter accepts any type that implements IntoIterator<Item = Into<Constraint>>. This includes arrays, slices, vectors, iterators, etc.
§Examples
use ratatui_core::layout::{Constraint, Layout};
let layout = Layout::horizontal([Constraint::Length(5), Constraint::Fill(1)]);Sourcepub fn init_cache(cache_size: NonZeroUsize)
Available on crate feature layout-cache only.
pub fn init_cache(cache_size: NonZeroUsize)
layout-cache only.Initialize an empty cache with a custom size. The cache is keyed on the layout and area, so
that subsequent calls with the same parameters are faster. The cache is a LruCache, and
grows until cache_size is reached.
By default, the cache size is Self::DEFAULT_CACHE_SIZE.
Sourcepub const fn direction(self, direction: Direction) -> Self
pub const fn direction(self, direction: Direction) -> Self
Set the direction of the layout.
§Examples
use ratatui_core::layout::{Constraint, Direction, Layout, Rect};
let layout = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Length(5), Constraint::Fill(1)])
.split(Rect::new(0, 0, 10, 10));
assert_eq!(layout[..], [Rect::new(0, 0, 5, 10), Rect::new(5, 0, 5, 10)]);
let layout = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Length(5), Constraint::Fill(1)])
.split(Rect::new(0, 0, 10, 10));
assert_eq!(layout[..], [Rect::new(0, 0, 10, 5), Rect::new(0, 5, 10, 5)]);Sourcepub fn constraints<I>(self, constraints: I) -> Self
pub fn constraints<I>(self, constraints: I) -> Self
Sets the constraints of the layout.
The constraints parameter accepts any type that implements IntoIterator<Item = Into<Constraint>>. This includes arrays, slices, vectors, iterators. Into<Constraint> is
implemented on u16, so you can pass an array or vec of u16 to this function to create a
layout with fixed size chunks.
Note that the constraints are applied to the whole area that is to be split, so using percentages and ratios with the other constraints may not have the desired effect of splitting the area up. (e.g. splitting 100 into [min 20, 50%, 50%], may not result in [20, 40, 40] but rather an indeterminate result between [20, 50, 30] and [20, 30, 50]).
§Examples
use ratatui_core::layout::{Constraint, Layout, Rect};
let layout = Layout::default()
.constraints([
Constraint::Percentage(20),
Constraint::Ratio(1, 5),
Constraint::Length(2),
Constraint::Min(2),
Constraint::Max(2),
])
.split(Rect::new(0, 0, 10, 10));
assert_eq!(
layout[..],
[
Rect::new(0, 0, 10, 2),
Rect::new(0, 2, 10, 2),
Rect::new(0, 4, 10, 2),
Rect::new(0, 6, 10, 2),
Rect::new(0, 8, 10, 2),
]
);
Layout::default().constraints([Constraint::Fill(1)]);
Layout::default().constraints(&[Constraint::Fill(1)]);
Layout::default().constraints(vec![Constraint::Fill(1)]);
Layout::default().constraints([Constraint::Fill(1)].iter().filter(|_| true));
Layout::default().constraints([1, 2, 3].iter().map(|&c| Constraint::Length(c)));
Layout::default().constraints([1, 2, 3]);
Layout::default().constraints(vec![1, 2, 3]);Sourcepub const fn margin(self, margin: u16) -> Self
pub const fn margin(self, margin: u16) -> Self
Set the margin of the layout.
§Examples
use ratatui_core::layout::{Constraint, Layout, Rect};
let layout = Layout::default()
.constraints([Constraint::Fill(1)])
.margin(2)
.split(Rect::new(0, 0, 10, 10));
assert_eq!(layout[..], [Rect::new(2, 2, 6, 6)]);Sourcepub const fn horizontal_margin(self, horizontal: u16) -> Self
pub const fn horizontal_margin(self, horizontal: u16) -> Self
Set the horizontal margin of the layout.
§Examples
use ratatui_core::layout::{Constraint, Layout, Rect};
let layout = Layout::default()
.constraints([Constraint::Fill(1)])
.horizontal_margin(2)
.split(Rect::new(0, 0, 10, 10));
assert_eq!(layout[..], [Rect::new(2, 0, 6, 10)]);Sourcepub const fn vertical_margin(self, vertical: u16) -> Self
pub const fn vertical_margin(self, vertical: u16) -> Self
Set the vertical margin of the layout.
§Examples
use ratatui_core::layout::{Constraint, Layout, Rect};
let layout = Layout::default()
.constraints([Constraint::Fill(1)])
.vertical_margin(2)
.split(Rect::new(0, 0, 10, 10));
assert_eq!(layout[..], [Rect::new(0, 2, 10, 6)]);Sourcepub const fn flex(self, flex: Flex) -> Self
pub const fn flex(self, flex: Flex) -> Self
The flex method allows you to specify the flex behavior of the layout.
§Arguments
flex: AFlexenum value that represents the flex behavior of the layout. It can be one of the following:Flex::Legacy: The last item is stretched to fill the excess space.Flex::Start: The items are aligned to the start of the layout.Flex::Center: The items are aligned to the center of the layout.Flex::End: The items are aligned to the end of the layout.Flex::SpaceBetween: The items are evenly distributed with equal space between them.Flex::SpaceAround: The items are evenly distributed with equal space around them, except the first and last items, which have half the space on their sides.Flex::SpaceEvenly: The items are evenly distributed with equal space around them.
§Examples
In this example, the items in the layout will be aligned to the start.
use ratatui_core::layout::Constraint::*;
use ratatui_core::layout::{Flex, Layout};
let layout = Layout::horizontal([Length(20), Length(20), Length(20)]).flex(Flex::Start);In this example, the items in the layout will be stretched equally to fill the available space.
use ratatui_core::layout::Constraint::*;
use ratatui_core::layout::{Flex, Layout};
let layout = Layout::horizontal([Length(20), Length(20), Length(20)]).flex(Flex::Legacy);Sourcepub fn spacing<T>(self, spacing: T) -> Self
pub fn spacing<T>(self, spacing: T) -> Self
Sets the spacing between items in the layout.
The spacing method sets the spacing between items in the layout. The spacing is applied
evenly between all segments. The spacing value represents the number of cells between each
item.
Spacing can be positive integers, representing gaps between segments; or negative integers
representing overlaps. Additionally, one of the variants of the Spacing enum can be
passed to this function. See the documentation of the Spacing enum for more information.
Note that if the layout has only one segment, the spacing will not be applied.
Also, spacing will not be applied for Flex::SpaceAround, Flex::SpaceEvenly and
Flex::SpaceBetween
§Examples
In this example, the spacing between each item in the layout is set to 2 cells.
use ratatui_core::layout::Constraint::*;
use ratatui_core::layout::Layout;
let layout = Layout::horizontal([Length(20), Length(20), Length(20)]).spacing(2);In this example, the spacing between each item in the layout is set to -1 cells, i.e. the three segments will have an overlapping border.
use ratatui_core::layout::Constraint::*;
use ratatui_core::layout::Layout;
let layout = Layout::horizontal([Length(20), Length(20), Length(20)]).spacing(-1);Sourcepub fn areas<const N: usize>(&self, area: Rect) -> [Rect; N]
pub fn areas<const N: usize>(&self, area: Rect) -> [Rect; N]
Split the rect into a number of sub-rects according to the given Layout.
An ergonomic wrapper around Layout::split that returns an array of Rects instead of
Rc<[Rect]>.
This method requires the number of constraints to be known at compile time. If you don’t
know the number of constraints at compile time, use Layout::split instead.
§Panics
Panics if the number of constraints is not equal to the length of the returned array.
§Examples
use ratatui_core::layout::{Constraint, Layout, Rect};
let area = Rect::new(0, 0, 10, 10);
let layout = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)]);
let [top, main] = layout.areas(area);
// or explicitly specify the number of constraints:
let areas = layout.areas::<2>(area);Sourcepub fn try_areas<const N: usize>(
&self,
area: Rect,
) -> Result<[Rect; N], TryFromSliceError>
pub fn try_areas<const N: usize>( &self, area: Rect, ) -> Result<[Rect; N], TryFromSliceError>
Split the rect into a number of sub-rects according to the given Layout.
An ergonomic wrapper around Layout::split that returns an array of Rects instead of
Rc<[Rect]>.
This method requires the number of constraints to be known at compile time. If you don’t
know the number of constraints at compile time, use Layout::split instead.
§Errors
Returns an error if the number of constraints is not equal to the length of the returned array.
§Examples
use ratatui_core::layout::{Constraint, Layout, Rect};
let area = Rect::new(0, 0, 10, 10);
let layout = Layout::vertical([Constraint::Length(1), Constraint::Min(0)]);
let [top, main] = layout.try_areas(area)?;
// or explicitly specify the number of constraints:
let areas = layout.try_areas::<2>(area)?;Sourcepub fn spacers<const N: usize>(&self, area: Rect) -> [Rect; N]
pub fn spacers<const N: usize>(&self, area: Rect) -> [Rect; N]
Split the rect into a number of sub-rects according to the given Layout and return just
the spacers between the areas.
This method requires the number of constraints to be known at compile time. If you don’t
know the number of constraints at compile time, use Layout::split_with_spacers instead.
This method is similar to Layout::areas, and can be called with the same parameters, but
it returns just the spacers between the areas. The result of calling the areas method is
cached, so this will generally not re-run the solver, but will just return the cached
result.
§Panics
Panics if the number of constraints + 1 is not equal to the length of the returned array.
§Examples
use ratatui_core::layout::{Constraint, Layout, Rect};
let area = Rect::new(0, 0, 10, 10);
let layout = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)]);
let [top, main] = layout.areas(area);
let [before, inbetween, after] = layout.spacers(area);
// or explicitly specify the number of constraints:
let spacers = layout.spacers::<3>(area);Sourcepub fn split(&self, area: Rect) -> Rc<[Rect]>
pub fn split(&self, area: Rect) -> Rc<[Rect]>
Wrapper function around the kasuari solver to be able to split a given area into
smaller ones based on the preferred widths or heights and the direction.
Note that the constraints are applied to the whole area that is to be split, so using percentages and ratios with the other constraints may not have the desired effect of splitting the area up. (e.g. splitting 100 into [min 20, 50%, 50%], may not result in [20, 40, 40] but rather an indeterminate result between [20, 50, 30] and [20, 30, 50]).
This method stores the result of the computation in a thread-local cache keyed on the layout
and area, so that subsequent calls with the same parameters are faster. The cache is a
LruCache, and grows until Self::DEFAULT_CACHE_SIZE is reached by default. If the cache
is initialized with Layout::init_cache(), it grows until the initialized cache size.
There is a helper method that can be used to split the whole area into smaller ones based on
the layout: Layout::areas(). That method is a shortcut for calling this method. It
allows you to destructure the result directly into variables, which is useful when you know
at compile time the number of areas that will be created.
§Examples
use ratatui_core::layout::{Constraint, Direction, Layout, Rect};
let layout = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Length(5), Constraint::Fill(1)])
.split(Rect::new(2, 2, 10, 10));
assert_eq!(layout[..], [Rect::new(2, 2, 10, 5), Rect::new(2, 7, 10, 5)]);
let layout = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Ratio(1, 3), Constraint::Ratio(2, 3)])
.split(Rect::new(0, 0, 9, 2));
assert_eq!(layout[..], [Rect::new(0, 0, 3, 2), Rect::new(3, 0, 6, 2)]);Sourcepub fn split_with_spacers(&self, area: Rect) -> (Rc<[Rect]>, Rc<[Rect]>)
pub fn split_with_spacers(&self, area: Rect) -> (Rc<[Rect]>, Rc<[Rect]>)
Wrapper function around the kasuari solver that splits the given area into smaller ones
based on the preferred widths or heights and the direction, with the ability to include
spacers between the areas.
This method is similar to split, but it returns two sets of rectangles: one for the areas
and one for the spacers.
This method stores the result of the computation in a thread-local cache keyed on the layout
and area, so that subsequent calls with the same parameters are faster. The cache is a
LruCache, and grows until Self::DEFAULT_CACHE_SIZE is reached by default. If the cache
is initialized with Layout::init_cache(), it grows until the initialized cache size.
§Examples
use ratatui_core::layout::{Constraint, Direction, Layout, Rect};
let (areas, spacers) = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Length(5), Constraint::Fill(1)])
.split_with_spacers(Rect::new(2, 2, 10, 10));
assert_eq!(areas[..], [Rect::new(2, 2, 10, 5), Rect::new(2, 7, 10, 5)]);
assert_eq!(
spacers[..],
[
Rect::new(2, 2, 10, 0),
Rect::new(2, 7, 10, 0),
Rect::new(2, 12, 10, 0)
]
);
let (areas, spacers) = Layout::default()
.direction(Direction::Horizontal)
.spacing(1)
.constraints([Constraint::Ratio(1, 3), Constraint::Ratio(2, 3)])
.split_with_spacers(Rect::new(0, 0, 10, 2));
assert_eq!(areas[..], [Rect::new(0, 0, 3, 2), Rect::new(4, 0, 6, 2)]);
assert_eq!(
spacers[..],
[
Rect::new(0, 0, 0, 2),
Rect::new(3, 0, 1, 2),
Rect::new(10, 0, 0, 2)
]
);Trait Implementations§
Source§impl<'de> Deserialize<'de> for Layout
impl<'de> Deserialize<'de> for Layout
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for Layout
impl StructuralPartialEq for Layout
Auto Trait Implementations§
impl Freeze for Layout
impl RefUnwindSafe for Layout
impl Send for Layout
impl Sync for Layout
impl Unpin for Layout
impl UnwindSafe for Layout
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more