-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Flora License, Version 1.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://floralicense.org/license/
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an AS IS BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
// CLASS HEADER
-
#include "alignment-impl.h"
-// INTERNAL INCLUDES
-
// EXTERNAL INCLUDES
+#include <dali/public-api/object/property-input.h>
+#include <dali/public-api/object/type-registry.h>
+#include <dali/devel-api/object/type-registry-helper.h>
+#include <dali/public-api/size-negotiation/relayout-container.h>
namespace Dali
{
return Toolkit::Alignment::New();
}
-TypeRegistration mType( typeid(Toolkit::Alignment), typeid(Toolkit::Control), Create );
+DALI_TYPE_REGISTRATION_BEGIN( Toolkit::Alignment, Toolkit::Control, Create )
+DALI_TYPE_REGISTRATION_END()
struct ScaleToFillConstraint
{
{}
/**
- * CopyConstructor. Used by Boost.
- * @param rhs Copying from.
- */
- ScaleToFillConstraint( const ScaleToFillConstraint& rhs )
- : mPadding( rhs.mPadding )
- {}
-
- /**
* Called by render thread
*/
Vector3 operator()( const Vector3& currentSize,
{}
/**
- * CopyConstructor. Used by Boost.
- * @param rhs Copying from.
- */
- ScaleToFitKeepAspectConstraint( const ScaleToFitKeepAspectConstraint& rhs )
- : mPadding( rhs.mPadding ),
- mSizeStored( rhs.mSizeStored ),
- mOriginalSize( rhs.mOriginalSize )
- {}
-
- /**
* Called by render thread
*/
Vector3 operator()( const Vector3& currentSize,
{ }
/**
- * CopyConstructor. Used by Boost.
- * @param rhs Copying from.
- */
- ScaleToFillKeepAspectConstraint( const ScaleToFillKeepAspectConstraint& rhs )
- : mPadding( rhs.mPadding ),
- mSizeStored( rhs.mSizeStored ),
- mOriginalSize( rhs.mOriginalSize )
- {}
-
- /**
* Called by render thread
*/
Vector3 operator()( const Vector3& currentSize,
{}
/**
- * CopyConstructor. Used by Boost.
- * @param rhs Copying from.
- */
- ShrinkToFitConstraint( const ShrinkToFitConstraint& rhs )
- : mPadding( rhs.mPadding ),
- mSizeStored( rhs.mSizeStored ),
- mOriginalSize( rhs.mOriginalSize )
- { }
-
- /**
* Called by render thread
*/
Vector3 operator()( const Vector3& currentSize,
{}
/**
- * CopyConstructor. Used by Boost.
- * @param rhs Copying from.
- */
- ShrinkToFitKeepAspectConstraint( const ShrinkToFitKeepAspectConstraint& rhs )
- : mPadding( rhs.mPadding ),
- mSizeStored( rhs.mSizeStored ),
- mOriginalSize( rhs.mOriginalSize )
- { }
-
- /**
* Called by render thread
*/
Vector3 operator()( const Vector3& currentSize,
{}
/**
- * CopyConstructor. Used by Boost.
- * @param rhs Copying from.
- */
- PositionConstraint( const PositionConstraint& rhs )
- : mPadding( rhs.mPadding ),
- mHorizontalAlignment( rhs.mHorizontalAlignment ),
- mVerticalAlignment( rhs.mVerticalAlignment )
- {}
-
- /**
* Called by render thread.
*/
Vector3 operator()( const Vector3& currentPosition,
const Vector3& currentSize( currentSizeProperty.GetVector3() );
const Vector3& parentSize( parentSizeProperty.GetVector3() );
+ return GetPosition( currentSize, parentSize );
+ }
+
+ inline Vector3 GetPosition( const Vector3& currentSize, const Vector3& parentSize )
+ {
Vector3 position( 0.f, 0.f, 0.f );
switch( mHorizontalAlignment )
{
- case Dali::Toolkit::Alignment::HorizontalLeft:
- {
- position.x += mPadding.left;
- break;
- }
- case Dali::Toolkit::Alignment::HorizontalCenter:
- {
- if( currentSize.width + mPadding.left + mPadding.right >= parentSize.width )
- {
- position.x += 0.5f * ( mPadding.left - mPadding.right );
- }
- break;
- }
- case Dali::Toolkit::Alignment::HorizontalRight:
- {
- position.x -= mPadding.right;
- break;
- }
- default:
+ case Dali::Toolkit::Alignment::HorizontalLeft:
+ {
+ position.x += mPadding.left;
+ break;
+ }
+ case Dali::Toolkit::Alignment::HorizontalCenter:
+ {
+ if( currentSize.width + mPadding.left + mPadding.right >= parentSize.width )
{
- DALI_ASSERT_ALWAYS( !"Wrong horizontal alignment value" );
- break;
+ position.x += 0.5f * ( mPadding.left - mPadding.right );
}
+ break;
+ }
+ case Dali::Toolkit::Alignment::HorizontalRight:
+ {
+ position.x -= mPadding.right;
+ break;
+ }
+ default:
+ {
+ DALI_ASSERT_ALWAYS( !"Wrong horizontal alignment value" );
+ break;
+ }
}
switch( mVerticalAlignment )
{
- case Dali::Toolkit::Alignment::VerticalTop:
- {
- position.y += mPadding.top;
- break;
- }
- case Dali::Toolkit::Alignment::VerticalCenter:
- {
- if( currentSize.height + mPadding.top + mPadding.bottom >= parentSize.height )
- {
- position.y += 0.5f * ( mPadding.top - mPadding.bottom );
- }
- break;
- }
- case Dali::Toolkit::Alignment::VerticalBottom:
- {
- position.y -= mPadding.bottom;
- break;
- }
- default:
+ case Dali::Toolkit::Alignment::VerticalTop:
+ {
+ position.y += mPadding.top;
+ break;
+ }
+ case Dali::Toolkit::Alignment::VerticalCenter:
+ {
+ if( currentSize.height + mPadding.top + mPadding.bottom >= parentSize.height )
{
- DALI_ASSERT_ALWAYS( !"Wrong vertical alignment value" );
- break;
+ position.y += 0.5f * ( mPadding.top - mPadding.bottom );
}
+ break;
+ }
+ case Dali::Toolkit::Alignment::VerticalBottom:
+ {
+ position.y -= mPadding.bottom;
+ break;
+ }
+ default:
+ {
+ DALI_ASSERT_ALWAYS( !"Wrong vertical alignment value" );
+ break;
+ }
}
return position;
const Toolkit::Alignment::Type mHorizontalAlignment;
const Toolkit::Alignment::Type mVerticalAlignment;
};
-
-void SetPositionConstraint( Actor actor, const Toolkit::Alignment::Padding& padding, Toolkit::Alignment::Type horizontal, Toolkit::Alignment::Type vertical )
-{
- Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
- LocalSource( Actor::SIZE ),
- ParentSource( Actor::SIZE ),
- PositionConstraint( padding, horizontal, vertical ) );
- actor.ApplyConstraint( constraint );
-}
} // namespace
Toolkit::Alignment Alignment::New( Toolkit::Alignment::Type horizontal, Toolkit::Alignment::Type vertical )
// Create the implementation, temporarily owned on stack
IntrusivePtr< Alignment > internalAlignment = new Alignment( horizontal, vertical );
- // Pass ownership to Toolkit::View
+ // Pass ownership to Toolkit::Alignment
Toolkit::Alignment alignment( *internalAlignment );
// Second-phase init of the implementation
void Alignment::SetAlignmentType( Toolkit::Alignment::Type type )
{
// Horizontal Alignment
- bool horizontalSet(false);
-
+ if( type & Toolkit::Alignment::HorizontalRight )
+ {
+ mHorizontal = Toolkit::Alignment::HorizontalRight;
+ }
if( type & Toolkit::Alignment::HorizontalLeft )
{
mHorizontal = Toolkit::Alignment::HorizontalLeft;
- horizontalSet = true;
}
if( type & Toolkit::Alignment::HorizontalCenter )
{
- DALI_ASSERT_ALWAYS(!horizontalSet);
mHorizontal = Toolkit::Alignment::HorizontalCenter;
- horizontalSet = true;
- }
- if( type & Toolkit::Alignment::HorizontalRight )
- {
- DALI_ASSERT_ALWAYS(!horizontalSet);
- mHorizontal = Toolkit::Alignment::HorizontalRight;
}
// Vertical Alignment
- bool verticalSet(false);
-
+ if( type & Toolkit::Alignment::VerticalBottom )
+ {
+ mVertical = Toolkit::Alignment::VerticalBottom;
+ }
if( type & Toolkit::Alignment::VerticalTop )
{
mVertical = Toolkit::Alignment::VerticalTop;
- verticalSet = true;
}
if( type & Toolkit::Alignment::VerticalCenter )
{
- DALI_ASSERT_ALWAYS(!verticalSet);
mVertical = Toolkit::Alignment::VerticalCenter;
- verticalSet = true;
- }
- if( type & Toolkit::Alignment::VerticalBottom )
- {
- DALI_ASSERT_ALWAYS(!verticalSet);
- mVertical = Toolkit::Alignment::VerticalBottom;
}
RelayoutRequest();
return mPadding;
}
-void Alignment::OnRelaidOut( Vector2 size, ActorSizeContainer& container )
+void Alignment::OnRelayout( const Vector2& size, RelayoutContainer& container )
{
// lay out the actors
Vector3 anchorPointAndParentOrigin = Vector3::ZERO;
anchorPointAndParentOrigin.y = 1.0f;
}
- unsigned int childCount = Self().GetChildCount();
- for( unsigned int i=0; i<childCount; ++i )
+ for( unsigned int i = 0, childCount = Self().GetChildCount(); i < childCount; ++i )
{
- Actor actor = Self().GetChildAt(i);
+ Actor child = Self().GetChildAt(i);
- actor.SetAnchorPoint( anchorPointAndParentOrigin );
- actor.SetParentOrigin( anchorPointAndParentOrigin );
+ child.SetAnchorPoint( anchorPointAndParentOrigin );
+ child.SetParentOrigin( anchorPointAndParentOrigin );
- if( Toolkit::Alignment::ScaleNone != mScaling )
+ Vector3 currentChildSize( child.GetTargetSize() );
+ if( currentChildSize == Vector3::ZERO )
{
- actor.RemoveConstraints();
+ currentChildSize = child.GetNaturalSize();
}
- Vector3 actorSize ( actor.GetCurrentSize() );
- Control control( Control::DownCast( actor ) );
- if ( actorSize == Vector3::ZERO && control )
- {
- actorSize = control.GetNaturalSize();
- }
-
- Vector2 childSize;
+ bool renegotiate = true;
+ Vector3 newChildSize;
switch( mScaling )
{
case Toolkit::Alignment::ScaleNone:
{
// Nothing to do but needed just to not to jump to the default.
- childSize = size;
+ newChildSize = currentChildSize;
+ renegotiate = false;
break;
}
case Toolkit::Alignment::ScaleToFill:
{
ScaleToFillConstraint constraint( mPadding );
- childSize = Vector2( constraint.GetSize( actorSize, Vector3(size) ) );
- SetPositionConstraint( actor, mPadding, mHorizontal, mVertical );
+ newChildSize = constraint.GetSize( currentChildSize, Vector3(size) ) ;
break;
}
case Toolkit::Alignment::ScaleToFitKeepAspect:
{
ScaleToFitKeepAspectConstraint constraint( mPadding );
- childSize = Vector2( constraint.GetSize( actorSize, Vector3(size) ) );
- SetPositionConstraint( actor, mPadding, mHorizontal, mVertical );
+ newChildSize = constraint.GetSize( currentChildSize, Vector3(size) ) ;
break;
}
case Toolkit::Alignment::ScaleToFillKeepAspect:
{
ScaleToFillKeepAspectConstraint constraint( mPadding );
- childSize = Vector2( constraint.GetSize( actorSize, Vector3(size) ) );
- SetPositionConstraint( actor, mPadding, mHorizontal, mVertical );
+ newChildSize = constraint.GetSize( currentChildSize, Vector3(size) );
break;
}
case Toolkit::Alignment::ShrinkToFit:
{
ShrinkToFitConstraint constraint( mPadding );
- childSize = Vector2( constraint.GetSize( actorSize, Vector3(size) ) );
- SetPositionConstraint( actor, mPadding, mHorizontal, mVertical );
+ newChildSize = constraint.GetSize( currentChildSize, Vector3(size) );
break;
}
case Toolkit::Alignment::ShrinkToFitKeepAspect:
{
ShrinkToFitKeepAspectConstraint constraint( mPadding );
- childSize = Vector2( constraint.GetSize( actorSize, Vector3(size) ) );
- SetPositionConstraint( actor, mPadding, mHorizontal, mVertical );
+ newChildSize = constraint.GetSize( currentChildSize, Vector3(size) );
break;
}
default:
}
}
- Relayout( actor, childSize, container );
+ PositionConstraint positionConstraint(mPadding, mHorizontal, mVertical);
+ child.SetPosition( positionConstraint.GetPosition(newChildSize, currentChildSize) );
+
+ if( renegotiate )
+ {
+ container.Add( child, Vector2(newChildSize) );
+ }
}
}
Alignment::Alignment( Toolkit::Alignment::Type horizontal, Toolkit::Alignment::Type vertical )
-: ControlImpl( false ), // doesn't require touch events
+: Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ),
mHorizontal( horizontal ),
mVertical( vertical ),
mScaling( Toolkit::Alignment::ScaleNone ),