use crate::layout::ResizeEdge;
use crate::types::Rect;
#[derive(Debug, Clone, Copy)]
pub struct ResizeDrag {
pub edge: ResizeEdge,
pub start_rect: Rect,
pub start_pos: (f64, f64),
pub min: (f64, f64),
pub cap: (f64, f64),
}
impl ResizeDrag {
pub fn begin(
edge: ResizeEdge,
start_rect: Rect,
start_pos: (f64, f64),
min: (f64, f64),
cap: (f64, f64),
) -> Self {
Self { edge, start_rect, start_pos, min, cap }
}
pub fn resolve(&self, cursor: (f64, f64)) -> Rect {
let dx = cursor.0 - self.start_pos.0;
let dy = cursor.1 - self.start_pos.1;
let (mut x, mut y) = (self.start_rect.x, self.start_rect.y);
let (mut w, mut h) = (self.start_rect.width, self.start_rect.height);
let (min_w, min_h) = self.min;
let (cap_w, cap_h) = self.cap;
let clamp = |v: f64, lo: f64, hi: f64| v.max(lo).min(hi);
match self.edge {
ResizeEdge::E => {
w = clamp(self.start_rect.width + dx, min_w, cap_w);
}
ResizeEdge::W => {
let nw = clamp(self.start_rect.width - dx, min_w, cap_w);
x = self.start_rect.x + (self.start_rect.width - nw);
w = nw;
}
ResizeEdge::S => {
h = clamp(self.start_rect.height + dy, min_h, cap_h);
}
ResizeEdge::N => {
let nh = clamp(self.start_rect.height - dy, min_h, cap_h);
y = self.start_rect.y + (self.start_rect.height - nh);
h = nh;
}
ResizeEdge::SE => {
w = clamp(self.start_rect.width + dx, min_w, cap_w);
h = clamp(self.start_rect.height + dy, min_h, cap_h);
}
ResizeEdge::NE => {
w = clamp(self.start_rect.width - 0.0 + dx, min_w, cap_w);
let nh = clamp(self.start_rect.height - dy, min_h, cap_h);
y = self.start_rect.y + (self.start_rect.height - nh);
h = nh;
}
ResizeEdge::SW => {
let nw = clamp(self.start_rect.width - dx, min_w, cap_w);
x = self.start_rect.x + (self.start_rect.width - nw);
w = nw;
h = clamp(self.start_rect.height + dy, min_h, cap_h);
}
ResizeEdge::NW => {
let nw = clamp(self.start_rect.width - dx, min_w, cap_w);
x = self.start_rect.x + (self.start_rect.width - nw);
w = nw;
let nh = clamp(self.start_rect.height - dy, min_h, cap_h);
y = self.start_rect.y + (self.start_rect.height - nh);
h = nh;
}
}
Rect::new(x, y, w, h)
}
}