From 6834194b9e16a7b5ee68b539ceb1a99b8f1ff90b Mon Sep 17 00:00:00 2001 From: Silas Bartha Date: Thu, 2 May 2024 02:53:51 -0400 Subject: Added ratatui integration + logger redirect --- src/resources.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) (limited to 'src/resources.rs') diff --git a/src/resources.rs b/src/resources.rs index 343967d..e8fb946 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -1,7 +1,10 @@ -use std::sync::{Arc, Mutex}; +use std::{sync::{Arc, Mutex}, io::{stdout, Stdout}, fs::{File, OpenOptions}}; -use bevy::{prelude::*, utils::HashSet}; -use crossterm::event::{Event, KeyCode}; +use bevy::{prelude::*, utils::{HashSet, Uuid, HashMap, tracing::{subscriber, level_filters::LevelFilter}}, log::tracing_subscriber}; +use crossterm::{event::{Event, KeyCode, EnableMouseCapture}, terminal::{EnterAlternateScreen, enable_raw_mode}, ExecutableCommand}; +use ratatui::{backend::CrosstermBackend, Frame, layout::Rect}; + +use crate::events::TerminalInputEvent; #[derive(Resource, Default)] pub struct TerminalInput { @@ -36,3 +39,52 @@ impl TerminalInput { #[derive(Resource, Default)] pub(super) struct EventQueue(pub(super) Arc>>); + +#[derive(Resource)] +pub struct Terminal(pub ratatui::Terminal>); + +impl Default for Terminal { + fn default() -> Self { + stdout().execute(EnterAlternateScreen).unwrap(); + stdout().execute(EnableMouseCapture).unwrap(); + enable_raw_mode().unwrap(); + let mut terminal = ratatui::Terminal::new(CrosstermBackend::new(stdout())).expect("Failed to create terminal"); + terminal.clear().expect("Failed to clear terminal"); + Self(terminal) + } +} + +#[derive(Resource, Default)] +pub struct TerminalUI { + widgets: HashMap> +} + +impl TerminalUI { + pub fn insert_widget(&mut self, widget: Box) -> Uuid { + let id = Uuid::new_v4(); + self.widgets.insert(id, widget); + id + } + + pub fn get_widget(&mut self, id: Uuid) -> Option<&mut Box> { + self.widgets.get_mut(&id) + } + + pub fn destroy_widget(&mut self, id: Uuid) { + self.widgets.remove(&id); + } + + pub fn widgets(&mut self) -> Vec<&mut Box> { + let mut vec = self.widgets.values_mut().collect::>(); + vec.sort_by(|a, b| { a.depth().cmp(&b.depth()).reverse() }); + vec + } +} + +pub trait TerminalWidget { + fn init(&mut self) {} + fn update(&mut self) {} + fn render(&mut self, frame: &mut Frame, rect: Rect); + fn handle_events(&mut self, _event: &TerminalInputEvent) {} + fn depth(&self) -> u32 { 0 } +} -- cgit v1.2.3