slightly improved structure and added a few more elements

This commit is contained in:
2025-06-27 12:10:25 -05:00
parent dfb17ab48e
commit 15b61d57c8
11 changed files with 242 additions and 14 deletions
+91
View File
@@ -0,0 +1,91 @@
use std::sync::{Arc, Mutex};
use crossterm::event::KeyEvent;
use crate::{
event, event_handler, events::EventManager, extensions::keypress::KeyPressEventHandler, Element,
};
pub struct Input(String, usize, Arc<Mutex<EventManager>>);
impl Input {
pub fn new() -> Input {
Input(String::new(), 0, Arc::new(Mutex::new(EventManager::new())))
}
pub fn get_event(&self) -> Arc<Mutex<EventManager>> {
self.2.clone()
}
}
impl Element for Input {
fn init(&mut self, events: &mut crate::events::EventManager) {
event_handler!(Self, self, events, on_keypress);
}
fn render(&mut self, scope: &mut crate::render_scope::RenderScope) {
let mut s = self.0.clone();
if self.1 < self.0.len() {
s.insert_str(self.1 + 1, "\x1b[0m");
s.insert_str(self.1, "\x1b[42m");
} else {
s += "\x1b[42m \x1b[0m";
}
scope.draw_text(&s);
}
fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
self
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
}
impl KeyPressEventHandler for Input {
fn on_keypress(&mut self, event: Box<KeyEvent>) {
match event.code {
crossterm::event::KeyCode::Char(c) => {
self.0.insert(self.1, c);
self.1 += 1;
self.2
.lock()
.unwrap()
.dispatch(InputUpdateEvent(self.0.clone()));
}
crossterm::event::KeyCode::Backspace => {
if self.1 > 0 {
self.0.remove(self.1 - 1);
self.1 -= 1;
self.2
.lock()
.unwrap()
.dispatch(InputUpdateEvent(self.0.clone()));
}
}
crossterm::event::KeyCode::Left => {
if self.1 > 0 {
self.1 -= 1;
self.2
.lock()
.unwrap()
.dispatch(InputUpdateEvent(self.0.clone()));
}
}
crossterm::event::KeyCode::Right => {
if self.1 < self.0.len() {
self.1 += 1;
self.2
.lock()
.unwrap()
.dispatch(InputUpdateEvent(self.0.clone()));
}
}
_ => {}
}
}
}
event!(InputUpdateEvent(pub String));