1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-29 04:40:03 -04:00

Remove clip_rect_margin (#8366)

* Closes https://github.com/emilk/egui/issues/5605
 
It has been zero by default for a few months now, and I do not wish to
support it. It was always an ugly hack, and it is no longer needed.
This commit is contained in:
Emil Ernerfeldt
2026-07-31 14:21:17 -07:00
committed by GitHub
parent 36341c21fe
commit b06f5fea09
6 changed files with 12 additions and 36 deletions

View File

@@ -289,16 +289,16 @@ impl Resize {
Rect::from_min_size(position, state.desired_size) Rect::from_min_size(position, state.desired_size)
}; };
let mut content_clip_rect = inner_rect.expand(ui.visuals().clip_rect_margin); let mut content_clip_rect = inner_rect;
// If we pull the resize handle to shrink, we want to TRY to shrink it. // If we pull the resize handle to shrink, we want to TRY to shrink it.
// After laying out the contents, we might be much bigger. // After laying out the contents, we might be much bigger.
// In those cases we don't want the clip_rect to be smaller, because // In those cases we don't want the clip_rect to be smaller, because
// then we will clip the contents of the region even thought the result gets larger. This is simply ugly! // then we will clip the contents of the region even thought the result gets larger. This is simply ugly!
// So we use the memory of last_content_size to make the clip rect large enough. // So we use the memory of last_content_size to make the clip rect large enough.
content_clip_rect.max = content_clip_rect.max.max( content_clip_rect.max = content_clip_rect
inner_rect.min + state.last_content_size + Vec2::splat(ui.visuals().clip_rect_margin), .max
); .max(inner_rect.min + state.last_content_size);
content_clip_rect = content_clip_rect.intersect(ui.clip_rect()); // Respect parent region content_clip_rect = content_clip_rect.intersect(ui.clip_rect()); // Respect parent region

View File

