use crate::Theme;
const BUTTON_RADIUS: i32 = 7;
const BUTTON_GAP: i32 = 6;
const BUTTON_RIGHT_PAD: i32 = 10;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[non_exhaustive]
pub struct DecorationGeometry {
pub panel_x: i32,
pub panel_y: i32,
pub panel_w: i32,
pub panel_h: i32,
pub title_bar_height: i32,
pub button_radius: i32,
pub button_cy: i32,
pub close_cx: i32,
pub minimize_cx: i32,
pub maximize_cx: i32,
}
#[must_use]
pub fn decoration_geometry(theme: &Theme, deco_w: u32, deco_h: u32) -> DecorationGeometry {
let extent = theme.shadow_extent.max(0);
let panel_w = (i64::from(deco_w) - i64::from(2 * extent)).max(0);
let panel_h = (i64::from(deco_h) - i64::from(2 * extent)).max(0);
let panel_w = i32::try_from(panel_w).unwrap_or(i32::MAX);
let panel_h = i32::try_from(panel_h).unwrap_or(i32::MAX);
let title_bar_height = theme.title_bar.height.max(0);
let button_cy = extent + (title_bar_height / 2);
let right_edge = extent
.saturating_add(panel_w)
.saturating_sub(BUTTON_RIGHT_PAD);
let close_cx = right_edge - BUTTON_RADIUS;
let step = (2 * BUTTON_RADIUS) + BUTTON_GAP;
DecorationGeometry {
panel_x: extent,
panel_y: extent,
panel_w,
panel_h,
title_bar_height,
button_radius: BUTTON_RADIUS,
button_cy,
close_cx,
minimize_cx: close_cx - step,
maximize_cx: close_cx - (2 * step),
}
}