Rectf Control::getBounds( bool bIncludeSubviews ) { Rectf bounds = Rectf( 0.0f, 0.0f, getWidth(), getHeight() ); Rectf hitRect = mHitRect; hitRect.x1-=mPadding.mLeft; hitRect.y1-=mPadding.mTop; hitRect.x2+=mPadding.mRight; hitRect.y2+=mPadding.mBottom; bounds.include( hitRect ); if( bIncludeSubviews ) { for ( auto &it : mSubViews ) { bounds.include( it->getBounds( bIncludeSubviews ) ); } bounds.offset( getOrigin( false ) ); } else { bounds.offset( getOrigin() ); } return bounds; }
Rectf View::getBounds( bool bIncludeSubviews ) { Rectf bounds = Rectf( 0.0f, 0.0f, getWidth(), getHeight() ); if( bIncludeSubviews ) { for ( auto &it : mSubViews ) { bounds.include( it->getBounds( bIncludeSubviews ) ); } bounds.offset( getOrigin( false ) ); } else { bounds.offset( getOrigin() ); } return bounds; }
void Grove::createMenuModal( const std::string &name, ci::Rectf *rect, ci::vec2 *offset, const WidgetRef &menu, const std::function<void()> &cancel, const std::function<void()> &confirm, bool adaptBackgroundColor ) { // create the layout Rectf fullRect = *rect; fullRect.include( vec2( fullRect.getCenter().x, fullRect.getLowerRight().y + 180 ) ); fullRect = fullRect.getCenteredFit( getWindowBounds(), false ); // get the window bounds #if defined( CINDER_COCOA_TOUCH ) Rectf windowBounds = toPixels( Rectf( vec2( 0.0f ), vec2( getWindowHeight(), getWindowWidth() ) ) ); #else Rectf windowBounds = toPixels( getWindowBounds() ); #endif // if the screen is really small, add some extra margins if( abs( fullRect.getWidth() - windowBounds.getWidth() ) < 300 ) fullRect.scaleCentered( (float) ( windowBounds.getWidth() - 300 ) / (float) fullRect.getWidth() ); if( abs( fullRect.getHeight() - windowBounds.getHeight() ) < 300 ) fullRect.scaleCentered( (float) ( windowBounds.getHeight() - 300 ) / (float) fullRect.getHeight() ); *rect = (*rect).getCenteredFit( fullRect, false ); (*rect).offset( vec2( 0.0f, -( fullRect.getHeight() - (*rect).getHeight() ) / 2.0f ) ); *offset = vec2( 0.0f, -fullRect.getLowerLeft().y ); auto fadeIn = [this](){ timeline().applyPtr( &mFogDensity, 1.0f, 2.0f, EaseInAtan() ); timeline().applyPtr( &mSunIntensity, 0.0f, 2.0f, EaseInAtan() ) .updateFn( [this](){ mTerrain->setFogDensity( mFogDensity ); mTerrain->setSunIntensity( mSunIntensity ); } ); }; auto fadeOut = [this](){ timeline().applyPtr( &mFogDensity, 0.129f, 6.0f, EaseOutAtan() ); timeline().applyPtr( &mSunIntensity, 0.166f, 6.0f, EaseOutAtan() ) .updateFn( [this](){ mTerrain->setFogDensity( mFogDensity ); mTerrain->setSunIntensity( mSunIntensity ); } ); }; // add events if( menu ){ menu->onPressed( name, [=]( WidgetEvent event ) { if( adaptBackgroundColor ) fadeIn(); mModal = true; event.getWidget()->close( true, event.getItem() ); // wait for the menu to close timeline().add( [=](){ timeline().applyPtr( offset, vec2(0), 1.0f, EaseInQuad() ) .finishFn( [=]() { vector<string> items; if( confirm ) items = { "ConfirmWire", "QuitWire" }; else items = { "QuitWire" }; mWidget = Widget::create( Widget::Format() .items( items ) .position( (*rect).getLowerLeft() + vec2( (*rect).getWidth() / 2 + ( confirm ? 69 : 0 ), ( fullRect.getHeight() - (*rect).getHeight() ) / 2 ) ) .autoClose( false ) ); mWidget->onClose( [=]( WidgetEvent event ){ timeline().applyPtr( offset, vec2( 0, -fullRect.getLowerLeft().y ), 1.0f, EaseOutQuad() ); if( adaptBackgroundColor ) fadeOut(); } ); mWidget->onCloseEnded( [=]( WidgetEvent event ){ mOpenMenuButton->open(); } ); if( confirm ){ mWidget->onPressed( "ConfirmWire", [=]( WidgetEvent event ) { event.getWidget()->close(); timeline().add( [=](){ mModal = false; }, timeline().getCurrentTime() + 1.5f ); confirm(); } ); } mWidget->onPressed( "QuitWire", [=]( WidgetEvent event ) { event.getWidget()->close(); timeline().add( [=](){ mModal = false; }, timeline().getCurrentTime() + 1.5f ); if( cancel ) cancel(); } ); } ); }, timeline().getCurrentTime() + 1.0f ); } ); } else { vector<string> items; if( confirm ) items = { "ConfirmWire", "QuitWire" }; else items = { "QuitWire" }; mWidget = Widget::create( Widget::Format() .items( items ) .position( (*rect).getLowerLeft() + vec2( (*rect).getWidth() / 2 + ( confirm ? 69 : 0 ), ( fullRect.getHeight() - (*rect).getHeight() ) / 2 ) ) .autoClose( false ) ); mWidget->onClose( [=]( WidgetEvent event ){ timeline().applyPtr( offset, vec2( 0, -fullRect.getLowerLeft().y ), 1.0f, EaseOutQuad() ); if( adaptBackgroundColor ) fadeOut(); } ); mWidget->onCloseEnded( [=]( WidgetEvent event ){ mOpenMenuButton->open(); } ); if( confirm ){ mWidget->onPressed( "ConfirmWire", [=]( WidgetEvent event ) { event.getWidget()->close(); timeline().add( [=](){ mModal = false; }, timeline().getCurrentTime() + 1.5f ); confirm(); } ); } mWidget->onPressed( "QuitWire", [=]( WidgetEvent event ) { event.getWidget()->close(); timeline().add( [=](){ mModal = false; }, timeline().getCurrentTime() + 1.5f ); if( cancel ) cancel(); } ); if( adaptBackgroundColor ) fadeIn(); mModal = true; timeline().applyPtr( offset, vec2(0), 1.0f, EaseInQuad() ); } }