@@ -810,12 +810,11 @@ impl ScrollArea {
{ {
// Clip the content, but only when we really need to: // Clip the content, but only when we really need to:
let clip_rect_margin = ui.visuals().clip_rect_margin;
let mut content_clip_rect = ui.clip_rect(); let mut content_clip_rect = ui.clip_rect();
for d in 0..2 { for d in 0..2 {
if direction_enabled[d] { if direction_enabled[d] {
content_clip_rect.min[d] = inner_rect.min[d] - clip_rect_margin; content_clip_rect.min[d] = inner_rect.min[d];
content_clip_rect.max[d] = inner_rect.max[d] + clip_rect_margin; content_clip_rect.max[d] = inner_rect.max[d];
} else { } else {
// Nice handling of forced resizing beyond the possible: // Nice handling of forced resizing beyond the possible:
content_clip_rect.max[d] = ui.clip_rect().max[d] - current_bar_use[d]; content_clip_rect.max[d] = ui.clip_rect().max[d] - current_bar_use[d];
@@ -1306,8 +1305,6 @@ impl Prepared {
// * When one ScrollArea is nested inside another, and the outer // * When one ScrollArea is nested inside another, and the outer
// is scrolled so that the scroll-bars of the inner ScrollArea (us) // is scrolled so that the scroll-bars of the inner ScrollArea (us)
// is outside the clip rectangle. // is outside the clip rectangle.
// Really this should use the tighter clip_rect that ignores clip_rect_margin, but we don't store that.
// clip_rect_margin is quite a hack. It would be nice to get rid of it.
max_cross = ui.clip_rect().max[1 - d] - outer_margin; max_cross = ui.clip_rect().max[1 - d] - outer_margin;
} }
@@ -1575,9 +1572,7 @@ fn paint_fade_areas_impl(ui: &Ui, inner_rect: Rect, content_size: Vec2, offset:
let overflow = content_size - inner_rect.size(); let overflow = content_size - inner_rect.size();
let paint_rect = inner_rect let paint_rect = inner_rect.intersect(ui.min_rect());
.intersect(ui.min_rect())
.expand(ui.visuals().clip_rect_margin);
// Top fade: animate opacity based on how far we've scrolled down. // Top fade: animate opacity based on how far we've scrolled down.
if 0.0 < offset.y { if 0.0 < offset.y {

View File

@@ -1074,12 +1074,6 @@ pub struct Visuals {
/// How the text cursor acts. /// How the text cursor acts.
pub text_cursor: TextCursorStyle, pub text_cursor: TextCursorStyle,
/// Allow widgets to paint this much outside the scroll area rect.
///
/// Legacy. Should not be used anymore.
/// Use [`crate::ScrollArea::content_margin`] instead.
pub clip_rect_margin: f32,
/// Show a background behind buttons. /// Show a background behind buttons.
pub button_frame: bool, pub button_frame: bool,
@@ -1534,7 +1528,6 @@ impl Visuals {
text_cursor: Default::default(), text_cursor: Default::default(),
clip_rect_margin: 0.0,
button_frame: true, button_frame: true,
collapsing_header_frame: false, collapsing_header_frame: false,
indent_has_left_vline: true, indent_has_left_vline: true,
@@ -2297,7 +2290,6 @@ impl Visuals {
text_cursor, text_cursor,
clip_rect_margin,
button_frame, button_frame,
collapsing_header_frame, collapsing_header_frame,
indent_has_left_vline, indent_has_left_vline,
@@ -2484,8 +2476,6 @@ impl Visuals {
ui.collapsing("Misc", |ui| { ui.collapsing("Misc", |ui| {
ui.add(Slider::new(resize_corner_size, 0.0..=20.0).text("resize_corner_size")); ui.add(Slider::new(resize_corner_size, 0.0..=20.0).text("resize_corner_size"));
ui.add(Slider::new(clip_rect_margin, 0.0..=20.0).text("clip_rect_margin"));
ui.checkbox(button_frame, "Button has a frame"); ui.checkbox(button_frame, "Button has a frame");
ui.checkbox(collapsing_header_frame, "Collapsing header has a frame"); ui.checkbox(collapsing_header_frame, "Collapsing header has a frame");
ui.checkbox( ui.checkbox(

View File

@@ -340,10 +340,8 @@ impl crate::View for ScrollTo {
ui.scroll_to_cursor(Some(Align::BOTTOM)); ui.scroll_to_cursor(Some(Align::BOTTOM));
} }
let margin = ui.visuals().clip_rect_margin; let current_scroll = ui.clip_rect().top() - ui.min_rect().top();
let max_scroll = ui.min_rect().height() - ui.clip_rect().height();
let current_scroll = ui.clip_rect().top() - ui.min_rect().top() + margin;
let max_scroll = ui.min_rect().height() - ui.clip_rect().height() + 2.0 * margin;
(current_scroll, max_scroll) (current_scroll, max_scroll)
}) })
.inner; .inner;

View File

@@ -217,10 +217,7 @@ impl<'l> StripLayout<'l> {
let mut child_ui = self.ui.new_child(ui_builder); let mut child_ui = self.ui.new_child(ui_builder);
if flags.clip { if flags.clip {
let margin = egui::Vec2::splat(self.ui.visuals().clip_rect_margin); child_ui.shrink_clip_rect(max_rect);
let margin = margin.min(0.5 * self.ui.spacing().item_spacing);
let clip_rect = max_rect.expand2(margin);
child_ui.shrink_clip_rect(clip_rect);
if !child_ui.is_sizing_pass() { if !child_ui.is_sizing_pass() {
// Better to truncate (if we can), rather than hard clipping: // Better to truncate (if we can), rather than hard clipping:

View File

@@ -451,17 +451,13 @@ fn drop_target<R>(
) -> egui::InnerResponse<R> { ) -> egui::InnerResponse<R> {
let is_being_dragged = ui.ctx().dragged_id().is_some(); let is_being_dragged = ui.ctx().dragged_id().is_some();
let margin = egui::Vec2::splat(ui.visuals().clip_rect_margin); // 3.0
let background_id = ui.painter().add(egui::Shape::Noop); let background_id = ui.painter().add(egui::Shape::Noop);
let available_rect = ui.available_rect_before_wrap(); let available_rect = ui.available_rect_before_wrap();
let inner_rect = available_rect.shrink2(margin); let mut content_ui = ui.new_child(UiBuilder::new().max_rect(available_rect));
let mut content_ui = ui.new_child(UiBuilder::new().max_rect(inner_rect));
let ret = body(&mut content_ui); let ret = body(&mut content_ui);
let outer_rect = let outer_rect = egui::Rect::from_min_max(available_rect.min, content_ui.min_rect().max);
egui::Rect::from_min_max(available_rect.min, content_ui.min_rect().max + margin);
let (rect, response) = ui.allocate_at_least(outer_rect.size(), egui::Sense::hover()); let (rect, response) = ui.allocate_at_least(outer_rect.size(), egui::Sense::hover());
let style = if is_being_dragged && response.hovered() { let style = if is_being_dragged && response.hovered() {