agg_gui/widgets/window/
snap_glue.rs1use super::{snap, ResizeDir, Window};
7use crate::geometry::Rect;
8
9impl Window {
10 pub(crate) fn apply_move_snap(&mut self) {
15 if !crate::snap::is_enabled() {
16 crate::snap::clear_guides();
17 return;
18 }
19 let targets = crate::snap::targets_snapshot();
20 let result = crate::snap::compute_snap(
21 self.bounds,
22 self.snap_id,
23 &targets,
24 crate::snap::DEFAULT_THRESHOLD,
25 crate::snap::SnapMode::Move,
26 );
27 self.bounds = snap(result.rect);
28 crate::snap::set_guides(result.guides);
29 }
30
31 pub(crate) fn apply_resize_snap(&mut self, dir: ResizeDir) {
35 if !crate::snap::is_enabled() {
36 crate::snap::clear_guides();
37 return;
38 }
39 let targets = crate::snap::targets_snapshot();
40 let edge = resize_dir_to_snap_edge(dir);
41 let result = crate::snap::compute_snap(
42 self.bounds,
43 self.snap_id,
44 &targets,
45 crate::snap::DEFAULT_THRESHOLD,
46 crate::snap::SnapMode::Resize(edge),
47 );
48 self.bounds = snap(result.rect);
49 crate::snap::set_guides(result.guides);
50 }
51}
52
53fn resize_dir_to_snap_edge(dir: ResizeDir) -> crate::snap::ResizeEdge {
57 use crate::snap::ResizeEdge as E;
58 match dir {
59 ResizeDir::N => E::North,
60 ResizeDir::NE => E::NorthEast,
61 ResizeDir::E => E::East,
62 ResizeDir::SE => E::SouthEast,
63 ResizeDir::S => E::South,
64 ResizeDir::SW => E::SouthWest,
65 ResizeDir::W => E::West,
66 ResizeDir::NW => E::NorthWest,
67 }
68}
69
70impl crate::snap::Snappable for Window {
71 fn snap_id(&self) -> crate::snap::SnapId {
72 self.snap_id
73 }
74 fn snap_rect(&self) -> Rect {
75 self.bounds
76 }
77 fn set_snap_rect(&mut self, r: Rect) {
78 self.bounds = snap(r);
79 }
80 fn is_snap_source(&self) -> bool {
81 self.requested_visible() && !self.maximized
82 }
83 fn is_snap_target(&self) -> bool {
84 self.requested_visible() && !self.maximized
89 }
90}