BCardLayout: Do not recompute size limits on visible item switch.
The size limits are already the minimum/maximum for all views, not just the current one, so we do not need to recompute them when the layout is invalidated due to an item switch. Fixes #14675, and other performance issues on switching tabs in layouted BTabViews, among other things. Change-Id: I55bfe4ddb8c8a79c634634cfc27113205a790c42 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2677 Reviewed-by: Andrew Lindesay <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
81f3f1485d
commit
9cfe144326
@@ -78,16 +78,20 @@ BCardLayout::SetVisibleItem(BLayoutItem* item)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Changing an item's visibility will invalidate its parent's layout (us),
|
||||||
|
// which would normally cause the min-max to be re-computed. But in this
|
||||||
|
// case, that is unnecessary, and so we can skip it.
|
||||||
|
const bool minMaxValid = fMinMaxValid;
|
||||||
|
|
||||||
if (fVisibleItem != NULL)
|
if (fVisibleItem != NULL)
|
||||||
fVisibleItem->SetVisible(false);
|
fVisibleItem->SetVisible(false);
|
||||||
|
|
||||||
fVisibleItem = item;
|
fVisibleItem = item;
|
||||||
|
|
||||||
if (fVisibleItem != NULL) {
|
if (fVisibleItem != NULL)
|
||||||
fVisibleItem->SetVisible(true);
|
fVisibleItem->SetVisible(true);
|
||||||
|
|
||||||
Relayout();
|
fMinMaxValid = minMaxValid;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -274,6 +278,8 @@ BCardLayout::ItemAdded(BLayoutItem* item, int32 atIndex)
|
|||||||
void
|
void
|
||||||
BCardLayout::ItemRemoved(BLayoutItem* item, int32 fromIndex)
|
BCardLayout::ItemRemoved(BLayoutItem* item, int32 fromIndex)
|
||||||
{
|
{
|
||||||
|
fMinMaxValid = false;
|
||||||
|
|
||||||
if (fVisibleItem == item) {
|
if (fVisibleItem == item) {
|
||||||
BLayoutItem* newVisibleItem = NULL;
|
BLayoutItem* newVisibleItem = NULL;
|
||||||
SetVisibleItem(newVisibleItem);
|
SetVisibleItem(newVisibleItem);
|
||||||
|
|||||||
Reference in New Issue
Block a user