Add `ui.shrink_clip_rect` (#5068)

This commit is contained in:
Emil Ernerfeldt 2024-09-04 17:01:41 +02:00 committed by GitHub
parent 454abf705b
commit 0b92b93233
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 27 additions and 1 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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: