X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-label-impl.cpp;h=77da8f9e25cbb69f674b5a5ed558267cf6d3a23d;hb=533d8c2ec94a43bbe098b556bb905cbe10f427ab;hp=fdce0edd128a975980a20c090843e48cc7711aa2;hpb=fc2392c09ab526295f52c430ead7879e1e91a096;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git 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 fdce0ed..274f40e 100644 --- a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 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. @@ -19,17 +19,17 @@ #include // EXTERNAL INCLUDES -#include #include #include // INTERNAL INCLUDES -#include -#include #include +#include +#include +#include +#include using Dali::Toolkit::Text::LayoutEngine; -using Dali::Toolkit::Text::Backend; namespace Dali { @@ -48,6 +48,10 @@ namespace namespace { +#if defined ( DEBUG_ENABLED ) + Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT_CONTROLS"); +#endif + // Type registration BaseHandle Create() { @@ -57,15 +61,61 @@ BaseHandle Create() // Setup properties, signals and actions using the type-registry. DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextLabel, Toolkit::Control, Create ); -DALI_PROPERTY_REGISTRATION( TextLabel, "rendering-backend", INTEGER, RENDERING_BACKEND ) -DALI_PROPERTY_REGISTRATION( TextLabel, "text", STRING, TEXT ) -DALI_PROPERTY_REGISTRATION( TextLabel, "font-family", STRING, FONT_FAMILY ) -DALI_PROPERTY_REGISTRATION( TextLabel, "font-style", STRING, FONT_STYLE ) -DALI_PROPERTY_REGISTRATION( TextLabel, "point-size", FLOAT, POINT_SIZE ) -DALI_PROPERTY_REGISTRATION( TextLabel, "multi-line", BOOLEAN, MULTI_LINE ) +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_TYPE_REGISTRATION_END() +const int TEXT_VISUAL_PROPERTY_TABLE[] = { + Dali::Toolkit::TextVisual::Property::RENDERING_BACKEND, + Dali::Toolkit::TextVisual::Property::TEXT, + Dali::Toolkit::TextVisual::Property::FONT_FAMILY, + Dali::Toolkit::TextVisual::Property::FONT_STYLE, + Dali::Toolkit::TextVisual::Property::POINT_SIZE, + Dali::Toolkit::TextVisual::Property::MULTI_LINE, + Dali::Toolkit::TextVisual::Property::HORIZONTAL_ALIGNMENT, + Dali::Toolkit::TextVisual::Property::VERTICAL_ALIGNMENT, + Dali::Toolkit::TextVisual::Property::TEXT_COLOR, + Dali::Toolkit::TextVisual::Property::SHADOW, + Dali::Toolkit::TextVisual::Property::SHADOW, + Dali::Toolkit::TextVisual::Property::UNDERLINE, + Dali::Toolkit::TextVisual::Property::UNDERLINE, + Dali::Toolkit::TextVisual::Property::UNDERLINE, + Dali::Toolkit::TextVisual::Property::ENABLE_MARKUP, + Dali::Toolkit::TextVisual::Property::ENABLE_AUTO_SCROLL, + Dali::Toolkit::TextVisual::Property::AUTO_SCROLL_SPEED, + Dali::Toolkit::TextVisual::Property::AUTO_SCROLL_LOOP_COUNT, + Dali::Toolkit::TextVisual::Property::AUTO_SCROLL_GAP, + Dali::Toolkit::TextVisual::Property::LINE_SPACING, + Dali::Toolkit::TextVisual::Property::UNDERLINE, + Dali::Toolkit::TextVisual::Property::SHADOW, + Dali::Toolkit::TextVisual::Property::EMBOSS, + Dali::Toolkit::TextVisual::Property::OUTLINE, + Dali::Toolkit::TextVisual::Property::BATCHING_ENABLED +}; + } // namespace Toolkit::TextLabel TextLabel::New() @@ -89,126 +139,142 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr if( label ) { - TextLabel& impl( GetImpl( label ) ); - switch( index ) + TextLabel& impl = GetImpl( label ); + + // Sets the property to the to the text visual. + impl.mVisual.SetProperty( TEXT_VISUAL_PROPERTY_TABLE[index - Toolkit::TextLabel::PROPERTY_START_INDEX], value ); + } +} + +Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index index ) +{ + Property::Value value; + + Toolkit::TextLabel label = Toolkit::TextLabel::DownCast( Dali::BaseHandle( object ) ); + + if( label ) + { + TextLabel& impl = GetImpl( label ); + + if( ( Toolkit::TextLabel::Property::SHADOW_OFFSET == index ) || + ( Toolkit::TextLabel::Property::SHADOW_COLOR == index ) || + ( Toolkit::TextLabel::Property::UNDERLINE_ENABLED == index ) || + ( Toolkit::TextLabel::Property::UNDERLINE_COLOR == index ) || + ( Toolkit::TextLabel::Property::UNDERLINE_HEIGHT == index ) ) { - case Toolkit::TextLabel::Property::RENDERING_BACKEND: - { - int backend = value.Get< int >(); + // TODO : Branch to be removed when the deprecated properties are finally removed. + value = impl.mVisual.GetProperty( TEXT_VISUAL_PROPERTY_TABLE[index - Toolkit::TextLabel::PROPERTY_START_INDEX] ); - if( impl.mRenderingBackend != backend ) - { - impl.mRenderingBackend = backend; - impl.mRenderer.Reset(); - impl.RequestTextRelayout(); - } - break; - } - case Toolkit::TextLabel::Property::TEXT: - { - if( impl.mController ) - { - impl.mController->SetText( value.Get< std::string >() ); - impl.RequestTextRelayout(); - } - break; - } - case Toolkit::TextLabel::Property::FONT_FAMILY: + switch( index ) { - if( impl.mController ) + case Toolkit::TextLabel::Property::SHADOW_OFFSET: // Converts the deprecated property to the new one. { - std::string fontFamily = value.Get< std::string >(); - - if( impl.mController->GetDefaultFontFamily() != fontFamily ) + bool colorDefined = false; + Vector4 color; + bool offsetDefined = false; + Vector2 offset; + const bool empty = Text::ParseProperties( value.Get(), + colorDefined, + color, + offsetDefined, + offset ); + + if( !empty ) { - impl.mController->SetDefaultFontFamily( fontFamily ); - impl.RequestTextRelayout(); + value = offset; } + break; } - break; - } - case Toolkit::TextLabel::Property::FONT_STYLE: - { - if( impl.mController ) + case Toolkit::TextLabel::Property::SHADOW_COLOR: // Converts the deprecated property to the new one. { - std::string fontStyle = value.Get< std::string >(); - - if( impl.mController->GetDefaultFontStyle() != fontStyle ) + bool colorDefined = false; + Vector4 color; + bool offsetDefined = false; + Vector2 offset; + const bool empty = Text::ParseProperties( value.Get(), + colorDefined, + color, + offsetDefined, + offset ); + + if( !empty ) { - impl.mController->SetDefaultFontStyle( fontStyle ); - impl.RequestTextRelayout(); + value = color; } + break; } - break; - } - case Toolkit::TextLabel::Property::POINT_SIZE: - { - if( impl.mController ) + case Toolkit::TextLabel::Property::UNDERLINE_ENABLED: // Converts the deprecated property to the new one. { - float pointSize = value.Get< float >(); - - if( impl.mController->GetDefaultPointSize() != pointSize /*TODO - epsilon*/ ) + bool enabled = false; + bool colorDefined = false; + Vector4 color; + bool heightDefined = false; + float height = 0.f; + const bool empty = Text::ParseProperties( value.Get(), + enabled, + colorDefined, + color, + heightDefined, + height ); + + if( !empty ) { - impl.mController->SetDefaultPointSize( pointSize ); - impl.RequestTextRelayout(); + value = enabled; } + break; } - break; - } - case Toolkit::TextLabel::Property::MULTI_LINE: - { - if( impl.mController ) + case Toolkit::TextLabel::Property::UNDERLINE_COLOR: // Converts the deprecated property to the new one. { - LayoutEngine& engine = impl.mController->GetLayoutEngine(); - LayoutEngine::Layout layout = value.Get< bool >() ? LayoutEngine::MULTI_LINE_BOX : LayoutEngine::SINGLE_LINE_BOX; - - if( engine.GetLayout() != layout ) + bool enabled = false; + bool colorDefined = false; + Vector4 color; + bool heightDefined = false; + float height = 0.f; + const bool empty = Text::ParseProperties( value.Get(), + enabled, + colorDefined, + color, + heightDefined, + height ); + + if( !empty && colorDefined ) { - impl.mController->GetLayoutEngine().SetLayout( layout ); - impl.RequestTextRelayout(); + value = color; } + break; } - break; - } - } - } -} - -Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index index ) -{ - Property::Value value; - - Toolkit::TextLabel label = Toolkit::TextLabel::DownCast( Dali::BaseHandle( object ) ); - - if( label ) - { - TextLabel& impl( GetImpl( label ) ); - switch( index ) - { - case Toolkit::TextLabel::Property::RENDERING_BACKEND: - { - value = impl.mRenderingBackend; - break; - } - case Toolkit::TextLabel::Property::TEXT: - { - if( impl.mController ) + case Toolkit::TextLabel::Property::UNDERLINE_HEIGHT: // Converts the deprecated property to the new one. { - std::string text; - impl.mController->GetText( text ); - value = text; + bool enabled = false; + bool colorDefined = false; + Vector4 color; + bool heightDefined = false; + float height = 0.f; + const bool empty = Text::ParseProperties( value.Get(), + enabled, + colorDefined, + color, + heightDefined, + height ); + + if( !empty && heightDefined ) + { + value = height; + } + break; } - break; - } - case Toolkit::TextLabel::Property::MULTI_LINE: - { - if( impl.mController ) + default: { - value = static_cast( LayoutEngine::MULTI_LINE_BOX == impl.mController->GetLayoutEngine().GetLayout() ); + // Nothing to do. + break; } - break; } } + else + { + // Retrieves the property from the text visual. + value = impl.mVisual.GetProperty( TEXT_VISUAL_PROPERTY_TABLE[index - Toolkit::TextLabel::PROPERTY_START_INDEX] ); + } } return value; @@ -216,57 +282,91 @@ Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index inde void TextLabel::OnInitialize() { - mController = Text::Controller::New( *this ); -} + Actor self = Self(); -Vector3 TextLabel::GetNaturalSize() -{ - return mController->GetNaturalSize(); -} + // Creates the text's visual. + Property::Map visualMap; + visualMap[Toolkit::VisualProperty::TYPE] = Toolkit::Visual::TEXT; + visualMap[Toolkit::TextVisual::Property::RENDERING_BACKEND] = static_cast( DEFAULT_RENDERING_BACKEND ); -float TextLabel::GetHeightForWidth( float width ) -{ - return mController->GetHeightForWidth( width ); + mVisual = Toolkit::VisualFactory::Get().CreateVisual( visualMap ); + RegisterVisual( Toolkit::TextLabel::Property::TEXT, self, mVisual ); + + Internal::Visual::Base& visualBase = Toolkit::GetImplementation( mVisual ); + TextVisual* textVisual = static_cast( &visualBase ); + + // Sets the text's control interface. + textVisual->SetTextControlInterface( this ); + + // Use height-for-width negotiation by default + self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); + self.SetResizePolicy( ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT ); } -void TextLabel::OnRelayout( const Vector2& size, ActorSizeContainer& container ) +void TextLabel::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change ) { - if( mController->Relayout( size ) || - !mRenderer ) + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextLabel::OnStyleChange\n"); + + switch ( change ) { - if( !mRenderer ) + case StyleChange::DEFAULT_FONT_CHANGE: { - mRenderer = Backend::Get().NewRenderer( mRenderingBackend ); - } + // Property system did not set the font so should update it. + 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() ); - RenderableActor renderableActor; - if( mRenderer ) + const std::string fontString = "{\"family\":\"" + newFont + "\",\"type\":\"system\"}"; + mVisual.SetProperty( Toolkit::TextVisual::Property::FONT_FAMILY, fontString ); + break; + } + case StyleChange::DEFAULT_FONT_SIZE_CHANGE: { - renderableActor = mRenderer->Render( mController->GetView() ); + GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); + break; } - - if( renderableActor != mRenderableActor ) + case StyleChange::THEME_CHANGE: { - UnparentAndReset( mRenderableActor ); - - if( renderableActor ) - { - Self().Add( renderableActor ); - } - - mRenderableActor = renderableActor; + GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); + break; } } } +Vector3 TextLabel::GetNaturalSize() +{ + Vector2 naturalSize; + mVisual.GetNaturalSize( naturalSize ); + + return Vector3( naturalSize ); +} + +float TextLabel::GetHeightForWidth( float width ) +{ + return mVisual.GetHeightForWidth( width ); +} + +void TextLabel::OnRelayout( const Vector2& size, RelayoutContainer& container ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "TextLabel::OnRelayout\n" ); + + mVisual.SetSize( size ); +} + void TextLabel::RequestTextRelayout() { RelayoutRequest(); } +void TextLabel::OnStageConnection( int depth ) +{ + // Call the Control::OnStageConnection() to set the depth of the background. + Control::OnStageConnection( depth ); + + // The depth of the text renderer is set by the text-visual called from OnRelayout(). +} + TextLabel::TextLabel() -: Control( ControlBehaviour( CONTROL_BEHAVIOUR_NONE ) ), - mRenderingBackend( DEFAULT_RENDERING_BACKEND ) +: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ) { }