From 9715630d9f0fe24c71fc5c558612fa0c014419d2 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Fri, 27 Jun 2025 15:02:13 -0500 Subject: [PATCH] few changes --- src/element/input.rs | 5 ++++- src/extensions/keypress.rs | 12 +++++------- src/extensions/mod.rs | 1 + src/extensions/tick_rate.rs | 13 +++++++++++++ src/main.rs | 29 +++++++++++++++++++++++------ src/render_scope.rs | 20 ++++++++++---------- src/style.rs | 18 ++++++++---------- src/utils.rs | 14 ++++++++++++++ 8 files changed, 78 insertions(+), 34 deletions(-) create mode 100644 src/extensions/tick_rate.rs diff --git a/src/element/input.rs b/src/element/input.rs index 82fedfe..ec927b6 100644 --- a/src/element/input.rs +++ b/src/element/input.rs @@ -65,9 +65,12 @@ impl KeyPressEventHandler for Input { events.dispatch(InputUpdateEvent(self.0.clone())); } } - _ => {} + _ => { + events.dispatch(InputKeyPress(self.0.clone(), *event)); + } } } } event!(InputUpdateEvent(pub String)); +event!(InputKeyPress(pub String, pub KeyEvent)); diff --git a/src/extensions/keypress.rs b/src/extensions/keypress.rs index 307c51f..16be086 100644 --- a/src/extensions/keypress.rs +++ b/src/extensions/keypress.rs @@ -1,4 +1,4 @@ -use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; +use crossterm::event::KeyEvent; use crate::{ events::{Close, Event, EventManager}, @@ -34,15 +34,13 @@ impl Extension for KeyPressExtension { fn tick_start(&mut self, _: &mut Screen, _: &mut EventManager) {} fn tick_end(&mut self, _: &mut Screen, events: &mut EventManager) { - match crossterm::event::read().unwrap() { - crossterm::event::Event::Key(e) => { - if e.modifiers.contains(KeyModifiers::CONTROL) && e.code == KeyCode::Char('c') { - events.dispatch(Close); - } else { + if crossterm::event::poll(std::time::Duration::from_millis(13)).unwrap() { + match crossterm::event::read().unwrap() { + crossterm::event::Event::Key(e) => { events.dispatch(e); } + _ => {} } - _ => {} } } } diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs index fc05f73..1e7b187 100644 --- a/src/extensions/mod.rs +++ b/src/extensions/mod.rs @@ -1,4 +1,5 @@ pub mod keypress; +pub mod tick_rate; use crate::{events::EventManager, Screen}; diff --git a/src/extensions/tick_rate.rs b/src/extensions/tick_rate.rs new file mode 100644 index 0000000..63f97d1 --- /dev/null +++ b/src/extensions/tick_rate.rs @@ -0,0 +1,13 @@ +use crate::extensions::Extension; + +pub struct TickRate(pub u8); + +impl Extension for TickRate { + fn init(&mut self, _: &mut crate::Screen, _: &mut crate::events::EventManager) {} + + fn tick_end(&mut self, _: &mut crate::Screen, _: &mut crate::events::EventManager) { + std::thread::sleep(std::time::Duration::from_millis(1000 / self.0 as u64)); + } + + fn tick_start(&mut self, _: &mut crate::Screen, _: &mut crate::events::EventManager) {} +} diff --git a/src/main.rs b/src/main.rs index 07fa97f..e3630a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,10 @@ use osui::{ - element::input::{Input, InputUpdateEvent}, + element::{ + input::{Input, InputKeyPress}, + rect::Rect, + }, events::{Close, EventManager}, - extensions::{keypress::KeyPressExtension, ExtensionManager}, + extensions::{keypress::KeyPressExtension, tick_rate::TickRate, ExtensionManager}, style::Transform, Screen, }; @@ -11,13 +14,27 @@ fn main() { let mut extensions = ExtensionManager::new(); let mut events = EventManager::new(); extensions.add(KeyPressExtension); + extensions.add(TickRate(255)); - screen.draw(Input::new()).component(Transform::center()); + screen + .draw(Rect(0xffffff)) + .component(Transform::center().dimensions(30, 3)); - events.on(|events, event: Box| { - if event.0 == "quit" { - events.dispatch(Close); + screen + .draw(format!("Type quit to quit")) + .component(Transform::new().bottom()); + + screen + .draw(Input::new()) + .component(Transform::new().bottom()); + + events.on(|events, event: Box| match event.1.code { + crossterm::event::KeyCode::Enter => { + if event.0 == "quit" { + events.dispatch(Close); + } } + _ => {} }); screen.run(&mut events, &mut extensions).unwrap(); diff --git a/src/render_scope.rs b/src/render_scope.rs index eeae4ce..205c59c 100644 --- a/src/render_scope.rs +++ b/src/render_scope.rs @@ -49,18 +49,18 @@ impl RenderScope { for m in &self.render_stack { match m { RenderMethod::Text(t) => { - println!("\x1b[{};{}H{t}", self.transform.y + 1, self.transform.x + 1) + utils::print(self.transform.x, self.transform.y, t); } RenderMethod::Rectangle(width, height, color) => { - for i in 0..(*height) { - println!( - "\x1b[{};{}H{}{}\x1b[0m", - self.transform.y + 1 + i, - self.transform.x + 1, - hex_ansi_bg(*color), - " ".repeat(*width as usize) - ) - } + utils::print_liner( + self.transform.x, + self.transform.y, + &hex_ansi_bg(*color), + &std::iter::repeat(" ".repeat(*width as usize)) + .take(*height as usize) + .collect::>() + .join("\n"), + ); } } } diff --git a/src/style.rs b/src/style.rs index 33d823b..2e8d030 100644 --- a/src/style.rs +++ b/src/style.rs @@ -9,8 +9,9 @@ pub struct RawTransform { #[derive(Debug, Clone)] pub enum Position { - Center, Const(u16), + Center, + End, } #[derive(Debug, Clone)] @@ -45,19 +46,15 @@ impl Transform { } } - pub fn position(x: Position, y: Position) -> Transform { - Transform { - x, - y, - width: Dimension::Auto, - height: Dimension::Auto, - } + pub fn bottom(mut self) -> Self { + self.y = Position::End; + self } - pub fn dimensions(&mut self, width: u16, height: u16) -> Self { + pub fn dimensions(mut self, width: u16, height: u16) -> Self { self.width = Dimension::Const(width); self.height = Dimension::Const(height); - self.clone() + self } pub fn use_dimensions(&self, raw: &mut RawTransform) { @@ -96,6 +93,7 @@ impl Position { match self { Self::Center => *r = (parent - size) / 2, Self::Const(n) => *r = *n, + Self::End => *r = parent - size, } } } diff --git a/src/utils.rs b/src/utils.rs index c42b6a4..031149f 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -106,3 +106,17 @@ pub fn hex_ansi_bg(hex: u32) -> String { let b = (hex & 0xFF) as u8; format!("\x1b[48;2;{r};{g};{b}m") } + +pub(crate) fn print(x: u16, y: u16, text: &str) { + for (i, line) in text.lines().enumerate() { + print!("\x1b[{};{}H{line}\x1b[0m", y + i as u16 + 1, x + 1); + flush().unwrap(); + } +} + +pub(crate) fn print_liner(x: u16, y: u16, liner: &str, text: &str) { + for (i, line) in text.lines().enumerate() { + print!("\x1b[{};{}H{liner}{line}\x1b[0m", y + i as u16 + 1, x + 1); + flush().unwrap(); + } +}