#include <dali/public-api/object/type-registry.h>
#include <dali/public-api/object/property-array.h>
#include <dali/public-api/actors/layer.h>
-#include <dali/public-api/actors/image-actor.h>
#include <dali/public-api/actors/camera-actor.h>
#include <dali/devel-api/scripting/scripting.h>
#include <dali/public-api/signals/functor-delegate.h>
extern Animation CreateAnimation(const TreeNode& child, const Replacement& replacements, const Dali::Actor searchRoot, Builder* const builder );
extern Actor SetupSignalAction(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor, Dali::Toolkit::Internal::Builder* const builder);
extern Actor SetupPropertyNotification(ConnectionTracker* tracker, const TreeNode &root, const TreeNode &child, Actor actor, Dali::Toolkit::Internal::Builder* const builder);
-extern Actor SetupActor( const TreeNode& node, Actor& actor, const Replacement& constant );
#if defined(DEBUG_ENABLED)
Integration::Log::Filter* gFilterScript = Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_SCRIPT");
const std::string KEYNAME_INCLUDES = "includes";
const std::string KEYNAME_MAPPINGS = "mappings";
+const std::string PROPERTIES = "properties";
+const std::string ANIMATABLE_PROPERTIES = "animatableProperties";
+
typedef std::vector<const TreeNode*> TreeNodeList;
}
/*
- * Recursively collects all stylesin a node (An array of style names).
+ * Recursively collects all styles in a node (An array of style names).
*
* stylesCollection The set of styles from the json file (a json object of named styles)
* style The style array to begin the collection from
{
if( OptionalString styleName = IsString( (*iter).second ) )
{
- if( OptionalChild node = IsChild( stylesCollection, *styleName) )
+ if( OptionalChild node = IsChildIgnoreCase( stylesCollection, *styleName) )
{
styleList.push_back( &(*node) );
continue;
}
- // special field 'image' usually contains an json object description
- // although sometimes refers to a framebuffer
- if( key == "image" )
- {
- if( 0 == keyChild.second.Size() )
- {
- ImageActor imageActor = ImageActor::DownCast(handle);
- if(imageActor)
- {
- if( OptionalString s = constant.IsString( keyChild.second ) )
- {
- FrameBufferImage fb = GetFrameBufferImage(*s, constant);
- if(fb)
- {
- imageActor.SetImage( fb );
- }
- }
- }
- }
- }
-
- // special field 'effect' references the shader effect instances
- if( key == "effect" )
- {
- ImageActor actor = ImageActor::DownCast(handle);
- if( actor )
- {
- OptionalString str = constant.IsString( keyChild.second );
- if( str )
- {
- ShaderEffect effect = GetShaderEffect( *str, constant );
- actor.SetShaderEffect(effect);
- }
- }
- else
- {
- DALI_SCRIPT_WARNING("Could not find or set shader effect\n");
- }
-
- continue;
- }
-
Handle propertyObject( handle );
Dali::Property::Index index = propertyObject.GetPropertyIndex( key );
- if( Property::INVALID_INDEX == index )
- {
- ImageActor actor = ImageActor::DownCast(handle);
- if( actor )
- {
- if( ShaderEffect effect = actor.GetShaderEffect() )
- {
- index = effect.GetPropertyIndex( key );
- if(index != Property::INVALID_INDEX)
- {
- propertyObject = effect;
- }
- }
- }
- }
-
if( Property::INVALID_INDEX != index )
{
Property::Type type = propertyObject.GetPropertyType(index);
mapped = DeterminePropertyFromNode( keyChild.second, type, value, constant );
if( ! mapped )
{
- // verbose as this might not be a problem
- // eg parentOrigin can be a string which is picked up later
- DALI_SCRIPT_VERBOSE("Could not convert property:%s\n", key.c_str());
+ // Just determine the property from the node and if it's valid, let the property object handle it
+ DeterminePropertyFromNode( keyChild.second, value, constant );
+ mapped = ( value.GetType() != Property::NONE );
}
}
if( mapped )
DALI_SCRIPT_VERBOSE("SetProperty INVALID '%s' Index=:%d\n", key.c_str(), index);
}
+ // Add custom properties
+ SetCustomProperties(node, handle, constant, PROPERTIES, Property::READ_WRITE);
+ SetCustomProperties(node, handle, constant, ANIMATABLE_PROPERTIES, Property::ANIMATABLE);
+
} // for property nodes
}
else
}
}
+void Builder::SetCustomProperties( const TreeNode& node, Handle& handle, const Replacement& constant,
+ const std::string& childName, Property::AccessMode accessMode )
+{
+ // Add custom properties
+ if( OptionalChild customPropertiesChild = IsChild(node, childName) )
+ {
+ const TreeNode& customPropertiesNode = *customPropertiesChild;
+ const TreeConstIter endIter = customPropertiesNode.CEnd();
+ for( TreeConstIter iter = customPropertiesNode.CBegin(); endIter != iter; ++iter )
+ {
+ const TreeNode::KeyNodePair& keyChild = *iter;
+ std::string key( keyChild.first );
+
+ Property::Value value;
+ DeterminePropertyFromNode( keyChild.second, value, constant );
+ // Register/Set property.
+ handle.RegisterProperty( key, value, accessMode );
+ }
+ }
+}
+
// Set properties from node on handle.
void Builder::ApplyProperties( const TreeNode& root, const TreeNode& node,
Dali::Handle& handle, const Replacement& constant )
if( actor )
{
- SetupActor( node, actor, constant );
-
// add signals
SetupSignalAction( mSlotDelegate.GetConnectionTracker(), root, node, actor, this );
SetupPropertyNotification( mSlotDelegate.GetConnectionTracker(), root, node, actor, this );
}
}
-ShaderEffect Builder::GetShaderEffect( const std::string &name)
-{
- Replacement constant( mReplacementMap );
- return GetShaderEffect( name, constant );
-}
-
-ShaderEffect Builder::GetShaderEffect( const std::string &name, const Replacement& constant )
-{
- DALI_ASSERT_ALWAYS(mParser.GetRoot() && "Builder script not loaded");
-
- ShaderEffect ret;
-
- ShaderEffectLut::const_iterator iter( mShaderEffectLut.find( name ) );
- if( iter != mShaderEffectLut.end() )
- {
- ret = iter->second;
- }
- else
- {
- if( OptionalChild effects = IsChild( *mParser.GetRoot(), "shaderEffects") )
- {
- if( OptionalChild effect = IsChild( *effects, name ) )
- {
- Dali::Property::Value propertyMap(Property::MAP);
- if( DeterminePropertyFromNode( *effect, Property::MAP, propertyMap, constant ) )
- {
- ret = Dali::Scripting::NewShaderEffect( propertyMap );
- mShaderEffectLut[ name ] = ret;
- }
- }
- }
- }
-
- return ret;
-}
-
FrameBufferImage Builder::GetFrameBufferImage( const std::string &name )
{
Replacement constant( mReplacementMap );
case Property::MAP:
{
Property::Map* map = child.GetMap();
- for( Property::Map::SizeType i=0; i < map->Count(); ++i )
+ if( map )
{
- Property::Value& child = map->GetValue(i);
- ConvertChildValue(mappingRoot, keyStack, child);
+ for( Property::Map::SizeType i=0; i < map->Count(); ++i )
+ {
+ Property::Value& child = map->GetValue(i);
+ ConvertChildValue(mappingRoot, keyStack, child);
+ }
}
break;
}
case Property::ARRAY:
{
Property::Array* array = child.GetArray();
- for( Property::Array::SizeType i=0; i < array->Count(); ++i )
+ if( array )
{
- Property::Value& child = array->GetElementAt(i);
- ConvertChildValue(mappingRoot, keyStack, child);
+ for( Property::Array::SizeType i=0; i < array->Count(); ++i )
+ {
+ Property::Value& child = array->GetElementAt(i);
+ ConvertChildValue(mappingRoot, keyStack, child);
+ }
}
break;
}
DALI_ASSERT_ALWAYS(mParser.GetRoot() && "Builder script not loaded");
OptionalChild styles = IsChild( *mParser.GetRoot(), KEYNAME_STYLES );
- OptionalChild style = IsChild( *styles, styleName );
+
+ std::string styleNameLower(styleName);
+ OptionalChild style = IsChildIgnoreCase( *styles, styleNameLower );
if( styles && style )
{