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=b10842b831e4190776cbece33fdb6d6d0ac9fc03;hp=0a7d70e25ab7eb38c2413aff56556c5d938280f6;hb=bd126b5d480c08bf7a995b2c4532e80e76ec4ad2;hpb=e3d6a0a27fd980a4ced6e7257abdc32bc192e871 diff --git a/dali-toolkit/internal/controls/control/control-data-impl.cpp b/dali-toolkit/internal/controls/control/control-data-impl.cpp index 0a7d70e..b10842b 100755 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -47,6 +47,7 @@ #include #include #include +#include namespace { @@ -104,25 +105,30 @@ void Remove( DictionaryKeys& keys, const std::string& name ) } } -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++ ) { - if ( (*iter)->index == targetIndex ) + Toolkit::Visual::Base visual = (*iter)->visual; + if( visual && visual.GetName() == visualName ) { return true; } @@ -169,6 +175,24 @@ 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 */ @@ -198,54 +222,56 @@ const char* ACTION_ACCESSIBILITY_READING_STOPPED = "ReadingStopped"; static bool DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes ) { - if (!object) - return false; + bool ret = true; - Toolkit::Control control = Toolkit::Control::DownCast( BaseHandle( object ) ); - if ( !control ) - return false; + Dali::BaseHandle handle( object ); + + Toolkit::Control control = Toolkit::Control::DownCast( handle ); + + DALI_ASSERT_ALWAYS( control ); if( 0 == strcmp( actionName.c_str(), ACTION_ACCESSIBILITY_ACTIVATED ) || - actionName == "activate" ) + actionName == "activate" ) { // if cast succeeds there is an implementation so no need to check - if (!DevelControl::AccessibilityActivateSignal( control ).Empty()) + if( !DevelControl::AccessibilityActivateSignal( control ).Empty() ) DevelControl::AccessibilityActivateSignal( control ).Emit(); - else - return Internal::GetImplementation( control ).OnAccessibilityActivated(); + else ret = Internal::GetImplementation( control ).OnAccessibilityActivated(); } 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()) + 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()) + if( !DevelControl::AccessibilityReadingPausedSignal( control ).Empty() ) DevelControl::AccessibilityReadingPausedSignal( control ).Emit(); } 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()) + if( !DevelControl::AccessibilityReadingResumedSignal( control ).Empty() ) DevelControl::AccessibilityReadingResumedSignal( control ).Emit(); } 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()) + if( !DevelControl::AccessibilityReadingCancelledSignal( control ).Empty() ) DevelControl::AccessibilityReadingCancelledSignal( control ).Emit(); } 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()) + if(!DevelControl::AccessibilityReadingStoppedSignal( control ).Empty()) DevelControl::AccessibilityReadingStoppedSignal( control ).Emit(); + } else + { + ret = false; } - - return true; + return ret; } /** @@ -457,6 +483,16 @@ Control::Impl::Impl( Control& controlImpl ) Control::Impl::~Impl() { + for( auto&& iter : mVisuals ) + { + StopObservingVisual( iter->visual ); + } + + for( auto&& iter : mRemoveVisuals ) + { + StopObservingVisual( iter->visual ); + } + AccessibilityDeregister(); // All gesture detectors will be destroyed so no need to disconnect. delete mStartingPinchScale; @@ -1205,13 +1241,21 @@ 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; } } @@ -1520,59 +1564,47 @@ void Control::Impl::RecreateChangedVisuals( Dictionary& stateVisu const std::string& visualName = (*iter).key; const Property::Map& toMap = (*iter).entry; - // is it a candidate for re-creation? - bool recreate = false; - - 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); } } } @@ -1800,6 +1832,19 @@ void Control::Impl::ClearShadow() 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() { if(!mIsEmittingResourceReadySignal) @@ -2010,12 +2055,14 @@ Dali::Accessibility::States Control::Impl::AccessibleImpl::CalculateStates() 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] = self.GetCurrentProperty< bool >( Actor::Property::VISIBLE ); + 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 >(); + 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; } @@ -2086,14 +2133,13 @@ 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() { + std::string focusBorderImagePath(AssetManager::GetDaliImagePath()); + focusBorderImagePath += "/keyboard_focus.9.png"; // 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 ); + // keyboard focusable actors + auto actor = Toolkit::ImageView::New( focusBorderImagePath ); actor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); DevelControl::AppendAccessibilityAttribute( actor, "highlight", "" ); actor.SetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_ANIMATED, true); @@ -2151,11 +2197,6 @@ bool Control::Impl::AccessibleImpl::ClearHighlight() return false; } -int Control::Impl::AccessibleImpl::GetHighlightIndex() -{ - return 0; -} - std::string Control::Impl::AccessibleImpl::GetActionName( size_t index ) { if ( index >= GetActionCount() ) return "";