X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-label-impl.cpp;h=e871db3d2b55f6e488e2d3b1699680eb8ecc73be;hp=9f7863fa80053e883678a03c1d23321f52605e1d;hb=5c827a7125b3c0420ba39766cbbcb0ee3eb8fccf;hpb=db152116b8c7de79b206d7d361c9d3875d05d0ac diff --git a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp index 9f7863f..e871db3 100644 --- a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp @@ -20,11 +20,13 @@ // EXTERNAL INCLUDES #include +#include #include // INTERNAL INCLUDES #include #include +#include #include #include #include @@ -33,6 +35,13 @@ #include #include +#include +#include +#include +#include +#include +#include + using namespace Dali::Toolkit::Text; namespace Dali @@ -56,6 +65,13 @@ namespace Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT_CONTROLS"); #endif +const Scripting::StringEnum AUTO_SCROLL_STOP_MODE_TABLE[] = +{ + { "IMMEDIATE", Toolkit::DevelTextLabel::AutoScrollStopMode::IMMEDIATE }, + { "FINISH_LOOP", Toolkit::DevelTextLabel::AutoScrollStopMode::FINISH_LOOP }, +}; +const unsigned int AUTO_SCROLL_STOP_MODE_TABLE_COUNT = sizeof( AUTO_SCROLL_STOP_MODE_TABLE ) / sizeof( AUTO_SCROLL_STOP_MODE_TABLE[0] ); + const Scripting::StringEnum HORIZONTAL_ALIGNMENT_STRING_TABLE[] = { { "BEGIN", Toolkit::Text::Layout::HORIZONTAL_ALIGN_BEGIN }, @@ -72,6 +88,13 @@ const Scripting::StringEnum VERTICAL_ALIGNMENT_STRING_TABLE[] = }; const unsigned int VERTICAL_ALIGNMENT_STRING_TABLE_COUNT = sizeof( VERTICAL_ALIGNMENT_STRING_TABLE ) / sizeof( VERTICAL_ALIGNMENT_STRING_TABLE[0] ); +const Scripting::StringEnum LINE_WRAP_MODE_STRING_TABLE[] = +{ + { "WRAP_MODE_WORD", Toolkit::Text::Layout::LineWrap::WORD }, + { "WRAP_MODE_CHARACTER", Toolkit::Text::Layout::LineWrap::CHARACTER } +}; +const unsigned int LINE_WRAP_MODE_STRING_TABLE_COUNT = sizeof( LINE_WRAP_MODE_STRING_TABLE ) / sizeof( LINE_WRAP_MODE_STRING_TABLE[0] ); + // Type registration BaseHandle Create() { @@ -81,31 +104,41 @@ BaseHandle Create() // Setup properties, signals and actions using the type-registry. DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextLabel, Toolkit::Control, Create ); -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "renderingBackend", INTEGER, RENDERING_BACKEND ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "text", STRING, TEXT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "fontFamily", STRING, FONT_FAMILY ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "fontStyle", MAP, FONT_STYLE ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "pointSize", FLOAT, POINT_SIZE ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "multiLine", BOOLEAN, MULTI_LINE ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "horizontalAlignment", STRING, HORIZONTAL_ALIGNMENT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "verticalAlignment", STRING, VERTICAL_ALIGNMENT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "textColor", VECTOR4, TEXT_COLOR ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "shadowOffset", VECTOR2, SHADOW_OFFSET ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "shadowColor", VECTOR4, SHADOW_COLOR ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "underlineEnabled", BOOLEAN, UNDERLINE_ENABLED ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "underlineColor", VECTOR4, UNDERLINE_COLOR ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "underlineHeight", FLOAT, UNDERLINE_HEIGHT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "enableMarkup", BOOLEAN, ENABLE_MARKUP ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "enableAutoScroll", BOOLEAN, ENABLE_AUTO_SCROLL ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "autoScrollSpeed", INTEGER, AUTO_SCROLL_SPEED ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "autoScrollLoopCount", INTEGER, AUTO_SCROLL_LOOP_COUNT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "autoScrollGap", FLOAT, AUTO_SCROLL_GAP ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "lineSpacing", FLOAT, LINE_SPACING ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "underline", MAP, UNDERLINE ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "shadow", MAP, SHADOW ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "emboss", MAP, EMBOSS ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "outline", MAP, OUTLINE ) - +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "renderingBackend", INTEGER, RENDERING_BACKEND ) // Deprecated property +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "text", STRING, TEXT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "fontFamily", STRING, FONT_FAMILY ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "fontStyle", MAP, FONT_STYLE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "pointSize", FLOAT, POINT_SIZE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "multiLine", BOOLEAN, MULTI_LINE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "horizontalAlignment", STRING, HORIZONTAL_ALIGNMENT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "verticalAlignment", STRING, VERTICAL_ALIGNMENT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "textColor", VECTOR4, TEXT_COLOR ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "shadowOffset", VECTOR2, SHADOW_OFFSET ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "shadowColor", VECTOR4, SHADOW_COLOR ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "underlineEnabled", BOOLEAN, UNDERLINE_ENABLED ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "underlineColor", VECTOR4, UNDERLINE_COLOR ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "underlineHeight", FLOAT, UNDERLINE_HEIGHT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "enableMarkup", BOOLEAN, ENABLE_MARKUP ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "enableAutoScroll", BOOLEAN, ENABLE_AUTO_SCROLL ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "autoScrollSpeed", INTEGER, AUTO_SCROLL_SPEED ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "autoScrollLoopCount", INTEGER, AUTO_SCROLL_LOOP_COUNT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "autoScrollGap", FLOAT, AUTO_SCROLL_GAP ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "lineSpacing", FLOAT, LINE_SPACING ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "underline", MAP, UNDERLINE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "shadow", MAP, SHADOW ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "emboss", MAP, EMBOSS ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextLabel, "outline", MAP, OUTLINE ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "pixelSize", FLOAT, PIXEL_SIZE ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "ellipsis", BOOLEAN, ELLIPSIS ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "autoScrollLoopDelay", FLOAT, AUTO_SCROLL_LOOP_DELAY ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "autoScrollStopMode", STRING, AUTO_SCROLL_STOP_MODE ) +DALI_DEVEL_PROPERTY_REGISTRATION_READ_ONLY( Toolkit, TextLabel, "lineCount", INTEGER, LINE_COUNT ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "lineWrapMode", STRING, LINE_WRAP_MODE ) +DALI_DEVEL_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT( Toolkit, TextLabel, "textColorAnimatable", Color::BLACK, TEXT_COLOR_ANIMATABLE ) +DALI_DEVEL_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION( Toolkit, TextLabel, "textColorRed", TEXT_COLOR_RED, TEXT_COLOR_ANIMATABLE, 0) +DALI_DEVEL_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION( Toolkit, TextLabel, "textColorGreen", TEXT_COLOR_GREEN, TEXT_COLOR_ANIMATABLE, 1) +DALI_DEVEL_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION( Toolkit, TextLabel, "textColorBlue", TEXT_COLOR_BLUE, TEXT_COLOR_ANIMATABLE, 2) +DALI_DEVEL_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION( Toolkit, TextLabel, "textColorAlpha", TEXT_COLOR_ALPHA, TEXT_COLOR_ANIMATABLE, 3) DALI_TYPE_REGISTRATION_END() } // namespace @@ -136,6 +169,8 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr { case Toolkit::TextLabel::Property::RENDERING_BACKEND: { + DALI_LOG_WARNING("[%s] Using deprecated Property TextLabel::Property::RENDERING_BACKEND which is no longer supported and will be ignored\n", __FUNCTION__); + int backend = value.Get< int >(); #ifndef ENABLE_VECTOR_BASED_TEXT_RENDERING @@ -147,7 +182,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr if( impl.mRenderingBackend != backend ) { impl.mRenderingBackend = backend; - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; if( impl.mController ) { @@ -188,9 +223,9 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr { const float pointSize = value.Get< float >(); - if( !Equals( impl.mController->GetDefaultPointSize(), pointSize ) ) + if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE ), pointSize ) ) { - impl.mController->SetDefaultPointSize( pointSize ); + impl.mController->SetDefaultFontSize( pointSize, Text::Controller::POINT_SIZE ); } } break; @@ -236,15 +271,8 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr case Toolkit::TextLabel::Property::TEXT_COLOR: { - if( impl.mController ) - { - const Vector4& textColor = value.Get< Vector4 >(); - if( impl.mController->GetDefaultColor() != textColor ) - { - impl.mController->SetDefaultColor( textColor ); - impl.mRenderer.Reset(); - } - } + label.SetProperty( DevelTextLabel::Property::TEXT_COLOR_ANIMATABLE, value ); + impl.mTextUpdateNeeded = true; break; } @@ -256,7 +284,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr if ( impl.mController->GetShadowOffset() != shadowOffset ) { impl.mController->SetShadowOffset( shadowOffset ); - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } } break; @@ -269,7 +297,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr if ( impl.mController->GetShadowColor() != shadowColor ) { impl.mController->SetShadowColor( shadowColor ); - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } } break; @@ -282,7 +310,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr if ( impl.mController->GetUnderlineColor() != color ) { impl.mController->SetUnderlineColor( color ); - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } } break; @@ -295,7 +323,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr if ( impl.mController->IsUnderlineEnabled() != enabled ) { impl.mController->SetUnderlineEnabled( enabled ); - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } } break; @@ -309,7 +337,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr if( fabsf( impl.mController->GetUnderlineHeight() - height ) > Math::MACHINE_EPSILON_1000 ) { impl.mController->SetUnderlineHeight( height ); - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } } break; @@ -336,7 +364,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr { if( impl.mTextScroller ) { - impl.mTextScroller->SetLoopCount( 0 ); // Causes the current animation to finish playing (0) + impl.mTextScroller->StopScrolling(); } } // If request is enable (true) then start autoscroll as not already running @@ -349,6 +377,22 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr } break; } + case Toolkit::DevelTextLabel::Property::AUTO_SCROLL_STOP_MODE: + { + if( !impl.mTextScroller ) + { + impl.mTextScroller = Text::TextScroller::New( impl ); + } + DevelTextLabel::AutoScrollStopMode::Type stopMode = impl.mTextScroller->GetStopMode(); + if( Scripting::GetEnumerationProperty< Toolkit::DevelTextLabel::AutoScrollStopMode::Type >( value, + AUTO_SCROLL_STOP_MODE_TABLE, + AUTO_SCROLL_STOP_MODE_TABLE_COUNT, + stopMode ) ) + { + impl.mTextScroller->SetStopMode( stopMode ); + } + break; + } case Toolkit::TextLabel::Property::AUTO_SCROLL_SPEED: { if( !impl.mTextScroller ) @@ -367,6 +411,15 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr impl.mTextScroller->SetLoopCount( value.Get() ); break; } + case Toolkit::DevelTextLabel::Property::AUTO_SCROLL_LOOP_DELAY: + { + if( !impl.mTextScroller ) + { + impl.mTextScroller = Text::TextScroller::New( impl ); + } + impl.mTextScroller->SetLoopDelay( value.Get() ); + break; + } case Toolkit::TextLabel::Property::AUTO_SCROLL_GAP: { if( !impl.mTextScroller ) @@ -382,7 +435,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr { const float lineSpacing = value.Get(); impl.mController->SetDefaultLineSpacing( lineSpacing ); - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } break; } @@ -391,7 +444,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr const bool update = SetUnderlineProperties( impl.mController, value, Text::EffectStyle::DEFAULT ); if( update ) { - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } break; } @@ -400,7 +453,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr const bool update = SetShadowProperties( impl.mController, value, Text::EffectStyle::DEFAULT ); if( update ) { - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } break; } @@ -409,7 +462,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr const bool update = SetEmbossProperties( impl.mController, value, Text::EffectStyle::DEFAULT ); if( update ) { - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; } break; } @@ -418,7 +471,47 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr const bool update = SetOutlineProperties( impl.mController, value, Text::EffectStyle::DEFAULT ); if( update ) { - impl.mRenderer.Reset(); + impl.mTextUpdateNeeded = true; + } + break; + } + case Toolkit::DevelTextLabel::Property::PIXEL_SIZE: + { + if( impl.mController ) + { + const float pixelSize = value.Get< float >(); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize ); + + if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE ), pixelSize ) ) + { + impl.mController->SetDefaultFontSize( pixelSize, Text::Controller::PIXEL_SIZE ); + } + } + break; + } + case Toolkit::DevelTextLabel::Property::ELLIPSIS: + { + if( impl.mController ) + { + const bool ellipsis = value.Get(); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p ELLIPSIS %d\n", impl.mController.Get(), ellipsis ); + + impl.mController->SetTextElideEnabled( ellipsis ); + } + break; + } + case Toolkit::DevelTextLabel::Property::LINE_WRAP_MODE: + { + const std::string& wrapModeStr = value.Get< std::string >(); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel %p LINE_WRAP_MODE %s\n", impl.mController.Get(), wrapModeStr.c_str() ); + + Layout::LineWrap::Mode lineWrapMode( Layout::LineWrap::WORD ); + if( Scripting::GetEnumeration< Layout::LineWrap::Mode >( wrapModeStr.c_str(), + LINE_WRAP_MODE_STRING_TABLE, + LINE_WRAP_MODE_STRING_TABLE_COUNT, + lineWrapMode ) ) + { + impl.mController->SetLineWrapMode( lineWrapMode ); } break; } @@ -439,6 +532,8 @@ Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index inde { case Toolkit::TextLabel::Property::RENDERING_BACKEND: { + DALI_LOG_WARNING("[%s] Using deprecated Property TextLabel::Property::RENDERING_BACKEND which is no longer supported and will be ignored\n", __FUNCTION__); + value = impl.mRenderingBackend; break; } @@ -469,7 +564,7 @@ Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index inde { if( impl.mController ) { - value = impl.mController->GetDefaultPointSize(); + value = impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE ); } break; } @@ -511,10 +606,7 @@ Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index inde } case Toolkit::TextLabel::Property::TEXT_COLOR: { - if ( impl.mController ) - { - value = impl.mController->GetDefaultColor(); - } + value = label.GetProperty( Toolkit::DevelTextLabel::Property::TEXT_COLOR_ANIMATABLE ); break; } case Toolkit::TextLabel::Property::SHADOW_OFFSET: @@ -573,6 +665,20 @@ Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index inde } break; } + case Toolkit::DevelTextLabel::Property::AUTO_SCROLL_STOP_MODE: + { + if( impl.mTextScroller ) + { + const char* mode = Scripting::GetEnumerationName< Toolkit::DevelTextLabel::AutoScrollStopMode::Type >( impl.mTextScroller->GetStopMode(), + AUTO_SCROLL_STOP_MODE_TABLE, + AUTO_SCROLL_STOP_MODE_TABLE_COUNT ); + if( mode ) + { + value = std::string( mode ); + } + } + break; + } case Toolkit::TextLabel::Property::AUTO_SCROLL_SPEED: { TextLabel& impl( GetImpl( label ) ); @@ -594,6 +700,18 @@ Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index inde } break; } + case Toolkit::DevelTextLabel::Property::AUTO_SCROLL_LOOP_DELAY: + { + if( impl.mController ) + { + TextLabel& impl( GetImpl( label ) ); + if ( impl.mTextScroller ) + { + value = impl.mTextScroller->GetLoopDelay(); + } + } + break; + } case Toolkit::TextLabel::Property::AUTO_SCROLL_GAP: { TextLabel& impl( GetImpl( label ) ); @@ -631,6 +749,39 @@ Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index inde GetOutlineProperties( impl.mController, value, Text::EffectStyle::DEFAULT ); break; } + case Toolkit::DevelTextLabel::Property::PIXEL_SIZE: + { + if( impl.mController ) + { + value = impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE ); + } + break; + } + case Toolkit::DevelTextLabel::Property::ELLIPSIS: + { + if( impl.mController ) + { + value = impl.mController->IsTextElideEnabled(); + } + break; + } + case Toolkit::DevelTextLabel::Property::LINE_WRAP_MODE: + { + if( impl.mController ) + { + value = impl.mController->GetLineWrapMode(); + } + break; + } + case Toolkit::DevelTextLabel::Property::LINE_COUNT: + { + if( impl.mController ) + { + float width = label.GetProperty( Actor::Property::SIZE_WIDTH ).Get(); + value = impl.mController->GetLineCount( width ); + } + break; + } } } @@ -641,11 +792,19 @@ void TextLabel::OnInitialize() { Actor self = Self(); - mController = Text::Controller::New( this ); + Property::Map propertyMap; + propertyMap.Add( Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::TEXT ); + + mVisual = Toolkit::VisualFactory::Get().CreateVisual( propertyMap ); + DevelControl::RegisterVisual( *this, Toolkit::TextLabel::Property::TEXT, mVisual ); - // When using the vector-based rendering, the size of the GLyphs are different - TextAbstraction::GlyphType glyphType = (Text::RENDERING_VECTOR_BASED == mRenderingBackend) ? TextAbstraction::VECTOR_GLYPH : TextAbstraction::BITMAP_GLYPH; - mController->SetGlyphType( glyphType ); + TextVisual::SetAnimatableTextColorProperty( mVisual, Toolkit::DevelTextLabel::Property::TEXT_COLOR_ANIMATABLE ); + + mController = TextVisual::GetController(mVisual); + if( mController ) + { + mController->SetControlInterface(this); + } // Use height-for-width negotiation by default self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); @@ -656,8 +815,6 @@ void TextLabel::OnInitialize() Layout::Engine& engine = mController->GetLayoutEngine(); engine.SetCursorWidth( 0u ); // Do not layout space for the cursor. - - self.OnStageSignal().Connect( this, &TextLabel::OnStageConnect ); } void TextLabel::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change ) @@ -672,19 +829,24 @@ void TextLabel::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange:: const std::string& newFont = GetImpl( styleManager ).GetDefaultFontFamily(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::OnStyleChange StyleChange::DEFAULT_FONT_CHANGE newFont(%s)\n", newFont.c_str() ); mController->UpdateAfterFontChange( newFont ); + RelayoutRequest(); break; } case StyleChange::DEFAULT_FONT_SIZE_CHANGE: { GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); + RelayoutRequest(); break; } case StyleChange::THEME_CHANGE: { - GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); + // Nothing to do, let control base class handle this break; } } + + // Up call to Control + Control::OnStyleChange( styleManager, change ); } Vector3 TextLabel::GetNaturalSize() @@ -694,75 +856,87 @@ Vector3 TextLabel::GetNaturalSize() float TextLabel::GetHeightForWidth( float width ) { - return mController->GetHeightForWidth( width ); + Padding padding; + Self().GetPadding( padding ); + return mController->GetHeightForWidth( width ) + padding.top + padding.bottom; } -void TextLabel::OnRelayout( const Vector2& size, RelayoutContainer& container ) +void TextLabel::OnPropertySet( Property::Index index, Property::Value propertyValue ) { - DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::OnRelayout\n" ); - - const Text::Controller::UpdateTextType updateTextType = mController->Relayout( size ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextLabel::OnPropertySet index[%d]\n", index ); - if( ( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) ) || - !mRenderer ) + switch ( index ) { - if( !mRenderer ) + case Toolkit::DevelTextLabel::Property::TEXT_COLOR_ANIMATABLE: { - mRenderer = Text::Backend::Get().NewRenderer( mRenderingBackend ); + const Vector4& textColor = propertyValue.Get< Vector4 >(); + if( mController->GetDefaultColor() != textColor ) + { + mController->SetDefaultColor( textColor ); + mTextUpdateNeeded = true; + } + break; + } + default: + { + Control::OnPropertySet( index, propertyValue ); // up call to control for non-handled properties + break; } - RenderText(); } } -void TextLabel::RequestTextRelayout() +void TextLabel::OnRelayout( const Vector2& size, RelayoutContainer& container ) { - RelayoutRequest(); -} + DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::OnRelayout\n" ); -void TextLabel::RenderText() -{ - DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::RenderText IsAutoScrollEnabled[%s] [%p]\n", ( mController->IsAutoScrollEnabled())?"true":"false", this ); + Padding padding; + Self().GetPadding( padding ); + Vector2 contentSize( size.x - ( padding.left + padding.right ), size.y - ( padding.top + padding.bottom ) ); - Actor self = Self(); - Actor renderableActor; + const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize ); - float alignmentOffset = 0.f; - if( mRenderer ) + if( ( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) ) + || mTextUpdateNeeded ) { - renderableActor = mRenderer->Render( mController->GetView(), - alignmentOffset, - DepthIndex::TEXT ); - } + DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::OnRelayout IsAutoScrollEnabled[%s] [%p]\n", ( mController->IsAutoScrollEnabled())?"true":"false", this ); - if( renderableActor != mRenderableActor ) - { - UnparentAndReset( mRenderableActor ); + // Update the visual + TextVisual::EnableRendererUpdate( mVisual ); - if( renderableActor ) - { - const Vector2& scrollOffset = mController->GetTextModel()->GetScrollPosition(); - renderableActor.SetPosition( scrollOffset.x + alignmentOffset, scrollOffset.y ); + Padding padding; + Self().GetPadding( padding ); - self.Add( renderableActor ); - } - mRenderableActor = renderableActor; + Property::Map visualTransform; + visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, contentSize ) + .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET, Vector2(padding.left, padding.top) ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::DevelVisual::Transform::Policy::ABSOLUTE, Toolkit::DevelVisual::Transform::Policy::ABSOLUTE ) ) + .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) + .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN ); + mVisual.SetTransformAndSize( visualTransform, size ); if ( mController->IsAutoScrollEnabled() ) { SetUpAutoScrolling(); } + + mTextUpdateNeeded = false; } } +void TextLabel::RequestTextRelayout() +{ + RelayoutRequest(); +} + void TextLabel::SetUpAutoScrolling() { const Size& controlSize = mController->GetView().GetControlSize(); - const Size offScreenSize = GetNaturalSize().GetVectorXY(); // As relayout of text may not be done at this point natural size is used to get size. Single line scrolling only. - const float alignmentOffset = mController->GetAutoScrollLineAlignment(); + const Size textNaturalSize = GetNaturalSize().GetVectorXY(); // As relayout of text may not be done at this point natural size is used to get size. Single line scrolling only. const Text::CharacterDirection direction = mController->GetAutoScrollDirection(); - DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::SetUpAutoScrolling alignmentOffset[%f] offScreenSize[%f,%f] controlSize[%f,%f]\n", - alignmentOffset, offScreenSize.x,offScreenSize.y , controlSize.x,controlSize.y ); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::SetUpAutoScrolling textNaturalSize[%f,%f] controlSize[%f,%f]\n", + textNaturalSize.x,textNaturalSize.y , controlSize.x,controlSize.y ); if ( !mTextScroller ) { @@ -771,23 +945,27 @@ void TextLabel::SetUpAutoScrolling() // If speed, loopCount or gap not set via property system then will need to create a TextScroller with defaults mTextScroller = Text::TextScroller::New( *this ); } - mTextScroller->SetParameters( mRenderableActor, controlSize, offScreenSize, direction, alignmentOffset ); - Actor self = Self(); - self.Add( mTextScroller->GetScrollingText() ); - self.Add( mTextScroller->GetSourceCamera() ); -} - -void TextLabel::OnStageConnect( Dali::Actor actor ) -{ - if ( mHasBeenStaged ) - { - RenderText(); - } - else - { - mHasBeenStaged = true; - } + // Create a texture of the text for scrolling + Text::TypesetterPtr typesetter = Text::Typesetter::New( mController->GetTextModel() ); + PixelData data = typesetter->Render( textNaturalSize, Text::Typesetter::RENDER_TEXT_AND_STYLES, true, Pixel::RGBA8888 ); // ignore the horizontal alignment + Texture texture = Texture::New( Dali::TextureType::TEXTURE_2D, + data.GetPixelFormat(), + data.GetWidth(), + data.GetHeight() ); + texture.Upload( data ); + + TextureSet textureSet = TextureSet::New(); + textureSet.SetTexture( 0u, texture ); + + // Filter mode needs to be set to linear to produce better quality while scaling. + Sampler sampler = Sampler::New(); + sampler.SetFilterMode( FilterMode::LINEAR, FilterMode::LINEAR ); + textureSet.SetSampler( 0u, sampler ); + + // Set parameters for scrolling + Renderer renderer = static_cast( GetImplementation( mVisual ) ).GetRenderer(); + mTextScroller->SetParameters( Self(), renderer, textureSet, controlSize, textNaturalSize, direction, mController->GetHorizontalAlignment(), mController->GetVerticalAlignment() ); } void TextLabel::ScrollingFinished() @@ -802,7 +980,7 @@ void TextLabel::ScrollingFinished() TextLabel::TextLabel() : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), mRenderingBackend( DEFAULT_RENDERING_BACKEND ), - mHasBeenStaged( false ) + mTextUpdateNeeded( false ) { }