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}