From a168559b7526fe4dfb7c474d450246315311e553 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 26 Jan 2025 21:54:22 +0100 Subject: [PATCH] changes --- src/elements.rs | 14 ++++++++++++++ src/lib.rs | 15 +++++++++++++++ src/main.rs | 16 ++++++++++++++-- src/utils.rs | 1 + 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/elements.rs b/src/elements.rs index 6cbc310..c31827c 100644 --- a/src/elements.rs +++ b/src/elements.rs @@ -11,3 +11,17 @@ impl Element for String { self.to_owned() } } + +pub struct Button { + pub on_click: crate::Handler, + pub text: String, +} + +impl Element for Button { + fn render(&self) -> String { + self.text.to_owned() + } + fn event(&self, _: crossterm::event::Event) { + (self.on_click.clone().lock().unwrap())() + } +} diff --git a/src/lib.rs b/src/lib.rs index 02ca008..6a476ee 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,6 +7,8 @@ use std::{io::Write, sync::Arc}; pub mod prelude { pub use crate::{ + elements::*, + func, style::{Color, Style}, utils::init, Props, Result, Ui, @@ -20,9 +22,13 @@ pub trait Framing { pub trait Element { fn render(&self) -> String; + fn event(&self, event: crossterm::event::Event) { + _ = event + } } // Types +pub type Handler = std::sync::Arc>; pub type Ui = Arc; #[derive(Debug, Clone)] @@ -42,6 +48,7 @@ pub struct Console<'a> { height: u16, handle: Option>, pub mouse_position: Option<(u16, u16)>, + pub event: Option, } impl Props { @@ -170,6 +177,10 @@ impl Framing for Console<'_> { ) }; + if let Some(event) = &self.event { + element.event(event.clone()); + } + let (x, y) = (x - style.px, y - style.py); let px = " ".repeat(style.px as usize); written.push_str(&format!("\n{}", " ".repeat(width as usize)).repeat(style.py as usize)); @@ -217,3 +228,7 @@ impl Console<'_> { utils::clear() } } + +pub fn func(t: T) -> Handler { + std::sync::Arc::new(std::sync::Mutex::new(t)) +} diff --git a/src/main.rs b/src/main.rs index c0178c4..eb06f17 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,7 @@ fn main() -> Result<()> { .. }) => console.mouse_position = Some((column, row)), crossterm::event::Event::Resize(_, _) => {} - _ => break, + e => console.event = Some(e), } } @@ -26,6 +26,18 @@ fn main() -> Result<()> { pub fn app() -> Ui { Arc::new(|frame| { - frame.draw(&"this is centered!", &Props::center()); + frame.draw( + &Button { + on_click: func(|| {}), + text: String::from("Testing"), + }, + &Props::center().state( + "hover", + Style { + color: Color::Red, + ..Default::default() + }, + ), + ); }) } diff --git a/src/utils.rs b/src/utils.rs index adb36fe..09dba85 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -114,5 +114,6 @@ pub fn init<'a>(mouse: bool) -> crate::Result> { mouse, handle: None, mouse_position: None, + event: None, }) }