ratatui_kit/hooks/
use_size.rs1use crossterm::{event::Event, terminal};
2use ratatui::layout::Rect;
3
4use crate::{Hook, UseEvents, UseState};
5
6mod private {
7 pub trait Sealed {}
8 impl Sealed for crate::Hooks<'_, '_> {}
9}
10
11pub trait UseTerminalSize: private::Sealed {
13 fn use_terminal_size(&mut self) -> (u16, u16);
14}
15
16impl UseTerminalSize for crate::Hooks<'_, '_> {
17 fn use_terminal_size(&mut self) -> (u16, u16) {
18 let mut size = self.use_state(|| terminal::size().unwrap_or((0, 0)));
19
20 self.use_events(move |event| {
21 if let Event::Resize(width, height) = event {
22 size.set((width, height));
23 }
24 });
25
26 size.get()
27 }
28}
29
30pub trait UsePreviousSize: private::Sealed {
32 fn use_previous_size(&mut self) -> Rect;
33}
34
35pub struct UsePreviousSizeImpl {
36 size: Rect,
37}
38
39impl Default for UsePreviousSizeImpl {
40 fn default() -> Self {
41 Self::new()
42 }
43}
44
45impl UsePreviousSizeImpl {
46 pub fn new() -> Self {
47 UsePreviousSizeImpl {
48 size: Rect::default(),
49 }
50 }
51}
52
53impl Hook for UsePreviousSizeImpl {
54 fn pre_component_draw(&mut self, drawer: &mut crate::ComponentDrawer) {
55 self.size = drawer.area;
56 }
57}
58
59impl UsePreviousSize for crate::Hooks<'_, '_> {
60 fn use_previous_size(&mut self) -> Rect {
61 let hook = self.use_hook(UsePreviousSizeImpl::new);
62 hook.size
63 }
64}