pixmux 0.1.0

An interactive TUI for exploring CSV-backed image datasets.
Documentation
use std::path;

use color_eyre::Result;
use pixmux::{Pane, Tab};
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::{DefaultTerminal, Frame};

use crate::ui;

mod events;

#[derive(Default)]
pub struct App {
    running: bool,
    pub col_headers: Vec<String>,
    pub table_rows: Vec<Vec<String>>,
    pub imagedir_paths: Vec<std::path::PathBuf>,
    pub imagefile_basenames: Vec<String>,
    pub current_tab: Tab,
    pub current_datarow_index: usize,
    pub pane_tree: pixmux::Pane,
    pub current_pane_path: Vec<bool>,
}

impl App {
    pub fn new(csv_path: path::PathBuf) -> Result<Self> {
        let (col_headers, table_rows, imagedir_paths) = pixmux::parse_csv(&csv_path)?;
        let imagefile_basenames = pixmux::imagefile::collect_basenames(&imagedir_paths);
        Ok(Self {
            running: false,
            col_headers,
            table_rows,
            imagedir_paths,
            imagefile_basenames,
            current_tab: Tab::default(),
            current_datarow_index: 0,
            pane_tree: Pane::default(),
            current_pane_path: vec![],
        })
    }

    pub fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
        self.running = true;
        while self.running {
            terminal.draw(|frame| self.render(frame))?;
            self.handle_crossterm_events()?;
        }
        Ok(())
    }

    fn quit(&mut self) {
        self.running = false;
    }

    fn render(&mut self, frame: &mut Frame) {
        let chunks = Layout::default()
            .direction(Direction::Vertical)
            .constraints([Constraint::Length(3), Constraint::Min(0)])
            .split(frame.area());

        ui::NavBarUI::render(frame, chunks[0], self);

        match self.current_tab {
            pixmux::Tab::Data => {
                frame.render_widget(ui::TableTabUI::create_widget(self), chunks[1]);
            }
            pixmux::Tab::Image => {
                ui::ImageTabUI::render(frame, chunks[1], self);
            }
        }
    }
}