X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-field-impl.cpp;h=7341032d1e87abef67cd0ae37185c75fd15d9eb6;hb=refs%2Fchanges%2F55%2F103555%2F3;hp=e95ac995751fbeeb166469752c85fd6b24c0f87c;hpb=ee431c9e2b342243f9e0e2b6bafca7505d321457;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index e95ac99..7341032 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -30,7 +30,9 @@ // INTERNAL INCLUDES #include +#include #include +#include #include #include #include @@ -270,7 +272,17 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } case Toolkit::TextField::Property::EXCEED_POLICY: { - // TODO + impl.mExceedPolicy = value.Get(); + + if( Dali::Toolkit::TextField::EXCEED_POLICY_CLIP == impl.mExceedPolicy ) + { + impl.EnableClipping(); + } + else + { + UnparentAndReset( impl.mStencil ); + } + impl.RequestTextRelayout(); break; } case Toolkit::TextField::Property::HORIZONTAL_ALIGNMENT: @@ -803,7 +815,7 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde } case Toolkit::TextField::Property::VERTICAL_ALIGNMENT: { - if( impl.mController ) + if( impl.mController ) { const char* name = Scripting::GetEnumerationName< Toolkit::Text::Layout::VerticalAlignment >( impl.mController->GetVerticalAlignment(), VERTICAL_ALIGNMENT_STRING_TABLE, @@ -1160,6 +1172,11 @@ void TextField::OnInitialize() self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::HEIGHT ); self.OnStageSignal().Connect( this, &TextField::OnStageConnect ); + + if( Dali::Toolkit::TextField::EXCEED_POLICY_CLIP == mExceedPolicy ) + { + EnableClipping(); + } } void TextField::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change ) @@ -1222,7 +1239,6 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) mRenderer = Backend::Get().NewRenderer( mRenderingBackend ); } - EnableClipping( size ); RenderText( updateTextType ); } @@ -1248,7 +1264,6 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) void TextField::RenderText( Text::Controller::UpdateTextType updateTextType ) { - Actor self = Self(); Actor renderableActor; if( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) ) @@ -1271,39 +1286,19 @@ void TextField::RenderText( Text::Controller::UpdateTextType updateTextType ) mRenderableActor.SetPosition( scrollOffset.x, scrollOffset.y ); - Actor clipRootActor; - if( mClipper ) - { - clipRootActor = mClipper->GetRootActor(); - } + // Make sure the actors are parented correctly with/without clipping + Actor self = mStencil ? mStencil : Self(); for( std::vector::const_iterator it = mClippingDecorationActors.begin(), endIt = mClippingDecorationActors.end(); it != endIt; ++it ) { - Actor actor = *it; - - if( clipRootActor ) - { - clipRootActor.Add( actor ); - } - else - { - self.Add( actor ); - } + self.Add( *it ); } mClippingDecorationActors.clear(); - // Make sure the actor is parented correctly with/without clipping - if( clipRootActor ) - { - clipRootActor.Add( mRenderableActor ); - } - else - { - self.Add( mRenderableActor ); - } + self.Add( mRenderableActor ); } } @@ -1531,31 +1526,26 @@ void TextField::GetHandleImagePropertyValue( Property::Value& value, Text::Hand } } -void TextField::EnableClipping( const Vector2& size ) +void TextField::EnableClipping() { - if( Dali::Toolkit::TextField::EXCEED_POLICY_CLIP == mExceedPolicy ) - { - // Not worth to created clip actor if width or height is equal to zero. - if( size.width > Math::MACHINE_EPSILON_1000 && size.height > Math::MACHINE_EPSILON_1000 ) - { - if( !mClipper ) - { - Actor self = Self(); - - mClipper = Clipper::New( size ); - self.Add( mClipper->GetRootActor() ); - self.Add( mClipper->GetImageView() ); - } - else if ( mClipper ) - { - mClipper->Refresh( size ); - } - } - } - else + if( !mStencil ) { - // Note - this will automatically remove the root actor & the image view - mClipper.Reset(); + // Creates an extra control to be used as stencil buffer. + mStencil = Control::New(); + mStencil.SetAnchorPoint( AnchorPoint::CENTER ); + mStencil.SetParentOrigin( ParentOrigin::CENTER ); + + // Creates a background visual. Even if the color is transparent it updates the stencil. + // Property::Map backgroundMap; + mStencil.SetProperty( Toolkit::Control::Property::BACKGROUND, + Property::Map().Add( Toolkit::Visual::Property::TYPE, DevelVisual::COLOR ). + Add( ColorVisual::Property::MIX_COLOR, Color::TRANSPARENT ) ); + + // Enable the clipping property. + mStencil.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN ); + mStencil.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + + Self().Add( mStencil ); } } @@ -1615,7 +1605,7 @@ TextField::TextField() TextField::~TextField() { - mClipper.Reset(); + UnparentAndReset( mStencil ); if( ( NULL != mIdleCallback ) && Adaptor::IsAvailable() ) {