From 952916fd1c61ebd61e7b40211d97fdd0c15e85d1 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Wed, 4 Sep 2024 21:46:08 +0300 Subject: layout: Prevent view gesture snap beyond first/last column --- src/layout/workspace.rs | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 52c81a10..fbcb800b 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -2589,15 +2589,45 @@ impl Workspace { } }; + // Prevent the gesture from snapping further than the first/last column, as this is + // generally undesired. + // + // It's ok if leftmost_snap is > rightmost_snap (this happens if the columns on a + // workspace total up to less than the workspace width). + let leftmost_snap = snap_points(0., &self.columns[0]).0; + let last_col_idx = self.columns.len() - 1; + let last_col_x = self + .columns + .iter() + .take(last_col_idx) + .fold(0., |col_x, col| col_x + col.width() + gaps); + let rightmost_snap = + snap_points(last_col_x, &self.columns[last_col_idx]).1 - view_width; + + snapping_points.push(Snap { + view_pos: leftmost_snap, + col_idx: 0, + }); + snapping_points.push(Snap { + view_pos: rightmost_snap, + col_idx: last_col_idx, + }); + let mut push = |col_idx, left, right| { - snapping_points.push(Snap { - view_pos: left, - col_idx, - }); - snapping_points.push(Snap { - view_pos: right - view_width, - col_idx, - }); + if leftmost_snap < left && left < rightmost_snap { + snapping_points.push(Snap { + view_pos: left, + col_idx, + }); + } + + let right = right - view_width; + if leftmost_snap < right && right < rightmost_snap { + snapping_points.push(Snap { + view_pos: right, + col_idx, + }); + } }; let mut col_x = 0.; -- cgit