pub struct Frame<'a> { /* private fields */ }Expand description
A consistent view into the terminal state for rendering a single frame.
You usually get a Frame from the closure argument of Terminal::draw /
Terminal::try_draw. For manual rendering, use
Terminal::get_frame.
A Frame is used to render widgets into Ratatui’s current buffer and request the cursor state
for the end of the render pass.
The changes drawn to the frame are applied only to the current Buffer. After the closure
returns, the current buffer is compared to the previous buffer and only the changed cells are
sent to the backend. This avoids drawing redundant cells.
Implementations§
Source§impl Frame<'_>
impl Frame<'_>
Sourcepub const fn area(&self) -> Rect
pub const fn area(&self) -> Rect
Returns the area of the current frame.
This is guaranteed not to change during rendering, so may be called multiple times.
If your app listens for a resize event from the backend, ignore that event’s dimensions for calculations performed during the current render callback and use this value instead. It is the area of the buffer that is actually being rendered for this pass.
Sourcepub const fn size(&self) -> Rect
👎Deprecated: use area() instead
pub const fn size(&self) -> Rect
use area() instead
Returns the area of the current frame.
This is guaranteed not to change during rendering, so may be called multiple times.
If your app listens for a resize event from the backend, ignore that event’s dimensions for calculations performed during the current render callback and use this value instead. It is the area of the buffer that is actually being rendered for this pass.
Sourcepub fn render_widget<W>(&mut self, widget: W, area: Rect)where
W: Widget,
pub fn render_widget<W>(&mut self, widget: W, area: Rect)where
W: Widget,
Render a Widget to the current buffer using Widget::render.
Usually the area argument is the size of the current frame or a sub-area of the current
frame (which can be obtained using Layout to split the total area).
Rendering writes directly into the current frame buffer. If multiple widgets cover the same cells, later renders win for those cells.
§Example
use ratatui_core::layout::Rect;
let area = Rect::new(0, 0, 5, 5);
frame.render_widget("Hello", area);Sourcepub fn render_stateful_widget<W>(
&mut self,
widget: W,
area: Rect,
state: &mut <W as StatefulWidget>::State,
)where
W: StatefulWidget,
pub fn render_stateful_widget<W>(
&mut self,
widget: W,
area: Rect,
state: &mut <W as StatefulWidget>::State,
)where
W: StatefulWidget,
Render a StatefulWidget to the current buffer using StatefulWidget::render.
Usually the area argument is the size of the current frame or a sub-area of the current
frame (which can be obtained using Layout to split the total area).
The last argument should be an instance of the StatefulWidget::State associated to the
given StatefulWidget.
Like Frame::render_widget, this writes directly into the current frame buffer. The
widget owns how it interprets and mutates the provided state.
§Example
use ratatui_core::widgets::StatefulWidget;
struct DemoWidget;
impl StatefulWidget for DemoWidget {
type State = bool;
fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) {
let symbol = if *state { "Y" } else { "N" };
buf[(area.x, area.y)].set_symbol(symbol);
}
}
let mut state = true;
let area = Rect::new(0, 0, 5, 5);
frame.render_stateful_widget(DemoWidget, area, &mut state);Sourcepub fn set_cursor_position<P>(&mut self, position: P)
pub fn set_cursor_position<P>(&mut self, position: P)
After this frame is rendered, make the cursor visible and put it at the specified (x, y)
coordinates. If this method is not called, the cursor will be hidden.
The cursor is applied after Ratatui flushes the frame’s buffer diff to the backend.
Note that this will interfere with calls to Terminal::hide_cursor,
Terminal::show_cursor, and Terminal::set_cursor_position. Pick one of the APIs and
stick with it.
Sourcepub fn set_cursor(&mut self, x: u16, y: u16)
👎Deprecated: use set_cursor_position((x, y)) instead which takes impl Into<Position>
pub fn set_cursor(&mut self, x: u16, y: u16)
use set_cursor_position((x, y)) instead which takes impl Into<Position>
After this frame is rendered, make the cursor visible and put it at the specified (x, y)
coordinates. If this method is not called, the cursor will be hidden.
Note that this will interfere with calls to Terminal::hide_cursor,
Terminal::show_cursor, and Terminal::set_cursor_position. Pick one of the APIs and
stick with it.
Sourcepub const fn buffer_mut(&mut self) -> &mut Buffer
pub const fn buffer_mut(&mut self) -> &mut Buffer
Gets the buffer that this Frame draws into as a mutable reference.
This is an escape hatch for direct buffer manipulation. Normal applications should prefer the widget rendering methods so layout and rendering intent stay visible at the call site.
Use this when tests, custom widgets, or specialized integrations need direct cell access during a render pass.
Changes written here are not visible on the backend until the render pass is applied by
Terminal::flush or a full
Terminal::draw /
Terminal::try_draw pass.
§Example
frame.buffer_mut()[(0, 0)].set_symbol("h");Sourcepub const fn count(&self) -> usize
pub const fn count(&self) -> usize
Returns the current frame count.
This method provides access to the frame count, which is a sequence number indicating how many frames have been rendered up to (but not including) this one. It can be used for purposes such as animation, performance tracking, or debugging.
Each time a frame has been rendered, this count is incremented,
providing a consistent way to reference the order and number of frames processed by the
terminal. When count reaches its maximum value (usize::MAX), it wraps around to zero.
This count is particularly useful when dealing with dynamic content or animations where the state of the display changes over time. By tracking the frame count, developers can synchronize updates or changes to the content with the rendering process.
§Examples
let current_count = frame.count();
println!("Current frame count: {}", current_count);Trait Implementations§
Source§impl FrameExt for Frame<'_>
Available on crate feature unstable-widget-ref only.
impl FrameExt for Frame<'_>
unstable-widget-ref only.Source§fn render_widget_ref<W: WidgetRef>(&mut self, widget: W, area: Rect)
fn render_widget_ref<W: WidgetRef>(&mut self, widget: W, area: Rect)
Source§fn render_stateful_widget_ref<W>(
&mut self,
widget: W,
area: Rect,
state: &mut W::State,
)where
W: StatefulWidgetRef,
fn render_stateful_widget_ref<W>(
&mut self,
widget: W,
area: Rect,
state: &mut W::State,
)where
W: StatefulWidgetRef,
Auto Trait Implementations§
impl<'a> !UnwindSafe for Frame<'a>
impl<'a> Freeze for Frame<'a>
impl<'a> RefUnwindSafe for Frame<'a>
impl<'a> Send for Frame<'a>
impl<'a> Sync for Frame<'a>
impl<'a> Unpin for Frame<'a>
impl<'a> UnsafeUnpin for Frame<'a>
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, 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<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