use ratatui::layout::{Constraint, Direction, Layout, Rect};
pub fn compute_panel_areas(area: Rect) -> (Rect, Rect, Rect, Rect, Rect) {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(2), Constraint::Min(10), Constraint::Length(3), Constraint::Length(1), ])
.split(area);
let main_chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Percentage(65), Constraint::Percentage(35)])
.split(chunks[1]);
(
chunks[0],
main_chunks[0],
main_chunks[1],
chunks[2],
chunks[3],
)
}
#[inline]
pub fn point_in_rect(x: u16, y: u16, rect: Rect) -> bool {
x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compute_panel_areas_splits_correctly() {
let area = Rect::new(0, 0, 100, 50);
let (session, conversation, activity, input, hints) = compute_panel_areas(area);
assert_eq!(session.height, 2);
assert_eq!(session.y, 0);
assert_eq!(input.height, 3);
assert_eq!(hints.height, 1);
assert_eq!(hints.y, 49);
assert_eq!(conversation.x, 0);
assert_eq!(conversation.width, 65); assert_eq!(activity.x, 65);
assert_eq!(activity.width, 35); }
#[test]
fn test_point_in_rect_inside() {
let rect = Rect::new(10, 20, 30, 40);
assert!(point_in_rect(10, 20, rect)); assert!(point_in_rect(25, 40, rect)); assert!(point_in_rect(39, 59, rect)); }
#[test]
fn test_point_in_rect_outside() {
let rect = Rect::new(10, 20, 30, 40);
assert!(!point_in_rect(9, 20, rect)); assert!(!point_in_rect(10, 19, rect)); assert!(!point_in_rect(40, 20, rect)); assert!(!point_in_rect(10, 60, rect)); }
#[test]
fn test_point_in_rect_zero_area() {
let rect = Rect::new(10, 10, 0, 0);
assert!(!point_in_rect(10, 10, rect));
}
#[test]
fn test_panel_areas_small_terminal() {
let area = Rect::new(0, 0, 80, 24);
let (session, conversation, activity, input, hints) = compute_panel_areas(area);
assert!(session.height > 0);
assert!(conversation.width > 0);
assert!(activity.width > 0);
assert!(input.height > 0);
assert!(hints.height > 0);
let total_height = session.height + input.height + hints.height;
assert!(total_height <= area.height);
}
}