diff --git a/src/app.rs b/src/app.rs index 41dfe1f..c9e0a0c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -13,7 +13,7 @@ use std::time::Duration; #[derive(Default)] pub struct App { - pub input: String, + pub input: Vec, pub cursor_pos: usize, pub messages: Vec, pub message_queue: Vec, diff --git a/src/main.rs b/src/main.rs index c40817b..2de7f06 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,8 +19,9 @@ pub fn initialize_panic_handler() { std::panic::set_hook(Box::new(|panic_info| { execute!(std::io::stderr(), crossterm::terminal::LeaveAlternateScreen).unwrap(); disable_raw_mode().unwrap(); + Terminal::new(CrosstermBackend::new(stdout())).unwrap().show_cursor().unwrap(); Settings::auto() - .most_recent_first(false) + .most_recent_first(true) .lineno_suffix(true) .create_panic_handler()(panic_info); })); @@ -39,5 +40,6 @@ fn main() -> io::Result<()> { app.run(&mut terminal); execute!(terminal.backend_mut(), LeaveAlternateScreen)?; disable_raw_mode()?; + terminal.show_cursor()?; Ok(()) } diff --git a/src/net_handler.rs b/src/net_handler.rs index 7c81573..f757ccf 100644 --- a/src/net_handler.rs +++ b/src/net_handler.rs @@ -4,6 +4,8 @@ use serde_json::Value; use std::io::Write; use std::net::TcpStream; use std::sync::{Arc, RwLock}; +use std::thread::sleep; +use std::time::Duration; use crate::app::App; pub fn handler_s2c(app: Arc>, stream: TcpStream) { @@ -56,5 +58,6 @@ pub fn handler_c2s(app: Arc>, mut stream: TcpStream) { .expect("Failed to write to stream"); app.write().unwrap().message_queue.pop(); } + sleep(Duration::from_millis(40)); } } diff --git a/src/tui.rs b/src/tui.rs index a9862e8..cd0dc83 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -18,7 +18,7 @@ pub fn ui(frame: &mut Frame, app: Arc>) { frame.render_widget(esc_info, chunks[0]); let state = app.read().unwrap(); - let input = Paragraph::new(state.input.as_str()) + let input = Paragraph::new(state.input.iter().collect::()) .block(Block::default().borders(Borders::ALL).title("Message")); frame.render_widget(input, chunks[1]); @@ -40,27 +40,26 @@ pub fn ui(frame: &mut Frame, app: Arc>) { impl App { - pub fn move_cursor_left(&mut self) { - let moved = self.cursor_pos.saturating_sub(1); + pub fn move_cursor_left(&mut self, amount: usize) { + let moved = self.cursor_pos.saturating_sub(amount); self.cursor_pos = moved.clamp(0, self.input.len()); } - pub fn move_cursor_right(&mut self) { - let moved = self.cursor_pos + 1; + pub fn move_cursor_right(&mut self, amount: usize) { + let moved = self.cursor_pos + amount; self.cursor_pos = moved.clamp(0, self.input.len()); } pub fn enter(&mut self, ch: char) { self.input.insert(self.cursor_pos, ch); - self.move_cursor_right(); + self.move_cursor_right(1); } pub fn delete(&mut self) { if self.cursor_pos == 0 { return; } - let char_to_delete_pos = self.cursor_pos - 1; - self.input.remove(char_to_delete_pos); - self.move_cursor_left(); + self.input.remove(self.cursor_pos - 1); + self.move_cursor_left(1); } pub fn reset_cursor(&mut self) { @@ -68,8 +67,8 @@ impl App { } pub fn send(&mut self) { - self.message_queue.push(self.input.clone()); - self.input = String::new(); + self.message_queue.push(self.input.iter().collect()); + self.input.clear(); self.reset_cursor(); } }