Merge branch 'sizerflags-center-align'

Fix combining wxSizerFlags alignment and CenterXXX().

See https://github.com/wxWidgets/wxWidgets/pull/2190
This commit is contained in:
Vadim Zeitlin 2021-01-27 17:55:18 +01:00
commit 97eecc1cce
3 changed files with 88 additions and 55 deletions

View File

@ -69,14 +69,26 @@ public:
return *this;
}
// some shortcuts for Align()
// this is just a shortcut for Align()
wxSizerFlags& Centre() { return Align(wxALIGN_CENTRE); }
wxSizerFlags& Center() { return Centre(); }
wxSizerFlags& CentreVertical() { return Align(wxALIGN_CENTRE_VERTICAL); }
// but all the remaining methods turn on the corresponding alignment flag
// without affecting the existing ones
wxSizerFlags& CentreVertical()
{
m_flags = (m_flags & ~wxALIGN_BOTTOM) | wxALIGN_CENTRE_VERTICAL;
return *this;
}
wxSizerFlags& CenterVertical() { return CentreVertical(); }
wxSizerFlags& CentreHorizontal() { return Align(wxALIGN_CENTRE_HORIZONTAL); }
wxSizerFlags& CentreHorizontal()
{
m_flags = (m_flags & ~wxALIGN_RIGHT) | wxALIGN_CENTRE_HORIZONTAL;
return *this;
}
wxSizerFlags& CenterHorizontal() { return CentreHorizontal(); }
wxSizerFlags& Top()

View File

@ -1455,6 +1455,9 @@ public:
them anyhow. For 2D sizers, centering an item in one direction is quite
different from centering it in both directions however.
Note that, unlike Align(), this method doesn't change the vertical
alignment.
@see CentreVertical()
@since 3.1.0
@ -1467,6 +1470,9 @@ public:
The remarks in CentreHorizontal() documentation also apply to this
function.
Note that, unlike Align(), this method doesn't change the horizontal
alignment.
@since 3.1.0
*/
wxSizerFlags& CentreVertical();

View File

