sheetsui/src/main.rs

60 lines
1.5 KiB
Rust

use std::path::PathBuf;
use clap::Parser;
use crossterm::event::{self, Event, KeyCode, KeyEventKind};
use ratatui::{
self,
layout::{Constraint, Layout},
widgets::{Table, Tabs},
Frame,
};
use sheet::{Address, Computable, Tbl};
mod sheet;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct Args {
#[arg()]
workbook: PathBuf,
}
fn run(terminal: &mut ratatui::DefaultTerminal) -> std::io::Result<()> {
loop {
terminal.draw(|frame| draw(frame))?;
if let Event::Key(key) = event::read()? {
if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') {
return Ok(());
}
}
}
}
fn generate_default_table<'a>() -> Table<'a> {
let mut tbl = Tbl::new();
tbl.update_entry(Address::new(5, 5), Computable::Text("loc: 5, 5".to_owned()));
tbl.update_entry(Address::new(10, 10), Computable::Number(10.10));
tbl.update_entry(Address::new(0, 0), Computable::Formula("".to_owned()));
tbl.into()
}
fn draw(frame: &mut Frame) {
use Constraint::{Min, Percentage};
let table = generate_default_table();
let tabs = Tabs::new(vec!["sheet1"]).select(0);
let rects = Layout::vertical([Min(1), Percentage(90)]).split(frame.area());
frame.render_widget(tabs, rects[0]);
frame.render_widget(table, rects[1]);
}
fn main() -> std::io::Result<()> {
let _ = Args::parse();
let mut terminal = ratatui::init();
terminal.clear()?;
let app_result = run(&mut terminal);
ratatui::restore();
app_result
}