bubbles/components/
input.rs

1use crossterm::{
2    event::{KeyEvent, MouseEvent},
3    style::Stylize,
4};
5
6use crate::core::{
7    component::Component, dimension::Dimension, events::EventHandler, lifecycle::LifeCycle,
8    render::Render, renderer::Renderer, style::Style, view::View,
9};
10
11/// Input bar
12pub struct Input<'a> {
13    pub value: String,
14    pub style: Style,
15    pub dimension: Dimension,
16    pub renderer: Renderer<'a, Self>,
17}
18
19impl<'a> Input<'a> {
20    const PLACEHOLDER: &'static str = "Type here...";
21
22    pub fn new(
23        value: String,
24        style: Style,
25        dimension: Dimension,
26        renderer: Renderer<'a, Self>,
27    ) -> Self {
28        Self {
29            value,
30            style,
31            dimension,
32            renderer,
33        }
34    }
35}
36
37impl Default for Input<'_> {
38    fn default() -> Self {
39        Self {
40            value: Input::PLACEHOLDER.to_string(),
41            dimension: Dimension::default(),
42            style: Style::default(),
43            renderer: Renderer::default(),
44        }
45    }
46}
47
48impl Render for Input<'_> {
49    fn render(&self) -> View {
50        View {
51            color: self.style.color,
52            dimension: self.dimension,
53            background: self.style.background,
54            content: self.value.to_owned().with(self.style.color).to_string(),
55        }
56    }
57}
58
59impl LifeCycle for Input<'_> {
60    fn handle_mount(&mut self) {}
61
62    fn handle_render(&mut self) {
63        (self.renderer.on_render)(self)
64    }
65
66    fn handle_unmount(&mut self) {}
67}
68
69impl Component for Input<'_> {}
70
71impl EventHandler for Input<'_> {
72    fn handle_key_event(&mut self, event: KeyEvent) {
73        (self.renderer.on_key_press)(self, event);
74    }
75
76    fn handle_mouse_event(&mut self, _event: MouseEvent) {}
77
78    fn handle_paste_event(&mut self, _event: MouseEvent) {}
79}