Make it possible to combine wxEXPAND and alignment in wxGridSizer.

Allow overriding wxEXPAND effect in one of the directions by specifying
wxALIGN_{RIGHT,BOTTOM} or wxALIGN_CENTRE_{HORIZONTAL,VERTICAL} together with
it (unfortunately this doesn't work for wxALIGN_{LEFT,TOP} as their value is 0
and so their presence in flags can't be detected).
This commit is contained in:
Vadim Zeitlin
2015-04-04 18:59:06 +02:00
parent 233a7fe77b
commit 9aaa38c7c8
3 changed files with 43 additions and 4 deletions

View File

@@ -68,7 +68,17 @@
These flags are used to specify which side(s) of the sizer item These flags are used to specify which side(s) of the sizer item
the border width will apply to.} the border width will apply to.}
@itemdef{wxEXPAND, @itemdef{wxEXPAND,
The item will be expanded to fill the space assigned to the item.} The item will be expanded to fill the space assigned to the item.
When used for the items of wxBoxSizer, the expansion only happens
in the transversal direction of the sizer as only the item
proportion governs its behaviour in the principal sizer direction.
But when it is used for the items of wxGridSizer, this flag can be
combined with the alignment flags which override it in the
corresponding direction if specified, e.g. @c wxEXPAND |
wxALIGN_CENTRE_VERTICAL would expand the item only horizontally
but center it vertically. Notice that this doesn't work for the
default left/top alignment and @c wxEXPAND still applies in both
directions if it is combined with @c wxALIGN_LEFT or @c wxALIGN_TOP.}
@itemdef{wxSHAPED, @itemdef{wxSHAPED,
The item will be expanded as much as possible while also The item will be expanded as much as possible while also
maintaining its aspect ratio.} maintaining its aspect ratio.}

View File

@@ -1517,11 +1517,13 @@ void wxGridSizer::SetItemBounds( wxSizerItem *item, int x, int y, int w, int h )
wxSize sz( item->GetMinSizeWithBorder() ); wxSize sz( item->GetMinSizeWithBorder() );
int flag = item->GetFlag(); int flag = item->GetFlag();
if ((flag & wxEXPAND) || (flag & wxSHAPED)) // wxSHAPED maintains aspect ratio and so always applies to both
// directions.
if ( flag & wxSHAPED )
{ {
sz = wxSize(w, h); sz = wxSize(w, h);
} }
else else // Otherwise we handle each direction individually.
{ {
if (flag & wxALIGN_CENTER_HORIZONTAL) if (flag & wxALIGN_CENTER_HORIZONTAL)
{ {
@@ -1531,6 +1533,10 @@ void wxGridSizer::SetItemBounds( wxSizerItem *item, int x, int y, int w, int h )
{ {
pt.x = x + (w - sz.x); pt.x = x + (w - sz.x);
} }
else if (flag & wxEXPAND)
{
sz.x = w;
}
if (flag & wxALIGN_CENTER_VERTICAL) if (flag & wxALIGN_CENTER_VERTICAL)
{ {
@@ -1540,6 +1546,10 @@ void wxGridSizer::SetItemBounds( wxSizerItem *item, int x, int y, int w, int h )
{ {
pt.y = y + (h - sz.y); pt.y = y + (h - sz.y);
} }
else if ( flag & wxEXPAND )
{
sz.y = h;
}
} }
item->SetDimension(pt, sz); item->SetDimension(pt, sz);

View File

@@ -136,4 +136,23 @@ void GridSizerTestCase::Expand()
CPPUNIT_ASSERT_EQUAL( wxSize(sizeChild.x, sizeRest.y), CPPUNIT_ASSERT_EQUAL( wxSize(sizeChild.x, sizeRest.y),
children[2]->GetSize() ); children[2]->GetSize() );
CPPUNIT_ASSERT_EQUAL( sizeRest, children[3]->GetSize() ); CPPUNIT_ASSERT_EQUAL( sizeRest, children[3]->GetSize() );
// With expand and another alignment flag, they should expand only in the
// direction in which the alignment is not given.
SetChildren(children, wxSizerFlags().Expand().CentreVertical());
CPPUNIT_ASSERT_EQUAL( sizeChild, children[0]->GetSize() );
CPPUNIT_ASSERT_EQUAL( wxSize(sizeRest.x, sizeChild.y),
children[1]->GetSize() );
CPPUNIT_ASSERT_EQUAL( sizeChild, children[2]->GetSize() );
CPPUNIT_ASSERT_EQUAL( wxSize(sizeRest.x, sizeChild.y),
children[3]->GetSize() );
// Same as above but mirrored.
SetChildren(children, wxSizerFlags().Expand().CentreHorizontal());
CPPUNIT_ASSERT_EQUAL( sizeChild, children[0]->GetSize() );
CPPUNIT_ASSERT_EQUAL( sizeChild, children[1]->GetSize() );
CPPUNIT_ASSERT_EQUAL( wxSize(sizeChild.x, sizeRest.y),
children[2]->GetSize() );
CPPUNIT_ASSERT_EQUAL( wxSize(sizeChild.x, sizeRest.y),
children[3]->GetSize() );
} }