| Crates.io | rat-reloc |
| lib.rs | rat-reloc |
| version | 1.2.0 |
| created_at | 2024-11-01 19:51:37.236351+00 |
| updated_at | 2025-09-07 18:34:36.502835+00 |
| description | relocate widgets after rendering |
| homepage | |
| repository | https://github.com/thscharler/rat-salsa |
| max_upload_size | |
| id | 1432242 |
| size | 24,854 |
This crate is a part of rat-salsa.
RelocatableState enables rendering StatefulWidget's to a temporary buffer.
After rendering a stateful widget all areas derived from the render area will be wrong if the temporary buffer is rendered to screen at a different location and with some clipping.
This trait defines a relocate function that corrects the areas at some point after rendering the widget.
Doesn't impact normal rendering of the widget. It can just use the area and be done with it.
Straightforward
use rat_reloc::{RelocatableState, relocate_area};
use ratatui::layout::Rect;
# struct ButtonState{ area:Rect, inner:Rect}
impl RelocatableState for ButtonState {
fn relocate(&mut self, shift: (i16, i16), clip: Rect) {
self.area = relocate_area(self.area, shift, clip);
self.inner = relocate_area(self.inner, shift, clip);
}
}
Decent to implement for a view widget
use ratatui::layout::Rect;
use ratatui::buffer::Buffer;
use ratatui::widgets::StatefulWidget;
use rat_reloc::RelocatableState;
pub struct RelocatedRender;
impl RelocatedRender {
fn render<W, S>(widget: W, area: Rect, state: &mut S)
where
W: StatefulWidget<State = S>,
S: RelocatableState,
{
// remap area
let area = Rect::default();
// use inner buffer
let mut buf = Buffer::default();
// render to buffer
widget.render(area, &mut buf, state);
// calculate shift and clip
let shift = (-1, -1);
let clip = Rect::default();
// correct state
state.relocate(shift, clip);
}
}