From d376554674564ccef656cd224862b0dfa813c634 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Wed, 3 Jul 2013 23:16:23 -0400 Subject: [PATCH] BBox: propagate alignment from child for the... ...FULL_{VERTICAL,HORIZONTAL} case. --- headers/os/interface/Box.h | 1 + src/kits/interface/Box.cpp | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/headers/os/interface/Box.h b/headers/os/interface/Box.h index 786ea50691..37bdf88d90 100644 --- a/headers/os/interface/Box.h +++ b/headers/os/interface/Box.h @@ -70,6 +70,7 @@ class BBox : public BView { virtual BSize MinSize(); virtual BSize MaxSize(); virtual BSize PreferredSize(); + virtual BAlignment LayoutAlignment(); protected: virtual void LayoutInvalidated(bool descendants = false); diff --git a/src/kits/interface/Box.cpp b/src/kits/interface/Box.cpp index e9ff1359f1..5f84ac6965 100644 --- a/src/kits/interface/Box.cpp +++ b/src/kits/interface/Box.cpp @@ -38,6 +38,7 @@ struct BBox::LayoutData { BSize min; BSize max; BSize preferred; + BAlignment alignment; bool valid; // validity the other fields }; @@ -540,6 +541,17 @@ BBox::PreferredSize() } +BAlignment +BBox::LayoutAlignment() +{ + _ValidateLayoutData(); + + BAlignment alignment = (GetLayout() ? GetLayout()->Alignment() + : fLayoutData->alignment); + return BLayoutUtils::ComposeAlignment(ExplicitAlignment(), alignment); +} + + void BBox::LayoutInvalidated(bool descendants) { @@ -849,6 +861,8 @@ BBox::_ValidateLayoutData() else minWidth = addWidth - 1; + BAlignment alignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER); + // finally consider the child constraints, if we shall support layout BView* child = _Child(); if (child && (Flags() & B_SUPPORTS_LAYOUT)) { @@ -870,10 +884,19 @@ BBox::_ValidateLayoutData() fLayoutData->min = min; fLayoutData->max = max; fLayoutData->preferred = preferred; + + BAlignment childAlignment = child->LayoutAlignment(); + if (childAlignment.horizontal == B_ALIGN_USE_FULL_WIDTH) + alignment.horizontal = B_ALIGN_USE_FULL_WIDTH; + if (childAlignment.vertical == B_ALIGN_USE_FULL_HEIGHT) + alignment.vertical = B_ALIGN_USE_FULL_HEIGHT; + + fLayoutData->alignment = alignment; } else { fLayoutData->min.Set(minWidth, addHeight - 1); fLayoutData->max.Set(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED); fLayoutData->preferred = fLayoutData->min; + fLayoutData->alignment = alignment; } fLayoutData->valid = true;