From 543921319912c63993d3803306d8a2ba37d61f99 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 26 Mar 2021 09:46:53 +0100 Subject: [PATCH] Fix `Empty` sometimes returning an infinite size in `layout` This commit also ensures that elements never report an infinite size by adding a debug assertion in the `Lifecycle` element. --- gpui/src/elements/empty.rs | 18 ++++++++++++++++-- gpui/src/elements/new.rs | 3 +++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gpui/src/elements/empty.rs b/gpui/src/elements/empty.rs index 330b77ae4b..f5d038bb50 100644 --- a/gpui/src/elements/empty.rs +++ b/gpui/src/elements/empty.rs @@ -1,7 +1,10 @@ +use crate::geometry::{ + rect::RectF, + vector::{vec2f, Vector2F}, +}; use crate::{ AfterLayoutContext, Element, Event, EventContext, LayoutContext, PaintContext, SizeConstraint, }; -use pathfinder_geometry::{rect::RectF, vector::Vector2F}; pub struct Empty; @@ -20,7 +23,18 @@ impl Element for Empty { constraint: SizeConstraint, _: &mut LayoutContext, ) -> (Vector2F, Self::LayoutState) { - (constraint.max, ()) + let x = if constraint.max.x().is_finite() { + constraint.max.x() + } else { + constraint.min.x() + }; + let y = if constraint.max.y().is_finite() { + constraint.max.y() + } else { + constraint.min.y() + }; + + (vec2f(x, y), ()) } fn after_layout(&mut self, _: Vector2F, _: &mut Self::LayoutState, _: &mut AfterLayoutContext) { diff --git a/gpui/src/elements/new.rs b/gpui/src/elements/new.rs index 896c143288..9cde494171 100644 --- a/gpui/src/elements/new.rs +++ b/gpui/src/elements/new.rs @@ -87,6 +87,9 @@ impl AnyElement for Lifecycle { | Lifecycle::PostLayout { mut element, .. } | Lifecycle::PostPaint { mut element, .. } => { let (size, layout) = element.layout(constraint, ctx); + debug_assert!(size.x().is_finite()); + debug_assert!(size.y().is_finite()); + result = Some(size); Lifecycle::PostLayout { element,