BBox: tolerate non-layouted child in layouted mode

While mixing layouted and non-layouted views is not supported, we are
doing it in some cases, including translator preferences (which uses
layout, but the views may come from a translator add-on which doesn't).

So, try to handle that case and at least avoid crashes by calling
MinSize/MaxSize and other unsupported layout code on views which won't
handle it.

Fixes #12610.
This commit is contained in:
Adrien Destugues
2016-01-24 13:42:11 +01:00
parent 37f9a29216
commit be1537b41a
+6 -2
View File
@@ -592,14 +592,18 @@ BBox::DoLayout()
return; return;
// layout the child // layout the child
if (BView* child = _Child()) { BView* child = _Child();
if (child) {
BRect frame(Bounds()); BRect frame(Bounds());
frame.left += fLayoutData->insets.left; frame.left += fLayoutData->insets.left;
frame.top += fLayoutData->insets.top; frame.top += fLayoutData->insets.top;
frame.right -= fLayoutData->insets.right; frame.right -= fLayoutData->insets.right;
frame.bottom -= fLayoutData->insets.bottom; frame.bottom -= fLayoutData->insets.bottom;
if (child->Flags() & B_SUPPORTS_LAYOUT)
BLayoutUtils::AlignInFrame(child, frame); BLayoutUtils::AlignInFrame(child, frame);
else
child->MoveTo(frame.LeftTop());
} }
} }
@@ -855,7 +859,7 @@ BBox::_ValidateLayoutData()
// finally consider the child constraints, if we shall support layout // finally consider the child constraints, if we shall support layout
BView* child = _Child(); BView* child = _Child();
if (child && (Flags() & B_SUPPORTS_LAYOUT)) { if (child && (child->Flags() & B_SUPPORTS_LAYOUT)) {
BSize min = child->MinSize(); BSize min = child->MinSize();
BSize max = child->MaxSize(); BSize max = child->MaxSize();
BSize preferred = child->PreferredSize(); BSize preferred = child->PreferredSize();