X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-effects-style.cpp;h=d5f8ff13ba8cf1cb2a9718ec2748b0c86e34942e;hp=083cf47e5b25ba301ea5030bb8052ed0233c1449;hb=528aa3699cd51dab5115bca1aaebb65d4bc67c15;hpb=3e6769f502e8ce54a9ddd4579707438bb5827a62 diff --git a/dali-toolkit/internal/text/text-effects-style.cpp b/dali-toolkit/internal/text/text-effects-style.cpp old mode 100644 new mode 100755 index 083cf47..d5f8ff1 --- a/dali-toolkit/internal/text/text-effects-style.cpp +++ b/dali-toolkit/internal/text/text-effects-style.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 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,6 +19,7 @@ #include // INTERNAL INCLUDES +#include #include #include @@ -35,102 +36,197 @@ namespace { const std::string COLOR_KEY( "color" ); const std::string OFFSET_KEY( "offset" ); +const std::string BLUR_RADIUS_KEY( "blurRadius" ); +const std::string WIDTH_KEY( "width" ); const std::string HEIGHT_KEY( "height" ); const std::string ENABLE_KEY( "enable" ); const std::string TRUE_TOKEN( "true" ); +const std::string FALSE_TOKEN( "false" ); } -bool ParseProperties( const std::string& shadowProperties, - bool& colorDefined, - Vector4& color, - bool& offsetDefined, - Vector2& offset ) +bool ParseShadowProperties( const Property::Map& shadowPropertiesMap, + bool& colorDefined, + Vector4& color, + bool& offsetDefined, + Vector2& offset, + bool& blurRadiusDefined, + float& blurRadius ) { - // Parses and applies the style. - Property::Map map; - Text::ParsePropertyString( shadowProperties, map ); - - const bool empty = map.Empty(); + const unsigned int numberOfItems = shadowPropertiesMap.Count(); - if( !empty ) + // Parses and applies the style. + for( unsigned int index = 0u; index < numberOfItems; ++index ) { - /// Color key. - Property::Value* colorValue = map.Find( COLOR_KEY ); + const KeyValuePair& valueGet = shadowPropertiesMap.GetKeyValue( index ); - colorDefined = colorValue != NULL; - if( colorDefined ) + if( ( DevelText::Shadow::Property::COLOR == valueGet.first.indexKey ) || ( COLOR_KEY == valueGet.first.stringKey ) ) { - const std::string colorStr = colorValue->Get(); + /// Color key. + colorDefined = true; - Text::ColorStringToVector4( colorStr.c_str(), colorStr.size(), color ); + if( valueGet.second.GetType() == Dali::Property::STRING ) + { + const std::string colorStr = valueGet.second.Get(); + Text::ColorStringToVector4( colorStr.c_str(), colorStr.size(), color ); + } + else + { + color = valueGet.second.Get(); + } } + else if( ( DevelText::Shadow::Property::OFFSET == valueGet.first.indexKey ) || ( OFFSET_KEY == valueGet.first.stringKey ) ) + { + /// Offset key. + offsetDefined = true; - /// Offset key. - Property::Value* offsetValue = map.Find( OFFSET_KEY ); - - offsetDefined = offsetValue != NULL; - if( offsetDefined ) + if( valueGet.second.GetType() == Dali::Property::STRING ) + { + const std::string offsetStr = valueGet.second.Get(); + StringToVector2( offsetStr.c_str(), offsetStr.size(), offset ); + } + else + { + offset = valueGet.second.Get(); + } + } + else if( ( DevelText::Shadow::Property::BLUR_RADIUS == valueGet.first.indexKey ) || ( BLUR_RADIUS_KEY == valueGet.first.stringKey ) ) { - const std::string offsetStr = offsetValue->Get(); + /// Blur radius key. + blurRadiusDefined = true; - StringToVector2( offsetStr.c_str(), offsetStr.size(), offset ); + if( valueGet.second.GetType() == Dali::Property::STRING ) + { + const std::string blurRadiusStr = valueGet.second.Get(); + blurRadius = StringToFloat( blurRadiusStr.c_str() ); + } + else + { + blurRadius = valueGet.second.Get(); + } } } - return empty; + return 0u == numberOfItems; } -bool ParseProperties( const std::string& underlineProperties, - bool& enabled, - bool& colorDefined, - Vector4& color, - bool& heightDefined, - float& height ) +bool ParseUnderlineProperties( const Property::Map& underlinePropertiesMap, + bool& enabled, + bool& colorDefined, + Vector4& color, + bool& heightDefined, + float& height ) { - // Parses and applies the style. - Property::Map map; - Text::ParsePropertyString( underlineProperties, map ); - - const bool empty = map.Empty(); + const unsigned int numberOfItems = underlinePropertiesMap.Count(); - if( !empty ) + // Parses and applies the style. + for( unsigned int index = 0u; index < numberOfItems; ++index ) { - /// Enable key. - Property::Value* enableValue = map.Find( ENABLE_KEY ); + const KeyValuePair& valueGet = underlinePropertiesMap.GetKeyValue( index ); - enabled = false; - const bool enabledDefined = enableValue != NULL; - if( enabledDefined ) + if( ( DevelText::Underline::Property::ENABLE == valueGet.first.indexKey ) || ( ENABLE_KEY == valueGet.first.stringKey ) ) { - const std::string enableStr = enableValue->Get(); - enabled = Text::TokenComparison( TRUE_TOKEN, enableStr.c_str(), enableStr.size() ); + /// Enable key. + if( valueGet.second.GetType() == Dali::Property::STRING ) + { + const std::string enableStr = valueGet.second.Get(); + enabled = Text::TokenComparison( TRUE_TOKEN, enableStr.c_str(), enableStr.size() ); + } + else + { + enabled = valueGet.second.Get(); + } } + else if( ( DevelText::Underline::Property::COLOR == valueGet.first.indexKey ) || ( COLOR_KEY == valueGet.first.stringKey ) ) + { + /// Color key. + colorDefined = true; - /// Color key. - Property::Value* colorValue = map.Find( COLOR_KEY ); - - colorDefined = colorValue != NULL; - if( colorDefined ) + if( valueGet.second.GetType() == Dali::Property::STRING ) + { + const std::string colorStr = valueGet.second.Get(); + Text::ColorStringToVector4( colorStr.c_str(), colorStr.size(), color ); + } + else + { + color = valueGet.second.Get(); + } + } + else if( ( DevelText::Underline::Property::HEIGHT == valueGet.first.indexKey ) || ( HEIGHT_KEY == valueGet.first.stringKey ) ) { - const std::string colorStr = colorValue->Get(); + /// Height key. + heightDefined = true; - Text::ColorStringToVector4( colorStr.c_str(), colorStr.size(), color ); + if( valueGet.second.GetType() == Dali::Property::STRING ) + { + const std::string heightStr = valueGet.second.Get(); + height = StringToFloat( heightStr.c_str() ); + } + else + { + height = valueGet.second.Get(); + } } + } + + return 0u == numberOfItems; +} - /// Height key. - Property::Value* heightValue = map.Find( HEIGHT_KEY ); +bool ParseOutlineProperties( const Property::Map& underlinePropertiesMap, + bool& colorDefined, + Vector4& color, + bool& widthDefined, + uint16_t& width ) +{ + const unsigned int numberOfItems = underlinePropertiesMap.Count(); + + // Parses and applies the style. + for( unsigned int index = 0u; index < numberOfItems; ++index ) + { + const KeyValuePair& valueGet = underlinePropertiesMap.GetKeyValue( index ); - height = 0.f; - heightDefined = heightValue != NULL; - if( heightDefined ) + if( ( DevelText::Outline::Property::COLOR == valueGet.first.indexKey ) || ( COLOR_KEY == valueGet.first.stringKey ) ) { - const std::string heightStr = heightValue->Get(); + /// Color key. + colorDefined = true; + color = valueGet.second.Get(); + } + else if( ( DevelText::Outline::Property::WIDTH == valueGet.first.indexKey ) || ( WIDTH_KEY == valueGet.first.stringKey ) ) + { + /// Width key. + widthDefined = true; + width = static_cast( valueGet.second.Get() ); + } + } - height = StringToFloat( heightStr.c_str() ); + return 0u == numberOfItems; +} + +bool ParseBackgroundProperties( const Property::Map& backgroundProperties, + bool& enabled, + bool& colorDefined, + Vector4& color ) +{ + const unsigned int numberOfItems = backgroundProperties.Count(); + + // Parses and applies the style. + for( unsigned int index = 0u; index < numberOfItems; ++index ) + { + const KeyValuePair& valueGet = backgroundProperties.GetKeyValue( index ); + + if( ( DevelText::Background::Property::ENABLE == valueGet.first.indexKey ) || ( ENABLE_KEY == valueGet.first.stringKey ) ) + { + /// Enable key. + enabled = valueGet.second.Get(); + } + else if( ( DevelText::Background::Property::COLOR == valueGet.first.indexKey ) || ( COLOR_KEY == valueGet.first.stringKey ) ) + { + /// Color key. + colorDefined = true; + color = valueGet.second.Get(); } } - return empty; + return 0u == numberOfItems; } bool SetUnderlineProperties( ControllerPtr controller, const Property::Value& value, EffectStyle::Type type ) @@ -139,26 +235,53 @@ bool SetUnderlineProperties( ControllerPtr controller, const Property::Value& va if( controller ) { - const std::string properties = value.Get(); - - bool enabled = false; - bool colorDefined = false; - Vector4 color; - bool heightDefined = false; - float height = 0.f; - - const bool empty = ParseProperties( properties, - enabled, - colorDefined, - color, - heightDefined, - height ); - - if( !empty ) + switch( type ) { - switch( type ) + case EffectStyle::DEFAULT: { - case EffectStyle::DEFAULT: + const Property::Map& propertiesMap = value.Get(); + + bool enabled = false; + bool colorDefined = false; + Vector4 color; + bool heightDefined = false; + float height = 0.f; + + bool empty = true; + + if ( propertiesMap.Empty() ) + { + // Map empty so check if a string provided + const std::string propertyString = value.Get(); + + if ( !propertyString.empty() ) + { + Property::Map parsedStringMap; + Text::ParsePropertyString( propertyString, parsedStringMap ); + + empty = ParseUnderlineProperties( parsedStringMap, + enabled, + colorDefined, + color, + heightDefined, + height ); + + controller->UnderlineSetByString( !empty ); + } + } + else + { + empty = ParseUnderlineProperties( propertiesMap, + enabled, + colorDefined, + color, + heightDefined, + height ); + + controller->UnderlineSetByString( false ); + } + + if( !empty ) { if( enabled != controller->IsUnderlineEnabled() ) { @@ -178,21 +301,8 @@ bool SetUnderlineProperties( ControllerPtr controller, const Property::Value& va controller->SetUnderlineHeight( height ); update = true; } - break; } - case EffectStyle::INPUT: - { - // Sets the input underline values. - // TODO: to be implemented. - break; - } - } - } - else - { - switch( type ) - { - case EffectStyle::DEFAULT: + else { // Disable underline. if( controller->IsUnderlineEnabled() ) @@ -200,18 +310,18 @@ bool SetUnderlineProperties( ControllerPtr controller, const Property::Value& va controller->SetUnderlineEnabled( false ); update = true; } - break; - } - case EffectStyle::INPUT: - { - // Sets the input underline values. - // TODO: to be implemented. - controller->SetInputUnderlineProperties( properties ); - break; } + break; } - } - } + case EffectStyle::INPUT: + { + const std::string& underlineProperties = value.Get(); + + controller->SetInputUnderlineProperties( underlineProperties ); + break; + } + } // switch + } // if( controller ) return update; } @@ -228,19 +338,33 @@ void GetUnderlineProperties( ControllerPtr controller, Property::Value& value, E const Vector4& color = controller->GetUnderlineColor(); const float height = controller->GetUnderlineHeight(); - std::string underlineProperties = "{\"enable\":"; - const std::string enabledStr = enabled ? "true" : "false"; - underlineProperties += "\"" + enabledStr + "\","; + if ( controller->IsUnderlineSetByString() ) + { + std::string underlineProperties = "{\"enable\":"; + const std::string enabledStr = enabled ? "true" : "false"; + underlineProperties += "\"" + enabledStr + "\","; - std::string colorStr; - Vector4ToColorString( color, colorStr ); - underlineProperties += "\"color\":\"" + colorStr + "\","; + std::string colorStr; + Vector4ToColorString( color, colorStr ); + underlineProperties += "\"color\":\"" + colorStr + "\","; - std::string heightStr; - FloatToString( height, heightStr ); - underlineProperties += "\"height\":\"" + heightStr + "\"}"; + std::string heightStr; + FloatToString( height, heightStr ); + underlineProperties += "\"height\":\"" + heightStr + "\"}"; + + value = underlineProperties; + } + else + { + Property::Map map; + + map.Insert( ENABLE_KEY, enabled ); + map.Insert( COLOR_KEY, color ); + map.Insert( HEIGHT_KEY, height ); + + value = map; + } - value = underlineProperties; break; } case EffectStyle::INPUT: @@ -258,24 +382,54 @@ bool SetShadowProperties( ControllerPtr controller, const Property::Value& value if( controller ) { - const std::string properties = value.Get< std::string >(); + switch( type ) + { + case EffectStyle::DEFAULT: + { + const Property::Map& propertiesMap = value.Get(); - bool colorDefined = false; - Vector4 color; - bool offsetDefined = false; - Vector2 offset; + bool colorDefined = false; + Vector4 color; + bool offsetDefined = false; + Vector2 offset; + bool blurRadiusDefined = false; + float blurRadius; - const bool empty = ParseProperties( properties, - colorDefined, - color, - offsetDefined, - offset ); + bool empty = true; - if( !empty ) - { - switch( type ) - { - case EffectStyle::DEFAULT: + if ( propertiesMap.Empty() ) + { + // Map empty so check if a string provided + const std::string propertyString = value.Get(); + + Property::Map parsedStringMap; + Text::ParsePropertyString( propertyString, parsedStringMap ); + + empty = ParseShadowProperties( parsedStringMap, + colorDefined, + color, + offsetDefined, + offset, + blurRadiusDefined, + blurRadius ); + + controller->ShadowSetByString( !empty ); + + } + else + { + empty = ParseShadowProperties( propertiesMap, + colorDefined, + color, + offsetDefined, + offset, + blurRadiusDefined, + blurRadius ); + + controller->ShadowSetByString( false ); + } + + if( !empty ) { // Sets the default shadow values. if( colorDefined && ( controller->GetShadowColor() != color ) ) @@ -289,39 +443,32 @@ bool SetShadowProperties( ControllerPtr controller, const Property::Value& value controller->SetShadowOffset( offset ); update = true; } - break; + + if( blurRadiusDefined && ( controller->GetShadowBlurRadius() != blurRadius ) ) + { + controller->SetShadowBlurRadius( blurRadius ); + update = true; + } } - case EffectStyle::INPUT: - { - // Sets the input shadow values. - // TODO: to be implemented. - break; - } - } - } - else - { - switch( type ) - { - case EffectStyle::DEFAULT: + else { // Disable shadow. if( Vector2::ZERO != controller->GetShadowOffset() ) { controller->SetShadowOffset( Vector2::ZERO ); } - break; - } - case EffectStyle::INPUT: - { - // Sets the input shadow values. - // TODO: to be implemented. - controller->SetInputShadowProperties( properties ); - break; } + break; } - } - } + case EffectStyle::INPUT: + { + const std::string& shadowString = value.Get(); + + controller->SetInputShadowProperties( shadowString ); + break; + } + } // switch + } // if( controller ) return update; } @@ -336,18 +483,36 @@ void GetShadowProperties( ControllerPtr controller, Property::Value& value, Effe { const Vector4& color = controller->GetShadowColor(); const Vector2& offset = controller->GetShadowOffset(); + const float& blurRadius = controller->GetShadowBlurRadius(); - std::string shadowProperties = "{"; + if ( controller->IsShadowSetByString() ) + { + std::string shadowProperties = "{"; + + std::string colorStr; + Vector4ToColorString( color, colorStr ); + shadowProperties += "\"color\":\"" + colorStr + "\","; + + std::string offsetStr; + Vector2ToString( offset, offsetStr ); + shadowProperties += "\"offset\":\"" + offsetStr + "\","; + + std::string blurRadiusStr; + FloatToString( blurRadius, blurRadiusStr ); + shadowProperties += "\"blurRadius\":\"" + blurRadiusStr + "\"}"; - std::string colorStr; - Vector4ToColorString( color, colorStr ); - shadowProperties += "\"color\":\"" + colorStr + "\","; + value = shadowProperties; + } + else + { + Property::Map map; - std::string offsetStr; - Vector2ToString( offset, offsetStr ); - shadowProperties += "\"offset\":\"" + offsetStr + "\"}"; + map.Insert( COLOR_KEY, color ); + map.Insert( OFFSET_KEY, offset ); + map.Insert( BLUR_RADIUS_KEY, blurRadius ); - value = shadowProperties; + value = map; + } break; } case EffectStyle::INPUT: @@ -413,29 +578,179 @@ bool SetOutlineProperties( ControllerPtr controller, const Property::Value& valu if( controller ) { - const std::string properties = value.Get< std::string >(); - switch( type ) { case EffectStyle::DEFAULT: { - // Stores the default outline's properties string to be recovered by the GetOutlineProperties() function. - controller->SetDefaultOutlineProperties( properties ); + const Property::Map& propertiesMap = value.Get(); + + bool colorDefined = false; + Vector4 color; + bool widthDefined = false; + uint16_t width = 0u; + + bool empty = true; + + if ( propertiesMap.Empty() ) + { + // Map empty so check if a string provided + // This is purely to maintain backward compatibility, but we don't parse the string to be a property map. + const std::string propertyString = value.Get(); + + // Stores the default outline's properties string to be recovered by the GetOutlineProperties() function. + controller->SetDefaultOutlineProperties( propertyString ); + + controller->OutlineSetByString( true ); + } + else + { + empty = ParseOutlineProperties( propertiesMap, + colorDefined, + color, + widthDefined, + width ); + + controller->OutlineSetByString( false ); + } + + if( !empty ) + { + // Sets the default outline values. + if( colorDefined && ( controller->GetOutlineColor() != color ) ) + { + controller->SetOutlineColor( color ); + update = true; + } + + if( widthDefined && ( controller->GetOutlineWidth() != width ) ) + { + controller->SetOutlineWidth( width ); + update = true; + } + } + else + { + // Disable outline + if( 0u != controller->GetOutlineWidth() ) + { + controller->SetOutlineWidth( 0u ); + update = true; + } + } break; } case EffectStyle::INPUT: { - // Stores the input outline's properties string to be recovered by the GetOutlineProperties() function. - controller->SetInputOutlineProperties( properties ); + const std::string& outlineProperties = value.Get(); + + controller->SetInputOutlineProperties( outlineProperties ); + break; + } + } // switch + } // if( controller ) + + return update; +} + +void GetOutlineProperties( ControllerPtr controller, Property::Value& value, EffectStyle::Type type ) +{ + if( controller ) + { + switch( type ) + { + case EffectStyle::DEFAULT: + { + if ( controller->IsOutlineSetByString() ) + { + value = controller->GetDefaultOutlineProperties(); + break; + } + else + { + const Vector4& color = controller->GetOutlineColor(); + const uint16_t width = controller->GetOutlineWidth(); + + Property::Map map; + map.Insert( COLOR_KEY, color ); + map.Insert( WIDTH_KEY, static_cast( width ) ); + + value = map; + + break; + } + } + case EffectStyle::INPUT: + { + value = controller->GetInputOutlineProperties(); break; } } } +} + +bool SetBackgroundProperties( ControllerPtr controller, const Property::Value& value, EffectStyle::Type type ) +{ + bool update = false; + + if( controller ) + { + switch( type ) + { + case EffectStyle::DEFAULT: + { + const Property::Map& propertiesMap = value.Get(); + + bool enabled = false; + bool colorDefined = false; + Vector4 color; + + bool empty = true; + + if ( !propertiesMap.Empty() ) + { + empty = ParseBackgroundProperties( propertiesMap, + enabled, + colorDefined, + color ); + } + + if( !empty ) + { + if( enabled != controller->IsBackgroundEnabled() ) + { + controller->SetBackgroundEnabled( enabled ); + update = true; + } + + if( colorDefined && ( controller->GetBackgroundColor() != color ) ) + { + controller->SetBackgroundColor( color ); + update = true; + } + } + else + { + // Disable background. + if( controller->IsBackgroundEnabled() ) + { + controller->SetBackgroundEnabled( false ); + update = true; + } + } + break; + } + case EffectStyle::INPUT: + { + // Text background is not supported while inputting yet + break; + } + } // switch + } // if( controller ) return update; } -void GetOutlineProperties( ControllerPtr controller, Property::Value& value, EffectStyle::Type type ) +void GetBackgroundProperties( ControllerPtr controller, Property::Value& value, EffectStyle::Type type ) { if( controller ) { @@ -443,18 +758,28 @@ void GetOutlineProperties( ControllerPtr controller, Property::Value& value, Eff { case EffectStyle::DEFAULT: { - value = controller->GetDefaultOutlineProperties(); + const bool enabled = controller->IsBackgroundEnabled(); + const Vector4& color = controller->GetBackgroundColor(); + + Property::Map map; + map.Insert( ENABLE_KEY, enabled ); + map.Insert( COLOR_KEY, color ); + + value = map; + break; + } case EffectStyle::INPUT: { - value = controller->GetInputOutlineProperties(); + // Text background is not supported while inputting yet break; } } } } + } // namespace Text } // namespace Toolkit