#include <dali/integration-api/debug.h>
// INTERNAL INCLUDES
-#include <dali-toolkit/devel-api/builder/json-parser.h>
-#include <dali-toolkit/devel-api/builder/tree-node.h>
+#include <dali-toolkit/internal/text/property-string-parser.h>
namespace Dali
{
const std::string WEIGHT_KEY( "weight" );
const std::string WIDTH_KEY( "width" );
const std::string SLANT_KEY( "slant" );
-const std::string EMPTY_STRING( "" );
#if defined(DEBUG_ENABLED)
Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_CONTROLS");
} // namespace
-/**
- * @brief Creates a map with pairs 'key,value' with the font's style parameters.
- *
- * @param[in] node Data structure with the font's style parameters.
- * @param[out] map A map with the font's style parameters.
- *
- */
-void CreateFontStyleMap( const TreeNode* const node, Property::Map& map )
-{
- switch( node->GetType() )
- {
- case TreeNode::IS_NULL:
- case TreeNode::OBJECT:
- case TreeNode::ARRAY: // FALL THROUGH
- {
- break;
- }
- case TreeNode::STRING:
- {
- map.Insert( node->GetName(), Property::Value( node->GetString() ) );
- break;
- }
- case TreeNode::INTEGER:
- case TreeNode::FLOAT:
- case TreeNode::BOOLEAN: // FALL THROUGH
- {
- break;
- }
- }
-
- for( TreeNode::ConstIterator it = node->CBegin(), endIt = node->CEnd(); it != endIt; ++it )
- {
- const TreeNode::KeyNodePair& pair = *it;
- CreateFontStyleMap( &pair.second, map );
- }
-}
-
-/**
- * @brief Parses the font's style string.
- *
- * @param[in] style The font's style string.
- * @param[out] map A map with the font's style parameters.
- *
- */
-void ParseFontStyleString( const std::string& style, Property::Map& map )
-{
- Toolkit::JsonParser parser = Toolkit::JsonParser::New();
-
- if( parser.Parse( style ) )
- {
- const TreeNode* const node = parser.GetRoot();
-
- CreateFontStyleMap( node, map );
- }
-}
-
void SetFontStyleProperty( ControllerPtr controller, const Property::Value& value, FontStyle::Type type )
{
if( controller )
const std::string style = value.Get< std::string >();
DALI_LOG_INFO( gLogFilter, Debug::General, "Text Control %p FONT_STYLE %s\n", controller.Get(), style.c_str() );
- switch( type )
- {
- case FontStyle::DEFAULT:
- {
- // Stores the default font's style string to be recovered by the GetFontStyleProperty() function.
- controller->SetDefaultFontStyle( style );
- break;
- }
- case FontStyle::INPUT:
- {
- // Stores the input font's style string to be recovered by the GetFontStyleProperty() function.
- controller->SetInputFontStyle( style );
- break;
- }
- }
-
// Parses and applies the style.
Property::Map map;
- ParseFontStyleString( style, map );
+ ParsePropertyString( style, map );
if( !map.Empty() )
{
/// Weight key
Property::Value* weightValue = map.Find( WEIGHT_KEY );
- FontWeight weight = TextAbstraction::FontWeight::NORMAL;
+ FontWeight weight = TextAbstraction::FontWeight::NONE;
const bool weightDefined = weightValue != NULL;
if( weightDefined )
{
/// Width key
Property::Value* widthValue = map.Find( WIDTH_KEY );
- FontWidth width = TextAbstraction::FontWidth::NORMAL;
+ FontWidth width = TextAbstraction::FontWidth::NONE;
const bool widthDefined = widthValue != NULL;
if( widthDefined )
{
/// Slant key
Property::Value* slantValue = map.Find( SLANT_KEY );
- FontSlant slant = TextAbstraction::FontSlant::NORMAL;
+ FontSlant slant = TextAbstraction::FontSlant::NONE;
const bool slantDefined = slantValue != NULL;
if( slantDefined )
{
case FontStyle::DEFAULT:
{
// Sets the default font's style values.
- if( weightDefined && ( controller->GetDefaultFontWeight() != weight ) )
+ if( !weightDefined ||
+ ( weightDefined && ( controller->GetDefaultFontWeight() != weight ) ) )
{
controller->SetDefaultFontWeight( weight );
}
- if( widthDefined && ( controller->GetDefaultFontWidth() != width ) )
+ if( !widthDefined ||
+ ( widthDefined && ( controller->GetDefaultFontWidth() != width ) ) )
{
controller->SetDefaultFontWidth( width );
}
- if( slantDefined && ( controller->GetDefaultFontSlant() != slant ) )
+ if( !slantDefined ||
+ ( slantDefined && ( controller->GetDefaultFontSlant() != slant ) ) )
{
controller->SetDefaultFontSlant( slant );
}
case FontStyle::INPUT:
{
// Sets the input font's style values.
- if( weightDefined && ( controller->GetInputFontWeight() != weight ) )
+ if( !weightDefined ||
+ ( weightDefined && ( controller->GetInputFontWeight() != weight ) ) )
{
controller->SetInputFontWeight( weight );
}
- if( widthDefined && ( controller->GetInputFontWidth() != width ) )
+ if( !widthDefined ||
+ ( widthDefined && ( controller->GetInputFontWidth() != width ) ) )
{
controller->SetInputFontWidth( width );
}
- if( slantDefined && ( controller->GetInputFontSlant() != slant ) )
+ if( !slantDefined ||
+ ( slantDefined && ( controller->GetInputFontSlant() != slant ) ) )
{
controller->SetInputFontSlant( slant );
}
break;
}
- }
- }
- }
+ } // switch
+ } // map not empty
+ else
+ {
+ switch( type )
+ {
+ case FontStyle::DEFAULT:
+ {
+ controller->SetDefaultFontWeight( TextAbstraction::FontWeight::NONE );
+ controller->SetDefaultFontWidth( TextAbstraction::FontWidth::NONE );
+ controller->SetDefaultFontSlant( TextAbstraction::FontSlant::NONE );
+ break;
+ }
+ case FontStyle::INPUT:
+ {
+ controller->SetInputFontWeight( TextAbstraction::FontWeight::NONE );
+ controller->SetInputFontWidth( TextAbstraction::FontWidth::NONE );
+ controller->SetInputFontSlant( TextAbstraction::FontSlant::NONE );
+ break;
+ }
+ } // switch
+ } // map.Empty()
+ } // controller
}
void GetFontStyleProperty( ControllerPtr controller, Property::Value& value, FontStyle::Type type )
{
if( controller )
{
- switch( type )
+ const bool isDefaultStyle = FontStyle::DEFAULT == type;
+
+ bool weightDefined = false;
+ bool widthDefined = false;
+ bool slantDefined = false;
+ FontWeight weight = TextAbstraction::FontWeight::NONE;
+ FontWidth width = TextAbstraction::FontWidth::NONE;
+ FontSlant slant = TextAbstraction::FontSlant::NONE;
+
+ if( isDefaultStyle )
{
- case FontStyle::DEFAULT:
+ weightDefined = controller->IsDefaultFontWeightDefined();
+ widthDefined = controller->IsDefaultFontWidthDefined();
+ slantDefined = controller->IsDefaultFontSlantDefined();
+
+ if( weightDefined )
{
- value = controller->GetDefaultFontStyle();
- break;
+ weight = controller->GetDefaultFontWeight();
}
- case FontStyle::INPUT:
+
+ if( widthDefined )
{
- value = controller->GetInputFontStyle();
- break;
+ width = controller->GetDefaultFontWidth();
}
+
+ if( slantDefined )
+ {
+ slant = controller->GetDefaultFontSlant();
+ }
+ }
+ else
+ {
+ weightDefined = controller->IsInputFontWeightDefined();
+ widthDefined = controller->IsInputFontWidthDefined();
+ slantDefined = controller->IsInputFontSlantDefined();
+
+ if( weightDefined )
+ {
+ weight = controller->GetInputFontWeight();
+ }
+
+ if( widthDefined )
+ {
+ width = controller->GetInputFontWidth();
+ }
+
+ if( slantDefined )
+ {
+ slant = controller->GetInputFontSlant();
+ }
+ }
+
+ if( weightDefined || widthDefined || slantDefined )
+ {
+ std::string styleString("{");
+ if( weightDefined )
+ {
+ if( TextAbstraction::FontWeight::NONE != weight )
+ {
+ const std::string weightStr( GetEnumerationName( weight,
+ FONT_WEIGHT_STRING_TABLE,
+ FONT_WEIGHT_STRING_TABLE_COUNT ) );
+
+ styleString += "\"weight\":\"" + weightStr + "\"";
+ }
+ else
+ {
+ weightDefined = false;
+ }
+ }
+
+ if( widthDefined )
+ {
+ if( TextAbstraction::FontWidth::NONE != width )
+ {
+ const std::string widthStr( GetEnumerationName( width,
+ FONT_WIDTH_STRING_TABLE,
+ FONT_WIDTH_STRING_TABLE_COUNT ) );
+
+ if( weightDefined )
+ {
+ styleString += ",";
+ }
+ styleString += "\"width\":\"" + widthStr + "\"";
+ }
+ else
+ {
+ widthDefined = false;
+ }
+ }
+
+ if( slantDefined )
+ {
+ if( TextAbstraction::FontSlant::NONE != slant )
+ {
+ const std::string slantStr( GetEnumerationName( slant,
+ FONT_SLANT_STRING_TABLE,
+ FONT_SLANT_STRING_TABLE_COUNT ) );
+
+ if( weightDefined || widthDefined )
+ {
+ styleString += ",";
+ }
+ styleString += "\"slant\":\"" + slantStr + "\"";
+ }
+ else
+ {
+ slantDefined = false;
+ }
+ }
+
+ if( weightDefined || widthDefined || slantDefined )
+ {
+ styleString += "}";
+ }
+ else
+ {
+ styleString.clear();
+ }
+
+ value = styleString;
}
}
}