pub struct Rect {
pub x: u16,
pub y: u16,
pub width: u16,
pub height: u16,
}Expand description
A rectangular area in the terminal.
A Rect represents a rectangular region in the terminal coordinate system, defined by its
top-left corner position and dimensions. This is the fundamental building block for all layout
operations and widget rendering in Ratatui.
Rectangles are used throughout the layout system to define areas where widgets can be rendered.
They are typically created by Layout operations that divide terminal space, but can also be
manually constructed for specific positioning needs.
The coordinate system uses the top-left corner as the origin (0, 0), with x increasing to the right and y increasing downward. All measurements are in character cells.
§Construction and Conversion
new- Create a new rectangle from coordinates and dimensionsas_position- Convert to a position at the top-left corneras_size- Convert to a size representing the dimensionsfrom((Position, Size))- Create from(Position, Size)tuplefrom(((u16, u16), (u16, u16)))- Create from((u16, u16), (u16, u16))coordinate and dimension tuples- [
into((Position, Size))] - Convert to(Position, Size)tuple default- Create a zero-sized rectangle at origin
§Geometry and Properties
area- Calculate the total area in character cellsis_empty- Check if the rectangle has zero arealeft,right,top,bottom- Get edge coordinates
§Spatial Operations
inner,outer- Apply margins to shrink or expandoffset- Move the rectangle by a relative amountunion- Combine with another rectangle to create a bounding boxintersection- Find the overlapping area with another rectangleclamp- Constrain the rectangle to fit within another
§Positioning and Centering
centered_horizontally- Center horizontally within a constraintcentered_vertically- Center vertically within a constraintcentered- Center both horizontally and vertically
§Testing and Iteration
contains- Check if a position is within the rectangleintersects- Check if it overlaps with another rectanglerows- Iterate over horizontal rows within the rectanglecolumns- Iterate over vertical columns within the rectanglepositions- Iterate over all positions within the rectangle
§Examples
use ratatui_core::layout::{Position, Rect, Size};
// Create a rectangle manually
let rect = Rect::new(10, 5, 80, 20);
assert_eq!(rect.x, 10);
assert_eq!(rect.y, 5);
assert_eq!(rect.width, 80);
assert_eq!(rect.height, 20);
// Create from position and size
let rect = Rect::from((Position::new(10, 5), Size::new(80, 20)));For comprehensive layout documentation and examples, see the layout module.
Fields§
§x: u16The x coordinate of the top left corner of the Rect.
y: u16The y coordinate of the top left corner of the Rect.
width: u16The width of the Rect.
height: u16The height of the Rect.
Implementations§
Source§impl Rect
impl Rect
Sourcepub const fn new(x: u16, y: u16, width: u16, height: u16) -> Rect
pub const fn new(x: u16, y: u16, width: u16, height: u16) -> Rect
Creates a new Rect, with width and height limited to keep both bounds within u16.
If the width or height would cause the right or bottom coordinate to be larger than the
maximum value of u16, the width or height will be clamped to keep the right or bottom
coordinate within u16.
§Examples
use ratatui_core::layout::Rect;
let rect = Rect::new(1, 2, 3, 4);Sourcepub const fn area(self) -> u32
pub const fn area(self) -> u32
The area of the Rect. If the area is larger than the maximum value of u16, it will be
clamped to u16::MAX.
Sourcepub const fn right(self) -> u16
pub const fn right(self) -> u16
Returns the right coordinate of the Rect. This is the first coordinate outside of the
Rect.
If the right coordinate is larger than the maximum value of u16, it will be clamped to
u16::MAX.
Sourcepub const fn bottom(self) -> u16
pub const fn bottom(self) -> u16
Returns the bottom coordinate of the Rect. This is the first coordinate outside of the
Rect.
If the bottom coordinate is larger than the maximum value of u16, it will be clamped to
u16::MAX.
Sourcepub const fn inner(self, margin: Margin) -> Rect
pub const fn inner(self, margin: Margin) -> Rect
Returns a new Rect inside the current one, with the given margin on each side.
If the margin is larger than the Rect, the returned Rect will have no area.
Sourcepub const fn outer(self, margin: Margin) -> Rect
pub const fn outer(self, margin: Margin) -> Rect
Returns a new Rect outside the current one, with the given margin applied on each side.
If the margin causes the Rect’s bounds to outsdie the range of a u16, the Rect will
be truncated to keep the bounds within u16. This will cause the size of the Rect to
change.
The generated Rect may not fit inside the buffer or containing area, so it consider
constraining the resulting Rect with Rect::clamp before using it.
Sourcepub fn union(self, other: Rect) -> Rect
pub fn union(self, other: Rect) -> Rect
Returns a new Rect that contains both the current one and the given one.
Sourcepub fn intersection(self, other: Rect) -> Rect
pub fn intersection(self, other: Rect) -> Rect
Returns a new Rect that is the intersection of the current one and the given one.
If the two Rects do not intersect, the returned Rect will have no area.
Sourcepub const fn intersects(self, other: Rect) -> bool
pub const fn intersects(self, other: Rect) -> bool
Returns true if the two Rects intersect.
Sourcepub const fn contains(self, position: Position) -> bool
pub const fn contains(self, position: Position) -> bool
Returns true if the given position is inside the Rect.
The position is considered inside the Rect if it is on the Rect’s border.
§Examples
use ratatui_core::layout::{Position, Rect};
let rect = Rect::new(1, 2, 3, 4);
assert!(rect.contains(Position { x: 1, y: 2 }));Sourcepub fn clamp(self, other: Rect) -> Rect
pub fn clamp(self, other: Rect) -> Rect
Clamp this Rect to fit inside the other Rect.
If the width or height of this Rect is larger than the other Rect, it will be clamped to
the other Rect’s width or height.
If the left or top coordinate of this Rect is smaller than the other Rect, it will be
clamped to the other Rect’s left or top coordinate.
If the right or bottom coordinate of this Rect is larger than the other Rect, it will be
clamped to the other Rect’s right or bottom coordinate.
This is different from Rect::intersection because it will move this Rect to fit inside
the other Rect, while Rect::intersection instead would keep this Rect’s position and
truncate its size to only that which is inside the other Rect.
§Examples
use ratatui_core::layout::Rect;
let area = Rect::new(0, 0, 100, 100);
let rect = Rect::new(80, 80, 30, 30).clamp(area);
assert_eq!(rect, Rect::new(70, 70, 30, 30));Sourcepub const fn rows(self) -> Rows ⓘ
pub const fn rows(self) -> Rows ⓘ
An iterator over rows within the Rect.
Each row is a full Rect region with height 1 that can be used for rendering widgets
or as input to further layout methods.
§Example
use ratatui_core::buffer::Buffer;
use ratatui_core::layout::{Constraint, Layout, Rect};
use ratatui_core::widgets::Widget;
fn render_list(area: Rect, buf: &mut Buffer) {
// Renders "Item 0", "Item 1", etc. in each row
for (i, row) in area.rows().enumerate() {
format!("Item {i}").render(row, buf);
}
}
fn render_with_nested_layout(area: Rect, buf: &mut Buffer) {
// Splits each row into left/right areas and renders labels and content
for (i, row) in area.rows().take(3).enumerate() {
let [left, right] =
Layout::horizontal([Constraint::Percentage(30), Constraint::Fill(1)]).areas(row);
format!("{i}:").render(left, buf);
"Content".render(right, buf);
}
}Sourcepub const fn columns(self) -> Columns ⓘ
pub const fn columns(self) -> Columns ⓘ
An iterator over columns within the Rect.
Each column is a full Rect region with width 1 that can be used for rendering widgets
or as input to further layout methods.
§Example
use ratatui_core::buffer::Buffer;
use ratatui_core::layout::Rect;
use ratatui_core::widgets::Widget;
fn render_columns(area: Rect, buf: &mut Buffer) {
// Renders column indices (0-9 repeating) in each column
for (i, column) in area.columns().enumerate() {
format!("{}", i % 10).render(column, buf);
}
}Sourcepub const fn positions(self) -> Positions ⓘ
pub const fn positions(self) -> Positions ⓘ
An iterator over the positions within the Rect.
The positions are returned in a row-major order (left-to-right, top-to-bottom).
Each position is a Position that represents a single cell coordinate.
§Example
use ratatui_core::buffer::Buffer;
use ratatui_core::layout::{Position, Rect};
use ratatui_core::widgets::Widget;
fn render_positions(area: Rect, buf: &mut Buffer) {
// Renders position indices (0-9 repeating) at each cell position
for (i, position) in area.positions().enumerate() {
buf[position].set_symbol(&format!("{}", i % 10));
}
}Sourcepub const fn as_position(self) -> Position
pub const fn as_position(self) -> Position
Sourcepub fn centered_horizontally(self, constraint: Constraint) -> Rect
pub fn centered_horizontally(self, constraint: Constraint) -> Rect
Returns a new Rect, centered horizontally based on the provided constraint.
§Examples
use ratatui_core::layout::Constraint;
use ratatui_core::terminal::Frame;
fn render(frame: &mut Frame) {
let area = frame.area().centered_horizontally(Constraint::Ratio(1, 2));
}Sourcepub fn centered_vertically(self, constraint: Constraint) -> Rect
pub fn centered_vertically(self, constraint: Constraint) -> Rect
Returns a new Rect, centered vertically based on the provided constraint.
§Examples
use ratatui_core::layout::Constraint;
use ratatui_core::terminal::Frame;
fn render(frame: &mut Frame) {
let area = frame.area().centered_vertically(Constraint::Ratio(1, 2));
}Sourcepub fn centered(
self,
horizontal_constraint: Constraint,
vertical_constraint: Constraint,
) -> Rect
pub fn centered( self, horizontal_constraint: Constraint, vertical_constraint: Constraint, ) -> Rect
Returns a new Rect, centered horizontally and vertically based on the provided constraints.
§Examples
use ratatui_core::layout::Constraint;
use ratatui_core::terminal::Frame;
fn render(frame: &mut Frame) {
let area = frame
.area()
.centered(Constraint::Ratio(1, 2), Constraint::Ratio(1, 3));
}Sourcepub fn layout<const N: usize>(self, layout: &Layout) -> [Rect; N]
pub fn layout<const N: usize>(self, layout: &Layout) -> [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::Min(0)]);
let [top, main] = area.layout(&layout);
assert_eq!(top, Rect::new(0, 0, 10, 1));
assert_eq!(main, Rect::new(0, 1, 10, 9));
// or explicitly specify the number of constraints:
let areas = area.layout::<2>(&layout);
assert_eq!(areas, [Rect::new(0, 0, 10, 1), Rect::new(0, 1, 10, 9),]);Sourcepub fn layout_vec(self, layout: &Layout) -> Vec<Rect>
pub fn layout_vec(self, layout: &Layout) -> Vec<Rect>
Split the rect into a number of sub-rects according to the given Layout.
An ergonomic wrapper around Layout::split that returns a Vec of Rects instead of
Rc<[Rect]>.
§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 areas = area.layout_vec(&layout);
assert_eq!(areas, vec![Rect::new(0, 0, 10, 1), Rect::new(0, 1, 10, 9),]);Sourcepub fn try_layout<const N: usize>(
self,
layout: &Layout,
) -> Result<[Rect; N], TryFromSliceError>
pub fn try_layout<const N: usize>( self, layout: &Layout, ) -> Result<[Rect; N], TryFromSliceError>
Try to 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]>.
§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] = area.try_layout(&layout)?;
assert_eq!(top, Rect::new(0, 0, 10, 1));
assert_eq!(main, Rect::new(0, 1, 10, 9));
// or explicitly specify the number of constraints:
let areas = area.try_layout::<2>(&layout)?;
assert_eq!(areas, [Rect::new(0, 0, 10, 1), Rect::new(0, 1, 10, 9),]);Trait Implementations§
Source§impl<'de> Deserialize<'de> for Rect
impl<'de> Deserialize<'de> for Rect
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Rect, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Rect, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Serialize for Rect
impl Serialize for Rect
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl Copy for Rect
impl Eq for Rect
impl StructuralPartialEq for Rect
Auto Trait Implementations§
impl Freeze for Rect
impl RefUnwindSafe for Rect
impl Send for Rect
impl Sync for Rect
impl Unpin for Rect
impl UnwindSafe for Rect
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> ToCompactString for Twhere
T: Display,
impl<T> ToCompactString for Twhere
T: Display,
Source§fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>
fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>
ToCompactString::to_compact_string() Read moreSource§fn to_compact_string(&self) -> CompactString
fn to_compact_string(&self) -> CompactString
CompactString. Read moreSource§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