From c5224d3802b89aa7e9c043bf4e1bc0d8056f1121 Mon Sep 17 00:00:00 2001 From: Agnelo Vaz Date: Wed, 2 Aug 2017 18:00:53 +0100 Subject: [PATCH] ImageView ResourceReady logic update Change-Id: I9cedf4f0edead2fb492a9431187cf88d9012da64 --- .../dali-toolkit-test-utils/dummy-control.cpp | 11 +++++ .../dali-toolkit-test-utils/dummy-control.h | 9 ++++ .../src/dali-toolkit/utc-Dali-ImageView.cpp | 52 ++++++++++++++++++++++ dali-toolkit/devel-api/controls/control-devel.h | 2 + .../controls/image-view/image-view-impl.cpp | 14 +----- .../internal/controls/image-view/image-view-impl.h | 1 - 6 files changed, 75 insertions(+), 14 deletions(-) diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp index 0d54096..d0a9d03 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dummy-control.cpp @@ -265,6 +265,11 @@ void Impl::DummyControl::SetLayout( Property::Index visualIndex, Property::Map& void Impl::DummyControl::OnRelayout( const Vector2& size, RelayoutContainer& container ) { + if ( mRelayoutCallback ) + { + mRelayoutCallback( size ); // Execute callback if set + } + Property::Map emptyMap; for( VisualIndices::iterator iter = mRegisteredVisualIndices.begin(); iter != mRegisteredVisualIndices.end() ; ++iter ) @@ -286,6 +291,12 @@ void Impl::DummyControl::OnRelayout( const Vector2& size, RelayoutContainer& con } } +void Impl::DummyControl::SetRelayoutCallback( RelayoutCallbackFunc callback ) +{ + mRelayoutCallback = callback; +} + + DummyControl DummyControl::New( bool override ) { DummyControl control; diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dummy-control.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dummy-control.h index 7b43bd0..d0387d9 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dummy-control.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/dummy-control.h @@ -21,6 +21,9 @@ // INTERNAL INCLUDES #include +// EXTERNAL INCLUDES +#include + namespace Dali { @@ -132,10 +135,14 @@ class DummyControl : public Toolkit::DummyControlImpl { public: + typedef std::function RelayoutCallbackFunc; + static Toolkit::DummyControl New(); void SetLayout( Property::Index visualIndex, Property::Map& map ); + void SetRelayoutCallback( RelayoutCallbackFunc callback ); + private: DummyControl(); @@ -200,6 +207,8 @@ public: bool keyInputFocusLost; Property::Map mLayouts; + RelayoutCallbackFunc mRelayoutCallback; + }; } // namespace Impl diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp index e8198ca..31909d9 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp @@ -30,6 +30,8 @@ #include #include +#include "dummy-control.h" + using namespace Dali; using namespace Toolkit; @@ -831,6 +833,7 @@ int UtcDaliImageViewSetImageOffstageP(void) } bool gResourceReadySignalFired = false; +Vector3 gNaturalSize; void ResourceReadySignal( Control control ) { @@ -1354,3 +1357,52 @@ int UtcDaliImageViewReplaceImage(void) END_TEST; } + +void OnRelayoutOverride( Size size ) +{ + gNaturalSize = size; // Size Relayout is using +} + +int UtcDaliImageViewReplaceImageAndGetNaturalSize(void) +{ + ToolkitTestApplication application; + + // Check ImageView with background and main image, to ensure both visuals are marked as loaded + ImageView imageView = ImageView::New( TEST_IMAGE_1 ); + imageView.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); + + DummyControl dummyControl = DummyControl::New( true ); + Impl::DummyControl& dummyImpl = static_cast(dummyControl.GetImplementation()); + dummyControl.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); + + dummyControl.Add( imageView ); + dummyImpl.SetRelayoutCallback( &OnRelayoutOverride ); + Stage::GetCurrent().Add( dummyControl ); + + application.SendNotification(); + application.Render(); + + // loading started, this waits for the loader thread for max 30 seconds + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + DALI_TEST_EQUALS( gNaturalSize.width, 1024.0f, TEST_LOCATION ); + DALI_TEST_EQUALS( gNaturalSize.height, 1024.0f, TEST_LOCATION ); + + gNaturalSize = Vector3::ZERO; + + imageView.SetImage(gImage_600_RGB); + + // Waiting for resourceReady so SendNotifcation not called here. + + // loading started, this waits for the loader thread for max 30 seconds + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + // Trigger a potential relayout + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( gNaturalSize.width, 600.0f, TEST_LOCATION ); + DALI_TEST_EQUALS( gNaturalSize.height, 600.0f, TEST_LOCATION ); + + END_TEST; +} diff --git a/dali-toolkit/devel-api/controls/control-devel.h b/dali-toolkit/devel-api/controls/control-devel.h index 233ef12..eb58f91 100644 --- a/dali-toolkit/devel-api/controls/control-devel.h +++ b/dali-toolkit/devel-api/controls/control-devel.h @@ -123,6 +123,8 @@ typedef Signal ResourceReadySignalType; * by a control are loaded and ready. * Most resources are only loaded when the control is placed on stage. * + * @note A RelayoutRequest is queued by Control before this signal is emitted + * * A callback of the following type may be connected: * @code * void YourCallbackName( Control control ); 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 491e697..72faf14 100644 --- a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp +++ b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp @@ -64,8 +64,7 @@ DALI_TYPE_REGISTRATION_END() using namespace Dali; ImageView::ImageView() -: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), - mRelayoutRequired(true) +: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ) { } @@ -117,7 +116,6 @@ void ImageView::SetImage( const Property::Map& map ) mPropertyMap = map; mUrl.clear(); mImage.Reset(); - mRelayoutRequired = true; Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( mPropertyMap ); // Don't set mVisual until it is ready and shown. Getters will still use current visual. @@ -135,7 +133,6 @@ void ImageView::SetImage( const std::string& url, ImageDimensions size ) mUrl = url; mImage.Reset(); mPropertyMap.Clear(); - mRelayoutRequired = true; // Don't set mVisual until it is ready and shown. Getters will still use current visual. Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( url, size ); @@ -218,9 +215,6 @@ void ImageView::OnRelayout( const Vector2& size, RelayoutContainer& container ) { Control::OnRelayout( size, container ); - // If visual is being replaced then mVisual will be the replacement visual even if not ready. - mVisual = DevelControl::GetVisual( *this, Toolkit::ImageView::Property::IMAGE ); - if( mVisual ) { // Pass in an empty map which uses default transform values meaning our visual fills the control @@ -233,12 +227,6 @@ void ImageView::OnResourceReady( Toolkit::Control control ) { // Visual ready so update visual attached to this ImageView, following call to RelayoutRequest will use this visual. mVisual = DevelControl::GetVisual( *this, Toolkit::ImageView::Property::IMAGE ); - - if( mRelayoutRequired) - { - mRelayoutRequired = false; - RelayoutRequest(); - } } /////////////////////////////////////////////////////////// diff --git a/dali-toolkit/internal/controls/image-view/image-view-impl.h b/dali-toolkit/internal/controls/image-view/image-view-impl.h index dc449e9..f335ce7 100644 --- a/dali-toolkit/internal/controls/image-view/image-view-impl.h +++ b/dali-toolkit/internal/controls/image-view/image-view-impl.h @@ -166,7 +166,6 @@ private: std::string mUrl; ///< the url for the image if the image came from a URL, empty otherwise Image mImage; ///< the Image if the image came from a Image, null otherwise Property::Map mPropertyMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise - bool mRelayoutRequired; ///< True if relayout is required, e.g. due to unreadiness }; } // namespace Internal -- 2.7.4