summaryrefslogtreecommitdiff
path: root/src/app.rs
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-07-25 00:40:37 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-07-25 00:40:37 +0200
commit58b305b9f6d13007d2ea62775054c95177f81092 (patch)
tree2123cb5379aa69476b1e549e0bcacc08d67fba71 /src/app.rs
first sketch
Diffstat (limited to 'src/app.rs')
-rw-r--r--src/app.rs81
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);
+ }
+}