aboutsummaryrefslogtreecommitdiff
path: root/src/app.rs
diff options
context:
space:
mode:
authorShav Kinderlehrer <[email protected]>2024-07-23 17:48:28 -0400
committerShav Kinderlehrer <[email protected]>2024-07-23 17:48:28 -0400
commitdc0f2ce9ba97ebb47e05b80a511da6eb29818b63 (patch)
treedc83035069f5a015047be1ca3da6f65781eb4695 /src/app.rs
parentf638f4bd1e3a03bc2bdd5f9dcd57d4830fd3c553 (diff)
downloadmolehole-dc0f2ce9ba97ebb47e05b80a511da6eb29818b63.tar.gz
molehole-dc0f2ce9ba97ebb47e05b80a511da6eb29818b63.zip
Merge old-moleholencurses
Diffstat (limited to 'src/app.rs')
-rw-r--r--src/app.rs154
1 files changed, 0 insertions, 154 deletions
diff --git a/src/app.rs b/src/app.rs
deleted file mode 100644
index 7d398f0..0000000
--- a/src/app.rs
+++ /dev/null
@@ -1,154 +0,0 @@
-use crossterm::event::Event;
-use eyre::Result;
-use ratatui::prelude::*;
-use std::time::Duration;
-
-use crate::app_action::AppAction;
-use crate::app_event::AppEvent;
-use crate::component::Component;
-use crate::components;
-use crate::keys::key_commands::KeyCommand;
-use crate::tui;
-
-pub struct App {
- pub tui: tui::Tui,
- pub tick_rate: Duration,
- pub components: Vec<Box<dyn Component>>,
- pub key_commands: Vec<KeyCommand>,
-
- should_quit: bool,
-}
-
-impl App {
- pub fn new(tick_rate: Duration) -> Result<Self> {
- let tui = tui::init()?;
-
- Ok(Self {
- tui,
- tick_rate,
-
- should_quit: false,
- components: vec![],
- key_commands: vec![],
- })
- }
-
- pub fn run(&mut self) -> Result<()> {
- let global_keys = components::global_keys::GlobalKeys {
- key_commands: self.key_commands.clone(),
- ..Default::default()
- };
- let status_bar = components::status::StatusBar {
- message: "Press '?' to show the help menu".to_string(),
- ..Default::default()
- };
- let url_manager = components::url_manager::UrlManager::default();
- self.components = vec![
- Box::new(global_keys),
- Box::new(status_bar),
- Box::new(url_manager),
- ];
-
- for component in &mut self.components {
- component.init()?;
- }
-
- loop {
- if self.should_quit {
- break Ok(());
- }
-
- self.draw()?;
- }
- }
-
- pub fn draw(&mut self) -> Result<()> {
- let event: Option<AppEvent> = match tui::get_event(self.tick_rate)? {
- Some(event) => match event {
- Event::Key(key) => Some(AppEvent::Key(key)),
- Event::Mouse(mouse) => Some(AppEvent::Mouse(mouse)),
- Event::FocusGained => todo!(),
- Event::FocusLost => todo!(),
- Event::Paste(_) => todo!(),
- Event::Resize(_, _) => todo!(),
- },
- None => None,
- };
-
- if let Some(event) = event {
- self.handle_event(event)?;
- }
-
- if self.should_quit {
- return Ok(());
- }
-
- self.tui.draw(|frame| {
- let layout = Layout::default()
- .direction(Direction::Vertical)
- .constraints(vec![
- Constraint::Percentage(100),
- Constraint::Min(1),
- ])
- .split(frame.size());
-
- // status bar
- let _ = self.components[1].render(frame, layout[1]);
-
- // global_keys
- let _ = self.components[0].render(frame, frame.size());
- })?;
-
- self.update()?;
-
- Ok(())
- }
-
- pub fn update(&mut self) -> Result<()> {
- let mut events: Vec<AppEvent> = vec![];
- for component in &mut self.components {
- if let Some(event) = component.update() {
- events.push(event);
- }
- }
-
- for event in events {
- self.handle_event(event)?;
- }
-
- Ok(())
- }
-
- pub fn quit(&mut self) -> Result<()> {
- tui::restore()?;
- self.should_quit = true;
-
- Ok(())
- }
-
- fn handle_action(&mut self, action: AppAction) -> Result<()> {
- match action {
- AppAction::Quit => Ok(self.quit()?),
- _ => {
- for component in &mut self.components {
- component.handle_action(action.clone());
- }
- Ok(())
- }
- }
- }
-
- fn handle_event(&mut self, event: AppEvent) -> Result<()> {
- let mut actions: Vec<AppAction> = vec![];
- for component in &mut self.components {
- if let Some(action) = component.handle_event(event.clone()) {
- actions.push(action);
- }
- }
-
- for action in actions {
- self.handle_action(action)?;
- }
- Ok(())
- }
-}