From: Adeel Kazmi Date: Mon, 16 Nov 2015 10:55:34 +0000 (+0000) Subject: (ImageView) Restore erroneously removed APIs & Fix SetImage behaviour X-Git-Tag: dali_1.1.11~11 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=76dead7c21ac57622ca1a70c156efddc017059cf;hp=26e308db77c286ccd0be0e7627b6cebfa2f9cb67 (ImageView) Restore erroneously removed APIs & Fix SetImage behaviour 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 --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp index e40862c..f817d08 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp @@ -505,3 +505,49 @@ int UtcDaliImageViewSetImageN(void) 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; +} diff --git a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp index 59a3b33..e47d1cd 100644 --- a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp +++ b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp @@ -66,7 +66,9 @@ Toolkit::ImageView ImageView::New() 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(); @@ -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 ); + + RelayoutRequest(); } } void ImageView::SetImage( Property::Map map ) { + mUrl.clear(); + mImage.Reset(); mPropertyMap = map; Actor self = Self(); @@ -101,11 +107,15 @@ void ImageView::SetImage( Property::Map map ) } mImageSize = ImageDimensions( width, height ); + + RelayoutRequest(); } 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(); @@ -123,6 +133,8 @@ void ImageView::SetImage( const std::string& url, ImageDimensions size ) Actor self = Self(); Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mUrl, mImageSize ); + + RelayoutRequest(); } } diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp index 0a25ffa..6b2e22e 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp @@ -212,6 +212,13 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& { 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 ) { @@ -271,7 +278,13 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& { 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 ) diff --git a/dali-toolkit/public-api/controls/image-view/image-view.cpp b/dali-toolkit/public-api/controls/image-view/image-view.cpp index 8c408e9..6408c19 100644 --- a/dali-toolkit/public-api/controls/image-view/image-view.cpp +++ b/dali-toolkit/public-api/controls/image-view/image-view.cpp @@ -65,8 +65,14 @@ ImageView ImageView::New( Image image ) 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 ); @@ -83,8 +89,12 @@ void ImageView::SetImage( Image 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 ); } diff --git a/dali-toolkit/public-api/controls/image-view/image-view.h b/dali-toolkit/public-api/controls/image-view/image-view.h index 4a7545e..f3b5416 100644 --- a/dali-toolkit/public-api/controls/image-view/image-view.h +++ b/dali-toolkit/public-api/controls/image-view/image-view.h @@ -77,32 +77,47 @@ public: * @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. * - * 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 ); /** - * @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. + * + * @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 @@ -146,17 +161,27 @@ public: 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. + */ + 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. */ - void SetImage( const std::string& url, - ImageDimensions size = ImageDimensions() ); + void SetImage( const std::string& url, ImageDimensions size ); /** * @deprecated Gets the Image