mechanical-engineering 0.0.0

Mechanical engineering calculation library and terminal based GUI
Documentation
pub mod app;

use crate::app::event::{Event, EventHandler};
use crate::app::tui::Tui;
use crate::app::update::update;
use crate::app::App;
use ratatui::{backend::CrosstermBackend, Terminal};
use std::time::Instant;

const REFRESH_RATE_MILLISEC: u128 = 15;
const EVENT_POLL_RATE_MILLISEC: u64 = 100;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut app = App::new();

    let backend = CrosstermBackend::new(std::io::stderr());
    let terminal = Terminal::new(backend)?;
    let events = EventHandler::new(EVENT_POLL_RATE_MILLISEC);
    let mut tui = Tui::new(terminal, events);
    tui.enter()?;

    let mut last_draw_time = Instant::now();
    while !app.should_quit {
        let duration = Instant::now() - last_draw_time;
        if duration.as_millis() >= REFRESH_RATE_MILLISEC {
            tui.draw(&mut app)?;
            last_draw_time = Instant::now();
        }

        match tui.events.next()? {
            Event::Tick => {}
            Event::Key(key_event) => update(&mut app, key_event),
            Event::Mouse(_) => {}
            Event::Resize(_, _) => {}
        };
    }

    tui.exit()?;
    Ok(())
}