(ImageView) Restore erroneously removed APIs & Fix SetImage behaviour 26/51826/7
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Mon, 16 Nov 2015 10:55:34 +0000 (10:55 +0000)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Mon, 16 Nov 2015 14:00:41 +0000 (14:00 +0000)
SetImage Issues fixed:
- SetImage should NOT show an error image if empty/NULL. It should show nothing as per API description.
- Changing between types (Image type to URL, property-map to Image etc.) did not work properly.
- Ensure a RelayoutRequest is done when SetImage is called so that our size is renegotiated.

Change-Id: I066130a697b7791f791b5b9b63733ec482ceaed6

automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp
dali-toolkit/internal/controls/image-view/image-view-impl.cpp
dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp
dali-toolkit/public-api/controls/image-view/image-view.cpp
dali-toolkit/public-api/controls/image-view/image-view.h

index e40862c..f817d08 100644 (file)
@@ -505,3 +505,49 @@ int UtcDaliImageViewSetImageN(void)
 
   END_TEST;
 }
 
   END_TEST;
 }
+
+int UtcDaliImageViewSetImageTypeChangesP(void)
+{
+  ToolkitTestApplication application;
+
+  ImageView imageView = ImageView::New();
+
+
+  std::string url;
+  Property::Map map;
+
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set a URL
+  imageView.SetImage( "TEST_URL" );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( value.Get( url ) );   // Value should NOT be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set an empty Image
+  imageView.SetImage( Image() );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set an Image
+  ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+  imageView.SetImage( image1 );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( value.Get( map ) );   // Value should NOT be empty
+
+  // Set an empty URL
+  imageView.SetImage( "" );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  END_TEST;
+}
index 59a3b33..e47d1cd 100644 (file)
@@ -66,7 +66,9 @@ Toolkit::ImageView ImageView::New()
 
 void ImageView::SetImage( Image image )
 {
 
 void ImageView::SetImage( Image image )
 {
-  if( mImage != image )
+  if( ( mImage != image ) ||
+      ! mUrl.empty()      ||   // If we're changing from a URL type to an Image type
+      ! mPropertyMap.Empty() ) // If we're changing from a property map type to an Image type
   {
     mUrl.clear();
     mPropertyMap.Clear();
   {
     mUrl.clear();
     mPropertyMap.Clear();
@@ -76,11 +78,15 @@ void ImageView::SetImage( Image image )
     Actor self = Self();
     Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, image );
     mImageSize = image ? ImageDimensions( image.GetWidth(), image.GetHeight() ) : ImageDimensions( 0, 0 );
     Actor self = Self();
     Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, image );
     mImageSize = image ? ImageDimensions( image.GetWidth(), image.GetHeight() ) : ImageDimensions( 0, 0 );
+
+    RelayoutRequest();
   }
 }
 
 void ImageView::SetImage( Property::Map map )
 {
   }
 }
 
 void ImageView::SetImage( Property::Map map )
 {
+  mUrl.clear();
+  mImage.Reset();
   mPropertyMap = map;
 
   Actor self = Self();
   mPropertyMap = map;
 
   Actor self = Self();
@@ -101,11 +107,15 @@ void ImageView::SetImage( Property::Map map )
   }
 
   mImageSize = ImageDimensions( width, height );
   }
 
   mImageSize = ImageDimensions( width, height );
+
+  RelayoutRequest();
 }
 
 void ImageView::SetImage( const std::string& url, ImageDimensions size )
 {
 }
 
 void ImageView::SetImage( const std::string& url, ImageDimensions size )
 {
-  if( mUrl != url )
+  if( ( mUrl != url ) ||
+      mImage          ||       // If we're changing from an Image type to a URL type
+      ! mPropertyMap.Empty() ) // If we're changing from a property map type to a URL type
   {
     mImage.Reset();
     mPropertyMap.Clear();
   {
     mImage.Reset();
     mPropertyMap.Clear();
@@ -123,6 +133,8 @@ void ImageView::SetImage( const std::string& url, ImageDimensions size )
 
     Actor self = Self();
     Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mUrl, mImageSize );
 
     Actor self = Self();
     Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mUrl, mImageSize );
+
+    RelayoutRequest();
   }
 }
 
   }
 }
 
