use super::{snap, ResizeDir, Window};
use crate::geometry::Rect;
impl Window {
pub(crate) fn apply_move_snap(&mut self) {
if !crate::snap::is_enabled() {
crate::snap::clear_guides();
return;
}
let targets = crate::snap::targets_snapshot();
let (ox, oy) = self.world_offset.get();
let candidate = Rect::new(
self.bounds.x + ox,
self.bounds.y + oy,
self.bounds.width,
self.bounds.height,
);
let result = crate::snap::compute_snap(
candidate,
self.snap_id,
&targets,
crate::snap::DEFAULT_THRESHOLD,
crate::snap::SnapMode::Move,
);
let r = result.rect;
self.bounds = snap(Rect::new(r.x - ox, r.y - oy, r.width, r.height));
crate::snap::set_guides(result.guides);
}
pub(crate) fn apply_resize_snap(&mut self, dir: ResizeDir) {
if !crate::snap::is_enabled() {
crate::snap::clear_guides();
return;
}
let targets = crate::snap::targets_snapshot();
let edge = resize_dir_to_snap_edge(dir);
let (ox, oy) = self.world_offset.get();
let candidate = Rect::new(
self.bounds.x + ox,
self.bounds.y + oy,
self.bounds.width,
self.bounds.height,
);
let result = crate::snap::compute_snap(
candidate,
self.snap_id,
&targets,
crate::snap::DEFAULT_THRESHOLD,
crate::snap::SnapMode::Resize(edge),
);
let r = result.rect;
self.bounds = snap(Rect::new(r.x - ox, r.y - oy, r.width, r.height));
crate::snap::set_guides(result.guides);
}
}
fn resize_dir_to_snap_edge(dir: ResizeDir) -> crate::snap::ResizeEdge {
use crate::snap::ResizeEdge as E;
match dir {
ResizeDir::N => E::North,
ResizeDir::NE => E::NorthEast,
ResizeDir::E => E::East,
ResizeDir::SE => E::SouthEast,
ResizeDir::S => E::South,
ResizeDir::SW => E::SouthWest,
ResizeDir::W => E::West,
ResizeDir::NW => E::NorthWest,
}
}
impl crate::snap::Snappable for Window {
fn snap_id(&self) -> crate::snap::SnapId {
self.snap_id
}
fn snap_rect(&self) -> Rect {
self.bounds
}
fn set_snap_rect(&mut self, r: Rect) {
self.bounds = snap(r);
}
fn is_snap_source(&self) -> bool {
self.requested_visible() && !self.maximized
}
fn is_snap_target(&self) -> bool {
self.requested_visible() && !self.maximized
}
}