authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-24 01:09:29-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-25 20:26:20-07:00
logac71f3406bb294c83e6ad73ba9661192c9c04b99
treeec3c4e24b0b11dae1875aa23d98cb1fc1a049389
parent1a88f66f3e89db9e9b9c016c61f9fdd549b74228
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

fix: stop scrolling at the topmost and leftmost page content

Scrolling allowed 36 pt of blank page above and left of the furthest object, so a page like one with an Ivy background image placed at (-27, -3.6) could be scrolled past its top. OneNote 2010 stops exactly at the page origin or at the object furthest above or left of it, and opens the page there. The far edges keep their 36 pt margin. Assisted-by: claude-opus-5

1 files changed, 3 insertions(+), 2 deletions(-)

crates/snowbound/src/scroll.rs+3-2
...@@ -15,8 +15,9 @@ impl Scroll {...@@ -15,8 +15,9 @@ impl Scroll {
15 max[axis] = max[axis].max(rect[axis + 2]);15 max[axis] = max[axis].max(rect[axis + 2]);
16 }16 }
17 }17 }
18 // OneNote stops at the page origin or the object furthest above or left of it.
18 for axis in 0..2 {19 for axis in 0..2 {
19 min[axis] = (min[axis] - 36.0) * viewport.scale;20 min[axis] *= viewport.scale;
20 max[axis] =21 max[axis] =
21 ((max[axis] + 36.0) * viewport.scale - viewport.size[axis] as f32).max(min[axis]);22 ((max[axis] + 36.0) * viewport.scale - viewport.size[axis] as f32).max(min[axis]);
22 }23 }
...@@ -100,7 +101,7 @@ mod tests {...@@ -100,7 +101,7 @@ mod tests {
100 };101 };
101 let scroll = Scroll::new(viewport, [[-80.0, -20.0, 1000.0, 1200.0]].into_iter());102 let scroll = Scroll::new(viewport, [[-80.0, -20.0, 1000.0, 1200.0]].into_iter());
102 scroll.clamp(&mut viewport);103 scroll.clamp(&mut viewport);
103 assert_eq!(viewport.origin, [232.0, 112.0]);104 assert_eq!(viewport.origin, [160.0, 40.0]);
104 viewport.origin = [-9999.0; 2];105 viewport.origin = [-9999.0; 2];
105 scroll.clamp(&mut viewport);106 scroll.clamp(&mut viewport);
106 assert_eq!(viewport.origin, [-1272.0, -1872.0]);107 assert_eq!(viewport.origin, [-1272.0, -1872.0]);