bubbles/components/
input.rs1use 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
11pub 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}