diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-07-25 00:40:37 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-07-25 00:40:37 +0200 |
| commit | 58b305b9f6d13007d2ea62775054c95177f81092 (patch) | |
| tree | 2123cb5379aa69476b1e549e0bcacc08d67fba71 /src/app.rs | |
first sketch
Diffstat (limited to 'src/app.rs')
| -rw-r--r-- | src/app.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..3544fdf --- /dev/null +++ b/src/app.rs @@ -0,0 +1,81 @@ +use std::{io, time::Duration}; + +use crate::{sheet::register::Register, tui, widgets::sheetview::SheetView}; + +use ratatui::{ + crossterm::event::{self, Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers}, + prelude::*, + widgets::Block, +}; + +#[derive(Debug)] +pub struct App<'a> { + exit: bool, + view: SheetView<'a>, +} + +impl App<'_> { + pub fn new() -> Self { + let sheet_id = Register::create(200, 1000); + let sheet = Register::get(sheet_id).unwrap(); + + { + let mut sheet = sheet.write().unwrap(); + + for row in 0..sheet.height() { + for column in 0..sheet.width() { + sheet.set_cell(row, column, format!("{}/{}", row, column).into()); + } + } + } + + let view = SheetView::new(sheet_id).block(Block::bordered().title("Sheet")); + + Self { exit: false, view } + } + + pub fn run(&mut self, terminal: &mut tui::Tui) -> io::Result<()> { + while !self.exit { + terminal.draw(|frame| self.render_frame(frame))?; + self.handle_events()?; + } + + Ok(()) + } + + fn render_frame(&mut self, frame: &mut Frame) { + frame.render_widget(self, frame.size()); + } + + fn handle_events(&mut self) -> io::Result<()> { + if event::poll(Duration::from_millis(100))? { + match event::read()? { + Event::Key(key_event) if key_event.kind == KeyEventKind::Press => { + self.handle_key_event(key_event) + } + _ => {} + } + } + Ok(()) + } + + fn handle_key_event(&mut self, key_event: KeyEvent) { + match key_event.code { + KeyCode::Char('q') if key_event.modifiers == KeyModifiers::CONTROL => self.exit(), + _ => self.view.handle_key_event(key_event), + } + } + + fn exit(&mut self) { + self.exit = true; + } +} + +impl Widget for &mut App<'_> { + fn render(self, area: Rect, buf: &mut Buffer) + where + Self: Sized, + { + self.view.render(area, buf); + } +} |