Crates.io | rat-reloc |
lib.rs | rat-reloc |
version | 0.2.0 |
source | src |
created_at | 2024-11-01 19:51:37.236351 |
updated_at | 2024-11-01 19:51:37.236351 |
description | relocate widgets after rendering |
homepage | |
repository | https://github.com/thscharler/rat-reloc |
max_upload_size | |
id | 1432242 |
size | 8,690 |
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. This trait defines a relocate function that corrects the areas afterwards.
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);
}
}