From 0b92b93233f56b323a80c4353d18ee7c2130e0f4 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 4 Sep 2024 17:01:41 +0200 Subject: [PATCH] Add `ui.shrink_clip_rect` (#5068) --- crates/egui/src/painter.rs | 13 +++++++++++++ crates/egui/src/ui.rs | 13 +++++++++++++ crates/egui_extras/src/layout.rs | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/crates/egui/src/painter.rs b/crates/egui/src/painter.rs index a79deac5..ff7d9879 100644 --- a/crates/egui/src/painter.rs +++ b/crates/egui/src/painter.rs @@ -151,8 +151,21 @@ impl Painter { self.clip_rect } + /// Constrain the rectangle in which we can paint. + /// + /// Short for `painter.set_clip_rect(painter.clip_rect().intersect(new_clip_rect))`. + /// + /// See also: [`Self::clip_rect`] and [`Self::set_clip_rect`]. + #[inline] + pub fn shrink_clip_rect(&mut self, new_clip_rect: Rect) { + self.clip_rect = self.clip_rect.intersect(new_clip_rect); + } + /// Everything painted in this [`Painter`] will be clipped against this. /// This means nothing outside of this rectangle will be visible on screen. + /// + /// Warning: growing the clip rect might cause unexpected results! + /// When in doubt, use [`Self::shrink_clip_rect`] instead. #[inline] pub fn set_clip_rect(&mut self, clip_rect: Rect) { self.clip_rect = clip_rect; diff --git a/crates/egui/src/ui.rs b/crates/egui/src/ui.rs index 1db33052..627c119b 100644 --- a/crates/egui/src/ui.rs +++ b/crates/egui/src/ui.rs @@ -643,8 +643,21 @@ impl Ui { self.painter.clip_rect() } + /// Constrain the rectangle in which we can paint. + /// + /// Short for `ui.set_clip_rect(ui.clip_rect().intersect(new_clip_rect))`. + /// + /// See also: [`Self::clip_rect`] and [`Self::set_clip_rect`]. + #[inline] + pub fn shrink_clip_rect(&mut self, new_clip_rect: Rect) { + self.painter.shrink_clip_rect(new_clip_rect); + } + /// Screen-space rectangle for clipping what we paint in this ui. /// This is used, for instance, to avoid painting outside a window that is smaller than its contents. + /// + /// Warning: growing the clip rect might cause unexpected results! + /// When in doubt, use [`Self::shrink_clip_rect`] instead. pub fn set_clip_rect(&mut self, clip_rect: Rect) { self.painter.set_clip_rect(clip_rect); } diff --git a/crates/egui_extras/src/layout.rs b/crates/egui_extras/src/layout.rs index c0bfdcd6..ec4938f0 100644 --- a/crates/egui_extras/src/layout.rs +++ b/crates/egui_extras/src/layout.rs @@ -215,7 +215,7 @@ impl<'l> StripLayout<'l> { let margin = egui::Vec2::splat(self.ui.visuals().clip_rect_margin); let margin = margin.min(0.5 * self.ui.spacing().item_spacing); let clip_rect = max_rect.expand2(margin); - child_ui.set_clip_rect(clip_rect.intersect(child_ui.clip_rect())); + child_ui.shrink_clip_rect(clip_rect); if !child_ui.is_sizing_pass() { // Better to truncate (if we can), rather than hard clipping: