X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fbuilder%2Fstyle.cpp;h=a5ced1bc8864b3e594e5a2731b9473e669afd744;hp=eaf59dcfd172f362d4da8b75f92650fede8ae1b2;hb=59314022f6789147a47a8b098433e211b6185625;hpb=cb30ef68af0383b073ba2d425d3d95c1e916cbb4 diff --git a/dali-toolkit/internal/builder/style.cpp b/dali-toolkit/internal/builder/style.cpp index eaf59dc..a5ced1b 100644 --- a/dali-toolkit/internal/builder/style.cpp +++ b/dali-toolkit/internal/builder/style.cpp @@ -15,43 +15,55 @@ */ #include +#include #include #include +#include #include +#include namespace Dali { namespace Toolkit { + namespace Internal { +extern const Dali::Scripting::StringEnum ControlStateTable[]; +extern const unsigned int ControlStateTableCount; + StylePtr Style::New() { StylePtr stylePtr( new Style() ); return stylePtr; } -void Style::ApplyVisualsAndPropertiesRecursively( Handle handle ) const +void Style::ApplyVisualsAndPropertiesRecursively( + Handle handle, + const Dictionary& instancedProperties ) const { - ApplyVisuals( handle ); + ApplyVisuals( handle, instancedProperties ); ApplyProperties( handle ); Toolkit::Control control = Toolkit::Control::DownCast(handle); if( control ) { - Property::Value value = control.GetProperty(DevelControl::Property::STATE); std::string stateName; - if( value.Get( stateName ) ) + Property::Value value = control.GetProperty(DevelControl::Property::STATE); + Dali::Toolkit::DevelControl::State state = static_cast(value.Get()); + stateName = Scripting::GetEnumerationName< Toolkit::DevelControl::State >( state, ControlStateTable, ControlStateTableCount ); + + if( ! stateName.empty() ) { // Look up state in states table: - const StylePtr* stylePtr = subStates.FindCaseInsensitiveC( stateName ); + const StylePtr* stylePtr = subStates.FindConst( stateName ); if( stylePtr ) { const StylePtr statePtr(*stylePtr); // We have a state match. - statePtr->ApplyVisuals( handle ); + statePtr->ApplyVisuals( handle, instancedProperties ); statePtr->ApplyProperties( handle ); // Apply substate visuals @@ -59,12 +71,12 @@ void Style::ApplyVisualsAndPropertiesRecursively( Handle handle ) const std::string subStateName; if( value.Get( subStateName ) && ! subStateName.empty() ) { - const StylePtr* stylePtr = statePtr->subStates.FindCaseInsensitiveC( subStateName ); + const StylePtr* stylePtr = statePtr->subStates.FindConst( subStateName ); if( stylePtr ) { const StylePtr subStatePtr(*stylePtr); // We have a sub-state match. - subStatePtr->ApplyVisuals( handle ); + subStatePtr->ApplyVisuals( handle, instancedProperties ); subStatePtr->ApplyProperties( handle ); } } @@ -73,18 +85,66 @@ void Style::ApplyVisualsAndPropertiesRecursively( Handle handle ) const } } -void Style::ApplyVisuals( Handle handle ) const +void Style::ApplyVisuals( + Handle handle, + const Dictionary& instancedProperties ) const { - for( Dictionary::iterator iter = visuals.Begin(); iter != visuals.End() ; ++iter ) + ApplyVisuals( handle, visuals, instancedProperties ); +} + +void Style::ApplyVisuals( + Handle handle, + const Dictionary& visualMaps, + const Dictionary& instancedProperties ) +{ + for( Dictionary::iterator iter = visualMaps.Begin(); iter != visualMaps.End() ; ++iter ) { const std::string& visualName = (*iter).key; - const Property::Map& map = (*iter).entry; - Dali::Property::Index index = handle.GetPropertyIndex( visualName ); - if( index != Property::INVALID_INDEX ) + Property::Map map = (*iter).entry; + Property::Map* instancedMap = instancedProperties.Find( visualName ); + ApplyVisual( handle, visualName, map, instancedMap ); + } +} + +void Style::ApplyVisual( + Handle handle, + const std::string& visualName, + const Property::Map& visualMap, + const Property::Map* instancedProperties ) +{ + // Check if this visual name is a valid property of handle + Dali::Property::Index index = handle.GetPropertyIndex( visualName ); + if( index != Property::INVALID_INDEX ) + { + const Property::Map* applyMap = &visualMap; + Property::Map mergedMap; + + // If there are instanced properties, and the visual types match, + // merge them into the visual map + if( instancedProperties ) { - const Property::Value value(const_cast(map)); - handle.SetProperty( index, value ); + Property::Value* instanceTypeValue = instancedProperties->Find( Toolkit::Visual::Property::TYPE); + Property::Value* newTypeValue = visualMap.Find( Toolkit::Visual::Property::TYPE, VISUAL_TYPE ); + if( instanceTypeValue && newTypeValue ) + { + int instanceVisualType=-1; + int newVisualType=-1; + Scripting::GetEnumerationProperty( *instanceTypeValue, VISUAL_TYPE_TABLE, VISUAL_TYPE_TABLE_COUNT, instanceVisualType ); + Scripting::GetEnumerationProperty( *newTypeValue, VISUAL_TYPE_TABLE, VISUAL_TYPE_TABLE_COUNT, newVisualType ); + + if( instanceVisualType == newVisualType ) + { + // Same type - merge remaining instance data + mergedMap.Merge( visualMap ); + mergedMap.Merge( *instancedProperties ); + applyMap = &mergedMap; + } + } } + + // Apply the visual property map to the handle + const Property::Value value(const_cast(*applyMap)); + handle.SetProperty( index, value ); } } @@ -103,7 +163,6 @@ void Style::ApplyProperties( Handle handle ) const Style::Style() { } - Style::~Style() { }