From 29080c76bd31bd02441a42dd3c1ec53caf129a91 Mon Sep 17 00:00:00 2001 From: Eric Renaud-Houde Date: Thu, 20 Oct 2016 14:16:56 -0400 Subject: [PATCH 1/2] Adding peripheral layout mode. --- src/ui/Layout.cpp | 26 ++++++++++++++++++++------ src/ui/Layout.h | 1 + test/src/LayoutTests.cpp | 6 +++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/ui/Layout.cpp b/src/ui/Layout.cpp index 032d994..e823715 100644 --- a/src/ui/Layout.cpp +++ b/src/ui/Layout.cpp @@ -62,24 +62,38 @@ void ui::LinearLayout::layout( View *view ) } ); // Update layout based on selected mode and primary axis. + size_t index = 0; float offset = mMargin.getUpperLeft()[axis]; + float negativeOffset = containerSize[axis] - mMargin.getLowerRight()[axis]; for( auto &subview : subviews ) { - if( mMode == Mode::DISTRIBUTE ) { - offset += ( containerSizeMinusMargins - subviewsTotal ) / float( subviews.size() + 1 ); + if( mMode == Mode::INCREMENT ) { + updateAxisPos( subview, offset, axis ); + offset += subview->getSize()[axis] + mPadding; + } + else if( mMode == Mode::DISTRIBUTE ) { + offset += (containerSizeMinusMargins - subviewsTotal) / float( subviews.size() + 1 ); updateAxisPos( subview, offset, axis ); offset += subview->getSize()[axis]; } else if( mMode == Mode::FILL ) { vec2 size = subview->getSize(); - size[axis] = ( containerSizeMinusMargins - paddingTotal ) / float( subviews.size() ); + size[axis] = (containerSizeMinusMargins - paddingTotal) / float( subviews.size() ); subview->setSize( size ); updateAxisPos( subview, offset, axis ); offset += subview->getSize()[axis] + mPadding; } - else { - updateAxisPos( subview, offset, axis ); - offset += subview->getSize()[axis] + mPadding; + else if( mMode == Mode::PERIPHERAL ) { + if( index < glm::ceil( 0.5f * subviews.size() ) ) { + updateAxisPos( subview, offset, axis ); + offset += subview->getSize()[axis] + mPadding; + } + else { + negativeOffset -= subview->getSize()[axis]; + updateAxisPos( subview, negativeOffset, axis ); + negativeOffset -= mPadding; + } } + ++index; } // Update alignment of all subviews on secondary axis. diff --git a/src/ui/Layout.h b/src/ui/Layout.h index 5854c11..c058ccb 100644 --- a/src/ui/Layout.h +++ b/src/ui/Layout.h @@ -64,6 +64,7 @@ class LinearLayout : public Layout { INCREMENT = 0, //! Each successive View is placed after the previous one + margin FILL, //! Spreads and expands subviews, overriding each subview's size. DISTRIBUTE, //! Spreads subviews equally based on their center. Ignores padding. + PERIPHERAL, //! Stacks subviews on each side. NUM_MODES }; diff --git a/test/src/LayoutTests.cpp b/test/src/LayoutTests.cpp index 3892c40..593e44f 100644 --- a/test/src/LayoutTests.cpp +++ b/test/src/LayoutTests.cpp @@ -54,10 +54,10 @@ void LayoutTests::addLabels( const ui::ViewRef &view, size_t count ) void LayoutTests::layout() { mHorizontalGroupView->setPos( vec2( 40, 40 ) ); - mHorizontalGroupView->setSize( vec2( 800, 80 ) ); + mHorizontalGroupView->setSize( vec2( 800, 100 ) ); - mVerticalGroupView->setPos( vec2( 40, 140 ) ); - mVerticalGroupView->setSize( vec2( 300, 300 ) ); + mVerticalGroupView->setPos( vec2( 40, 180 ) ); + mVerticalGroupView->setSize( vec2( 300, 400 ) ); } bool LayoutTests::keyDown( ci::app::KeyEvent &event ) From a7481b2404f984bfe766a6f7fc0d7f2f48c07c36 Mon Sep 17 00:00:00 2001 From: Eric Renaud-Houde Date: Thu, 20 Oct 2016 14:33:55 -0400 Subject: [PATCH 2/2] Formatting adjustements. --- src/ui/Layout.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/Layout.cpp b/src/ui/Layout.cpp index e823715..598ec39 100644 --- a/src/ui/Layout.cpp +++ b/src/ui/Layout.cpp @@ -71,13 +71,13 @@ void ui::LinearLayout::layout( View *view ) offset += subview->getSize()[axis] + mPadding; } else if( mMode == Mode::DISTRIBUTE ) { - offset += (containerSizeMinusMargins - subviewsTotal) / float( subviews.size() + 1 ); + offset += ( containerSizeMinusMargins - subviewsTotal ) / float( subviews.size() + 1 ); updateAxisPos( subview, offset, axis ); offset += subview->getSize()[axis]; } else if( mMode == Mode::FILL ) { vec2 size = subview->getSize(); - size[axis] = (containerSizeMinusMargins - paddingTotal) / float( subviews.size() ); + size[axis] = ( containerSizeMinusMargins - paddingTotal ) / float( subviews.size() ); subview->setSize( size ); updateAxisPos( subview, offset, axis ); offset += subview->getSize()[axis] + mPadding;