mod completion;
mod history;
mod input;
#[cfg(test)]
mod testing;
use ratada::theme::Skin;
use ratatui::Frame;
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::{Color, Style};
use ratatui::text::Line;
use crate::domain::history::HistoryEntry;
use crate::tui::colors::CaretColors;
use crate::tui::text_edit::TextCursor;
use crate::tui::views::calc::completion::render_completion;
use crate::tui::views::calc::history::render_history;
use crate::tui::views::calc::input::{input_box_height, render_input};
const MIN_ENTRY_LINES: usize = 2;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Mode {
Input,
History,
Edit(usize),
}
impl Mode {
pub fn is_text_editing(self) -> bool {
matches!(self, Mode::Input | Mode::Edit(_))
}
}
pub struct Row<'a> {
pub entry: &'a HistoryEntry,
pub result: String,
}
pub struct HistoryStyle {
pub spacing: usize,
pub separator: Option<Color>,
}
pub struct CalcView<'a> {
pub rows: &'a [Row<'a>],
pub selected: Option<usize>,
pub mode: Mode,
pub input: &'a str,
pub cursor: TextCursor,
pub input_styles: &'a [Style],
pub row_styles: &'a [Vec<Style>],
pub completion: Vec<Line<'static>>,
pub caret: CaretColors,
pub style: HistoryStyle,
pub accent_color: Color,
pub error_color: Color,
pub warn: &'a str,
pub feedback: Option<Line<'static>>,
pub input_max_lines: usize,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct Metrics {
pub input_width: usize,
pub history_width: usize,
pub view_height: usize,
}
pub fn render(
frame: &mut Frame,
area: Rect,
skin: &Skin,
view: &CalcView<'_>,
) -> Metrics {
let input_height = input_box_height(view, area.width);
let rows = Layout::vertical([
Constraint::Min(1),
Constraint::Length(input_height),
])
.split(area);
let mut metrics = render_history(frame, rows[0], skin, view);
metrics.input_width = render_input(frame, rows[1], skin, view);
render_completion(frame, rows[0], skin, &view.completion);
metrics
}