index 0a25ffa..6b2e22e 100644 (file)
@@ -212,6 +212,13 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor&
 {
   if( renderer )
   {
 {
   if( renderer )
   {
+    if( ! image )
+    {
+      // If the image is empty, then reset the renderer and return
+      renderer.RemoveAndReset( actor );
+      return;
+    }
+
     NinePatchImage npatchImage = NinePatchImage::DownCast( image );
     if( npatchImage )
     {
     NinePatchImage npatchImage = NinePatchImage::DownCast( image );
     if( npatchImage )
     {
@@ -271,7 +278,13 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor&
 {
   if( renderer )
   {
 {
   if( renderer )
   {
-    if( NinePatchImage::IsNinePatchUrl( url ) )
+    if( url.empty() )
+    {
+      // If the URL is empty, then reset the renderer and return
+      renderer.RemoveAndReset( actor );
+      return;
+    }
+    else if( NinePatchImage::IsNinePatchUrl( url ) )
     {
       NPatchRenderer* rendererPtr = dynamic_cast< NPatchRenderer* >( &GetImplementation( renderer ) );
       if( rendererPtr )
     {
       NPatchRenderer* rendererPtr = dynamic_cast< NPatchRenderer* >( &GetImplementation( renderer ) );
       if( rendererPtr )
index 8c408e9..6408c19 100644 (file)
@@ -65,8 +65,14 @@ ImageView ImageView::New( Image image )
   return ImageView( imageView );
 }
 
   return ImageView( imageView );
 }
 
-ImageView ImageView::New( const std::string& url,
-                          ImageDimensions size)
+ImageView ImageView::New( const std::string& url )
+{
+  ImageView imageView = Internal::ImageView::New();
+  imageView.SetImage( url, ImageDimensions() );
+  return imageView;
+}
+
+ImageView ImageView::New( const std::string& url, ImageDimensions size )
 {
   ImageView imageView = Internal::ImageView::New();
   imageView.SetImage( url, size );
 {
   ImageView imageView = Internal::ImageView::New();
   imageView.SetImage( url, size );
@@ -83,8 +89,12 @@ void ImageView::SetImage( Image image )
   Dali::Toolkit::GetImpl( *this ).SetImage( image );
 }
 
   Dali::Toolkit::GetImpl( *this ).SetImage( image );
 }
 
-void ImageView::SetImage( const std::string& url,
-                          ImageDimensions size )
+void ImageView::SetImage( const std::string& url )
+{
+  Dali::Toolkit::GetImpl( *this ).SetImage( url, ImageDimensions() );
+}
+
+void ImageView::SetImage( const std::string& url, ImageDimensions size )
 {
   Dali::Toolkit::GetImpl( *this ).SetImage( url, size );
 }
 {
   Dali::Toolkit::GetImpl( *this ).SetImage( url, size );
 }
index 4a7545e..f3b5416 100644 (file)
@@ -77,32 +77,47 @@ public:
    * @brief Create an initialized ImageView.
    *
    * @return A handle to a newly allocated Dali ImageView.
    * @brief Create an initialized ImageView.
    *
    * @return A handle to a newly allocated Dali ImageView.
+   *
+   * @note ImageView will not display anything.
    */
   static ImageView New();
 
   /**
    * @brief Create an initialized ImageView from an Image.
    *
    */
   static ImageView New();
 
   /**
    * @brief Create an initialized ImageView from an Image.
    *
-   * If the handle is empty, ImageView will display nothing
+   * If the handle is empty, ImageView will not display anything.
+   *
    * @param[in] image The Image to display.
    * @return A handle to a newly allocated ImageView.
    */
   static ImageView New( Image image );
 
   /**
    * @param[in] image The Image to display.
    * @return A handle to a newly allocated ImageView.
    */
   static ImageView New( Image image );
 
   /**
-   * @brief Create an initialized ImageView from an Image resource url
+   * @brief Create an initialized ImageView from an Image resource URL
    *
    *
-   * @note A valid size is preferable for efficiency.
-   *       However, do not set size that is bigger than the actual image size, as the up-scaling is not available,
-   *       the content of the area not covered by actual image is undefined, it will not be cleared.
+   * If the string is empty, ImageView will not display anything.
+   *
+   * @param[in] url The url of the image resource to display.
+   * @return A handle to a newly allocated ImageView.
+   */
+  static ImageView New( const std::string& url );
+
+  /**
+   * @brief Create an initialized ImageView from an Image resource URL
+   *
+   * If the string is empty, ImageView will not display anything.
+   *
+   * @since DALi 1.1.10
    *
    *
-   * If the string is empty, ImageView will display nothing
    * @param[in] url The url of the image resource to display.
    * @param [in] size The width and height to fit the loaded image to.
    * @return A handle to a newly allocated ImageView.
    * @param[in] url The url of the image resource to display.
    * @param [in] size The width and height to fit the loaded image to.
    * @return A handle to a newly allocated ImageView.
+   *
+   * @note A valid size is preferable for efficiency.
+   *       However, do not set a size that is bigger than the actual image size, as up-scaling is not available.
+   *       The content of the area not covered by the actual image is undefined and will not be cleared.
    */
    */
-  static ImageView New( const std::string& url,
-                        ImageDimensions size = ImageDimensions() );
+  static ImageView New( const std::string& url, ImageDimensions size );
 
   /**
    * @brief Destructor
 
   /**
    * @brief Destructor
@@ -146,17 +161,27 @@ public:
   void SetImage( Image image );
 
   /**
   void SetImage( Image image );
 
   /**
-   * @brief Sets this ImageView from an Image url
+   * @brief Sets this ImageView from an Image URL
    *
    *
-   * If the handle is empty, ImageView will display nothing
+   * If the URL is empty, ImageView will not display anything.
    *
    * @since DALi 1.1.4
    *
    * @param[in] url The Image resource to display.
    *
    * @since DALi 1.1.4
    *
    * @param[in] url The Image resource to display.
+   */
+  void SetImage( const std::string& url );
+
+  /**
+   * @brief Sets this ImageView from an Image URL
+   *
+   * If the URL is empty, ImageView will not display anything.
+   *
+   * @since DALi 1.1.10
+   *
+   * @param[in] url A URL to the image resource to display.
    * @param [in] size The width and height to fit the loaded image to.
    */
    * @param [in] size The width and height to fit the loaded image to.
    */
-  void SetImage( const std::string& url,
-                 ImageDimensions size = ImageDimensions() );
+  void SetImage( const std::string& url, ImageDimensions size );
 
   /**
    * @deprecated Gets the Image
 
   /**
    * @deprecated Gets the Image