bubbles/core/
renderer.rs

1use crossterm::event::{KeyEvent, MouseEvent};
2
3pub(crate) fn default_view<'a, T>(_: &'a mut T) {}
4pub(crate) fn default_key_event<'a, T>(_: &'a mut T, _: KeyEvent) {}
5pub(crate) fn default_mouse_event<'a, T>(_: &'a mut T, _: MouseEvent) {}
6
7pub struct OnMount<'a, T>(pub &'a dyn Fn(&mut T));
8pub struct OnRender<'a, T>(pub &'a dyn Fn(&mut T));
9pub struct OnUnmount<'a, T>(pub &'a dyn Fn(&mut T));
10pub struct OnKeyPress<'a, T>(pub &'a dyn Fn(&mut T, KeyEvent));
11pub struct OnClickLeft<'a, T>(pub &'a dyn Fn(&mut T, MouseEvent));
12pub struct OnClickRight<'a, T>(pub &'a dyn Fn(&mut T, MouseEvent));
13
14pub struct Renderer<'a, T> {
15    pub on_mount: &'a dyn Fn(&mut T),
16    pub on_render: &'a dyn Fn(&mut T),
17    pub on_unmount: &'a dyn Fn(&mut T),
18
19    pub on_key_press: &'a dyn Fn(&mut T, KeyEvent),
20    pub on_click_left: &'a dyn Fn(&mut T, MouseEvent),
21    pub on_click_right: &'a dyn Fn(&mut T, MouseEvent),
22}
23
24impl<'a, T> Renderer<'a, T> {
25    pub fn new(
26        on_mount: &'a dyn Fn(&mut T),
27        on_render: &'a dyn Fn(&mut T),
28        on_unmount: &'a dyn Fn(&mut T),
29        on_key_press: &'a dyn Fn(&mut T, KeyEvent),
30        on_click_left: &'a dyn Fn(&mut T, MouseEvent),
31        on_click_right: &'a dyn Fn(&mut T, MouseEvent),
32    ) -> Self {
33        Self {
34            on_mount,
35            on_render,
36            on_unmount,
37            on_key_press,
38            on_click_left,
39            on_click_right,
40        }
41    }
42}
43
44impl<T> Default for Renderer<'_, T> {
45    fn default() -> Self {
46        Self {
47            on_mount: &default_view,
48            on_render: &default_view,
49            on_unmount: &default_view,
50            on_key_press: &default_key_event,
51            on_click_left: &default_mouse_event,
52            on_click_right: &default_mouse_event,
53        }
54    }
55}
56
57impl<'a, T> From<OnMount<'a, T>> for Renderer<'a, T> {
58    fn from(OnMount(on_mount): OnMount<'a, T>) -> Self {
59        Self {
60            on_mount,
61            ..Renderer::default()
62        }
63    }
64}
65
66impl<'a, T> From<OnRender<'a, T>> for Renderer<'a, T> {
67    fn from(OnRender(on_render): OnRender<'a, T>) -> Self {
68        Self {
69            on_render,
70            ..Renderer::default()
71        }
72    }
73}
74
75impl<'a, T> From<OnUnmount<'a, T>> for Renderer<'a, T> {
76    fn from(OnUnmount(on_unmount): OnUnmount<'a, T>) -> Self {
77        Self {
78            on_unmount,
79            ..Renderer::default()
80        }
81    }
82}
83
84impl<'a, T> From<OnKeyPress<'a, T>> for Renderer<'a, T> {
85    fn from(OnKeyPress(on_key_press): OnKeyPress<'a, T>) -> Self {
86        Self {
87            on_key_press,
88            ..Renderer::default()
89        }
90    }
91}
92
93impl<'a, T> From<OnClickLeft<'a, T>> for Renderer<'a, T> {
94    fn from(OnClickLeft(on_click_left): OnClickLeft<'a, T>) -> Self {
95        Self {
96            on_click_left,
97            ..Renderer::default()
98        }
99    }
100}
101
102impl<'a, T> From<OnClickRight<'a, T>> for Renderer<'a, T> {
103    fn from(OnClickRight(on_click_right): OnClickRight<'a, T>) -> Self {
104        Self {
105            on_click_right,
106            ..Renderer::default()
107        }
108    }
109}