diff --git a/src/ui/Layout.cpp b/src/ui/Layout.cpp index 032d994..598ec39 100644 --- a/src/ui/Layout.cpp +++ b/src/ui/Layout.cpp @@ -62,9 +62,15 @@ 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 ) { + 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]; @@ -76,10 +82,18 @@ void ui::LinearLayout::layout( View *view ) 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 )