@ -25,23 +25,11 @@
// test class
// ----------------------------------------------------------------------------
class GridSizerTestCase : public CppUnit::TestCase
class GridSizerTestCase
{
public:
GridSizerTestCase() { }
virtual void setUp() wxOVERRIDE;
virtual void tearDown() wxOVERRIDE;
private:
CPPUNIT_TEST_SUITE( GridSizerTestCase );
CPPUNIT_TEST( Expand );
CPPUNIT_TEST( IncompatibleFlags );
CPPUNIT_TEST_SUITE_END();
void Expand();
void IncompatibleFlags();
protected:
GridSizerTestCase();
~GridSizerTestCase();
// Clear the current sizer contents and add the specified windows to it,
// using the same flags for all of them.
void SetChildren(const wxVector<wxWindow*>& children,
@ -53,17 +41,11 @@ private:
wxDECLARE_NO_COPY_CLASS(GridSizerTestCase);
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( GridSizerTestCase );
// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( GridSizerTestCase, "GridSizerTestCase" );
// ----------------------------------------------------------------------------
// test initialization
// ----------------------------------------------------------------------------
void GridSizerTestCase::setUp()
GridSizerTestCase::GridSizerTestCase()
{
m_win = new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY);
m_win->SetClientSize(127, 35);
@ -72,7 +54,7 @@ void GridSizerTestCase::setUp()
m_win->SetSizer(m_sizer);
}
void GridSizerTestCase::tearDown()
GridSizerTestCase::~GridSizerTestCase()
{
delete m_win;
m_win = NULL;
@ -102,7 +84,9 @@ void GridSizerTestCase::SetChildren(const wxVector<wxWindow*>& children,
// tests themselves
// ----------------------------------------------------------------------------
void GridSizerTestCase::Expand()
TEST_CASE_METHOD(GridSizerTestCase,
"wxGridSizer::Layout",
"[grid-sizer][sizer]")
{
const wxSize sizeTotal = m_win->GetClientSize();
const wxSize sizeChild(sizeTotal.x / 4, sizeTotal.y / 4);
@ -120,43 +104,74 @@ void GridSizerTestCase::Expand()
m_sizer->AddGrowableCol(1);
// Without Expand() windows have their initial size.
SetChildren(children, wxSizerFlags());
CPPUNIT_ASSERT_EQUAL( sizeChild, children[0]->GetSize() );
CPPUNIT_ASSERT_EQUAL( sizeChild, children[1]->GetSize() );
CPPUNIT_ASSERT_EQUAL( sizeChild, children[2]->GetSize() );
CPPUNIT_ASSERT_EQUAL( sizeChild, children[3]->GetSize() );
SECTION("No flags")
{
SetChildren(children, wxSizerFlags());
CHECK( children[0]->GetSize() == sizeChild );
CHECK( children[1]->GetSize() == sizeChild );
CHECK( children[2]->GetSize() == sizeChild );
CHECK( children[3]->GetSize() == sizeChild );
}
// With just expand, they expand to fill the entire column and the row
// containing them (which may or not expand on its own).
SetChildren(children, wxSizerFlags().Expand());
CPPUNIT_ASSERT_EQUAL( sizeChild, children[0]->GetSize() );
CPPUNIT_ASSERT_EQUAL( wxSize(sizeRest.x, sizeChild.y),
children[1]->GetSize() );
CPPUNIT_ASSERT_EQUAL( wxSize(sizeChild.x, sizeRest.y),
children[2]->GetSize() );
CPPUNIT_ASSERT_EQUAL( sizeRest, children[3]->GetSize() );
SECTION("Expand")
{
SetChildren(children, wxSizerFlags().Expand());
CHECK( children[0]->GetSize() == sizeChild );
CHECK( children[1]->GetSize() == wxSize(sizeRest.x, sizeChild.y) );
CHECK( children[2]->GetSize() == wxSize(sizeChild.x, sizeRest.y) );
CHECK( children[3]->GetSize() == sizeRest );
}
// 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() );
SECTION("Expand and center vertically")
{
SetChildren(children, wxSizerFlags().Expand().CentreVertical());
CHECK( children[0]->GetSize() == sizeChild );
CHECK( children[1]->GetSize() == wxSize(sizeRest.x, sizeChild.y) );
CHECK( children[2]->GetSize() == sizeChild );
CHECK( children[3]->GetSize() == wxSize(sizeRest.x, sizeChild.y) );
}
// 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() );
SECTION("Expand and center horizontally")
{
SetChildren(children, wxSizerFlags().Expand().CentreHorizontal());
CHECK( children[0]->GetSize() == sizeChild );
CHECK( children[1]->GetSize() == sizeChild );
CHECK( children[2]->GetSize() == wxSize(sizeChild.x, sizeRest.y) );
CHECK( children[3]->GetSize() == wxSize(sizeChild.x, sizeRest.y) );
}
// Test alignment flag too.
SECTION("Right align")
{
SetChildren(children, wxSizerFlags().Right());
CHECK( children[0]->GetPosition() == wxPoint( 0, 0) );
CHECK( children[1]->GetPosition() == wxPoint(sizeRest.x, 0) );
CHECK( children[2]->GetPosition() == wxPoint( 0, sizeChild.y) );
CHECK( children[3]->GetPosition() == wxPoint(sizeRest.x, sizeChild.y) );
}
// Also test combining centering in one direction and aligning in another.
SECTION("Right align and center vertically")
{
SetChildren(children, wxSizerFlags().Right().CentreVertical());
const int yMid = sizeChild.y + (sizeRest.y - sizeChild.y) / 2;
CHECK( children[0]->GetPosition() == wxPoint( 0, 0) );
CHECK( children[1]->GetPosition() == wxPoint(sizeRest.x, 0) );
CHECK( children[2]->GetPosition() == wxPoint( 0, yMid) );
CHECK( children[3]->GetPosition() == wxPoint(sizeRest.x, yMid) );
}
}
void GridSizerTestCase::IncompatibleFlags()
TEST_CASE_METHOD(GridSizerTestCase,
"wxGridSizer::IncompatibleFlags",
"[grid-sizer][sizer]")
{
WX_ASSERT_FAILS_WITH_ASSERT_MESSAGE
(