X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fcontrol%2Fcontrol-data-impl.cpp;h=9e69f95540e5b0c2e94ccb20c68c94fb384edbca;hp=df01b275d51313e5b8371aab4f08cd61a6181dd5;hb=2676a40c6aa784628b20c42052bae09e66284b88;hpb=09502f5f09f1294ef5555e4efbf0e7e8115bfbc3 diff --git a/dali-toolkit/internal/controls/control/control-data-impl.cpp b/dali-toolkit/internal/controls/control/control-data-impl.cpp old mode 100755 new mode 100644 index df01b27..9e69f95 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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,110 +19,107 @@ #include "control-data-impl.h" // EXTERNAL INCLUDES +#include +#include #include -#include +#include +#include +#include #include #include #include -#include -#include #include -#include -#include +#include #include -#include -#include -#include +#include #include #include // INTERNAL INCLUDES -#include -#include -#include +#include #include #include #include #include +#include #include -#include #include +#include +#include +#include namespace { - const std::string READING_INFO_TYPE_NAME = "name"; - const std::string READING_INFO_TYPE_ROLE = "role"; - const std::string READING_INFO_TYPE_DESCRIPTION = "description"; - const std::string READING_INFO_TYPE_STATE = "state"; - const std::string READING_INFO_TYPE_ATTRIBUTE_NAME = "reading_info_type"; - const std::string READING_INFO_TYPE_SEPARATOR = "|"; -} +const std::string READING_INFO_TYPE_NAME = "name"; +const std::string READING_INFO_TYPE_ROLE = "role"; +const std::string READING_INFO_TYPE_DESCRIPTION = "description"; +const std::string READING_INFO_TYPE_STATE = "state"; +const std::string READING_INFO_TYPE_ATTRIBUTE_NAME = "reading_info_type"; +const std::string READING_INFO_TYPE_SEPARATOR = "|"; +} // namespace namespace Dali { - namespace Toolkit { - namespace Internal { - extern const Dali::Scripting::StringEnum ControlStateTable[]; -extern const unsigned int ControlStateTableCount; - +extern const unsigned int ControlStateTableCount; // Not static or anonymous - shared with other translation units const Scripting::StringEnum ControlStateTable[] = { - { "NORMAL", Toolkit::DevelControl::NORMAL }, - { "FOCUSED", Toolkit::DevelControl::FOCUSED }, - { "DISABLED", Toolkit::DevelControl::DISABLED }, + {"NORMAL", Toolkit::DevelControl::NORMAL}, + {"FOCUSED", Toolkit::DevelControl::FOCUSED}, + {"DISABLED", Toolkit::DevelControl::DISABLED}, }; -const unsigned int ControlStateTableCount = sizeof( ControlStateTable ) / sizeof( ControlStateTable[0] ); - - +const unsigned int ControlStateTableCount = sizeof(ControlStateTable) / sizeof(ControlStateTable[0]); namespace { - #if defined(DEBUG_ENABLED) -Debug::Filter* gLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_CONTROL_VISUALS"); +Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_CONTROL_VISUALS"); #endif - template -void Remove( Dictionary& keyValues, const std::string& name ) +void Remove(Dictionary& keyValues, const std::string& name) { keyValues.Remove(name); } -void Remove( DictionaryKeys& keys, const std::string& name ) +void Remove(DictionaryKeys& keys, const std::string& name) { - DictionaryKeys::iterator iter = std::find( keys.begin(), keys.end(), name ); - if( iter != keys.end()) + DictionaryKeys::iterator iter = std::find(keys.begin(), keys.end(), name); + if(iter != keys.end()) { keys.erase(iter); } } -Toolkit::Visual::Type GetVisualTypeFromMap( const Property::Map& map ) +/** + * Finds visual in given array, returning true if found along with the iterator for that visual as a out parameter + */ +bool FindVisual(Property::Index targetIndex, const RegisteredVisualContainer& visuals, RegisteredVisualContainer::Iterator& iter) { - Property::Value* typeValue = map.Find( Toolkit::Visual::Property::TYPE, VISUAL_TYPE ); - Toolkit::Visual::Type type = Toolkit::Visual::IMAGE; - if( typeValue ) + for(iter = visuals.Begin(); iter != visuals.End(); iter++) { - Scripting::GetEnumerationProperty( *typeValue, VISUAL_TYPE_TABLE, VISUAL_TYPE_TABLE_COUNT, type ); + if((*iter)->index == targetIndex) + { + return true; + } } - return type; + return false; } /** * Finds visual in given array, returning true if found along with the iterator for that visual as a out parameter */ -bool FindVisual( Property::Index targetIndex, const RegisteredVisualContainer& visuals, RegisteredVisualContainer::Iterator& iter ) +bool FindVisual(std::string visualName, const RegisteredVisualContainer& visuals, RegisteredVisualContainer::Iterator& iter) { - for ( iter = visuals.Begin(); iter != visuals.End(); iter++ ) + for(iter = visuals.Begin(); iter != visuals.End(); iter++) { - if ( (*iter)->index == targetIndex ) + Toolkit::Visual::Base visual = (*iter)->visual; + if(visual && visual.GetName() == visualName) { return true; } @@ -130,37 +127,38 @@ bool FindVisual( Property::Index targetIndex, const RegisteredVisualContainer& v return false; } -void FindChangableVisuals( Dictionary& stateVisualsToAdd, - Dictionary& stateVisualsToChange, - DictionaryKeys& stateVisualsToRemove) +void FindChangableVisuals(Dictionary& stateVisualsToAdd, + Dictionary& stateVisualsToChange, + DictionaryKeys& stateVisualsToRemove) { DictionaryKeys copyOfStateVisualsToRemove = stateVisualsToRemove; - for( DictionaryKeys::iterator iter = copyOfStateVisualsToRemove.begin(); - iter != copyOfStateVisualsToRemove.end(); ++iter ) + for(DictionaryKeys::iterator iter = copyOfStateVisualsToRemove.begin(); + iter != copyOfStateVisualsToRemove.end(); + ++iter) { const std::string& visualName = (*iter); - Property::Map* toMap = stateVisualsToAdd.Find( visualName ); - if( toMap ) + Property::Map* toMap = stateVisualsToAdd.Find(visualName); + if(toMap) { - stateVisualsToChange.Add( visualName, *toMap ); - stateVisualsToAdd.Remove( visualName ); - Remove( stateVisualsToRemove, visualName ); + stateVisualsToChange.Add(visualName, *toMap); + stateVisualsToAdd.Remove(visualName); + Remove(stateVisualsToRemove, visualName); } } } Toolkit::Visual::Base GetVisualByName( const RegisteredVisualContainer& visuals, - const std::string& visualName ) + const std::string& visualName) { Toolkit::Visual::Base visualHandle; RegisteredVisualContainer::Iterator iter; - for ( iter = visuals.Begin(); iter != visuals.End(); iter++ ) + for(iter = visuals.Begin(); iter != visuals.End(); iter++) { Toolkit::Visual::Base visual = (*iter)->visual; - if( visual && visual.GetName() == visualName ) + if(visual && visual.GetName() == visualName) { visualHandle = visual; break; @@ -169,17 +167,35 @@ Toolkit::Visual::Base GetVisualByName( return visualHandle; } +Toolkit::Visual::Base GetVisualByIndex( + const RegisteredVisualContainer& visuals, + Property::Index index) +{ + Toolkit::Visual::Base visualHandle; + + RegisteredVisualContainer::Iterator iter; + for(iter = visuals.Begin(); iter != visuals.End(); iter++) + { + if((*iter)->index == index) + { + visualHandle = (*iter)->visual; + break; + } + } + return visualHandle; +} + /** * Move visual from source to destination container */ -void MoveVisual( RegisteredVisualContainer::Iterator sourceIter, RegisteredVisualContainer& source, RegisteredVisualContainer& destination ) +void MoveVisual(RegisteredVisualContainer::Iterator sourceIter, RegisteredVisualContainer& source, RegisteredVisualContainer& destination) { - Toolkit::Visual::Base visual = (*sourceIter)->visual; - if( visual ) - { - RegisteredVisual* rv = source.Release( sourceIter ); - destination.PushBack( rv ); - } + Toolkit::Visual::Base visual = (*sourceIter)->visual; + if(visual) + { + RegisteredVisual* rv = source.Release(sourceIter); + destination.PushBack(rv); + } } /** @@ -196,54 +212,56 @@ const char* ACTION_ACCESSIBILITY_READING_RESUMED = "ReadingResumed"; const char* ACTION_ACCESSIBILITY_READING_SKIPPED = "ReadingSkipped"; const char* ACTION_ACCESSIBILITY_READING_STOPPED = "ReadingStopped"; -static bool DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes ) +static bool DoAction(BaseObject* object, const std::string& actionName, const Property::Map& attributes) { bool ret = true; - Dali::BaseHandle handle( object ); + Dali::BaseHandle handle(object); - Toolkit::Control control = Toolkit::Control::DownCast( handle ); + Toolkit::Control control = Toolkit::Control::DownCast(handle); - DALI_ASSERT_ALWAYS( control ); + DALI_ASSERT_ALWAYS(control); - if( 0 == strcmp( actionName.c_str(), ACTION_ACCESSIBILITY_ACTIVATED ) || - actionName == "activate" ) + if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_ACTIVATED) || + actionName == "activate") { // if cast succeeds there is an implementation so no need to check - if( !DevelControl::AccessibilityActivateSignal( control ).Empty() ) - DevelControl::AccessibilityActivateSignal( control ).Emit(); - else ret = Internal::GetImplementation( control ).OnAccessibilityActivated(); + if(!DevelControl::AccessibilityActivateSignal(control).Empty()) + DevelControl::AccessibilityActivateSignal(control).Emit(); + else + ret = Internal::GetImplementation(control).OnAccessibilityActivated(); } - else if( 0 == strcmp( actionName.c_str(), ACTION_ACCESSIBILITY_READING_SKIPPED ) ) + else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_SKIPPED)) { // if cast succeeds there is an implementation so no need to check - if( !DevelControl::AccessibilityReadingSkippedSignal( control ).Empty() ) - DevelControl::AccessibilityReadingSkippedSignal( control ).Emit(); + if(!DevelControl::AccessibilityReadingSkippedSignal(control).Empty()) + DevelControl::AccessibilityReadingSkippedSignal(control).Emit(); } - else if( 0 == strcmp( actionName.c_str(), ACTION_ACCESSIBILITY_READING_PAUSED ) ) + else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_PAUSED)) { // if cast succeeds there is an implementation so no need to check - if( !DevelControl::AccessibilityReadingPausedSignal( control ).Empty() ) - DevelControl::AccessibilityReadingPausedSignal( control ).Emit(); + if(!DevelControl::AccessibilityReadingPausedSignal(control).Empty()) + DevelControl::AccessibilityReadingPausedSignal(control).Emit(); } - else if( 0 == strcmp( actionName.c_str(), ACTION_ACCESSIBILITY_READING_RESUMED ) ) + else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_RESUMED)) { // if cast succeeds there is an implementation so no need to check - if( !DevelControl::AccessibilityReadingResumedSignal( control ).Empty() ) - DevelControl::AccessibilityReadingResumedSignal( control ).Emit(); + if(!DevelControl::AccessibilityReadingResumedSignal(control).Empty()) + DevelControl::AccessibilityReadingResumedSignal(control).Emit(); } - else if( 0 == strcmp( actionName.c_str(), ACTION_ACCESSIBILITY_READING_CANCELLED ) ) + else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_CANCELLED)) { // if cast succeeds there is an implementation so no need to check - if( !DevelControl::AccessibilityReadingCancelledSignal( control ).Empty() ) - DevelControl::AccessibilityReadingCancelledSignal( control ).Emit(); + if(!DevelControl::AccessibilityReadingCancelledSignal(control).Empty()) + DevelControl::AccessibilityReadingCancelledSignal(control).Emit(); } - else if( 0 == strcmp( actionName.c_str(), ACTION_ACCESSIBILITY_READING_STOPPED ) ) + else if(0 == strcmp(actionName.c_str(), ACTION_ACCESSIBILITY_READING_STOPPED)) { // if cast succeeds there is an implementation so no need to check - if(!DevelControl::AccessibilityReadingStoppedSignal( control ).Empty()) - DevelControl::AccessibilityReadingStoppedSignal( control ).Emit(); - } else + if(!DevelControl::AccessibilityReadingStoppedSignal(control).Empty()) + DevelControl::AccessibilityReadingStoppedSignal(control).Emit(); + } + else { ret = false; } @@ -259,72 +277,71 @@ static bool DoAction( BaseObject* object, const std::string& actionName, const P * @return True if the signal was connected. * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor. */ -const char* SIGNAL_KEY_EVENT = "keyEvent"; +const char* SIGNAL_KEY_EVENT = "keyEvent"; const char* SIGNAL_KEY_INPUT_FOCUS_GAINED = "keyInputFocusGained"; -const char* SIGNAL_KEY_INPUT_FOCUS_LOST = "keyInputFocusLost"; -const char* SIGNAL_TAPPED = "tapped"; -const char* SIGNAL_PANNED = "panned"; -const char* SIGNAL_PINCHED = "pinched"; -const char* SIGNAL_LONG_PRESSED = "longPressed"; -const char* SIGNAL_GET_NAME = "getName"; -const char* SIGNAL_GET_DESCRIPTION = "getDescription"; -const char* SIGNAL_DO_GESTURE = "doGesture"; -static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) -{ - Dali::BaseHandle handle( object ); - - bool connected( false ); - Toolkit::Control control = Toolkit::Control::DownCast( handle ); - if ( control ) - { - Internal::Control& controlImpl( Internal::GetImplementation( control ) ); +const char* SIGNAL_KEY_INPUT_FOCUS_LOST = "keyInputFocusLost"; +const char* SIGNAL_TAPPED = "tapped"; +const char* SIGNAL_PANNED = "panned"; +const char* SIGNAL_PINCHED = "pinched"; +const char* SIGNAL_LONG_PRESSED = "longPressed"; +const char* SIGNAL_GET_NAME = "getName"; +const char* SIGNAL_GET_DESCRIPTION = "getDescription"; +const char* SIGNAL_DO_GESTURE = "doGesture"; +static bool DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor) +{ + Dali::BaseHandle handle(object); + + bool connected(false); + Toolkit::Control control = Toolkit::Control::DownCast(handle); + if(control) + { + Internal::Control& controlImpl(Internal::GetImplementation(control)); connected = true; - if ( 0 == strcmp( signalName.c_str(), SIGNAL_KEY_EVENT ) ) + if(0 == strcmp(signalName.c_str(), SIGNAL_KEY_EVENT)) { - controlImpl.KeyEventSignal().Connect( tracker, functor ); + controlImpl.KeyEventSignal().Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_KEY_INPUT_FOCUS_GAINED ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_KEY_INPUT_FOCUS_GAINED)) { - controlImpl.KeyInputFocusGainedSignal().Connect( tracker, functor ); + controlImpl.KeyInputFocusGainedSignal().Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_KEY_INPUT_FOCUS_LOST ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_KEY_INPUT_FOCUS_LOST)) { - controlImpl.KeyInputFocusLostSignal().Connect( tracker, functor ); + controlImpl.KeyInputFocusLostSignal().Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_TAPPED ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_TAPPED)) { - controlImpl.EnableGestureDetection( GestureType::TAP ); - controlImpl.GetTapGestureDetector().DetectedSignal().Connect( tracker, functor ); + controlImpl.EnableGestureDetection(GestureType::TAP); + controlImpl.GetTapGestureDetector().DetectedSignal().Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_PANNED ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_PANNED)) { - controlImpl.EnableGestureDetection( GestureType::PAN ); - controlImpl.GetPanGestureDetector().DetectedSignal().Connect( tracker, functor ); + controlImpl.EnableGestureDetection(GestureType::PAN); + controlImpl.GetPanGestureDetector().DetectedSignal().Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_PINCHED ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_PINCHED)) { - controlImpl.EnableGestureDetection( GestureType::PINCH ); - controlImpl.GetPinchGestureDetector().DetectedSignal().Connect( tracker, functor ); + controlImpl.EnableGestureDetection(GestureType::PINCH); + controlImpl.GetPinchGestureDetector().DetectedSignal().Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_LONG_PRESSED ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_LONG_PRESSED)) { - controlImpl.EnableGestureDetection( GestureType::LONG_PRESS ); - controlImpl.GetLongPressGestureDetector().DetectedSignal().Connect( tracker, functor ); + controlImpl.EnableGestureDetection(GestureType::LONG_PRESS); + controlImpl.GetLongPressGestureDetector().DetectedSignal().Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_GET_NAME ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_GET_NAME)) { - DevelControl::AccessibilityGetNameSignal( control ).Connect( tracker, functor ); + DevelControl::AccessibilityGetNameSignal(control).Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_GET_DESCRIPTION ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_GET_DESCRIPTION)) { - DevelControl::AccessibilityGetDescriptionSignal( control ).Connect( tracker, functor ); + DevelControl::AccessibilityGetDescriptionSignal(control).Connect(tracker, functor); } - else if( 0 == strcmp( signalName.c_str(), SIGNAL_DO_GESTURE ) ) + else if(0 == strcmp(signalName.c_str(), SIGNAL_DO_GESTURE)) { - DevelControl::AccessibilityDoGestureSignal( control ).Connect( tracker, functor ); + DevelControl::AccessibilityDoGestureSignal(control).Connect(tracker, functor); } - } return connected; } @@ -337,28 +354,28 @@ BaseHandle Create() return Internal::Control::New(); } // Setup signals and actions using the type-registry. -DALI_TYPE_REGISTRATION_BEGIN( Control, CustomActor, Create ); +DALI_TYPE_REGISTRATION_BEGIN(Control, CustomActor, Create); // Note: Properties are registered separately below. -SignalConnectorType registerSignal1( typeRegistration, SIGNAL_KEY_EVENT, &DoConnectSignal ); -SignalConnectorType registerSignal2( typeRegistration, SIGNAL_KEY_INPUT_FOCUS_GAINED, &DoConnectSignal ); -SignalConnectorType registerSignal3( typeRegistration, SIGNAL_KEY_INPUT_FOCUS_LOST, &DoConnectSignal ); -SignalConnectorType registerSignal4( typeRegistration, SIGNAL_TAPPED, &DoConnectSignal ); -SignalConnectorType registerSignal5( typeRegistration, SIGNAL_PANNED, &DoConnectSignal ); -SignalConnectorType registerSignal6( typeRegistration, SIGNAL_PINCHED, &DoConnectSignal ); -SignalConnectorType registerSignal7( typeRegistration, SIGNAL_LONG_PRESSED, &DoConnectSignal ); -SignalConnectorType registerSignal8( typeRegistration, SIGNAL_GET_NAME, &DoConnectSignal ); -SignalConnectorType registerSignal9( typeRegistration, SIGNAL_GET_DESCRIPTION, &DoConnectSignal ); -SignalConnectorType registerSignal10( typeRegistration, SIGNAL_DO_GESTURE, &DoConnectSignal ); - -TypeAction registerAction1( typeRegistration, "activate", &DoAction ); -TypeAction registerAction2( typeRegistration, ACTION_ACCESSIBILITY_ACTIVATED, &DoAction ); -TypeAction registerAction3( typeRegistration, ACTION_ACCESSIBILITY_READING_SKIPPED, &DoAction ); -TypeAction registerAction4( typeRegistration, ACTION_ACCESSIBILITY_READING_CANCELLED, &DoAction ); -TypeAction registerAction5( typeRegistration, ACTION_ACCESSIBILITY_READING_STOPPED, &DoAction ); -TypeAction registerAction6( typeRegistration, ACTION_ACCESSIBILITY_READING_PAUSED, &DoAction ); -TypeAction registerAction7( typeRegistration, ACTION_ACCESSIBILITY_READING_RESUMED, &DoAction ); +SignalConnectorType registerSignal1(typeRegistration, SIGNAL_KEY_EVENT, &DoConnectSignal); +SignalConnectorType registerSignal2(typeRegistration, SIGNAL_KEY_INPUT_FOCUS_GAINED, &DoConnectSignal); +SignalConnectorType registerSignal3(typeRegistration, SIGNAL_KEY_INPUT_FOCUS_LOST, &DoConnectSignal); +SignalConnectorType registerSignal4(typeRegistration, SIGNAL_TAPPED, &DoConnectSignal); +SignalConnectorType registerSignal5(typeRegistration, SIGNAL_PANNED, &DoConnectSignal); +SignalConnectorType registerSignal6(typeRegistration, SIGNAL_PINCHED, &DoConnectSignal); +SignalConnectorType registerSignal7(typeRegistration, SIGNAL_LONG_PRESSED, &DoConnectSignal); +SignalConnectorType registerSignal8(typeRegistration, SIGNAL_GET_NAME, &DoConnectSignal); +SignalConnectorType registerSignal9(typeRegistration, SIGNAL_GET_DESCRIPTION, &DoConnectSignal); +SignalConnectorType registerSignal10(typeRegistration, SIGNAL_DO_GESTURE, &DoConnectSignal); + +TypeAction registerAction1(typeRegistration, "activate", &DoAction); +TypeAction registerAction2(typeRegistration, ACTION_ACCESSIBILITY_ACTIVATED, &DoAction); +TypeAction registerAction3(typeRegistration, ACTION_ACCESSIBILITY_READING_SKIPPED, &DoAction); +TypeAction registerAction4(typeRegistration, ACTION_ACCESSIBILITY_READING_CANCELLED, &DoAction); +TypeAction registerAction5(typeRegistration, ACTION_ACCESSIBILITY_READING_STOPPED, &DoAction); +TypeAction registerAction6(typeRegistration, ACTION_ACCESSIBILITY_READING_PAUSED, &DoAction); +TypeAction registerAction7(typeRegistration, ACTION_ACCESSIBILITY_READING_RESUMED, &DoAction); DALI_TYPE_REGISTRATION_END() @@ -368,56 +385,57 @@ DALI_TYPE_REGISTRATION_END() * @param[in] container Container of visuals * @param[in] parent Parent actor to remove visuals from */ -void SetVisualsOffScene( const RegisteredVisualContainer& container, Actor parent ) +void SetVisualsOffScene(const RegisteredVisualContainer& container, Actor parent) { - for( auto iter = container.Begin(), end = container.End() ; iter!= end; iter++) + for(auto iter = container.Begin(), end = container.End(); iter != end; iter++) { - if( (*iter)->visual ) + if((*iter)->visual) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::SetOffScene Setting visual(%d) off stage\n", (*iter)->index ); - Toolkit::GetImplementation((*iter)->visual).SetOffScene( parent ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::SetOffScene Setting visual(%d) off stage\n", (*iter)->index); + Toolkit::GetImplementation((*iter)->visual).SetOffScene(parent); } } } } // unnamed namespace - +// clang-format off // Properties registered without macro to use specific member variables. -const PropertyRegistration Control::Impl::PROPERTY_1( typeRegistration, "styleName", Toolkit::Control::Property::STYLE_NAME, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_4( typeRegistration, "keyInputFocus", Toolkit::Control::Property::KEY_INPUT_FOCUS, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_5( typeRegistration, "background", Toolkit::Control::Property::BACKGROUND, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_6( typeRegistration, "margin", Toolkit::Control::Property::MARGIN, Property::EXTENTS, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_7( typeRegistration, "padding", Toolkit::Control::Property::PADDING, Property::EXTENTS, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_8( typeRegistration, "tooltip", Toolkit::DevelControl::Property::TOOLTIP, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_9( typeRegistration, "state", Toolkit::DevelControl::Property::STATE, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_10( typeRegistration, "subState", Toolkit::DevelControl::Property::SUB_STATE, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_11( typeRegistration, "leftFocusableActorId", Toolkit::DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_12( typeRegistration, "rightFocusableActorId", Toolkit::DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID,Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_13( typeRegistration, "upFocusableActorId", Toolkit::DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_14( typeRegistration, "downFocusableActorId", Toolkit::DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_15( typeRegistration, "shadow", Toolkit::DevelControl::Property::SHADOW, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_16( typeRegistration, "accessibilityAttributes", Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_17( typeRegistration, "accessibilityName", Toolkit::DevelControl::Property::ACCESSIBILITY_NAME, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_18( typeRegistration, "accessibilityDescription", Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_19( typeRegistration, "accessibilityTranslationDomain", Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_20( typeRegistration, "accessibilityRole", Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_21( typeRegistration, "accessibilityHighlightable", Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); -const PropertyRegistration Control::Impl::PROPERTY_22( typeRegistration, "accessibilityAnimated", Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty ); - -Control::Impl::Impl( Control& controlImpl ) -: mControlImpl( controlImpl ), - mState( Toolkit::DevelControl::NORMAL ), +const PropertyRegistration Control::Impl::PROPERTY_1(typeRegistration, "styleName", Toolkit::Control::Property::STYLE_NAME, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_4(typeRegistration, "keyInputFocus", Toolkit::Control::Property::KEY_INPUT_FOCUS, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_5(typeRegistration, "background", Toolkit::Control::Property::BACKGROUND, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_6(typeRegistration, "margin", Toolkit::Control::Property::MARGIN, Property::EXTENTS, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_7(typeRegistration, "padding", Toolkit::Control::Property::PADDING, Property::EXTENTS, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_8(typeRegistration, "tooltip", Toolkit::DevelControl::Property::TOOLTIP, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_9(typeRegistration, "state", Toolkit::DevelControl::Property::STATE, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_10(typeRegistration, "subState", Toolkit::DevelControl::Property::SUB_STATE, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_11(typeRegistration, "leftFocusableActorId", Toolkit::DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_12(typeRegistration, "rightFocusableActorId", Toolkit::DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_13(typeRegistration, "upFocusableActorId", Toolkit::DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_14(typeRegistration, "downFocusableActorId", Toolkit::DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_15(typeRegistration, "shadow", Toolkit::DevelControl::Property::SHADOW, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_16(typeRegistration, "accessibilityAttributes", Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES, Property::MAP, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_17(typeRegistration, "accessibilityName", Toolkit::DevelControl::Property::ACCESSIBILITY_NAME, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_18(typeRegistration, "accessibilityDescription", Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_19(typeRegistration, "accessibilityTranslationDomain", Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN, Property::STRING, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_20(typeRegistration, "accessibilityRole", Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE, Property::INTEGER, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_21(typeRegistration, "accessibilityHighlightable", Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +const PropertyRegistration Control::Impl::PROPERTY_22(typeRegistration, "accessibilityAnimated", Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED, Property::BOOLEAN, &Control::Impl::SetProperty, &Control::Impl::GetProperty); +// clang-format on + +Control::Impl::Impl(Control& controlImpl) +: mControlImpl(controlImpl), + mState(Toolkit::DevelControl::NORMAL), mSubStateName(""), - mLeftFocusableActorId( -1 ), - mRightFocusableActorId( -1 ), - mUpFocusableActorId( -1 ), - mDownFocusableActorId( -1 ), + mLeftFocusableActorId(-1), + mRightFocusableActorId(-1), + mUpFocusableActorId(-1), + mDownFocusableActorId(-1), mStyleName(""), mBackgroundColor(Color::TRANSPARENT), mStartingPinchScale(nullptr), - mMargin( 0, 0, 0, 0 ), - mPadding( 0, 0, 0, 0 ), + mMargin(0, 0, 0, 0), + mPadding(0, 0, 0, 0), mKeyEventSignal(), mKeyInputFocusGainedSignal(), mKeyInputFocusLostSignal(), @@ -430,28 +448,28 @@ Control::Impl::Impl( Control& controlImpl ) mPanGestureDetector(), mTapGestureDetector(), mLongPressGestureDetector(), - mTooltip( NULL ), + mTooltip(NULL), mInputMethodContext(), mIdleCallback(nullptr), - mFlags( Control::ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), - mIsKeyboardNavigationSupported( false ), - mIsKeyboardFocusGroup( false ), + mFlags(Control::ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)), + mIsKeyboardNavigationSupported(false), + mIsKeyboardFocusGroup(false), mIsEmittingResourceReadySignal(false), mNeedToEmitResourceReady(false) { Dali::Accessibility::Accessible::RegisterControlAccessibilityGetter( - []( Dali::Actor actor ) -> Dali::Accessibility::Accessible* { - return Control::Impl::GetAccessibilityObject( actor ); - } ); + [](Dali::Actor actor) -> Dali::Accessibility::Accessible* { + return Control::Impl::GetAccessibilityObject(actor); + }); - accessibilityConstructor = []( Dali::Actor actor ) -> std::unique_ptr< Dali::Accessibility::Accessible > { - return std::unique_ptr< Dali::Accessibility::Accessible >( new AccessibleImpl( actor, - Dali::Accessibility::Role::UNKNOWN ) ); - }; + accessibilityConstructor = [](Dali::Actor actor) -> std::unique_ptr { + return std::unique_ptr(new DevelControl::AccessibleImpl(actor, + Dali::Accessibility::Role::UNKNOWN)); + }; size_t len = static_cast(Dali::Accessibility::RelationType::MAX_COUNT); mAccessibilityRelations.reserve(len); - for (auto i = 0u; i < len; ++i) + for(auto i = 0u; i < len; ++i) { mAccessibilityRelations.push_back({}); } @@ -459,7 +477,16 @@ Control::Impl::Impl( Control& controlImpl ) Control::Impl::~Impl() { - AccessibilityDeregister(); + for(auto&& iter : mVisuals) + { + StopObservingVisual(iter->visual); + } + + for(auto&& iter : mRemoveVisuals) + { + StopObservingVisual(iter->visual); + } + // All gesture detectors will be destroyed so no need to disconnect. delete mStartingPinchScale; @@ -470,12 +497,12 @@ Control::Impl::~Impl() } } -Control::Impl& Control::Impl::Get( Internal::Control& internalControl ) +Control::Impl& Control::Impl::Get(Internal::Control& internalControl) { return *internalControl.mImpl; } -const Control::Impl& Control::Impl::Get( const Internal::Control& internalControl ) +const Control::Impl& Control::Impl::Get(const Internal::Control& internalControl) { return *internalControl.mImpl; } @@ -501,86 +528,86 @@ void Control::Impl::LongPressDetected(Actor actor, const LongPressGesture& longP mControlImpl.OnLongPress(longPress); } -void Control::Impl::RegisterVisual( Property::Index index, Toolkit::Visual::Base& visual ) +void Control::Impl::RegisterVisual(Property::Index index, Toolkit::Visual::Base& visual) { - RegisterVisual( index, visual, VisualState::ENABLED, DepthIndexValue::NOT_SET ); + RegisterVisual(index, visual, VisualState::ENABLED, DepthIndexValue::NOT_SET); } -void Control::Impl::RegisterVisual( Property::Index index, Toolkit::Visual::Base& visual, int depthIndex ) +void Control::Impl::RegisterVisual(Property::Index index, Toolkit::Visual::Base& visual, int depthIndex) { - RegisterVisual( index, visual, VisualState::ENABLED, DepthIndexValue::SET, depthIndex ); + RegisterVisual(index, visual, VisualState::ENABLED, DepthIndexValue::SET, depthIndex); } -void Control::Impl::RegisterVisual( Property::Index index, Toolkit::Visual::Base& visual, bool enabled ) +void Control::Impl::RegisterVisual(Property::Index index, Toolkit::Visual::Base& visual, bool enabled) { - RegisterVisual( index, visual, ( enabled ? VisualState::ENABLED : VisualState::DISABLED ), DepthIndexValue::NOT_SET ); + RegisterVisual(index, visual, (enabled ? VisualState::ENABLED : VisualState::DISABLED), DepthIndexValue::NOT_SET); } -void Control::Impl::RegisterVisual( Property::Index index, Toolkit::Visual::Base& visual, bool enabled, int depthIndex ) +void Control::Impl::RegisterVisual(Property::Index index, Toolkit::Visual::Base& visual, bool enabled, int depthIndex) { - RegisterVisual( index, visual, ( enabled ? VisualState::ENABLED : VisualState::DISABLED ), DepthIndexValue::SET, depthIndex ); + RegisterVisual(index, visual, (enabled ? VisualState::ENABLED : VisualState::DISABLED), DepthIndexValue::SET, depthIndex); } -void Control::Impl::RegisterVisual( Property::Index index, Toolkit::Visual::Base& visual, VisualState::Type enabled, DepthIndexValue::Type depthIndexValueSet, int depthIndex ) +void Control::Impl::RegisterVisual(Property::Index index, Toolkit::Visual::Base& visual, VisualState::Type enabled, DepthIndexValue::Type depthIndexValueSet, int depthIndex) { - DALI_LOG_INFO( gLogFilter, Debug::Concise, "RegisterVisual:%d \n", index ); + DALI_LOG_INFO(gLogFilter, Debug::Concise, "RegisterVisual:%d \n", index); - bool visualReplaced ( false ); + bool visualReplaced(false); Actor self = mControlImpl.Self(); // Set the depth index, if not set by caller this will be either the current visual depth, max depth of all visuals // or zero. int requiredDepthIndex = visual.GetDepthIndex(); - if( depthIndexValueSet == DepthIndexValue::SET ) + if(depthIndexValueSet == DepthIndexValue::SET) { requiredDepthIndex = depthIndex; } // Visual replacement, existing visual should only be removed from stage when replacement ready. - if( !mVisuals.Empty() ) + if(!mVisuals.Empty()) { RegisteredVisualContainer::Iterator registeredVisualsiter; // Check if visual (index) is already registered, this is the current visual. - if( FindVisual( index, mVisuals, registeredVisualsiter ) ) + if(FindVisual(index, mVisuals, registeredVisualsiter)) { Toolkit::Visual::Base& currentRegisteredVisual = (*registeredVisualsiter)->visual; - if( currentRegisteredVisual ) + if(currentRegisteredVisual) { // Store current visual depth index as may need to set the replacement visual to same depth const int currentDepthIndex = (*registeredVisualsiter)->visual.GetDepthIndex(); // No longer required to know if the replaced visual's resources are ready - StopObservingVisual( currentRegisteredVisual ); + StopObservingVisual(currentRegisteredVisual); // If control staged and visual enabled then visuals will be swapped once ready - if( self.GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) && enabled ) + if(self.GetProperty(Actor::Property::CONNECTED_TO_SCENE) && enabled) { // Check if visual is currently in the process of being replaced ( is in removal container ) RegisteredVisualContainer::Iterator visualQueuedForRemoval; - if ( FindVisual( index, mRemoveVisuals, visualQueuedForRemoval ) ) + if(FindVisual(index, mRemoveVisuals, visualQueuedForRemoval)) { // Visual with same index is already in removal container so current visual pending // Only the the last requested visual will be displayed so remove current visual which is staged but not ready. - Toolkit::GetImplementation( currentRegisteredVisual ).SetOffScene( self ); - mVisuals.Erase( registeredVisualsiter ); + Toolkit::GetImplementation(currentRegisteredVisual).SetOffScene(self); + mVisuals.Erase(registeredVisualsiter); } else { // current visual not already in removal container so add now. - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "RegisterVisual Move current registered visual to removal Queue: %d \n", index ); - MoveVisual( registeredVisualsiter, mVisuals, mRemoveVisuals ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "RegisterVisual Move current registered visual to removal Queue: %d \n", index); + MoveVisual(registeredVisualsiter, mVisuals, mRemoveVisuals); } } else { // Control not staged or visual disabled so can just erase from registered visuals and new visual will be added later. - mVisuals.Erase( registeredVisualsiter ); + mVisuals.Erase(registeredVisualsiter); } // If we've not set the depth-index value and the new visual does not have a depth index applied to it, then use the previously set depth-index for this index - if( ( depthIndexValueSet == DepthIndexValue::NOT_SET ) && - ( visual.GetDepthIndex() == 0 ) ) + if((depthIndexValueSet == DepthIndexValue::NOT_SET) && + (visual.GetDepthIndex() == 0)) { requiredDepthIndex = currentDepthIndex; } @@ -592,100 +619,96 @@ void Control::Impl::RegisterVisual( Property::Index index, Toolkit::Visual::Base // If not set, set the name of the visual to the same name as the control's property. // ( If the control has been type registered ) - if( visual.GetName().empty() ) + if(visual.GetName().empty()) { // returns empty string if index is not found as long as index is not -1 - std::string visualName = self.GetPropertyName( index ); - if( !visualName.empty() ) + std::string visualName = self.GetPropertyName(index); + if(!visualName.empty()) { - DALI_LOG_INFO( gLogFilter, Debug::Concise, "Setting visual name for property %d to %s\n", - index, visualName.c_str() ); - visual.SetName( visualName ); + DALI_LOG_INFO(gLogFilter, Debug::Concise, "Setting visual name for property %d to %s\n", index, visualName.c_str()); + visual.SetName(visualName); } } - if( !visualReplaced ) // New registration entry + if(!visualReplaced) // New registration entry { // If we've not set the depth-index value, we have more than one visual and the visual does not have a depth index, then set it to be the highest - if( ( depthIndexValueSet == DepthIndexValue::NOT_SET ) && - ( mVisuals.Size() > 0 ) && - ( visual.GetDepthIndex() == 0 ) ) + if((depthIndexValueSet == DepthIndexValue::NOT_SET) && + (mVisuals.Size() > 0) && + (visual.GetDepthIndex() == 0)) { - int maxDepthIndex = std::numeric_limits< int >::min(); + int maxDepthIndex = std::numeric_limits::min(); - RegisteredVisualContainer::ConstIterator iter; + RegisteredVisualContainer::ConstIterator iter; const RegisteredVisualContainer::ConstIterator endIter = mVisuals.End(); - for ( iter = mVisuals.Begin(); iter != endIter; iter++ ) + for(iter = mVisuals.Begin(); iter != endIter; iter++) { const int visualDepthIndex = (*iter)->visual.GetDepthIndex(); - if ( visualDepthIndex > maxDepthIndex ) + if(visualDepthIndex > maxDepthIndex) { maxDepthIndex = visualDepthIndex; } } - ++maxDepthIndex; // Add one to the current maximum depth index so that our added visual appears on top - requiredDepthIndex = std::max( 0, maxDepthIndex ); // Start at zero if maxDepth index belongs to a background + ++maxDepthIndex; // Add one to the current maximum depth index so that our added visual appears on top + requiredDepthIndex = std::max(0, maxDepthIndex); // Start at zero if maxDepth index belongs to a background } } - if( visual ) + if(visual) { // Set determined depth index - visual.SetDepthIndex( requiredDepthIndex ); + visual.SetDepthIndex(requiredDepthIndex); // Monitor when the visual resources are ready - StartObservingVisual( visual ); + StartObservingVisual(visual); - DALI_LOG_INFO( gLogFilter, Debug::Concise, "New Visual registration index[%d] depth[%d]\n", index, requiredDepthIndex ); - RegisteredVisual* newRegisteredVisual = new RegisteredVisual( index, visual, - ( enabled == VisualState::ENABLED ? true : false ), - ( visualReplaced && enabled ) ) ; - mVisuals.PushBack( newRegisteredVisual ); + DALI_LOG_INFO(gLogFilter, Debug::Concise, "New Visual registration index[%d] depth[%d]\n", index, requiredDepthIndex); + RegisteredVisual* newRegisteredVisual = new RegisteredVisual(index, visual, (enabled == VisualState::ENABLED ? true : false), (visualReplaced && enabled)); + mVisuals.PushBack(newRegisteredVisual); - Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual ); + Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); // Put on stage if enabled and the control is already on the stage - if( ( enabled == VisualState::ENABLED ) && self.GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) + if((enabled == VisualState::ENABLED) && self.GetProperty(Actor::Property::CONNECTED_TO_SCENE)) { - visualImpl.SetOnScene( self ); + visualImpl.SetOnScene(self); } - else if( visualImpl.IsResourceReady() ) // When not being staged, check if visual already 'ResourceReady' before it was Registered. ( Resource may have been loaded already ) + else if(visualImpl.IsResourceReady()) // When not being staged, check if visual already 'ResourceReady' before it was Registered. ( Resource may have been loaded already ) { - ResourceReady( visualImpl ); + ResourceReady(visualImpl); } - } - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::RegisterVisual() Registered %s(%d), enabled:%s\n", visual.GetName().c_str(), index, enabled?"true":"false" ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::RegisterVisual() Registered %s(%d), enabled:%s\n", visual.GetName().c_str(), index, enabled ? "true" : "false"); } -void Control::Impl::UnregisterVisual( Property::Index index ) +void Control::Impl::UnregisterVisual(Property::Index index) { RegisteredVisualContainer::Iterator iter; - if ( FindVisual( index, mVisuals, iter ) ) + if(FindVisual(index, mVisuals, iter)) { // stop observing visual - StopObservingVisual( (*iter)->visual ); + StopObservingVisual((*iter)->visual); - Actor self( mControlImpl.Self() ); - Toolkit::GetImplementation((*iter)->visual).SetOffScene( self ); + Actor self(mControlImpl.Self()); + Toolkit::GetImplementation((*iter)->visual).SetOffScene(self); (*iter)->visual.Reset(); - mVisuals.Erase( iter ); + mVisuals.Erase(iter); } - if( FindVisual( index, mRemoveVisuals, iter ) ) + if(FindVisual(index, mRemoveVisuals, iter)) { - Actor self( mControlImpl.Self() ); - Toolkit::GetImplementation( (*iter)->visual ).SetOffScene( self ); + Actor self(mControlImpl.Self()); + Toolkit::GetImplementation((*iter)->visual).SetOffScene(self); (*iter)->pending = false; (*iter)->visual.Reset(); - mRemoveVisuals.Erase( iter ); + mRemoveVisuals.Erase(iter); } } -Toolkit::Visual::Base Control::Impl::GetVisual( Property::Index index ) const +Toolkit::Visual::Base Control::Impl::GetVisual(Property::Index index) const { RegisteredVisualContainer::Iterator iter; - if ( FindVisual( index, mVisuals, iter ) ) + if(FindVisual(index, mVisuals, iter)) { return (*iter)->visual; } @@ -693,104 +716,104 @@ Toolkit::Visual::Base Control::Impl::GetVisual( Property::Index index ) const return Toolkit::Visual::Base(); } -void Control::Impl::EnableVisual( Property::Index index, bool enable ) +void Control::Impl::EnableVisual(Property::Index index, bool enable) { - DALI_LOG_INFO( gLogFilter, Debug::General, "Control::EnableVisual(%d, %s)\n", index, enable?"T":"F"); + DALI_LOG_INFO(gLogFilter, Debug::General, "Control::EnableVisual(%d, %s)\n", index, enable ? "T" : "F"); RegisteredVisualContainer::Iterator iter; - if ( FindVisual( index, mVisuals, iter ) ) + if(FindVisual(index, mVisuals, iter)) { - if ( (*iter)->enabled == enable ) + if((*iter)->enabled == enable) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::EnableVisual Visual %s(%d) already %s\n", (*iter)->visual.GetName().c_str(), index, enable?"enabled":"disabled"); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::EnableVisual Visual %s(%d) already %s\n", (*iter)->visual.GetName().c_str(), index, enable ? "enabled" : "disabled"); return; } - (*iter)->enabled = enable; + (*iter)->enabled = enable; Actor parentActor = mControlImpl.Self(); - if ( mControlImpl.Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) // If control not on Scene then Visual will be added when SceneConnection is called. + if(mControlImpl.Self().GetProperty(Actor::Property::CONNECTED_TO_SCENE)) // If control not on Scene then Visual will be added when SceneConnection is called. { - if ( enable ) + if(enable) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::EnableVisual Setting %s(%d) on stage \n", (*iter)->visual.GetName().c_str(), index ); - Toolkit::GetImplementation((*iter)->visual).SetOnScene( parentActor ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::EnableVisual Setting %s(%d) on stage \n", (*iter)->visual.GetName().c_str(), index); + Toolkit::GetImplementation((*iter)->visual).SetOnScene(parentActor); } else { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::EnableVisual Setting %s(%d) off stage \n", (*iter)->visual.GetName().c_str(), index ); - Toolkit::GetImplementation((*iter)->visual).SetOffScene( parentActor ); // No need to call if control not staged. + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::EnableVisual Setting %s(%d) off stage \n", (*iter)->visual.GetName().c_str(), index); + Toolkit::GetImplementation((*iter)->visual).SetOffScene(parentActor); // No need to call if control not staged. } } } else { - DALI_LOG_WARNING( "Control::EnableVisual(%d, %s) FAILED - NO SUCH VISUAL\n", index, enable?"T":"F" ); + DALI_LOG_WARNING("Control::EnableVisual(%d, %s) FAILED - NO SUCH VISUAL\n", index, enable ? "T" : "F"); } } -bool Control::Impl::IsVisualEnabled( Property::Index index ) const +bool Control::Impl::IsVisualEnabled(Property::Index index) const { RegisteredVisualContainer::Iterator iter; - if ( FindVisual( index, mVisuals, iter ) ) + if(FindVisual(index, mVisuals, iter)) { return (*iter)->enabled; } return false; } -void Control::Impl::StopObservingVisual( Toolkit::Visual::Base& visual ) +void Control::Impl::StopObservingVisual(Toolkit::Visual::Base& visual) { - Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual ); + Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); // Stop observing the visual - visualImpl.RemoveEventObserver( *this ); + visualImpl.RemoveEventObserver(*this); } -void Control::Impl::StartObservingVisual( Toolkit::Visual::Base& visual) +void Control::Impl::StartObservingVisual(Toolkit::Visual::Base& visual) { - Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual ); + Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); // start observing the visual for events - visualImpl.AddEventObserver( *this ); + visualImpl.AddEventObserver(*this); } // Called by a Visual when it's resource is ready -void Control::Impl::ResourceReady( Visual::Base& object) +void Control::Impl::ResourceReady(Visual::Base& object) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::Impl::ResourceReady() replacements pending[%d]\n", mRemoveVisuals.Count() ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::Impl::ResourceReady() replacements pending[%d]\n", mRemoveVisuals.Count()); Actor self = mControlImpl.Self(); // A resource is ready, find resource in the registered visuals container and get its index - for( auto registeredIter = mVisuals.Begin(), end = mVisuals.End(); registeredIter != end; ++registeredIter ) + for(auto registeredIter = mVisuals.Begin(), end = mVisuals.End(); registeredIter != end; ++registeredIter) { - Internal::Visual::Base& registeredVisualImpl = Toolkit::GetImplementation( (*registeredIter)->visual ); + Internal::Visual::Base& registeredVisualImpl = Toolkit::GetImplementation((*registeredIter)->visual); - if( &object == ®isteredVisualImpl ) + if(&object == ®isteredVisualImpl) { RegisteredVisualContainer::Iterator visualToRemoveIter; // Find visual with the same index in the removal container // Set if off stage as it's replacement is now ready. // Remove if from removal list as now removed from stage. // Set Pending flag on the ready visual to false as now ready. - if( FindVisual( (*registeredIter)->index, mRemoveVisuals, visualToRemoveIter ) ) + if(FindVisual((*registeredIter)->index, mRemoveVisuals, visualToRemoveIter)) { (*registeredIter)->pending = false; - Toolkit::GetImplementation( (*visualToRemoveIter)->visual ).SetOffScene( self ); - mRemoveVisuals.Erase( visualToRemoveIter ); + Toolkit::GetImplementation((*visualToRemoveIter)->visual).SetOffScene(self); + mRemoveVisuals.Erase(visualToRemoveIter); } break; } } // A visual is ready so control may need relayouting if staged - if ( self.GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) + if(self.GetProperty(Actor::Property::CONNECTED_TO_SCENE)) { mControlImpl.RelayoutRequest(); } // Emit signal if all enabled visuals registered by the control are ready. - if( IsResourceReady() ) + if(IsResourceReady()) { // Reset the flag mNeedToEmitResourceReady = false; @@ -799,15 +822,15 @@ void Control::Impl::ResourceReady( Visual::Base& object) } } -void Control::Impl::NotifyVisualEvent( Visual::Base& object, Property::Index signalId ) +void Control::Impl::NotifyVisualEvent(Visual::Base& object, Property::Index signalId) { - for( auto registeredIter = mVisuals.Begin(), end = mVisuals.End(); registeredIter != end; ++registeredIter ) + for(auto registeredIter = mVisuals.Begin(), end = mVisuals.End(); registeredIter != end; ++registeredIter) { - Internal::Visual::Base& registeredVisualImpl = Toolkit::GetImplementation( (*registeredIter)->visual ); - if( &object == ®isteredVisualImpl ) + Internal::Visual::Base& registeredVisualImpl = Toolkit::GetImplementation((*registeredIter)->visual); + if(&object == ®isteredVisualImpl) { - Dali::Toolkit::Control handle( mControlImpl.GetOwner() ); - mVisualEventSignal.Emit( handle, (*registeredIter)->index, signalId ); + Dali::Toolkit::Control handle(mControlImpl.GetOwner()); + mVisualEventSignal.Emit(handle, (*registeredIter)->index, signalId); break; } } @@ -816,14 +839,15 @@ void Control::Impl::NotifyVisualEvent( Visual::Base& object, Property::Index sig bool Control::Impl::IsResourceReady() const { // Iterate through and check all the enabled visuals are ready - for( auto visualIter = mVisuals.Begin(); - visualIter != mVisuals.End(); ++visualIter ) + for(auto visualIter = mVisuals.Begin(); + visualIter != mVisuals.End(); + ++visualIter) { - const Toolkit::Visual::Base visual = (*visualIter)->visual; - const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual ); + const Toolkit::Visual::Base visual = (*visualIter)->visual; + const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); // one of the enabled visuals is not ready - if( !visualImpl.IsResourceReady() && (*visualIter)->enabled ) + if(!visualImpl.IsResourceReady() && (*visualIter)->enabled) { return false; } @@ -831,85 +855,83 @@ bool Control::Impl::IsResourceReady() const return true; } -Toolkit::Visual::ResourceStatus Control::Impl::GetVisualResourceStatus( Property::Index index ) const +Toolkit::Visual::ResourceStatus Control::Impl::GetVisualResourceStatus(Property::Index index) const { RegisteredVisualContainer::Iterator iter; - if ( FindVisual( index, mVisuals, iter ) ) + if(FindVisual(index, mVisuals, iter)) { - const Toolkit::Visual::Base visual = (*iter)->visual; - const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual ); - return visualImpl.GetResourceStatus( ); + const Toolkit::Visual::Base visual = (*iter)->visual; + const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); + return visualImpl.GetResourceStatus(); } return Toolkit::Visual::ResourceStatus::PREPARING; } - - -void Control::Impl::AddTransitions( Dali::Animation& animation, - const Toolkit::TransitionData& handle, - bool createAnimation ) +void Control::Impl::AddTransitions(Dali::Animation& animation, + const Toolkit::TransitionData& handle, + bool createAnimation) { // Setup a Transition from TransitionData. - const Internal::TransitionData& transitionData = Toolkit::GetImplementation( handle ); - TransitionData::Iterator end = transitionData.End(); - for( TransitionData::Iterator iter = transitionData.Begin() ; - iter != end; ++iter ) + const Internal::TransitionData& transitionData = Toolkit::GetImplementation(handle); + TransitionData::Iterator end = transitionData.End(); + for(TransitionData::Iterator iter = transitionData.Begin(); + iter != end; + ++iter) { TransitionData::Animator* animator = (*iter); - Toolkit::Visual::Base visual = GetVisualByName( mVisuals, animator->objectName ); + Toolkit::Visual::Base visual = GetVisualByName(mVisuals, animator->objectName); - if( visual ) + if(visual) { #if defined(DEBUG_ENABLED) - Dali::TypeInfo typeInfo; + Dali::TypeInfo typeInfo; ControlWrapper* controlWrapperImpl = dynamic_cast(&mControlImpl); - if( controlWrapperImpl ) + if(controlWrapperImpl) { typeInfo = controlWrapperImpl->GetTypeInfo(); } - DALI_LOG_INFO( gLogFilter, Debug::Concise, "CreateTransition: Found %s visual for %s\n", - visual.GetName().c_str(), typeInfo?typeInfo.GetName().c_str():"Unknown" ); + DALI_LOG_INFO(gLogFilter, Debug::Concise, "CreateTransition: Found %s visual for %s\n", visual.GetName().c_str(), typeInfo ? typeInfo.GetName().c_str() : "Unknown"); #endif - Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual ); - visualImpl.AnimateProperty( animation, *animator ); + Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); + visualImpl.AnimateProperty(animation, *animator); } else { - DALI_LOG_INFO( gLogFilter, Debug::Concise, "CreateTransition: Could not find visual. Trying actors"); + DALI_LOG_INFO(gLogFilter, Debug::Concise, "CreateTransition: Could not find visual. Trying actors"); // Otherwise, try any actor children of control (Including the control) - Actor child = mControlImpl.Self().FindChildByName( animator->objectName ); - if( child ) + Actor child = mControlImpl.Self().FindChildByName(animator->objectName); + if(child) { - Property::Index propertyIndex = child.GetPropertyIndex( animator->propertyKey ); - if( propertyIndex != Property::INVALID_INDEX ) + Property::Index propertyIndex = child.GetPropertyIndex(animator->propertyKey); + if(propertyIndex != Property::INVALID_INDEX) { - if( animator->animate == false ) + if(animator->animate == false) { - if( animator->targetValue.GetType() != Property::NONE ) + if(animator->targetValue.GetType() != Property::NONE) { - child.SetProperty( propertyIndex, animator->targetValue ); + child.SetProperty(propertyIndex, animator->targetValue); } } else // animate the property { - if( animator->initialValue.GetType() != Property::NONE ) + if(animator->initialValue.GetType() != Property::NONE) { - child.SetProperty( propertyIndex, animator->initialValue ); + child.SetProperty(propertyIndex, animator->initialValue); } - if( createAnimation && !animation ) + if(createAnimation && !animation) { - animation = Dali::Animation::New( 0.1f ); + animation = Dali::Animation::New(0.1f); } - animation.AnimateTo( Property( child, propertyIndex ), - animator->targetValue, - animator->alphaFunction, - TimePeriod( animator->timePeriodDelay, - animator->timePeriodDuration ) ); + animation.AnimateTo(Property(child, propertyIndex), + animator->targetValue, + animator->alphaFunction, + TimePeriod(animator->timePeriodDelay, + animator->timePeriodDuration)); } } } @@ -917,67 +939,65 @@ void Control::Impl::AddTransitions( Dali::Animation& animation, } } -Dali::Animation Control::Impl::CreateTransition( const Toolkit::TransitionData& transitionData ) +Dali::Animation Control::Impl::CreateTransition(const Toolkit::TransitionData& transitionData) { Dali::Animation transition; - if( transitionData.Count() > 0 ) + if(transitionData.Count() > 0) { - AddTransitions( transition, transitionData, true ); + AddTransitions(transition, transitionData, true); } return transition; } - - -void Control::Impl::DoAction( Dali::Property::Index visualIndex, Dali::Property::Index actionId, const Dali::Property::Value attributes ) +void Control::Impl::DoAction(Dali::Property::Index visualIndex, Dali::Property::Index actionId, const Dali::Property::Value attributes) { RegisteredVisualContainer::Iterator iter; - if ( FindVisual( visualIndex, mVisuals, iter ) ) + if(FindVisual(visualIndex, mVisuals, iter)) { - Toolkit::GetImplementation((*iter)->visual).DoAction( actionId, attributes ); + Toolkit::GetImplementation((*iter)->visual).DoAction(actionId, attributes); } } -void Control::Impl::AppendAccessibilityAttribute( const std::string& key, - const std::string value ) +void Control::Impl::AppendAccessibilityAttribute(const std::string& key, + const std::string value) { - Property::Value* val = mAccessibilityAttributes.Find( key ); - if( val ) + Property::Value* val = mAccessibilityAttributes.Find(key); + if(val) { - mAccessibilityAttributes[key] = Property::Value( value ); + mAccessibilityAttributes[key] = Property::Value(value); } else { - mAccessibilityAttributes.Insert( key, value ); + mAccessibilityAttributes.Insert(key, value); } } -void Control::Impl::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value ) +void Control::Impl::SetProperty(BaseObject* object, Property::Index index, const Property::Value& value) { - Toolkit::Control control = Toolkit::Control::DownCast( BaseHandle( object ) ); + Toolkit::Control control = Toolkit::Control::DownCast(BaseHandle(object)); - if ( control ) + if(control) { - Control& controlImpl( GetImplementation( control ) ); + Control& controlImpl(GetImplementation(control)); - switch ( index ) + switch(index) { case Toolkit::Control::Property::STYLE_NAME: { - controlImpl.SetStyleName( value.Get< std::string >() ); + controlImpl.SetStyleName(value.Get()); break; } case Toolkit::DevelControl::Property::STATE: { - bool withTransitions=true; - const Property::Value* valuePtr=&value; - const Property::Map* map = value.GetMap(); + bool withTransitions = true; + const Property::Value* valuePtr = &value; + const Property::Map* map = value.GetMap(); if(map) { Property::Value* value2 = map->Find("withTransitions"); - if( value2 ) + if(value2) { withTransitions = value2->Get(); } @@ -985,12 +1005,12 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons valuePtr = map->Find("state"); } - if( valuePtr ) + if(valuePtr) { - Toolkit::DevelControl::State state( controlImpl.mImpl->mState ); - if( Scripting::GetEnumerationProperty< Toolkit::DevelControl::State >( *valuePtr, ControlStateTable, ControlStateTableCount, state ) ) + Toolkit::DevelControl::State state(controlImpl.mImpl->mState); + if(Scripting::GetEnumerationProperty(*valuePtr, ControlStateTable, ControlStateTableCount, state)) { - controlImpl.mImpl->SetState( state, withTransitions ); + controlImpl.mImpl->SetState(state, withTransitions); } } } @@ -999,9 +1019,9 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::SUB_STATE: { std::string subState; - if( value.Get( subState ) ) + if(value.Get(subState)) { - controlImpl.mImpl->SetSubState( subState ); + controlImpl.mImpl->SetSubState(subState); } } break; @@ -1009,7 +1029,7 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID: { int focusId; - if( value.Get( focusId ) ) + if(value.Get(focusId)) { controlImpl.mImpl->mLeftFocusableActorId = focusId; } @@ -1019,7 +1039,7 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID: { int focusId; - if( value.Get( focusId ) ) + if(value.Get(focusId)) { controlImpl.mImpl->mRightFocusableActorId = focusId; } @@ -1029,9 +1049,9 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME: { std::string name; - if( value.Get( name ) ) + if(value.Get(name)) { - controlImpl.mImpl->mAccessibilityName = name; + controlImpl.mImpl->mAccessibilityName = name; controlImpl.mImpl->mAccessibilityNameSet = true; } else @@ -1044,9 +1064,9 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION: { std::string txt; - if( value.Get( txt ) ) + if(value.Get(txt)) { - controlImpl.mImpl->mAccessibilityDescription = txt; + controlImpl.mImpl->mAccessibilityDescription = txt; controlImpl.mImpl->mAccessibilityDescriptionSet = true; } else @@ -1059,9 +1079,9 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN: { std::string txt; - if( value.Get( txt ) ) + if(value.Get(txt)) { - controlImpl.mImpl->mAccessibilityTranslationDomain = txt; + controlImpl.mImpl->mAccessibilityTranslationDomain = txt; controlImpl.mImpl->mAccessibilityTranslationDomainSet = true; } else @@ -1074,9 +1094,9 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE: { bool highlightable; - if( value.Get( highlightable ) ) + if(value.Get(highlightable)) { - controlImpl.mImpl->mAccessibilityHighlightable = highlightable; + controlImpl.mImpl->mAccessibilityHighlightable = highlightable; controlImpl.mImpl->mAccessibilityHighlightableSet = true; } else @@ -1089,7 +1109,7 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE: { Dali::Accessibility::Role val; - if( value.Get( val ) ) + if(value.Get(val)) { controlImpl.mImpl->mAccessibilityRole = val; } @@ -1099,7 +1119,7 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::UP_FOCUSABLE_ACTOR_ID: { int focusId; - if( value.Get( focusId ) ) + if(value.Get(focusId)) { controlImpl.mImpl->mUpFocusableActorId = focusId; } @@ -1109,7 +1129,7 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID: { int focusId; - if( value.Get( focusId ) ) + if(value.Get(focusId)) { controlImpl.mImpl->mDownFocusableActorId = focusId; } @@ -1118,7 +1138,7 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::Control::Property::KEY_INPUT_FOCUS: { - if ( value.Get< bool >() ) + if(value.Get()) { controlImpl.SetKeyInputFocus(); } @@ -1131,23 +1151,23 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::Control::Property::BACKGROUND: { - std::string url; - Vector4 color; + std::string url; + Vector4 color; const Property::Map* map = value.GetMap(); - if( map && !map->Empty() ) + if(map && !map->Empty()) { - controlImpl.SetBackground( *map ); + controlImpl.SetBackground(*map); } - else if( value.Get( url ) ) + else if(value.Get(url)) { // don't know the size to load - Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( url, ImageDimensions() ); - if( visual ) + Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual(url, ImageDimensions()); + if(visual) { - controlImpl.mImpl->RegisterVisual( Toolkit::Control::Property::BACKGROUND, visual, DepthIndex::BACKGROUND ); + controlImpl.mImpl->RegisterVisual(Toolkit::Control::Property::BACKGROUND, visual, DepthIndex::BACKGROUND); } } - else if( value.Get( color ) ) + else if(value.Get(color)) { controlImpl.SetBackgroundColor(color); } @@ -1162,9 +1182,9 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::Control::Property::MARGIN: { Extents margin; - if( value.Get( margin ) ) + if(value.Get(margin)) { - controlImpl.mImpl->SetMargin( margin ); + controlImpl.mImpl->SetMargin(margin); } break; } @@ -1172,9 +1192,9 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::Control::Property::PADDING: { Extents padding; - if( value.Get( padding ) ) + if(value.Get(padding)) { - controlImpl.mImpl->SetPadding( padding ); + controlImpl.mImpl->SetPadding(padding); } break; } @@ -1182,20 +1202,20 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::TOOLTIP: { TooltipPtr& tooltipPtr = controlImpl.mImpl->mTooltip; - if( ! tooltipPtr ) + if(!tooltipPtr) { - tooltipPtr = Tooltip::New( control ); + tooltipPtr = Tooltip::New(control); } - tooltipPtr->SetProperties( value ); + tooltipPtr->SetProperties(value); break; } case Toolkit::DevelControl::Property::SHADOW: { const Property::Map* map = value.GetMap(); - if( map && !map->Empty() ) + if(map && !map->Empty()) { - controlImpl.mImpl->SetShadow( *map ); + controlImpl.mImpl->SetShadow(*map); } else { @@ -1207,30 +1227,38 @@ void Control::Impl::SetProperty( BaseObject* object, Property::Index index, cons case Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES: { - value.Get( controlImpl.mImpl->mAccessibilityAttributes ); + const Property::Map* map = value.GetMap(); + if(map && !map->Empty()) + { + controlImpl.mImpl->mAccessibilityAttributes = *map; + } break; } case Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED: { - value.Get( controlImpl.mImpl->mAccessibilityAnimated ); + bool animated; + if(value.Get(animated)) + { + controlImpl.mImpl->mAccessibilityAnimated = animated; + } break; } } } } -Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index index ) +Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index index) { Property::Value value; - Toolkit::Control control = Toolkit::Control::DownCast( BaseHandle( object ) ); + Toolkit::Control control = Toolkit::Control::DownCast(BaseHandle(object)); - if ( control ) + if(control) { - Control& controlImpl( GetImplementation( control ) ); + Control& controlImpl(GetImplementation(control)); - switch ( index ) + switch(index) { case Toolkit::Control::Property::STYLE_NAME: { @@ -1264,7 +1292,7 @@ Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index case Toolkit::DevelControl::Property::ACCESSIBILITY_NAME: { - if (controlImpl.mImpl->mAccessibilityNameSet) + if(controlImpl.mImpl->mAccessibilityNameSet) { value = controlImpl.mImpl->mAccessibilityName; } @@ -1273,7 +1301,7 @@ Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index case Toolkit::DevelControl::Property::ACCESSIBILITY_DESCRIPTION: { - if (controlImpl.mImpl->mAccessibilityDescriptionSet) + if(controlImpl.mImpl->mAccessibilityDescriptionSet) { value = controlImpl.mImpl->mAccessibilityDescription; } @@ -1282,7 +1310,7 @@ Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index case Toolkit::DevelControl::Property::ACCESSIBILITY_TRANSLATION_DOMAIN: { - if (controlImpl.mImpl->mAccessibilityTranslationDomainSet) + if(controlImpl.mImpl->mAccessibilityTranslationDomainSet) { value = controlImpl.mImpl->mAccessibilityTranslationDomain; } @@ -1291,7 +1319,7 @@ Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index case Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE: { - if (controlImpl.mImpl->mAccessibilityHighlightableSet) + if(controlImpl.mImpl->mAccessibilityHighlightableSet) { value = controlImpl.mImpl->mAccessibilityHighlightable; } @@ -1324,11 +1352,11 @@ Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index case Toolkit::Control::Property::BACKGROUND: { - Property::Map map; - Toolkit::Visual::Base visual = controlImpl.mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); - if( visual ) + Property::Map map; + Toolkit::Visual::Base visual = controlImpl.mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND); + if(visual) { - visual.CreatePropertyMap( map ); + visual.CreatePropertyMap(map); } value = map; @@ -1350,9 +1378,9 @@ Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index case Toolkit::DevelControl::Property::TOOLTIP: { Property::Map map; - if( controlImpl.mImpl->mTooltip ) + if(controlImpl.mImpl->mTooltip) { - controlImpl.mImpl->mTooltip->CreatePropertyMap( map ); + controlImpl.mImpl->mTooltip->CreatePropertyMap(map); } value = map; break; @@ -1360,11 +1388,11 @@ Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index case Toolkit::DevelControl::Property::SHADOW: { - Property::Map map; - Toolkit::Visual::Base visual = controlImpl.mImpl->GetVisual( Toolkit::DevelControl::Property::SHADOW ); - if( visual ) + Property::Map map; + Toolkit::Visual::Base visual = controlImpl.mImpl->GetVisual(Toolkit::DevelControl::Property::SHADOW); + if(visual) { - visual.CreatePropertyMap( map ); + visual.CreatePropertyMap(map); } value = map; @@ -1388,10 +1416,10 @@ Property::Value Control::Impl::GetProperty( BaseObject* object, Property::Index return value; } -void Control::Impl::RemoveAccessibilityAttribute( const std::string& key ) +void Control::Impl::RemoveAccessibilityAttribute(const std::string& key) { - Property::Value* val = mAccessibilityAttributes.Find( key ); - if( val ) + Property::Value* val = mAccessibilityAttributes.Find(key); + if(val) mAccessibilityAttributes[key] = Property::Value(); } @@ -1400,249 +1428,244 @@ void Control::Impl::ClearAccessibilityAttributes() mAccessibilityAttributes.Clear(); } -void Control::Impl::SetAccessibilityReadingInfoType( const Dali::Accessibility::ReadingInfoTypes types ) +void Control::Impl::SetAccessibilityReadingInfoType(const Dali::Accessibility::ReadingInfoTypes types) { std::string value; - if ( types[ Dali::Accessibility::ReadingInfoType::NAME ] ) + if(types[Dali::Accessibility::ReadingInfoType::NAME]) { value += READING_INFO_TYPE_NAME; } - if ( types[ Dali::Accessibility::ReadingInfoType::ROLE ] ) + if(types[Dali::Accessibility::ReadingInfoType::ROLE]) { - if( !value.empty() ) + if(!value.empty()) { value += READING_INFO_TYPE_SEPARATOR; } value += READING_INFO_TYPE_ROLE; } - if ( types[ Dali::Accessibility::ReadingInfoType::DESCRIPTION ] ) + if(types[Dali::Accessibility::ReadingInfoType::DESCRIPTION]) { - if( !value.empty() ) + if(!value.empty()) { value += READING_INFO_TYPE_SEPARATOR; } value += READING_INFO_TYPE_DESCRIPTION; } - if ( types[ Dali::Accessibility::ReadingInfoType::STATE ] ) + if(types[Dali::Accessibility::ReadingInfoType::STATE]) { - if( !value.empty() ) + if(!value.empty()) { value += READING_INFO_TYPE_SEPARATOR; } value += READING_INFO_TYPE_STATE; } - AppendAccessibilityAttribute( READING_INFO_TYPE_ATTRIBUTE_NAME, value ); + AppendAccessibilityAttribute(READING_INFO_TYPE_ATTRIBUTE_NAME, value); } Dali::Accessibility::ReadingInfoTypes Control::Impl::GetAccessibilityReadingInfoType() const { std::string value; - auto place = mAccessibilityAttributes.Find( READING_INFO_TYPE_ATTRIBUTE_NAME ); - if( place ) + auto place = mAccessibilityAttributes.Find(READING_INFO_TYPE_ATTRIBUTE_NAME); + if(place) { - place->Get( value ); + place->Get(value); + } + else + { + Dali::Accessibility::ReadingInfoTypes types; + types[Dali::Accessibility::ReadingInfoType::NAME] = true; + types[Dali::Accessibility::ReadingInfoType::ROLE] = true; + types[Dali::Accessibility::ReadingInfoType::DESCRIPTION] = true; + types[Dali::Accessibility::ReadingInfoType::STATE] = true; + return types; } - if ( value.empty() ) + if(value.empty()) { return {}; } Dali::Accessibility::ReadingInfoTypes types; - if ( value.find( READING_INFO_TYPE_NAME ) != std::string::npos ) + if(value.find(READING_INFO_TYPE_NAME) != std::string::npos) { - types[ Dali::Accessibility::ReadingInfoType::NAME ] = true; + types[Dali::Accessibility::ReadingInfoType::NAME] = true; } - if ( value.find( READING_INFO_TYPE_ROLE ) != std::string::npos ) + if(value.find(READING_INFO_TYPE_ROLE) != std::string::npos) { - types[ Dali::Accessibility::ReadingInfoType::ROLE ] = true; + types[Dali::Accessibility::ReadingInfoType::ROLE] = true; } - if ( value.find( READING_INFO_TYPE_DESCRIPTION ) != std::string::npos ) + if(value.find(READING_INFO_TYPE_DESCRIPTION) != std::string::npos) { - types[ Dali::Accessibility::ReadingInfoType::DESCRIPTION ] = true; + types[Dali::Accessibility::ReadingInfoType::DESCRIPTION] = true; } - if ( value.find( READING_INFO_TYPE_STATE ) != std::string::npos ) + if(value.find(READING_INFO_TYPE_STATE) != std::string::npos) { - types[ Dali::Accessibility::ReadingInfoType::STATE ] = true; + types[Dali::Accessibility::ReadingInfoType::STATE] = true; } return types; } -void Control::Impl::CopyInstancedProperties( RegisteredVisualContainer& visuals, Dictionary& instancedProperties ) +void Control::Impl::CopyInstancedProperties(RegisteredVisualContainer& visuals, Dictionary& instancedProperties) { - for(RegisteredVisualContainer::Iterator iter = visuals.Begin(); iter!= visuals.End(); iter++) + for(RegisteredVisualContainer::Iterator iter = visuals.Begin(); iter != visuals.End(); iter++) { - if( (*iter)->visual ) + if((*iter)->visual) { Property::Map instanceMap; Toolkit::GetImplementation((*iter)->visual).CreateInstancePropertyMap(instanceMap); - instancedProperties.Add( (*iter)->visual.GetName(), instanceMap ); + instancedProperties.Add((*iter)->visual.GetName(), instanceMap); } } } - -void Control::Impl::RemoveVisual( RegisteredVisualContainer& visuals, const std::string& visualName ) +void Control::Impl::RemoveVisual(RegisteredVisualContainer& visuals, const std::string& visualName) { - Actor self( mControlImpl.Self() ); + Actor self(mControlImpl.Self()); - for ( RegisteredVisualContainer::Iterator visualIter = visuals.Begin(); - visualIter != visuals.End(); ++visualIter ) + for(RegisteredVisualContainer::Iterator visualIter = visuals.Begin(); + visualIter != visuals.End(); + ++visualIter) { Toolkit::Visual::Base visual = (*visualIter)->visual; - if( visual && visual.GetName() == visualName ) + if(visual && visual.GetName() == visualName) { - Toolkit::GetImplementation(visual).SetOffScene( self ); + Toolkit::GetImplementation(visual).SetOffScene(self); (*visualIter)->visual.Reset(); - visuals.Erase( visualIter ); + visuals.Erase(visualIter); break; } } } -void Control::Impl::RemoveVisuals( RegisteredVisualContainer& visuals, DictionaryKeys& removeVisuals ) +void Control::Impl::RemoveVisuals(RegisteredVisualContainer& visuals, DictionaryKeys& removeVisuals) { - Actor self( mControlImpl.Self() ); - for( DictionaryKeys::iterator iter = removeVisuals.begin(); iter != removeVisuals.end(); ++iter ) + Actor self(mControlImpl.Self()); + for(DictionaryKeys::iterator iter = removeVisuals.begin(); iter != removeVisuals.end(); ++iter) { const std::string visualName = *iter; - RemoveVisual( visuals, visualName ); + RemoveVisual(visuals, visualName); } } -void Control::Impl::RecreateChangedVisuals( Dictionary& stateVisualsToChange, - Dictionary& instancedProperties ) +void Control::Impl::RecreateChangedVisuals(Dictionary& stateVisualsToChange, + Dictionary& instancedProperties) { - Dali::CustomActor handle( mControlImpl.GetOwner() ); - for( Dictionary::iterator iter = stateVisualsToChange.Begin(); - iter != stateVisualsToChange.End(); ++iter ) + Dali::CustomActor handle(mControlImpl.GetOwner()); + for(Dictionary::iterator iter = stateVisualsToChange.Begin(); + iter != stateVisualsToChange.End(); + ++iter) { - const std::string& visualName = (*iter).key; - const Property::Map& toMap = (*iter).entry; - - // is it a candidate for re-creation? - bool recreate = false; + const std::string& visualName = (*iter).key; + const Property::Map& toMap = (*iter).entry; - Toolkit::Visual::Base visual = GetVisualByName( mVisuals, visualName ); - if( visual ) + Actor self = mControlImpl.Self(); + RegisteredVisualContainer::Iterator registeredVisualsiter; + // Check if visual (visualName) is already registered, this is the current visual. + if(FindVisual(visualName, mVisuals, registeredVisualsiter)) { - Property::Map fromMap; - visual.CreatePropertyMap( fromMap ); - - Toolkit::Visual::Type fromType = GetVisualTypeFromMap( fromMap ); - Toolkit::Visual::Type toType = GetVisualTypeFromMap( toMap ); - - if( fromType != toType ) + Toolkit::Visual::Base& visual = (*registeredVisualsiter)->visual; + if(visual) { - recreate = true; - } - else - { - if( fromType == Toolkit::Visual::IMAGE || fromType == Toolkit::Visual::N_PATCH - || fromType == Toolkit::Visual::SVG || fromType == Toolkit::Visual::ANIMATED_IMAGE ) - { - Property::Value* fromUrl = fromMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME ); - Property::Value* toUrl = toMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME ); + // No longer required to know if the replaced visual's resources are ready + StopObservingVisual(visual); - if( fromUrl && toUrl ) + // If control staged then visuals will be swapped once ready + if(self.GetProperty(Actor::Property::CONNECTED_TO_SCENE)) + { + // Check if visual is currently in the process of being replaced ( is in removal container ) + RegisteredVisualContainer::Iterator visualQueuedForRemoval; + if(FindVisual(visualName, mRemoveVisuals, visualQueuedForRemoval)) { - std::string fromUrlString; - std::string toUrlString; - fromUrl->Get(fromUrlString); - toUrl->Get(toUrlString); - - if( fromUrlString != toUrlString ) - { - recreate = true; - } + // Visual with same visual name is already in removal container so current visual pending + // Only the the last requested visual will be displayed so remove current visual which is staged but not ready. + Toolkit::GetImplementation(visual).SetOffScene(self); + (*registeredVisualsiter)->visual.Reset(); + mVisuals.Erase(registeredVisualsiter); + } + else + { + // current visual not already in removal container so add now. + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "RegisterVisual Move current registered visual to removal Queue: %s \n", visualName.c_str()); + MoveVisual(registeredVisualsiter, mVisuals, mRemoveVisuals); } } + else + { + // Control not staged or visual disabled so can just erase from registered visuals and new visual will be added later. + (*registeredVisualsiter)->visual.Reset(); + mVisuals.Erase(registeredVisualsiter); + } } - const Property::Map* instancedMap = instancedProperties.FindConst( visualName ); - if( recreate || instancedMap ) - { - RemoveVisual( mVisuals, visualName ); - Style::ApplyVisual( handle, visualName, toMap, instancedMap ); - } - else - { - // @todo check to see if we can apply toMap without recreating the visual - // e.g. by setting only animatable properties - // For now, recreate all visuals, but merge in instance data. - RemoveVisual( mVisuals, visualName ); - Style::ApplyVisual( handle, visualName, toMap, instancedMap ); - } + const Property::Map* instancedMap = instancedProperties.FindConst(visualName); + Style::ApplyVisual(handle, visualName, toMap, instancedMap); } } } -void Control::Impl::ReplaceStateVisualsAndProperties( const StylePtr oldState, const StylePtr newState, const std::string& subState ) +void Control::Impl::ReplaceStateVisualsAndProperties(const StylePtr oldState, const StylePtr newState, const std::string& subState) { // Collect all old visual names DictionaryKeys stateVisualsToRemove; - if( oldState ) + if(oldState) { - oldState->visuals.GetKeys( stateVisualsToRemove ); - if( ! subState.empty() ) + oldState->visuals.GetKeys(stateVisualsToRemove); + if(!subState.empty()) { const StylePtr* oldSubState = oldState->subStates.FindConst(subState); - if( oldSubState ) + if(oldSubState) { DictionaryKeys subStateVisualsToRemove; - (*oldSubState)->visuals.GetKeys( subStateVisualsToRemove ); - Merge( stateVisualsToRemove, subStateVisualsToRemove ); + (*oldSubState)->visuals.GetKeys(subStateVisualsToRemove); + Merge(stateVisualsToRemove, subStateVisualsToRemove); } } } // Collect all new visual properties Dictionary stateVisualsToAdd; - if( newState ) + if(newState) { stateVisualsToAdd = newState->visuals; - if( ! subState.empty() ) + if(!subState.empty()) { const StylePtr* newSubState = newState->subStates.FindConst(subState); - if( newSubState ) + if(newSubState) { - stateVisualsToAdd.Merge( (*newSubState)->visuals ); + stateVisualsToAdd.Merge((*newSubState)->visuals); } } } // If a name is in both add/remove, move it to change list. Dictionary stateVisualsToChange; - FindChangableVisuals( stateVisualsToAdd, stateVisualsToChange, stateVisualsToRemove); + FindChangableVisuals(stateVisualsToAdd, stateVisualsToChange, stateVisualsToRemove); // Copy instanced properties (e.g. text label) of current visuals Dictionary instancedProperties; - CopyInstancedProperties( mVisuals, instancedProperties ); + CopyInstancedProperties(mVisuals, instancedProperties); // For each visual in remove list, remove from mVisuals - RemoveVisuals( mVisuals, stateVisualsToRemove ); + RemoveVisuals(mVisuals, stateVisualsToRemove); // For each visual in add list, create and add to mVisuals - Dali::CustomActor handle( mControlImpl.GetOwner() ); - Style::ApplyVisuals( handle, stateVisualsToAdd, instancedProperties ); + Dali::CustomActor handle(mControlImpl.GetOwner()); + Style::ApplyVisuals(handle, stateVisualsToAdd, instancedProperties); // For each visual in change list, if it requires a new visual, // remove old visual, create and add to mVisuals - RecreateChangedVisuals( stateVisualsToChange, instancedProperties ); + RecreateChangedVisuals(stateVisualsToChange, instancedProperties); } -void Control::Impl::SetState( DevelControl::State newState, bool withTransitions ) +void Control::Impl::SetState(DevelControl::State newState, bool withTransitions) { DevelControl::State oldState = mState; - Dali::CustomActor handle( mControlImpl.GetOwner() ); - DALI_LOG_INFO(gLogFilter, Debug::Concise, "Control::Impl::SetState: %s\n", - (mState == DevelControl::NORMAL ? "NORMAL" :( - mState == DevelControl::FOCUSED ?"FOCUSED" : ( - mState == DevelControl::DISABLED?"DISABLED":"NONE" )))); + Dali::CustomActor handle(mControlImpl.GetOwner()); + DALI_LOG_INFO(gLogFilter, Debug::Concise, "Control::Impl::SetState: %s\n", (mState == DevelControl::NORMAL ? "NORMAL" : (mState == DevelControl::FOCUSED ? "FOCUSED" : (mState == DevelControl::DISABLED ? "DISABLED" : "NONE")))); - if( mState != newState ) + if(mState != newState) { // If mState was Disabled, and new state is Focused, should probably // store that fact, e.g. in another property that FocusManager can access. @@ -1651,54 +1674,54 @@ void Control::Impl::SetState( DevelControl::State newState, bool withTransitions // Trigger state change and transitions // Apply new style, if stylemanager is available Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get(); - if( styleManager ) + if(styleManager) { - const StylePtr stylePtr = GetImpl( styleManager ).GetRecordedStyle( Toolkit::Control( mControlImpl.GetOwner() ) ); + const StylePtr stylePtr = GetImpl(styleManager).GetRecordedStyle(Toolkit::Control(mControlImpl.GetOwner())); - if( stylePtr ) + if(stylePtr) { - std::string oldStateName = Scripting::GetEnumerationName< Toolkit::DevelControl::State >( oldState, ControlStateTable, ControlStateTableCount ); - std::string newStateName = Scripting::GetEnumerationName< Toolkit::DevelControl::State >( newState, ControlStateTable, ControlStateTableCount ); + std::string oldStateName = Scripting::GetEnumerationName(oldState, ControlStateTable, ControlStateTableCount); + std::string newStateName = Scripting::GetEnumerationName(newState, ControlStateTable, ControlStateTableCount); - const StylePtr* newStateStyle = stylePtr->subStates.Find( newStateName ); - const StylePtr* oldStateStyle = stylePtr->subStates.Find( oldStateName ); - if( oldStateStyle && newStateStyle ) + const StylePtr* newStateStyle = stylePtr->subStates.Find(newStateName); + const StylePtr* oldStateStyle = stylePtr->subStates.Find(oldStateName); + if(oldStateStyle && newStateStyle) { // Only change if both state styles exist - ReplaceStateVisualsAndProperties( *oldStateStyle, *newStateStyle, mSubStateName ); + ReplaceStateVisualsAndProperties(*oldStateStyle, *newStateStyle, mSubStateName); } } } } } -void Control::Impl::SetSubState( const std::string& subStateName, bool withTransitions ) +void Control::Impl::SetSubState(const std::string& subStateName, bool withTransitions) { - if( mSubStateName != subStateName ) + if(mSubStateName != subStateName) { // Get existing sub-state visuals, and unregister them - Dali::CustomActor handle( mControlImpl.GetOwner() ); + Dali::CustomActor handle(mControlImpl.GetOwner()); Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get(); - if( styleManager ) + if(styleManager) { - const StylePtr stylePtr = GetImpl( styleManager ).GetRecordedStyle( Toolkit::Control( mControlImpl.GetOwner() ) ); - if( stylePtr ) + const StylePtr stylePtr = GetImpl(styleManager).GetRecordedStyle(Toolkit::Control(mControlImpl.GetOwner())); + if(stylePtr) { // Stringify state - std::string stateName = Scripting::GetEnumerationName< Toolkit::DevelControl::State >( mState, ControlStateTable, ControlStateTableCount ); + std::string stateName = Scripting::GetEnumerationName(mState, ControlStateTable, ControlStateTableCount); - const StylePtr* state = stylePtr->subStates.Find( stateName ); - if( state ) + const StylePtr* state = stylePtr->subStates.Find(stateName); + if(state) { StylePtr stateStyle(*state); - const StylePtr* newStateStyle = stateStyle->subStates.Find( subStateName ); - const StylePtr* oldStateStyle = stateStyle->subStates.Find( mSubStateName ); - if( oldStateStyle && newStateStyle ) + const StylePtr* newStateStyle = stateStyle->subStates.Find(subStateName); + const StylePtr* oldStateStyle = stateStyle->subStates.Find(mSubStateName); + if(oldStateStyle && newStateStyle) { std::string empty; - ReplaceStateVisualsAndProperties( *oldStateStyle, *newStateStyle, empty ); + ReplaceStateVisualsAndProperties(*oldStateStyle, *newStateStyle, empty); } } } @@ -1717,16 +1740,16 @@ void Control::Impl::OnSceneDisconnection() // then when this control appears back on stage it should use that new visual. // Iterate through all registered visuals and set off scene - SetVisualsOffScene( mVisuals, self ); + SetVisualsOffScene(mVisuals, self); // Visuals pending replacement can now be taken out of the removal list and set off scene // Iterate through all replacement visuals and add to a move queue then set off scene - for( auto removalIter = mRemoveVisuals.Begin(), end = mRemoveVisuals.End(); removalIter != end; removalIter++ ) + for(auto removalIter = mRemoveVisuals.Begin(), end = mRemoveVisuals.End(); removalIter != end; removalIter++) { - Toolkit::GetImplementation((*removalIter)->visual).SetOffScene( self ); + Toolkit::GetImplementation((*removalIter)->visual).SetOffScene(self); } - for( auto replacedIter = mVisuals.Begin(), end = mVisuals.End(); replacedIter != end; replacedIter++ ) + for(auto replacedIter = mVisuals.Begin(), end = mVisuals.End(); replacedIter != end; replacedIter++) { (*replacedIter)->pending = false; } @@ -1734,7 +1757,7 @@ void Control::Impl::OnSceneDisconnection() mRemoveVisuals.Clear(); } -void Control::Impl::SetMargin( Extents margin ) +void Control::Impl::SetMargin(Extents margin) { mControlImpl.mImpl->mMargin = margin; @@ -1747,7 +1770,7 @@ Extents Control::Impl::GetMargin() const return mControlImpl.mImpl->mMargin; } -void Control::Impl::SetPadding( Extents padding ) +void Control::Impl::SetPadding(Extents padding) { mControlImpl.mImpl->mPadding = padding; @@ -1760,18 +1783,18 @@ Extents Control::Impl::GetPadding() const return mControlImpl.mImpl->mPadding; } -void Control::Impl::SetInputMethodContext( InputMethodContext& inputMethodContext ) +void Control::Impl::SetInputMethodContext(InputMethodContext& inputMethodContext) { mInputMethodContext = inputMethodContext; } -bool Control::Impl::FilterKeyEvent( const KeyEvent& event ) +bool Control::Impl::FilterKeyEvent(const KeyEvent& event) { - bool consumed ( false ); + bool consumed(false); - if ( mInputMethodContext ) + if(mInputMethodContext) { - consumed = mInputMethodContext.FilterEventKey( event ); + consumed = mInputMethodContext.FilterEventKey(event); } return consumed; } @@ -1781,14 +1804,14 @@ DevelControl::VisualEventSignalType& Control::Impl::VisualEventSignal() return mVisualEventSignal; } -void Control::Impl::SetShadow( const Property::Map& map ) +void Control::Impl::SetShadow(const Property::Map& map) { - Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( map ); + Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual(map); visual.SetName("shadow"); - if( visual ) + if(visual) { - mControlImpl.mImpl->RegisterVisual( Toolkit::DevelControl::Property::SHADOW, visual, DepthIndex::BACKGROUND_EFFECT ); + mControlImpl.mImpl->RegisterVisual(Toolkit::DevelControl::Property::SHADOW, visual, DepthIndex::BACKGROUND_EFFECT); mControlImpl.RelayoutRequest(); } @@ -1796,10 +1819,23 @@ void Control::Impl::SetShadow( const Property::Map& map ) void Control::Impl::ClearShadow() { - mControlImpl.mImpl->UnregisterVisual( Toolkit::DevelControl::Property::SHADOW ); + mControlImpl.mImpl->UnregisterVisual(Toolkit::DevelControl::Property::SHADOW); - // Trigger a size negotiation request that may be needed when unregistering a visual. - mControlImpl.RelayoutRequest(); + // Trigger a size negotiation request that may be needed when unregistering a visual. + mControlImpl.RelayoutRequest(); +} + +Dali::Property Control::Impl::GetVisualProperty(Dali::Property::Index index, Dali::Property::Key visualPropertyKey) +{ + Toolkit::Visual::Base visual = GetVisualByIndex(mVisuals, index); + if(visual) + { + Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); + return visualImpl.GetPropertyObject(visualPropertyKey); + } + + Handle handle; + return Dali::Property(handle, Property::INVALID_INDEX); } void Control::Impl::EmitResourceReadySignal() @@ -1821,7 +1857,7 @@ void Control::Impl::EmitResourceReadySignal() if(!mIdleCallback) { // The callback manager takes the ownership of the callback object. - mIdleCallback = MakeCallback( this, &Control::Impl::OnIdleCallback); + mIdleCallback = MakeCallback(this, &Control::Impl::OnIdleCallback); Adaptor::Get().AddIdle(mIdleCallback, false); } } @@ -1854,452 +1890,94 @@ void Control::Impl::OnIdleCallback() mIdleCallback = nullptr; } -Dali::Accessibility::Accessible *Control::Impl::GetAccessibilityObject() +Dali::Accessibility::Accessible* Control::Impl::GetAccessibilityObject() { - if( !accessibilityObject ) - accessibilityObject = accessibilityConstructor( mControlImpl.Self() ); + if(!accessibilityObject) + accessibilityObject = accessibilityConstructor(mControlImpl.Self()); return accessibilityObject.get(); } -Dali::Accessibility::Accessible *Control::Impl::GetAccessibilityObject(Dali::Actor actor) +Dali::Accessibility::Accessible* Control::Impl::GetAccessibilityObject(Dali::Actor actor) { - if( actor ) + if(actor) { - auto q = Dali::Toolkit::Control::DownCast( actor ); - if( q ) + auto q = Dali::Toolkit::Control::DownCast(actor); + if(q) { - auto q2 = static_cast< Internal::Control* >( &q.GetImplementation() ); + auto q2 = static_cast(&q.GetImplementation()); return q2->mImpl->GetAccessibilityObject(); } } return nullptr; } -Control::Impl::AccessibleImpl::AccessibleImpl(Dali::Actor self, Dali::Accessibility::Role role, bool modal) - : self(self), modal(modal) -{ - auto control = Dali::Toolkit::Control::DownCast(self); - - Internal::Control& internalControl = Toolkit::Internal::GetImplementation( control ); - Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get( internalControl ); - if( controlImpl.mAccessibilityRole == Dali::Accessibility::Role::UNKNOWN ) - controlImpl.mAccessibilityRole = role; - - self.PropertySetSignal().Connect(&controlImpl, [this, &controlImpl](Dali::Handle &handle, Dali::Property::Index index, Dali::Property::Value value) - { - if (this->self != Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor()) - { - return; - } - - if (index == DevelControl::Property::ACCESSIBILITY_NAME - || (index == GetNamePropertyIndex() && !controlImpl.mAccessibilityNameSet)) - { - if (controlImpl.mAccessibilityGetNameSignal.Empty()) - { - Emit(Dali::Accessibility::ObjectPropertyChangeEvent::NAME); - } - } - - if (index == DevelControl::Property::ACCESSIBILITY_DESCRIPTION - || (index == GetDescriptionPropertyIndex() && !controlImpl.mAccessibilityDescriptionSet)) - { - if (controlImpl.mAccessibilityGetDescriptionSignal.Empty()) - { - Emit(Dali::Accessibility::ObjectPropertyChangeEvent::DESCRIPTION); - } - } - }); -} - -std::string Control::Impl::AccessibleImpl::GetName() -{ - auto control = Dali::Toolkit::Control::DownCast(self); - - Internal::Control& internalControl = Toolkit::Internal::GetImplementation( control ); - Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get( internalControl ); - - if (!controlImpl.mAccessibilityGetNameSignal.Empty()) { - std::string ret; - controlImpl.mAccessibilityGetNameSignal.Emit(ret); - return ret; - } - - if (controlImpl.mAccessibilityNameSet) - return controlImpl.mAccessibilityName; - - if (auto raw = GetNameRaw(); !raw.empty()) - return raw; - - return self.GetProperty< std::string >( Actor::Property::NAME ); -} - -std::string Control::Impl::AccessibleImpl::GetNameRaw() -{ - return {}; -} - -std::string Control::Impl::AccessibleImpl::GetDescription() -{ - auto control = Dali::Toolkit::Control::DownCast(self); - - Internal::Control& internalControl = Toolkit::Internal::GetImplementation( control ); - Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get( internalControl ); - - if (!controlImpl.mAccessibilityGetDescriptionSignal.Empty()) { - std::string ret; - controlImpl.mAccessibilityGetDescriptionSignal.Emit(ret); - return ret; - } - - if (controlImpl.mAccessibilityDescriptionSet) - return controlImpl.mAccessibilityDescription; - - return GetDescriptionRaw(); -} - -std::string Control::Impl::AccessibleImpl::GetDescriptionRaw() -{ - return ""; -} - -Dali::Accessibility::Accessible* Control::Impl::AccessibleImpl::GetParent() -{ - return Dali::Accessibility::Accessible::Get( self.GetParent() ); -} - -size_t Control::Impl::AccessibleImpl::GetChildCount() -{ - return self.GetChildCount(); -} - -Dali::Accessibility::Accessible* Control::Impl::AccessibleImpl::GetChildAtIndex( size_t index ) -{ - return Dali::Accessibility::Accessible::Get( self.GetChildAt( static_cast< unsigned int >( index ) ) ); -} - -size_t Control::Impl::AccessibleImpl::GetIndexInParent() -{ - auto s = self; - auto parent = s.GetParent(); - DALI_ASSERT_ALWAYS( parent && "can't call GetIndexInParent on object without parent" ); - auto count = parent.GetChildCount(); - for( auto i = 0u; i < count; ++i ) - { - auto c = parent.GetChildAt( i ); - if( c == s ) - return i; - } - DALI_ASSERT_ALWAYS( false && "object isn't child of it's parent" ); - return static_cast(-1); -} - -Dali::Accessibility::Role Control::Impl::AccessibleImpl::GetRole() -{ - return self.GetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_ROLE ); -} - -Dali::Accessibility::States Control::Impl::AccessibleImpl::CalculateStates() -{ - Dali::Accessibility::States s; - s[Dali::Accessibility::State::FOCUSABLE] = self.GetProperty< bool >( Actor::Property::KEYBOARD_FOCUSABLE ); - s[Dali::Accessibility::State::FOCUSED] = Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor() == self; - if(self.GetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE ).GetType() == Property::NONE ) - s[Dali::Accessibility::State::HIGHLIGHTABLE] = false; - else - s[Dali::Accessibility::State::HIGHLIGHTABLE] = self.GetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE ).Get< bool >(); - s[Dali::Accessibility::State::HIGHLIGHTED] = GetCurrentlyHighlightedActor() == self; - s[Dali::Accessibility::State::ENABLED] = true; - s[Dali::Accessibility::State::SENSITIVE] = true; - s[Dali::Accessibility::State::ANIMATED] = self.GetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED ).Get< bool >(); - s[Dali::Accessibility::State::VISIBLE] = true; - if( modal ) - { - s[Dali::Accessibility::State::MODAL] = true; - } - s[Dali::Accessibility::State::SHOWING] = !self.GetProperty( Dali::DevelActor::Property::CULLED ).Get< bool >() - && self.GetCurrentProperty< bool >( Actor::Property::VISIBLE ); - - s[Dali::Accessibility::State::DEFUNCT] = !self.GetProperty( Dali::DevelActor::Property::CONNECTED_TO_SCENE ).Get< bool >(); - return s; -} - -Dali::Accessibility::States Control::Impl::AccessibleImpl::GetStates() -{ - return CalculateStates(); -} - -Dali::Accessibility::Attributes Control::Impl::AccessibleImpl::GetAttributes() -{ - std::unordered_map< std::string, std::string > attribute_map; - auto q = Dali::Toolkit::Control::DownCast( self ); - auto w = - q.GetProperty( Dali::Toolkit::DevelControl::Property::ACCESSIBILITY_ATTRIBUTES ); - auto z = w.GetMap(); - - if( z ) - { - auto map_size = z->Count(); - - for( unsigned int i = 0; i < map_size; i++ ) - { - auto map_key = z->GetKeyAt( i ); - if( map_key.type == Property::Key::STRING ) - { - std::string map_value; - if( z->GetValue( i ).Get( map_value ) ) - { - attribute_map.emplace( std::move( map_key.stringKey ), - std::move( map_value ) ); - } - } - } - } - - return attribute_map; -} - -Dali::Accessibility::ComponentLayer Control::Impl::AccessibleImpl::GetLayer() -{ - return Dali::Accessibility::ComponentLayer::WINDOW; -} - -Dali::Rect<> Control::Impl::AccessibleImpl::GetExtents( Dali::Accessibility::CoordType ctype ) -{ - Vector2 screenPosition = - self.GetProperty( Dali::DevelActor::Property::SCREEN_POSITION ) - .Get< Vector2 >(); - auto size = self.GetCurrentProperty< Vector3 >( Actor::Property::SIZE ) * self.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_SCALE ); - bool positionUsesAnchorPoint = - self.GetProperty( Dali::DevelActor::Property::POSITION_USES_ANCHOR_POINT ) - .Get< bool >(); - Vector3 anchorPointOffSet = - size * ( positionUsesAnchorPoint ? self.GetCurrentProperty< Vector3 >( Actor::Property::ANCHOR_POINT ) - : AnchorPoint::TOP_LEFT ); - Vector2 position = Vector2( screenPosition.x - anchorPointOffSet.x, - screenPosition.y - anchorPointOffSet.y ); - - return { position.x, position.y, size.x, size.y }; -} - -int16_t Control::Impl::AccessibleImpl::GetMdiZOrder() { return 0; } -double Control::Impl::AccessibleImpl::GetAlpha() { return 0; } - -bool Control::Impl::AccessibleImpl::GrabFocus() -{ - return Toolkit::KeyboardFocusManager::Get().SetCurrentFocusActor( self ); -} - -const char* const FOCUS_BORDER_IMAGE_PATH = DALI_IMAGE_DIR "keyboard_focus.9.png"; - -static Dali::Actor CreateHighlightIndicatorActor() -{ - // Create the default if it hasn't been set and one that's shared by all the - // keyboard focusable actors const char* const FOCUS_BORDER_IMAGE_PATH = - // DALI_IMAGE_DIR "keyboard_focus.9.png"; - auto actor = Toolkit::ImageView::New( FOCUS_BORDER_IMAGE_PATH ); - actor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); - DevelControl::AppendAccessibilityAttribute( actor, "highlight", "" ); - actor.SetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED, true); - actor.SetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false ); - - return actor; -} - -bool Control::Impl::AccessibleImpl::GrabHighlight() -{ - auto old = GetCurrentlyHighlightedActor(); - - if( !Dali::Accessibility::IsUp() ) - return false; - if( self == old ) - return true; - if( old ) - { - auto c = dynamic_cast< Dali::Accessibility::Component* >( GetAccessibilityObject( old ) ); - if( c ) - c->ClearHighlight(); - } - auto highlight = GetHighlightActor(); - if ( !highlight ) - { - highlight = CreateHighlightIndicatorActor(); - SetHighlightActor( highlight ); - } - highlight.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); - highlight.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); - highlight.SetProperty( Actor::Property::POSITION_Z, 1.0f ); - highlight.SetProperty( Actor::Property::POSITION, Vector2( 0.0f, 0.0f )); - - EnsureSelfVisible(); - self.Add( highlight ); - SetCurrentlyHighlightedActor( self ); - EmitHighlighted( true ); - - return true; -} - - - -bool Control::Impl::AccessibleImpl::ClearHighlight() -{ - if( !Dali::Accessibility::IsUp() ) - return false; - if( GetCurrentlyHighlightedActor() == self ) - { - self.Remove( GetHighlightActor() ); - SetCurrentlyHighlightedActor( {} ); - EmitHighlighted( false ); - return true; - } - return false; -} - -std::string Control::Impl::AccessibleImpl::GetActionName( size_t index ) -{ - if ( index >= GetActionCount() ) return ""; - Dali::TypeInfo type; - self.GetTypeInfo( type ); - DALI_ASSERT_ALWAYS( type && "no TypeInfo object" ); - return type.GetActionName( index ); -} -std::string Control::Impl::AccessibleImpl::GetLocalizedActionName( size_t index ) -{ - // TODO: add localization - return GetActionName( index ); -} -std::string Control::Impl::AccessibleImpl::GetActionDescription( size_t index ) -{ - return ""; -} -size_t Control::Impl::AccessibleImpl::GetActionCount() -{ - Dali::TypeInfo type; - self.GetTypeInfo( type ); - DALI_ASSERT_ALWAYS( type && "no TypeInfo object" ); - return type.GetActionCount(); -} -std::string Control::Impl::AccessibleImpl::GetActionKeyBinding( size_t index ) -{ - return ""; -} -bool Control::Impl::AccessibleImpl::DoAction( size_t index ) -{ - std::string actionName = GetActionName( index ); - return self.DoAction( actionName, {} ); -} -bool Control::Impl::AccessibleImpl::DoAction(const std::string& name) -{ - return self.DoAction( name, {} ); -} - -bool Control::Impl::AccessibleImpl::DoGesture(const Dali::Accessibility::GestureInfo &gestureInfo) -{ - auto control = Dali::Toolkit::Control::DownCast(self); - - Internal::Control& internalControl = Toolkit::Internal::GetImplementation( control ); - Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get( internalControl ); - - if (!controlImpl.mAccessibilityDoGestureSignal.Empty()) { - auto ret = std::make_pair(gestureInfo, false); - controlImpl.mAccessibilityDoGestureSignal.Emit(ret); - return ret.second; - } - - return false; -} - -std::vector Control::Impl::AccessibleImpl::GetRelationSet() -{ - auto control = Dali::Toolkit::Control::DownCast(self); - - Internal::Control& internalControl = Toolkit::Internal::GetImplementation( control ); - Internal::Control::Impl& controlImpl = Internal::Control::Impl::Get( internalControl ); - - std::vector ret; - - auto &v = controlImpl.mAccessibilityRelations; - for (auto i = 0u; i < v.size(); ++i) - { - if ( v[i].empty() ) - continue; - - ret.emplace_back( Accessibility::Relation{ static_cast(i), v[i] } ); - } - - return ret; -} - -void Control::Impl::AccessibleImpl::EnsureChildVisible(Actor child) -{ -} - -void Control::Impl::AccessibleImpl::EnsureSelfVisible() -{ - auto parent = dynamic_cast(GetParent()); - if (parent) - { - parent->EnsureChildVisible(self); - } -} - -Property::Index Control::Impl::AccessibleImpl::GetNamePropertyIndex() -{ - return Actor::Property::NAME; -} - -Property::Index Control::Impl::AccessibleImpl::GetDescriptionPropertyIndex() -{ - return Property::INVALID_INDEX; -} - -void Control::Impl::PositionOrSizeChangedCallback( PropertyNotification &p ) +void Control::Impl::PositionOrSizeChangedCallback(PropertyNotification& p) { auto self = Dali::Actor::DownCast(p.GetTarget()); - if (Dali::Accessibility::IsUp() && !self.GetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED ).Get< bool >()) + if(Dali::Accessibility::IsUp() && !self.GetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED).Get()) { - auto extents = DevelActor::CalculateScreenExtents( self ); - Dali::Accessibility::Accessible::Get( self )->EmitBoundsChanged( extents ); + auto extents = DevelActor::CalculateScreenExtents(self); + Dali::Accessibility::Accessible::Get(self)->EmitBoundsChanged(extents); } } -void Control::Impl::CulledChangedCallback( PropertyNotification &p) +void Control::Impl::CulledChangedCallback(PropertyNotification& p) { - if (Dali::Accessibility::IsUp()) + if(Dali::Accessibility::IsUp()) { auto self = Dali::Actor::DownCast(p.GetTarget()); - Dali::Accessibility::Accessible::Get(self)->EmitShowing( !self.GetProperty( DevelActor::Property::CULLED ).Get() ); + Dali::Accessibility::Accessible::Get(self)->EmitShowing(!self.GetProperty(DevelActor::Property::CULLED).Get()); } } void Control::Impl::AccessibilityRegister() { - if (!accessibilityNotificationSet) + if(!accessibilityNotificationSet) { - accessibilityNotificationPosition = mControlImpl.Self().AddPropertyNotification( Actor::Property::POSITION, StepCondition( 0.01f ) ); - accessibilityNotificationPosition.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); - accessibilityNotificationPosition.NotifySignal().Connect( &Control::Impl::PositionOrSizeChangedCallback ); + accessibilityNotificationPosition = mControlImpl.Self().AddPropertyNotification(Actor::Property::POSITION, StepCondition(0.01f)); + accessibilityNotificationPosition.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED); + accessibilityNotificationPosition.NotifySignal().Connect(&Control::Impl::PositionOrSizeChangedCallback); - accessibilityNotificationSize = mControlImpl.Self().AddPropertyNotification( Actor::Property::SIZE, StepCondition( 0.01f ) ); - accessibilityNotificationSize.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); - accessibilityNotificationSize.NotifySignal().Connect( &Control::Impl::PositionOrSizeChangedCallback ); + accessibilityNotificationSize = mControlImpl.Self().AddPropertyNotification(Actor::Property::SIZE, StepCondition(0.01f)); + accessibilityNotificationSize.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED); + accessibilityNotificationSize.NotifySignal().Connect(&Control::Impl::PositionOrSizeChangedCallback); - accessibilityNotificationCulled = mControlImpl.Self().AddPropertyNotification( DevelActor::Property::CULLED, LessThanCondition( 0.5f ) ); - accessibilityNotificationCulled.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); - accessibilityNotificationCulled.NotifySignal().Connect( &Control::Impl::CulledChangedCallback ); + accessibilityNotificationCulled = mControlImpl.Self().AddPropertyNotification(DevelActor::Property::CULLED, LessThanCondition(0.5f)); + accessibilityNotificationCulled.SetNotifyMode(PropertyNotification::NOTIFY_ON_CHANGED); + accessibilityNotificationCulled.NotifySignal().Connect(&Control::Impl::CulledChangedCallback); accessibilityNotificationSet = true; } } -void Control::Impl::AccessibilityDeregister() +void Control::Impl::AccessibilityDeregister(bool remove) { - if (accessibilityNotificationSet) + if(accessibilityNotificationSet) { + accessibilityNotificationPosition.NotifySignal().Disconnect(&Control::Impl::PositionOrSizeChangedCallback); + if(remove) + { + mControlImpl.Self().RemovePropertyNotification(accessibilityNotificationPosition); + } + accessibilityNotificationPosition.Reset(); accessibilityNotificationPosition = {}; - accessibilityNotificationSize = {}; - accessibilityNotificationCulled = {}; - accessibilityNotificationSet = false; + + accessibilityNotificationSize.NotifySignal().Disconnect(&Control::Impl::PositionOrSizeChangedCallback); + if(remove) + { + mControlImpl.Self().RemovePropertyNotification(accessibilityNotificationSize); + } + accessibilityNotificationSize.Reset(); + accessibilityNotificationSize = {}; + + accessibilityNotificationCulled.NotifySignal().Disconnect(&Control::Impl::CulledChangedCallback); + if(remove) + { + mControlImpl.Self().RemovePropertyNotification(accessibilityNotificationCulled); + } + accessibilityNotificationCulled.Reset(); + accessibilityNotificationCulled = {}; + accessibilityNotificationSet = false; } }