use std::collections::HashMap;
use compact_str::CompactString;
use super::{cell::Block, image::ImageCache};
use crate::tdom::node::NodeId;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct InputRenderState {
pub value: CompactString,
pub cursor: usize,
pub focused: bool,
pub selection: Option<(usize, usize)>,
}
#[derive(Debug)]
pub struct TermLayout {
pub layout: Vec<Block>,
pub columns: u16,
pub rows: u16,
pub scroll_y: u32,
pub rendered_rows: u32,
pub zoom: f32,
pub last_frame: Vec<Block>,
pub(crate) image_cache: ImageCache,
pub input_states: HashMap<NodeId, InputRenderState>,
pub scroll_offsets: HashMap<NodeId, u32>,
pub scroll_x_offsets: HashMap<NodeId, u32>,
pub open_select: Option<NodeId>,
pub scrollbars_visible: HashMap<NodeId, bool>,
}
impl TermLayout {
pub fn effective_columns(&self) -> u16 {
(self.columns as f32 / self.zoom).round() as u16
}
pub fn effective_rows(&self) -> u16 {
(self.rows as f32 / self.zoom).round() as u16
}
pub fn max_scroll(&self) -> u32 {
let canvas_rows = self.layout.len() / (self.columns as usize).max(1);
let content = self.rendered_rows.saturating_sub(self.rows as u32) as usize;
canvas_rows.saturating_sub(self.rows as usize).min(content) as u32
}
pub fn clamp_scroll(&mut self) {
let max = self.max_scroll();
if self.scroll_y > max {
self.scroll_y = max;
}
}
}