Added a pblic Control Devel API GetVisualResourceStatus. 26/141026/17
authorUmar <m.umar@partner.samsung.com>
Thu, 27 Jul 2017 14:53:42 +0000 (15:53 +0100)
committerUmar <m.umar@partner.samsung.com>
Thu, 2 Nov 2017 19:50:18 +0000 (19:50 +0000)
The purpose was to check whether Visual resource loading on given control was successful or not.

Change-Id: Ib8af77e84180d8a04171a93022ba6c3751519158

24 files changed:
automated-tests/src/dali-toolkit/utc-Dali-Control.cpp
dali-toolkit/devel-api/controls/control-devel.cpp
dali-toolkit/devel-api/controls/control-devel.h
dali-toolkit/devel-api/visual-factory/visual-base.h
dali-toolkit/internal/controls/control/control-data-impl.cpp
dali-toolkit/internal/controls/control/control-data-impl.h
dali-toolkit/internal/controls/image-view/image-view-impl.h
dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp
dali-toolkit/internal/visuals/animated-image/animated-image-visual.cpp
dali-toolkit/internal/visuals/border/border-visual.cpp
dali-toolkit/internal/visuals/color/color-visual.cpp
dali-toolkit/internal/visuals/gradient/gradient-visual.cpp
dali-toolkit/internal/visuals/image/image-visual.cpp
dali-toolkit/internal/visuals/image/image-visual.h
dali-toolkit/internal/visuals/mesh/mesh-visual.cpp
dali-toolkit/internal/visuals/npatch/npatch-visual.cpp
dali-toolkit/internal/visuals/primitive/primitive-visual.cpp
dali-toolkit/internal/visuals/svg/svg-visual.cpp
dali-toolkit/internal/visuals/text/text-visual.cpp
dali-toolkit/internal/visuals/visual-base-data-impl.cpp
dali-toolkit/internal/visuals/visual-base-data-impl.h
dali-toolkit/internal/visuals/visual-base-impl.cpp
dali-toolkit/internal/visuals/visual-base-impl.h
dali-toolkit/internal/visuals/wireframe/wireframe-visual.cpp

index bfb390c..53b3fbd 100644 (file)
@@ -834,8 +834,11 @@ int UtcDaliControlResourcesReady(void)
   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, smallVisual );
 
   actor.SetSize( 200.f, 200.f );
+
+  Toolkit::Visual::ResourceStatus resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL);
   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
+  DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION );
 
   Stage::GetCurrent().Add( actor );
   application.SendNotification();
@@ -846,8 +849,10 @@ int UtcDaliControlResourcesReady(void)
   application.SendNotification();
   application.Render();
 
+  resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL);
   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
+  DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION );
 
   Visual::Base largeVisual = factory.CreateVisual( propertyMapLarge );
   largeVisual.SetName("largeVisual");
@@ -857,11 +862,24 @@ int UtcDaliControlResourcesReady(void)
 
   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, largeVisual, false );
 
+  resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL2);
+  DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION );
+
   application.SendNotification();
-  application.Render();
 
+  resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL2);
   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
+  DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION );
+
+  dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL2, true );
+
+  DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
+
+  application.SendNotification();
+
+  resourceStatus = DevelControl::GetVisualResourceStatus(dummyImpl, DummyControl::Property::TEST_VISUAL2);
+  DALI_TEST_EQUALS( static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION );
 
   END_TEST;
 }
index 1276e1e..187e518 100644 (file)
@@ -83,6 +83,12 @@ bool IsVisualEnabled( const Internal::Control& control, Dali::Property::Index in
   return controlDataImpl.IsVisualEnabled( index );
 }
 
