Skip to main content

ratatui_kit/components/adapter/
widget.rs

1use crate::{Component, Props};
2use ratatui::widgets::Widget;
3
4pub struct WidgetAdapterProps<T>
5where
6    T: 'static,
7{
8    pub inner: T,
9}
10
11impl<T: 'static> Props for WidgetAdapterProps<T> {}
12
13pub struct WidgetAdapter<T>
14where
15    T: 'static,
16{
17    inner: T,
18}
19
20impl<T> Component for WidgetAdapter<T>
21where
22    T: 'static + Unpin + Clone,
23    // 0.30 起所有内置 widget 都实现了 `Widget for &T`(ratatui 官方推荐写法,
24    // 见 ratatui-core widget.rs 文档)。借此约束即可在 draw 里按引用渲染。
25    for<'a> &'a T: Widget,
26{
27    type Props<'a> = WidgetAdapterProps<T>;
28
29    fn new(props: &Self::Props<'_>) -> Self {
30        Self {
31            inner: props.inner.clone(),
32        }
33    }
34
35    fn update(
36        &mut self,
37        props: &mut Self::Props<'_>,
38        _hooks: crate::Hooks,
39        _updater: &mut crate::ComponentUpdater,
40    ) {
41        self.inner = props.inner.clone();
42    }
43
44    fn draw(&mut self, drawer: &mut crate::ComponentDrawer<'_, '_>) {
45        // 按引用渲染,免去每帧一次 clone(渲染热路径)。new/update 仍需 Clone 从
46        // 借用的 props 把 widget 拷进持久组件,无法省去。
47        drawer.render_widget(&self.inner, drawer.area);
48    }
49}