diff --git a/Cargo.toml b/Cargo.toml index eac35a1..2461bfc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,4 @@ name = "osui" path = "src/main.rs" [dependencies] +k_board = { version = "1.2.1", features = ["standar", "f", "alt_lower_letter", "ctrl_lower_letter", "lower_letter"] } diff --git a/src/lib.rs b/src/lib.rs index 0505664..f0d78d3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ use std::io::{self, Write}; pub mod ui; -pub struct Component { +pub struct ComponentWrapper { pub component: T, pub x: usize, pub y: usize, @@ -10,9 +10,15 @@ pub struct Component { pub clear_trace: bool, } -impl Component { - pub fn new(component: T) -> Component { - Component { +pub trait Component { + fn render(&mut self) -> String { + String::new() + } +} + +impl ComponentWrapper { + pub fn new(component: T) -> ComponentWrapper { + ComponentWrapper { component, x: 0, y: 0, @@ -25,7 +31,10 @@ impl Component { self.clear(); } self.cleared_frame.clear(); - for (i, d) in format!("{}", self.component).split("\n").enumerate() { + for (i, d) in format!("{}", self.component.render()) + .split("\n") + .enumerate() + { print!("\x1B[{};{}H{}", self.y + (i + 1), self.x, d); self.cleared_frame += format!( "\x1B[{};{}H{}", diff --git a/src/ui.rs b/src/ui.rs index a3cabc6..c1b1109 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,5 +1,61 @@ -use crate::Component; +use crate::{Component, ComponentWrapper}; +use k_board::{keyboard::Keyboard, keys::Keys}; -pub fn text(text: &str) -> Component { - Component::new(text.to_string()) +impl Component for String { + fn render(&mut self) -> String { + self.clone() + } +} + +pub fn text(text: &str) -> ComponentWrapper { + ComponentWrapper::new(text.to_string()) +} + +pub struct Input { + pub max_length: usize, +} + +impl Component for Input { + fn render(&mut self) -> String { + format!( + " {}\n|{}|\n {}\x1b[1A\x1b[{}D", + "_".repeat(self.max_length), + " ".repeat(self.max_length), + "‾".repeat(self.max_length), + self.max_length + ) + } +} + +impl Input { + pub fn get_input(&mut self) -> String { + let mut input = String::new(); + loop { + let key = Keyboard::new().read_key(); + if key == Keys::Enter { + return input; + } + if input.len() < self.max_length { + match key { + Keys::Char(c) => { + input += c.to_string().as_str(); + print!("{c}"); + } + Keys::Space => { + input += " "; + print!(" "); + } + Keys::Delete => { + input.pop(); + print!("\x1b[1D \x1b[1D"); + } + _ => {} + } + } + } + } +} + +pub fn input(max_length: usize) -> ComponentWrapper { + ComponentWrapper::new(Input { max_length }) }