+Toolkit::Visual::ResourceStatus GetVisualResourceStatus( const Internal::Control& control, Dali::Property::Index index )
+{
+  const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
+  return controlDataImpl.GetVisualResourceStatus( index );
+}
+
 Dali::Animation CreateTransition( Internal::Control& control, const Toolkit::TransitionData& handle )
 {
   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
index f6fd3a4..817efd0 100644 (file)
@@ -20,6 +20,7 @@
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/public-api/controls/control.h>
+#include <dali-toolkit/devel-api/visual-factory/visual-base.h>
 
 namespace Dali
 {
@@ -214,6 +215,15 @@ DALI_IMPORT_API void EnableVisual( Internal::Control& control, Dali::Property::I
 DALI_IMPORT_API bool IsVisualEnabled( const Internal::Control& control, Dali::Property::Index index );
 
 /**
+ * @brief Get the loading state of the visual resource.
+ *
+ * @param[in] control The control
+ * @param[in] index The Property index of the visual
+ * @return Return the loading status (PREPARING, READY and FAILED) of visual resource
+ */
+DALI_IMPORT_API Toolkit::Visual::ResourceStatus GetVisualResourceStatus( const Internal::Control& control, Dali::Property::Index index );
+
+/**
  * @brief Create a transition effect on the control.
  *
  * Only generates an animation if the properties described in the transition
index fd00cd0..da41237 100644 (file)
@@ -37,6 +37,14 @@ class Base;
 
 namespace Visual
 {
+
+enum class ResourceStatus
+{
+  PREPARING,
+  READY,
+  FAILED
+};
+
 /**
  * @brief A Visual provides a renderer for drawing a control component. A control may have multiple visuals.
  *
index 4f26d11..6ff1efb 100644 (file)
@@ -686,6 +686,18 @@ bool Control::Impl::IsResourceReady() const
   return true;
 }
 
+Toolkit::Visual::ResourceStatus Control::Impl::GetVisualResourceStatus( Property::Index index ) const
+{
+  RegisteredVisualContainer::Iterator iter;
+  if ( FindVisual( index, mVisuals, iter ) )
+  {
+    const Toolkit::Visual::Base visual = (*iter)->visual;
+    const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual );
+    return visualImpl.GetResourceStatus( );
+  }
+
+  return Toolkit::Visual::ResourceStatus::PREPARING;
+}
 
 Dali::Animation Control::Impl::CreateTransition( const Toolkit::TransitionData& handle )
 {
index 2e1d4c9..f6a3288 100644 (file)
@@ -179,6 +179,11 @@ public:
   void StartObservingVisual( Toolkit::Visual::Base& visual);
 
   /**
+   * @copydoc Dali::Toolkit::DevelControl::GetVisualResourceStatus()
+   */
+  Toolkit::Visual::ResourceStatus GetVisualResourceStatus( Property::Index index ) const;
+
+  /**
    * @copydoc Dali::Toolkit::DevelControl::CreateTransition()
    */
   Dali::Animation CreateTransition( const Toolkit::TransitionData& transitionData );
index f335ce7..32867bf 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_TOOLKIT_INTERNAL_IMAGE_VIEW_H__
 
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 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.
index 638cf37..bb84a5b 100644 (file)
@@ -1205,7 +1205,7 @@ void TextEditor::OnInitialize()
 
   // Creates a background visual. Even if the color is transparent it updates the stencil.
   mStencil.SetProperty( Toolkit::Control::Property::BACKGROUND,
-                        Property::Map().Add( Toolkit::Visual::Property::TYPE, Visual::COLOR ).
+                        Property::Map().Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR ).
                         Add( ColorVisual::Property::MIX_COLOR, Color::TRANSPARENT ) );
 
   // Enable the clipping property.
index 4f4b441..9ac0b90 100644 (file)
@@ -449,7 +449,7 @@ void AnimatedImageVisual::StartFirstFrame( TextureSet& textureSet )
   mFrameDelayTimer.Start();
 
   DALI_LOG_INFO(gAnimImgLogFilter,Debug::Concise,"ResourceReady()\n");
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 TextureSet AnimatedImageVisual::PrepareTextureSet()
index da0ec77..2de039b 100644 (file)
@@ -217,7 +217,7 @@ void BorderVisual::DoSetOnStage( Actor& actor )
   actor.AddRenderer( mImpl->mRenderer );
 
   // Border Visual Generated and ready to display
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void BorderVisual::DoCreatePropertyMap( Property::Map& map ) const
index f1dfc4d..2d8008f 100644 (file)
@@ -131,7 +131,7 @@ void ColorVisual::DoSetOnStage( Actor& actor )
   actor.AddRenderer( mImpl->mRenderer );
 
   // Color Visual generated and ready to display
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void ColorVisual::DoCreatePropertyMap( Property::Map& map ) const
index 7c3f791..2686a50 100644 (file)
@@ -280,7 +280,7 @@ void GradientVisual::DoSetOnStage( Actor& actor )
   actor.AddRenderer( mImpl->mRenderer );
 
   // Gradient Visual generated and ready to display
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void GradientVisual::DoCreatePropertyMap( Property::Map& map ) const
index ea3c49c..59cccd5 100644 (file)
@@ -869,7 +869,7 @@ void ImageVisual::DoSetOnStage( Actor& actor )
     mPlacementActor.Reset();
 
     // Image loaded and ready to display
-    ResourceReady();
+    ResourceReady( Toolkit::Visual::ResourceStatus::READY );
   }
 }
 
