use ratatui::layout::{Constraint, Direction, Layout, Rect};
pub struct AppLayout {
pub sidebar: Rect,
pub main: Rect,
pub status_bar: Rect,
}
impl AppLayout {
pub fn new(area: Rect) -> Self {
let vertical = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Min(3), Constraint::Length(1), ])
.split(area);
let horizontal = Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Length(30), Constraint::Min(40), ])
.split(vertical[0]);
Self {
sidebar: horizontal[0],
main: horizontal[1],
status_bar: vertical[1],
}
}
}
pub struct SidebarLayout {
pub header: Rect,
pub accounts: Rect,
pub view_switcher: Rect,
}
impl SidebarLayout {
pub fn new(area: Rect) -> Self {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(3), Constraint::Min(5), Constraint::Length(5), ])
.split(area);
Self {
header: chunks[0],
accounts: chunks[1],
view_switcher: chunks[2],
}
}
}
pub struct MainPanelLayout {
pub header: Rect,
pub content: Rect,
}
impl MainPanelLayout {
pub fn new(area: Rect) -> Self {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(3), Constraint::Min(3), ])
.split(area);
Self {
header: chunks[0],
content: chunks[1],
}
}
}
pub struct BudgetLayout {
pub atb_header: Rect,
pub categories: Rect,
}
impl BudgetLayout {
pub fn new(area: Rect) -> Self {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(3), Constraint::Min(3), ])
.split(area);
Self {
atb_header: chunks[0],
categories: chunks[1],
}
}
}
pub fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
let popup_layout = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Percentage((100 - percent_y) / 2),
Constraint::Percentage(percent_y),
Constraint::Percentage((100 - percent_y) / 2),
])
.split(r);
Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Percentage((100 - percent_x) / 2),
Constraint::Percentage(percent_x),
Constraint::Percentage((100 - percent_x) / 2),
])
.split(popup_layout[1])[1]
}
pub fn centered_rect_fixed(width: u16, height: u16, r: Rect) -> Rect {
let x = r.x + (r.width.saturating_sub(width)) / 2;
let y = r.y + (r.height.saturating_sub(height)) / 2;
Rect::new(x, y, width.min(r.width), height.min(r.height))
}