@@ -927,6 +927,7 @@ void ImageVisual::DoCreatePropertyMap( Property::Map& map ) const
   map.Insert( Toolkit::ImageVisual::Property::WRAP_MODE_V, mWrapModeV );
 
   map.Insert( Toolkit::ImageVisual::Property::ATLASING, mAttemptAtlasing );
+
   if( mMaskingData != NULL )
   {
     map.Insert( Toolkit::ImageVisual::Property::ALPHA_MASK_URL, mMaskingData->mAlphaMaskUrl.GetUrl() );
@@ -963,6 +964,12 @@ void ImageVisual::OnSetTransform()
   }
 }
 
+bool ImageVisual::IsResourceReady() const
+{
+  return ( mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::READY ||
+           mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::FAILED );
+}
+
 Shader ImageVisual::GetImageShader( VisualFactoryCache& factoryCache, bool atlasing, bool defaultTextureWrapping )
 {
   Shader shader;
@@ -1035,6 +1042,7 @@ void ImageVisual::UploadCompleted()
 // From Texture Manager
 void ImageVisual::UploadComplete( bool loadingSuccess, int32_t textureId, TextureSet textureSet, bool usingAtlas, const Vector4& atlasRectangle )
 {
+  Toolkit::Visual::ResourceStatus resourceStatus;
   Actor actor = mPlacementActor.GetHandle();
   if( actor )
   {
@@ -1054,6 +1062,8 @@ void ImageVisual::UploadComplete( bool loadingSuccess, int32_t textureId, Textur
         sampler.SetWrapMode(  mWrapModeU, mWrapModeV  );
         textureSet.SetSampler( 0u, sampler );
         mImpl->mRenderer.SetTextures(textureSet);
+
+        resourceStatus = Toolkit::Visual::ResourceStatus::READY;
       }
       else
       {
@@ -1063,9 +1073,11 @@ void ImageVisual::UploadComplete( bool loadingSuccess, int32_t textureId, Textur
         mImpl->mRenderer.SetTextures( textureSet );
 
         ApplyImageToSampler( brokenImage );
+
+        resourceStatus = Toolkit::Visual::ResourceStatus::FAILED;
       }
       // Image loaded and ready to display
-      ResourceReady();
+      ResourceReady( resourceStatus );
     }
   }
   mLoading = false;
index e485904..729185a 100644 (file)
@@ -229,6 +229,11 @@ protected:
    */
   virtual void OnSetTransform();
 
+  /**
+   * @copydoc Visual::Base::IsResourceReady
+   */
+  virtual bool IsResourceReady() const;
+
 public:
 
   /**
index 92d30ab..0bea8c6 100644 (file)
@@ -520,7 +520,7 @@ void MeshVisual::DoSetOnStage( Actor& actor )
   actor.AddRenderer( mImpl->mRenderer );
 
   // Mesh loaded and ready to display
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void MeshVisual::DoCreatePropertyMap( Property::Map& map ) const
index df9b2ff..d5976dd 100755 (executable)
@@ -316,7 +316,7 @@ void NPatchVisual::DoSetOnStage( Actor& actor )
   actor.AddRenderer( mImpl->mRenderer );
 
   // npatch loaded and ready to display
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void NPatchVisual::DoSetOffStage( Actor& actor )
index 51a9b29..28afa6a 100644 (file)
@@ -420,7 +420,7 @@ void PrimitiveVisual::DoSetOnStage( Actor& actor )
   actor.AddRenderer( mImpl->mRenderer );
 
   // Primitive generated and ready to display
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void PrimitiveVisual::DoCreatePropertyMap( Property::Map& map ) const
index 95a7786..a9d0c0c 100644 (file)
@@ -112,7 +112,7 @@ void SvgVisual::DoSetOnStage( Actor& actor )
   mPlacementActor = actor;
 
   // SVG visual needs it's size set before it can be rasterized hence set ResourceReady once on stage
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void SvgVisual::DoSetOffStage( Actor& actor )
@@ -233,7 +233,7 @@ void SvgVisual::ApplyRasterizedImage( PixelData rasterizedPixelData )
     }
 
    // Svg loaded and ready to display
-   ResourceReady();
+   ResourceReady( Toolkit::Visual::ResourceStatus::READY );
   }
 }
 
index d70edce..f5817ea 100755 (executable)
@@ -627,7 +627,7 @@ void TextVisual::UpdateRenderer()
     }
 
     // Nothing else to do if the relayout size is zero.
-    ResourceReady();
+    ResourceReady( Toolkit::Visual::ResourceStatus::READY );
     return;
   }
 
@@ -703,7 +703,7 @@ void TextVisual::UpdateRenderer()
       control.AddRenderer( mImpl->mRenderer );
 
       // Text rendered and ready to display
-      ResourceReady();
+      ResourceReady( Toolkit::Visual::ResourceStatus::READY );
     }
   }
 }
index 27ba4a0..374ff68 100644 (file)
@@ -125,7 +125,7 @@ Internal::Visual::Base::Impl::Impl()
   mMixColorIndex( Property::INVALID_INDEX ),
   mOpacityIndex( Property::INVALID_INDEX ),
   mFlags( 0 ),
-  mResourceReady( false )
+  mResourceStatus( Toolkit::Visual::ResourceStatus::PREPARING )
 {
 }
 
index 1d92f6e..79c099c 100644 (file)
@@ -125,7 +125,7 @@ struct Base::Impl
   Property::Index mMixColorIndex;
   Property::Index mOpacityIndex;
   int             mFlags;
-  bool            mResourceReady:1;
+  Toolkit::Visual::ResourceStatus  mResourceStatus;
 };
 
 } // namespace Visual
index bd31fe7..f486a0f 100644 (file)
@@ -414,25 +414,28 @@ void Visual::Base::RemoveResourceObserver( Visual::ResourceObserver& observer )
   mImpl->mResourceObserver = NULL;
 }
 
-void Visual::Base::ResourceReady()
+void Visual::Base::ResourceReady(Toolkit::Visual::ResourceStatus resourceStatus)
 {
-  if( mImpl->mResourceReady )
+  if( mImpl->mResourceStatus != resourceStatus )
   {
-    // only inform the observer the first time the resource is ready
-    return;
-  }
-  mImpl->mResourceReady = true;
+    mImpl->mResourceStatus = resourceStatus;
 
-  if( mImpl->mResourceObserver )
-  {
-    // observer is currently a control impl
-    mImpl->mResourceObserver->ResourceReady( *this );
+    if( mImpl->mResourceObserver )
+    {
+      // observer is currently a control impl
+      mImpl->mResourceObserver->ResourceReady( *this );
+    }
   }
 }
 
 bool Visual::Base::IsResourceReady() const
 {
-  return mImpl->mResourceReady;
+  return ( mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::READY );
+}
+
+Toolkit::Visual::ResourceStatus Visual::Base::GetResourceStatus() const
+{
+  return mImpl->mResourceStatus;
 }
 
 Renderer Visual::Base::GetRenderer()
index c450d91..f9534e4 100644 (file)
@@ -226,13 +226,19 @@ public:
   /**
    * @brief Called when the visuals resources are loaded / ready
    */
-  void ResourceReady();
+  void ResourceReady( Toolkit::Visual::ResourceStatus resourceStatus );
 
   /**
    * @brief Called when the visuals resources are loaded / ready
    * @return true if ready, false otherwise
    */
-  bool IsResourceReady() const;
+  virtual bool IsResourceReady() const;
+
+  /**
+   * @brief Get the loading state of the visual resource
+   * @return Return the loading status (PREPARING, READY and FAILED) of visual resource
+   */
+  Toolkit::Visual::ResourceStatus GetResourceStatus() const;
 
 protected:
 
index 1c79d72..7d6e6e6 100644 (file)
@@ -176,7 +176,7 @@ void WireframeVisual::DoSetOnStage( Actor& actor )
   actor.AddRenderer( mImpl->mRenderer );
 
   // Wireframe generated and ready to display
-  ResourceReady();
+  ResourceReady( Toolkit::Visual::ResourceStatus::READY );
 }
 
 void WireframeVisual::InitializeRenderer()