From: minho.sun Date: Fri, 6 Jan 2017 06:41:36 +0000 (+0900) Subject: Add new properties to ProgressBar X-Git-Tag: dali_1.2.26~11^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=1fca3ce677ff263d2e3a9a18ac3b3a220f24513e Add new properties to ProgressBar Add new properties to ProgressBar 1. SECONDARY_PROGRESS_VALUE - Value of secondary progress 2. SECONDARY_PROGRESS_VISUAL - Visual to display how much the source is loaded 3. INDETERMINATED_VISUAL - Visual to display Indeterminate progress state - Indeterminate state means "applcation cannot cacluate current progress" 4. INDETERMINATED_VISUAL_TRANSITION - Transition data to animate indeterminate visual 5. INDETERMINATE - State to make indeterminate visual visible or not 6. LABEL_VISUAL - Visual to display progress Change-Id: I9db231d29c547eaead58ea5c0ad761e82b4461f2 Signed-off-by: minho.sun --- diff --git a/automated-tests/resources/progress-bar-skin-indeterminate.png b/automated-tests/resources/progress-bar-skin-indeterminate.png new file mode 100644 index 0000000..df99c15 Binary files /dev/null and b/automated-tests/resources/progress-bar-skin-indeterminate.png differ diff --git a/automated-tests/resources/progress-bar-skin-progress.png b/automated-tests/resources/progress-bar-skin-progress.png new file mode 100644 index 0000000..f73b14f Binary files /dev/null and b/automated-tests/resources/progress-bar-skin-progress.png differ diff --git a/automated-tests/resources/progress-bar-skin-secondary-progress.png b/automated-tests/resources/progress-bar-skin-secondary-progress.png new file mode 100644 index 0000000..f0ae311 Binary files /dev/null and b/automated-tests/resources/progress-bar-skin-secondary-progress.png differ diff --git a/automated-tests/resources/progress-bar-skin-track.png b/automated-tests/resources/progress-bar-skin-track.png new file mode 100644 index 0000000..a22e7c2 Binary files /dev/null and b/automated-tests/resources/progress-bar-skin-track.png differ diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ProgressBar.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ProgressBar.cpp index 2a2ae20..4b965c8 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ProgressBar.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ProgressBar.cpp @@ -18,6 +18,9 @@ #include #include #include +#include +#include +#include using namespace Dali; using namespace Dali::Toolkit; @@ -36,7 +39,10 @@ void utc_dali_toolkit_progressbar_cleanup(void) namespace { - +static const char* trackImage = TEST_RESOURCE_DIR "/progress-bar-skin-track-progress.png"; +static const char* progressImage = TEST_RESOURCE_DIR "/progress-bar-skin-progress-progress.png"; +static const char* secondaryProgressImage = TEST_RESOURCE_DIR "/progress-bar-skin-secondary-progress.png"; +static const char* indeterminateImage = TEST_RESOURCE_DIR "/progress-bar-skin-indeterminate.png"; static bool gObjectCreatedCallBackCalled; static void TestCallback(BaseHandle handle) @@ -107,7 +113,7 @@ int UtcDaliProgressBarDownCast(void) static bool gProgressBarValueChangedCallBackCalled = false; -static void OnProgressBarValueChanged( ProgressBar progressBar, float value ) +static void OnProgressBarValueChanged( ProgressBar progressBar, float value, float secondaryValue ) { gProgressBarValueChangedCallBackCalled = true; } @@ -124,14 +130,21 @@ int UtcDaliProgressBarSignals(void) progressBar.SetAnchorPoint(ParentOrigin::TOP_LEFT); progressBar.SetSize( Vector2( Stage::GetCurrent().GetSize().x, 20.0f ) ); progressBar.SetPosition( 0.0f, 0.0f ); - progressBar.ValueChangedSignal().Connect( &OnProgressBarValueChanged ); + progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.2f); application.SendNotification(); application.Render(); - //gProgressBarValueChangedCallBackCalled = false; + DALI_TEST_CHECK(gProgressBarValueChangedCallBackCalled); + + //Check Secondary progress value can make signal + gProgressBarValueChangedCallBackCalled = false; + progressBar.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE, 0.2f); + + application.SendNotification(); + application.Render(); DALI_TEST_CHECK(gProgressBarValueChangedCallBackCalled); END_TEST; @@ -147,91 +160,140 @@ int UtcDaliProgressBarSetPropertyP(void) progressBar.SetAnchorPoint(ParentOrigin::TOP_LEFT); progressBar.SetSize( Vector2( Stage::GetCurrent().GetSize().x, 20.0f ) ); progressBar.SetPosition( 0.0f, 0.0f ); - + progressBar.ValueChangedSignal().Connect( &OnProgressBarValueChanged ); Stage::GetCurrent().Add(progressBar); application.SendNotification(); application.Render(); - float val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.0f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.2f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.2f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.8f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.8f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.4f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.4f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.0f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.0f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 1.0f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 1.0f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, -1.0f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 1.0f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.9f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.9f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 1.1f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.9f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 2.0f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.9f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.0f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.0f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.9f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.9f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.09f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.09f, TEST_LOCATION); - - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.1f); - val = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VALUE); - DALI_TEST_EQUALS(val, 0.1f, TEST_LOCATION); - - { - Property::Map map; - map["rendererType"] = "image"; - map["size"] = Vector2(200, 200); - map["url"] = "track2.png"; - progressBar.SetProperty(ProgressBar::Property::TRACK_VISUAL, map); - map["url"] = "progress2.png"; - progressBar.SetProperty(ProgressBar::Property::PROGRESS_VISUAL, map); - - Property::Value value = progressBar.GetProperty(ProgressBar::Property::TRACK_VISUAL); - Property::Map* resultMap = value.GetMap(); - DALI_TEST_CHECK( resultMap ); - Property::Value* url = resultMap->Find("url"); - DALI_TEST_CHECK( url ) ; - DALI_TEST_EQUALS( *url, "track2.png", TEST_LOCATION ); - - value = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VISUAL); - resultMap = value.GetMap(); - DALI_TEST_CHECK( resultMap ); - url = resultMap->Find("url"); - DALI_TEST_CHECK( url ) ; - DALI_TEST_EQUALS( *url, "progress2.png", TEST_LOCATION ); - - } - + Property::Map map; + map["visualType"] = "IMAGE"; + map[Toolkit::ImageVisual::Property::URL] = trackImage; + progressBar.SetProperty(ProgressBar::Property::TRACK_VISUAL, map); + + Property::Value value = progressBar.GetProperty(ProgressBar::Property::TRACK_VISUAL); + Property::Map* resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + Property::Value* urlValue = resultMap->Find( Toolkit::ImageVisual::Property::URL ); + std::string urlString; + urlValue->Get( urlString ); + DALI_TEST_CHECK( !urlString.empty() ) ; + DALI_TEST_EQUALS( urlString, trackImage, TEST_LOCATION ); + + Property::Map colorMap; + colorMap["visualType"] = "COLOR"; + colorMap[Toolkit::ColorVisual::Property::MIX_COLOR] = Color::RED; + progressBar.SetProperty(ProgressBar::Property::TRACK_VISUAL, colorMap); + + value = progressBar.GetProperty(ProgressBar::Property::TRACK_VISUAL); + resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + Property::Value* colorValue = resultMap->Find( Toolkit::ColorVisual::Property::MIX_COLOR ); + Vector4 color = Color::TRANSPARENT; + colorValue->Get( color ); + DALI_TEST_CHECK( color != Color::TRANSPARENT ); + DALI_TEST_EQUALS( color, Color::RED, TEST_LOCATION ); + + map[Toolkit::ImageVisual::Property::URL] = progressImage; + progressBar.SetProperty(ProgressBar::Property::PROGRESS_VISUAL, map); + + value = progressBar.GetProperty(ProgressBar::Property::PROGRESS_VISUAL); + resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + urlValue = resultMap->Find( Toolkit::ImageVisual::Property::URL ); + urlValue->Get( urlString ); + DALI_TEST_CHECK( !urlString.empty() ) ; + DALI_TEST_EQUALS( urlString, progressImage, TEST_LOCATION ); + + progressBar.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, secondaryProgressImage); + + value = progressBar.GetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VISUAL); + resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + urlValue = resultMap->Find( Toolkit::ImageVisual::Property::URL ); + urlValue->Get( urlString ); + DALI_TEST_CHECK( !urlString.empty() ) ; + DALI_TEST_EQUALS( urlString, secondaryProgressImage, TEST_LOCATION ); + + map[Toolkit::ImageVisual::Property::URL] = secondaryProgressImage; + progressBar.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, map); + + value = progressBar.GetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VISUAL); + resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + urlValue = resultMap->Find( Toolkit::ImageVisual::Property::URL ); + urlValue->Get( urlString ); + DALI_TEST_CHECK( !urlString.empty() ) ; + DALI_TEST_EQUALS( urlString, secondaryProgressImage, TEST_LOCATION ); + + map[Toolkit::ImageVisual::Property::URL] = indeterminateImage; + progressBar.SetProperty(ProgressBar::Property::INDETERMINATE_VISUAL, map); + + value = progressBar.GetProperty(ProgressBar::Property::INDETERMINATE_VISUAL); + resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + urlValue = resultMap->Find( Toolkit::ImageVisual::Property::URL ); + urlValue->Get( urlString ); + DALI_TEST_CHECK( !urlString.empty() ) ; + DALI_TEST_EQUALS( urlString, indeterminateImage, TEST_LOCATION ); + + progressBar.SetProperty(ProgressBar::Property::LABEL_VISUAL, "test1"); + + value = progressBar.GetProperty(ProgressBar::Property::LABEL_VISUAL); + resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + Property::Value* textValue = resultMap->Find(Toolkit::TextVisual::Property::TEXT); + + std::string textString; + textValue->Get( textString ); + DALI_TEST_CHECK( !textString.empty() ); + DALI_TEST_EQUALS( textString, std::string( "test1" ), TEST_LOCATION ); + + Property::Map textVisualMap2; + textVisualMap2.Insert( Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::TEXT ); + textVisualMap2.Insert( Toolkit::TextVisual::Property::TEXT, "test2" ); + textVisualMap2.Insert( Toolkit::TextVisual::Property::POINT_SIZE, 12.0f ); + progressBar.SetProperty(ProgressBar::Property::LABEL_VISUAL, textVisualMap2); + + value = progressBar.GetProperty(ProgressBar::Property::LABEL_VISUAL); + resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + textValue = resultMap->Find(Toolkit::TextVisual::Property::TEXT); + + textValue->Get( textString ); + DALI_TEST_CHECK( !textString.empty() ); + DALI_TEST_EQUALS( textString, std::string( "test2" ), TEST_LOCATION ); + + progressBar.SetProperty(ProgressBar::Property::LABEL_VISUAL, "test3"); + + value = progressBar.GetProperty(ProgressBar::Property::LABEL_VISUAL); + resultMap = value.GetMap(); + DALI_TEST_CHECK( resultMap ); + textValue = resultMap->Find(Toolkit::TextVisual::Property::TEXT); + + std::string textString2; + textValue->Get( textString2 ); + DALI_TEST_CHECK( !textString2.empty() ); + DALI_TEST_EQUALS( textString2, std::string( "test3" ), TEST_LOCATION ); + + Property::Map transitionMap; + transitionMap["target"] = "indeterminateVisual"; + transitionMap["property"] = "offset"; + transitionMap["initialValue"] = Vector2( 0.0f, 0.0f ); + transitionMap["targetValue"] = Vector2( 10.0f, 0.0f ); + transitionMap["animator"] = Property::Map().Add("alphaFunction", "EASE_IN_OUT_BACK") + .Add("timePeriod", Property::Map().Add("delay", 0.5f).Add("duration", 1.0f)); + Property::Array array; + array.PushBack( transitionMap ); + progressBar.SetProperty(ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION, array); + + Property::Map transitionMap2; + transitionMap2["target"] = "indeterminateVisual"; + transitionMap2["property"] = "offset"; + transitionMap2["initialValue"] = Vector2( 0.0f, 0.0f ); + transitionMap2["targetValue"] = Vector2( 15.0f, 0.0f ); + transitionMap2["animator"] = Property::Map().Add("alphaFunction", "EASE_IN_OUT_BACK") + .Add("timePeriod", Property::Map().Add("delay", 0.5f).Add("duration", 1.0f)); + progressBar.SetProperty(ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION, transitionMap2); END_TEST; } @@ -245,6 +307,7 @@ int UtcDaliProgressBarSetPropertyP1(void) progressBar.SetAnchorPoint(ParentOrigin::TOP_LEFT); progressBar.SetSize( Vector2( Stage::GetCurrent().GetSize().x, 20.0f ) ); progressBar.SetPosition( 0.0f, 0.0f ); + progressBar.ValueChangedSignal().Connect( &OnProgressBarValueChanged ); Stage::GetCurrent().Add(progressBar); application.SendNotification(); @@ -254,7 +317,7 @@ int UtcDaliProgressBarSetPropertyP1(void) DALI_TEST_EQUALS(val, 0.0f, TEST_LOCATION); // test to download a file of 100k in chunks - float lowerBound = 0, upperBound = 100, progressValue = 0, chunkValue = 0; + float lowerBound = 0, upperBound = 100, progressValue = 0, secondaryProgressValue = 0, chunkValue = 0; while( chunkValue <= upperBound ) { @@ -277,6 +340,76 @@ int UtcDaliProgressBarSetPropertyP1(void) chunkValue = chunkValue + 100; } + val = progressBar.GetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE); + DALI_TEST_EQUALS(val, 0.0f, TEST_LOCATION); + + // test to download a file of 100k in chunks + lowerBound = 0, upperBound = 100, secondaryProgressValue = 0, chunkValue = 0; + + while( chunkValue <= upperBound ) + { + secondaryProgressValue = (chunkValue - lowerBound ) / ( upperBound - lowerBound ); + progressBar.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE, secondaryProgressValue); + val = progressBar.GetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE); + DALI_TEST_EQUALS(val, secondaryProgressValue, TEST_LOCATION); + chunkValue = chunkValue + 10; + } + + // test to download a file of 1000k in chunks + lowerBound = 0, upperBound = 1000, secondaryProgressValue = 0, chunkValue = 0; + + while( chunkValue <= upperBound ) + { + secondaryProgressValue = (chunkValue - lowerBound ) / ( upperBound - lowerBound ); + progressBar.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE, secondaryProgressValue); + val = progressBar.GetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE); + DALI_TEST_EQUALS(val, secondaryProgressValue, TEST_LOCATION); + chunkValue = chunkValue + 100; + } + END_TEST; } +int UtcDaliProgressBarSetPropertyP2(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliProgressBarSetPropertyP2" ); + + ProgressBar progressBar = ProgressBar::New(); + progressBar.SetParentOrigin(ParentOrigin::TOP_LEFT); + progressBar.SetAnchorPoint(ParentOrigin::TOP_LEFT); + progressBar.SetPosition( 0.0f, 0.0f ); + progressBar.SetProperty(ProgressBar::Property::LABEL_VISUAL, "test"); + progressBar.SetProperty(ProgressBar::Property::INDETERMINATE, true); + progressBar.SetProperty(ProgressBar::Property::TRACK_VISUAL, trackImage); + progressBar.SetProperty(ProgressBar::Property::PROGRESS_VISUAL, progressImage); + progressBar.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, secondaryProgressImage); + progressBar.SetProperty(ProgressBar::Property::INDETERMINATE_VISUAL, indeterminateImage); + + Property::Map transitionMap; + transitionMap["target"] = "indeterminateVisual"; + transitionMap["property"] = "offset"; + transitionMap["initialValue"] = Vector2( 0.0f, 0.0f ); + transitionMap["targetValue"] = Vector2( 10.0f, 0.0f ); + transitionMap["animator"] = Property::Map().Add("alphaFunction", "EASE_IN_OUT_BACK") + .Add("timePeriod", Property::Map().Add("delay", 0.5f).Add("duration", 1.0f)); + progressBar.SetProperty(ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION, transitionMap); + progressBar.SetProperty(ProgressBar::Property::PROGRESS_VALUE, 0.2f); + progressBar.SetProperty(ProgressBar::Property::SECONDARY_PROGRESS_VALUE, 0.3f); + + progressBar.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS ); + progressBar.SetSize( Vector2( Stage::GetCurrent().GetSize().x, 20.0f ) ); + Stage::GetCurrent().Add(progressBar); + application.SendNotification(); + application.Render(); + + // Test get/set INDETERMINATE + bool val = progressBar.GetProperty(ProgressBar::Property::INDETERMINATE); + DALI_TEST_EQUALS(val, true, TEST_LOCATION); + + progressBar.SetProperty(ProgressBar::Property::INDETERMINATE, false); + val = progressBar.GetProperty(ProgressBar::Property::INDETERMINATE); + DALI_TEST_EQUALS(val, false, TEST_LOCATION); + + END_TEST; +} diff --git a/dali-toolkit/devel-api/controls/progress-bar/progress-bar.h b/dali-toolkit/devel-api/controls/progress-bar/progress-bar.h index b487029..4c39a87 100644 --- a/dali-toolkit/devel-api/controls/progress-bar/progress-bar.h +++ b/dali-toolkit/devel-api/controls/progress-bar/progress-bar.h @@ -34,6 +34,25 @@ class ProgressBar; /** * @brief ProgressBar is a control to give the user an indication of the progress of an operation. + * * + * Determinate Progress State + * + * # : Progress visual + * * : Secondary Progress visual + * = : Track visual + * 40% : Label visual + * + * ============================================= + * = ###############**** 40% = + * ============================================= + * + * Indeterminate Progress State + * + * / : Indeterminate visual + * + * ============================================= + * = ///////////////////////////////////////// = + * ============================================= * * Also progress value percentage is shown as text inside the progress bar. * @@ -42,6 +61,7 @@ class ProgressBar; * |-------------------|-------------------------------| * | valueChanged | @ref ValueChangedSignal() | */ + class DALI_IMPORT_API ProgressBar : public Control { public: @@ -77,6 +97,23 @@ public: PROGRESS_VALUE = PROPERTY_START_INDEX, /** + * @brief The secondary progress value of progress bar, secondary progress runs form 0 to 1. + * @details Name "secondaryProgressValue", type Property::FLOAT. + * @note Optional. If not supplied, the default is 0. + * @note Value should be between 0 to 1. + * @note If Value is set to 0, progress bar will be set secondary progress to beginning. + * @note If Value is set to 1, progress bar will be set secondary progress to end. + * @note Any Value outside of the range is ignored. + */ + SECONDARY_PROGRESS_VALUE, + + /** + * @brief Sets the progress-bar as \e indeterminate state. + * @details name "indeterminate", type bool + */ + INDETERMINATE, + + /** * @brief The track Visual value of progress bar, it's a full progress area and it's shown behind PROGRESS_VISUAL. * @details Name "trackVisual", type Property::STRING if it is a url, map otherwise. * @note Optional. If not supplied, the default track visual will be shown. @@ -89,6 +126,33 @@ public: * @note Optional. If not supplied, the default progress visual will be shown. */ PROGRESS_VISUAL, + + /** + * @brief The secondary progress visual of progress bar, size of the secondary progress visual is changed based on SECONDARY_PROGRESS_VALUE. + * @details Name "secondaryProgressVisual", type Property::STRING if it is a url, map otherwise. + * @note Optional. If not supplied, the secondary progress visual will not be shown. + */ + SECONDARY_PROGRESS_VISUAL, + + /** + * @brief The indeterminate visual of progress bar. + * @details Name "inditerminateVisual", type Property::STRING if it is a url, map otherwise. + * @note Optional. If not supplied, the default inditerminate visual will be shown. + */ + INDETERMINATE_VISUAL, + + /** + * @brief The transition data for indeterminate visual animation. + * @details Name "indeterminateVisualAnimation", type Property::STRING. + * @note Optional. If not supplied, default animation will be played. + */ + INDETERMINATE_VISUAL_ANIMATION, + + /** + * @brief The Label visual of progress bar. + * @details Name "labelVisual", type Property::MAP. + */ + LABEL_VISUAL, }; }; @@ -141,19 +205,20 @@ public: // Signals /** * @brief Value changed signal type. */ - typedef Signal< void ( ProgressBar, float ) > ValueChangedSignalType; + typedef Signal< void ( ProgressBar, float, float ) > ValueChangedSignalType; /** * @brief Signal emitted when the ProgressBar value changes. * * A callback of the following type may be connected: * @code - * void YourCallbackName( ProgressBar progressBar, float value ); + * void YourCallbackName( ProgressBar progressBar, float progressValue, float secondaryProgressValue ); * @endcode * @return The signal to connect to */ ValueChangedSignalType& ValueChangedSignal(); + public: // Not intended for application developers /// @cond internal diff --git a/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp b/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp index ff3ed25..05005f5 100755 --- a/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp +++ b/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp @@ -25,6 +25,15 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include + +#include namespace Dali { @@ -46,19 +55,36 @@ BaseHandle Create() // Setup properties, signals and actions using the type-registry. DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ProgressBar, Toolkit::Control, Create ) -DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "progressValue", FLOAT, PROGRESS_VALUE ) -DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "trackVisual", MAP, TRACK_VISUAL ) -DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "progressVisual", MAP, PROGRESS_VISUAL ) -DALI_SIGNAL_REGISTRATION( Toolkit, ProgressBar, "valueChanged", SIGNAL_VALUE_CHANGED ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "progressValue", FLOAT, PROGRESS_VALUE ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "secondaryProgressValue", FLOAT, SECONDARY_PROGRESS_VALUE ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminate", BOOLEAN, INDETERMINATE ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "trackVisual", MAP, TRACK_VISUAL ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "progressVisual", MAP, PROGRESS_VISUAL ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "secondaryProgressVisual", MAP, SECONDARY_PROGRESS_VISUAL ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminateVisual", MAP, INDETERMINATE_VISUAL ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "indeterminateVisualAnimation", ARRAY, INDETERMINATE_VISUAL_ANIMATION ) +DALI_PROPERTY_REGISTRATION( Toolkit, ProgressBar, "labelVisual", MAP, LABEL_VISUAL ) +DALI_SIGNAL_REGISTRATION( Toolkit, ProgressBar, "valueChanged", SIGNAL_VALUE_CHANGED ) DALI_TYPE_REGISTRATION_END() -const char* SKINNED_TRACK_VISUAL = DALI_IMAGE_DIR "slider-skin.9.png"; -const char* SKINNED_PROGRESS_VISUAL = DALI_IMAGE_DIR "slider-skin-progress.9.png"; +struct ProgressDepthIndex +{ + // Enum to make sure the visual order + enum + { + TRACK_VISUAL, + SECONDARY_PROGRESS_VISUAL, + PROGRESS_VISUAL, + LABEL_VISUAL, + INDETERMINATE_VISUAL + }; +}; float DEFAULT_VALUE = 0.0f; float DEFAULT_LOWER_BOUND = 0.0f; float DEFAULT_UPPER_BOUND = 1.0f; +float DEFAULT_FONT_SIZE = 12.0f; } // Unnamed namespace @@ -83,12 +109,9 @@ Dali::Toolkit::ProgressBar ProgressBar::New() ProgressBar::ProgressBar() : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), - mTrackVisual(""), - mProgressVisual(""), - mTrackMap(), - mTrackVisualSize(), - mProgressVisualSize(), - mValue( DEFAULT_VALUE ) + mProgressValue( DEFAULT_VALUE ), + mSecondaryProgressValue( DEFAULT_VALUE ), + mIndeterminate( false ) { } @@ -98,49 +121,96 @@ ProgressBar::~ProgressBar() void ProgressBar::OnInitialize() { - // Setup - CreateChildren(); - - // Properties - SetTrackVisual( SKINNED_TRACK_VISUAL ); - SetProgressVisual( SKINNED_PROGRESS_VISUAL ); - - DisplayValue( mValue, false ); // Run this last to display the correct value } void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container ) { - // Track - if( mTrack ) + + Vector2 trackSize( size ); + mDomain = CalcDomain( size ); + + trackSize.width = std::max( 0.0f, size.width ); // Ensure we don't go negative + + Toolkit::Visual::Base trackVisual = GetVisual( Toolkit::ProgressBar::Property::TRACK_VISUAL ); + Toolkit::Visual::Base secondProgressVisual = GetVisual( Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL ); + Toolkit::Visual::Base progressVisual = GetVisual( Toolkit::ProgressBar::Property::PROGRESS_VISUAL ); + Toolkit::Visual::Base labelVisual = GetVisual( Toolkit::ProgressBar::Property::LABEL_VISUAL ); + Toolkit::Visual::Base indeterminateVisual = GetVisual( Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL ); + + if( trackVisual ) + { + Property::Map visualTransform; + + visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ); // Use Absolute size + trackVisual.SetTransformAndSize( visualTransform, trackSize ); + } + + if( secondProgressVisual ) { - container.Add( mTrack, size ); + Property::Map visualTransform; - // mValueTextLabel will have its relayout method called automatically as it's a child of mTrack, - // which is added to the container + visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, Vector2( mDomain.from.x + mSecondaryProgressValue * ( mDomain.to.x - mDomain.from.x ), trackSize.height ) ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ) // Use Absolute size + .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) + .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN ); + secondProgressVisual.SetTransformAndSize( visualTransform, trackSize ); } - // Progress bar - if( mProgress ) + if( progressVisual ) { - mDomain = CalcDomain( size ); + Property::Map visualTransform; + + visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, Vector2( mDomain.from.x + mProgressValue * ( mDomain.to.x - mDomain.from.x ), trackSize.height ) ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ) // Use Absolute size + .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) + .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN ); + progressVisual.SetTransformAndSize( visualTransform, trackSize ); + } - Vector2 progressSize( size ); + if( labelVisual ) + { + Property::Map visualTransform; - // If no progress, then we do not want a n-patch image shown incorrectly - progressSize.width = std::max( mProgressVisualSize.width, mDomain.from.x + mValue * ( mDomain.to.x - mDomain.from.x ) ); - progressSize.width = std::min( progressSize.width, size.width ); // We should not exceed given size + visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ); // Use Absolute size - container.Add( mProgress, progressSize ); + labelVisual.SetTransformAndSize( visualTransform, trackSize ); } + + if( indeterminateVisual ) + { + Property::Map visualTransform; + + visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ); // Use Absolute size + indeterminateVisual.SetTransformAndSize( visualTransform, trackSize ); + } + } Vector3 ProgressBar::GetNaturalSize() { - // Return the maximum width/height combinations of our visuals + // Return the bigger size after comparing trackVisual naturalSize and labelVisual naturalSize + Toolkit::Visual::Base trackVisual = GetVisual( Toolkit::ProgressBar::Property::TRACK_VISUAL ); + Toolkit::Visual::Base labelVisual = GetVisual( Toolkit::ProgressBar::Property::LABEL_VISUAL ); + + Size trackSize; + Size labelSize; + + if ( trackVisual ) + { + trackVisual.GetNaturalSize( trackSize ); + } + if ( labelVisual ) + { + labelVisual.GetNaturalSize( labelSize ); + } Vector3 naturalSize; - naturalSize.width = std::max( mTrackVisualSize.width, mProgressVisualSize.width ); - naturalSize.height = std::max( mTrackVisualSize.height, mProgressVisualSize.height ); + naturalSize.width = ( trackSize.width > labelSize.width ) ? trackSize.width: labelSize.width; + naturalSize.height = ( trackSize.height > labelSize.height ) ? trackSize.height: labelSize.height; + return naturalSize; } @@ -149,202 +219,184 @@ ProgressBar::Domain ProgressBar::CalcDomain( const Vector2& currentSize ) return Domain( Vector2( 0.0f, 0.0f ), currentSize ); } -void ProgressBar::DisplayValue( float value, bool raiseSignals ) +Toolkit::ProgressBar::ValueChangedSignalType& ProgressBar::ValueChangedSignal() { - // Signals - if( raiseSignals ) - { - Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() ); - mValueChangedSignal.Emit( self, value ); - } + return mValueChangedSignal; +} - // Change the value of the text label - if( mValueTextLabel ) +void ProgressBar::SetProgressValue( float value ) +{ + // update the progress bar value (taking float precision errors into account) + // TODO : it seems 0.0f cannot into this statement. + if( ( mProgressValue != value ) && + ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) && + ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) ) { - std::stringstream ss; - ss.precision( 0 ); - ss << std::fixed << ( value * 100 ) << "%"; + mProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND ); - std::string label = mValueTextLabel.GetProperty( Toolkit::TextLabel::Property::TEXT ); - if( label.compare(ss.str()) ) - { - mValueTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, ss.str() ); - } + Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() ); + mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue ); + RelayoutRequest(); } } -Toolkit::ImageView ProgressBar::CreateTrack() +float ProgressBar::GetProgressValue() const { - Toolkit::ImageView track = Toolkit::ImageView::New(); - track.SetParentOrigin( ParentOrigin::CENTER ); - track.SetAnchorPoint( AnchorPoint::CENTER ); - track.SetResizePolicy(ResizePolicy::USE_ASSIGNED_SIZE, Dimension::ALL_DIMENSIONS ); - - return track; + return mProgressValue; } -void ProgressBar::SetTrackVisual( const std::string& filename ) +void ProgressBar::SetSecondaryProgressValue( float value ) { - if( mTrack && filename.size() > 0 ) + // update the progress bar value (taking float precision errors into account) + // TODO : it seems 0.0f cannot into this statement. + if( ( mSecondaryProgressValue != value ) && + ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) && + ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) ) { - mTrack.SetImage( filename ); - mTrackVisual = filename; - mTrackVisualSize = Vector2::ZERO; + mSecondaryProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND ); + + Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() ); + mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue ); + RelayoutRequest(); } } -void ProgressBar::SetTrackVisual( Property::Map map ) +float ProgressBar::GetSecondaryProgressValue() const { - bool relayoutRequired = false; + return mSecondaryProgressValue; +} - Property::Value* imageValue = map.Find( "url" ); - if( imageValue ) +void ProgressBar::SetIndeterminate( bool value ) +{ + mIndeterminate = value; + EnableVisual( Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL, mIndeterminate ); + + if( mIndeterminate ) { - mTrackVisual.clear(); - std::string filename; - if( imageValue->Get( filename ) ) + RelayoutRequest(); + if( mIndeterminateVisualTransition ) { - if( mTrack && ( filename.size() > 0 ) ) - { - mTrack.SetImage( filename ); - mTrackMap = map; - relayoutRequired = true; - } + PlayIndeterminateVisualTransition(); } } - - Property::Value* sizeValue = map.Find( "size" ); - if( sizeValue ) + else { - Vector2 size; - if( sizeValue->Get( size ) ) + if( mIndeterminateVisualAni ) { - mTrackVisualSize = size; - relayoutRequired = true; + mIndeterminateVisualAni.Stop(); } } +} - // Visual and/or visual size changed so we need to relayout - if( relayoutRequired ) - { - RelayoutRequest(); - } +bool ProgressBar::GetIndeterminate() const +{ + return mIndeterminate; } -std::string ProgressBar::GetTrackVisual() +void ProgressBar::SetIndeterminateVisualTransition( Toolkit::TransitionData transition ) { - return mTrackVisual; + mIndeterminateVisualTransition = transition; + if( mIndeterminate ) + { + PlayIndeterminateVisualTransition(); + } } -Toolkit::ImageView ProgressBar::CreateProgress() +void ProgressBar::PlayIndeterminateVisualTransition() { - Toolkit::ImageView progress = Toolkit::ImageView::New(); - progress.SetParentOrigin( ParentOrigin::CENTER_LEFT ); - progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT ); - progress.SetResizePolicy(ResizePolicy::USE_ASSIGNED_SIZE, Dimension::ALL_DIMENSIONS ); + if( mIndeterminateVisualAni ) + { + mIndeterminateVisualAni.Stop(); + mIndeterminateVisualAni.Clear(); + } + + mIndeterminateVisualAni = CreateTransition( mIndeterminateVisualTransition ); - return progress; + if( mIndeterminate && mIndeterminateVisualAni ) + { + mIndeterminateVisualAni.SetLooping(true); + mIndeterminateVisualAni.Play(); + } } -void ProgressBar::SetProgressVisual( const std::string& filename ) +Toolkit::TransitionData ProgressBar::ConvertPropertyToTransition( const Property::Value& value ) { - if( mProgress && ( filename.size() > 0 ) ) + Toolkit::TransitionData transitionData; + + if( value.GetType() == Property::ARRAY ) { - mProgress.SetImage( filename ); - mProgressVisual = filename; - mProgressVisualSize = Vector2::ZERO; - RelayoutRequest(); + transitionData = Toolkit::TransitionData::New( *value.GetArray() ); + } + else if( value.GetType() == Property::MAP ) + { + transitionData = Toolkit::TransitionData::New( *value.GetMap() ); } + + return transitionData; } -void ProgressBar::SetProgressVisual( Property::Map map ) +/** + * Create Visual for given index from a property map or url. + * 1) Check if value passed in is a url and create visual + * 2) Create visual from map if step (1) is false + * 3) Register visual with control with false for enable flag. + * 4) Unregister visual if empty map was provided. This is the method to remove a visual + */ + +void ProgressBar::CreateVisualsForComponent( Property::Index index, const Property::Value& value, const float visualDepth ) { - bool relayoutRequired = false; + Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get(); + Toolkit::Visual::Base progressVisual; - Property::Value* imageValue = map.Find( "url" ); - if( imageValue ) + std::string imageUrl; + if( value.Get( imageUrl ) ) { - mProgressVisual.clear(); - std::string filename; - if( imageValue->Get( filename ) ) + if ( !imageUrl.empty() ) { - if( mProgress && ( filename.size() > 0 ) ) - { - mProgress.SetImage( filename ); - mProgressMap = map; - relayoutRequired = true; - } + progressVisual = visualFactory.CreateVisual( imageUrl, ImageDimensions() ); } } - - Property::Value* sizeValue = map.Find( "size" ); - if( sizeValue ) + else // Does this code make text-visual can be accepted as visual? { - Vector2 size; - if( sizeValue->Get( size ) ) + // if its not a string then get a Property::Map from the property if possible. + Property::Map *map = value.GetMap(); + if( map && !map->Empty() ) // Empty map results in current visual removal. { - mProgressVisualSize = size; - relayoutRequired = true; + progressVisual = visualFactory.CreateVisual( *map ); } } - // Visual and/or visual size changed so we need to relayout - if( relayoutRequired ) + if ( progressVisual ) { - RelayoutRequest(); + progressVisual.SetDepthIndex( visualDepth ); + if( index == Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL ) + { + RegisterVisual( index, progressVisual, mIndeterminate ); + } + else + { + RegisterVisual( index, progressVisual, true ); + } + } + else + { + UnregisterVisual( index ); } } -std::string ProgressBar::GetProgressVisual() -{ - return mProgressVisual; -} - -Toolkit::ProgressBar::ValueChangedSignalType& ProgressBar::ValueChangedSignal() -{ - return mValueChangedSignal; -} - -void ProgressBar::CreateChildren() +bool ProgressBar::GetPropertyMapForVisual( Property::Index visualIndex, Property::Map& retreivedMap ) const { - Actor self = Self(); - - // Track - mTrack = CreateTrack(); - self.Add( mTrack ); // Needs to be a direct child as we want to manipulate its size - - // Progress bar - mProgress = CreateProgress(); - self.Add( mProgress ); // Needs to be a direct child as we want to manipulate its size - - // Value Text - mValueTextLabel = Toolkit::TextLabel::New(); - mValueTextLabel.SetName( "ProgressBarValueTextLabel" ); - mValueTextLabel.SetStyleName( "ProgressBarValueTextLabel" ); - mValueTextLabel.SetParentOrigin( ParentOrigin::CENTER ); - mValueTextLabel.SetAnchorPoint( AnchorPoint::CENTER ); - mValueTextLabel.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" ); - mValueTextLabel.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" ); - mTrack.Add( mValueTextLabel ); // Add to mTrack and let it automatically set its size -} + bool success = false; + Toolkit::Visual::Base visual = GetVisual( visualIndex ); -void ProgressBar::SetProgressValue( float value ) -{ - // update the progress bar value (taking float precision errors into account) - if( ( mValue != value ) && - ( ( value >= DEFAULT_LOWER_BOUND ) || ( Equals( value, DEFAULT_LOWER_BOUND ) ) ) && - ( ( value <= DEFAULT_UPPER_BOUND ) || ( Equals( value, DEFAULT_UPPER_BOUND ) ) ) ) + if ( visual ) { - mValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND ); - DisplayValue( mValue, true ); - RelayoutRequest(); + visual.CreatePropertyMap( retreivedMap ); + success = true; } -} -float ProgressBar::GetProgressValue() const -{ - return mValue; + return success; } // Static class method to support script connecting signals @@ -378,29 +430,89 @@ void ProgressBar::SetProperty( BaseObject* object, Property::Index propertyIndex switch ( propertyIndex ) { - case Toolkit::ProgressBar::Property::PROGRESS_VALUE: + case Toolkit::ProgressBar::Property::TRACK_VISUAL: { - progressBarImpl.SetProgressValue( value.Get< float >() ); + progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::TRACK_VISUAL ); break; } - case Toolkit::ProgressBar::Property::TRACK_VISUAL: + case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL: { - Property::Map map; - if( value.Get( map ) ) - { - progressBarImpl.SetTrackVisual( map ); - } + progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL ); break; } case Toolkit::ProgressBar::Property::PROGRESS_VISUAL: { + progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::PROGRESS_VISUAL ); + break; + } + + case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL: + { + progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::INDETERMINATE_VISUAL ); + break; + } + + case Toolkit::ProgressBar::Property::LABEL_VISUAL: + { Property::Map map; - if( value.Get( map ) ) + std::string textString; + + if ( value.Get( textString ) ) + { + // set new text string as TEXT property + Property::Map newTextMap; + Toolkit::Visual::Base label = progressBarImpl.GetVisual( Toolkit::ProgressBar::Property::LABEL_VISUAL ); + + if( label ) + { + label.CreatePropertyMap( map ); + } + + // if LABEL_VISUAL doesn't set before, add Visual property "TYPE" to create new text Visual + if( map.Empty() ) + { + newTextMap.Add( Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::TEXT ); + newTextMap.Add( Toolkit::TextVisual::Property::POINT_SIZE, DEFAULT_FONT_SIZE ); + } + newTextMap.Add( Toolkit::TextVisual::Property::TEXT, textString ); + + map.Merge( newTextMap ); + } + else { - progressBarImpl.SetProgressVisual( map ); + value.Get( map ); } + + if( !map.Empty() ) + { + progressBarImpl.CreateVisualsForComponent( propertyIndex, map, ProgressDepthIndex::LABEL_VISUAL ); + } + break; + } + + case Toolkit::ProgressBar::Property::PROGRESS_VALUE: + { + progressBarImpl.SetProgressValue( value.Get< float >() ); + break; + } + + case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE: + { + progressBarImpl.SetSecondaryProgressValue( value.Get< float >() ); + break; + } + + case Toolkit::ProgressBar::Property::INDETERMINATE: + { + progressBarImpl.SetIndeterminate( value.Get< bool >() ); + break; + } + + case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION: + { + progressBarImpl.SetIndeterminateVisualTransition( progressBarImpl.ConvertPropertyToTransition( value ) ); break; } } @@ -419,43 +531,59 @@ Property::Value ProgressBar::GetProperty( BaseObject* object, Property::Index pr switch ( propertyIndex ) { + case Toolkit::ProgressBar::Property::TRACK_VISUAL: + case Toolkit::ProgressBar::Property::PROGRESS_VISUAL: + case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL: + case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL: + case Toolkit::ProgressBar::Property::LABEL_VISUAL: + { + Property::Map visualProperty; + if ( progressBarImpl.GetPropertyMapForVisual( propertyIndex, visualProperty ) ) + { + value = visualProperty; + } + break; + } + case Toolkit::ProgressBar::Property::PROGRESS_VALUE: { value = progressBarImpl.GetProgressValue(); break; } - case Toolkit::ProgressBar::Property::TRACK_VISUAL: + case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE: { - if( !progressBarImpl.mTrackVisual.empty() ) - { - value = progressBarImpl.GetTrackVisual(); - } - else if( !progressBarImpl.mTrackMap.Empty() ) - { - value = progressBarImpl.mTrackMap; - } + value = progressBarImpl.GetSecondaryProgressValue(); break; } - case Toolkit::ProgressBar::Property::PROGRESS_VISUAL: + case Toolkit::ProgressBar::Property::INDETERMINATE: { - if( !progressBarImpl.mProgressVisual.empty() ) - { - value = progressBarImpl.GetProgressVisual(); - } - else if( !progressBarImpl.mProgressMap.Empty() ) - { - value = progressBarImpl.mProgressMap; - } + value = progressBarImpl.GetIndeterminate(); break; } + + case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION: + { + //TODO: Return INDETERMINATE_VISUAL_TRANSITION; + } } } return value; } +void ProgressBar::OnStageConnection( int depth ) +{ + // Chain up first (ensures visuals are ready to draw) + Control::OnStageConnection( depth ); + + if( mIndeterminate ) + { + PlayIndeterminateVisualTransition(); + } +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.h b/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.h index f5f7e91..b59c8b3 100755 --- a/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.h +++ b/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.h @@ -18,14 +18,12 @@ * */ -// EXTERNAL INCLUDES -#include // INTERNAL INCLUDES #include +#include #include -#include -#include +#include namespace Dali { @@ -63,7 +61,6 @@ public: * * @param[in] value The value to set. Will be clamped to [lowerBound .. upperBound] */ - void SetProgressValue( float value ); /** @@ -73,14 +70,62 @@ public: */ float GetProgressValue() const; + /** + * Set the secondary progress value of the ProgressBar + * + * @param[in] value The secondary progress value to set. Will be clamped to [lowerBound .. upperBound] + */ + void SetSecondaryProgressValue( float value ); + + /** + * Get the secondary progress value of the ProgressBar + * + * @return The current secondary progress value of the ProgressBar + */ + float GetSecondaryProgressValue() const; + + /** + * Set the indeterminate state of the ProgressBar + * + * @param[in] value The value to set. + */ + void SetIndeterminate( bool value ); + + /** + * Get the indeterminate state value of the ProgressBar + * + * @return The current determined state of the ProgressBar + */ + bool GetIndeterminate() const; + + /** + * Set the indeterminate visual transition of the ProgressBar + * + * @param[in] Transition data map to set. + */ + void SetIndeterminateVisualTransition( Property::Map transtion ); + + /** + * Get the indeterminate visual transition data map of the ProgressBar + * + * @return The current indeterminate visual transition data map of the ProgressBar + */ + Property::Map GetIndeterminateVisualTransition() const; + + /** + * Play the indeterminate visual transition + */ + void PlayIndeterminateVisualTransition(); + public: //Signals /** - * @copydoc Toolkit::ProgressBar::ValueChangedSignal() + * @copydoc toolkit::progressbar::valuechangedsignal() */ Toolkit::ProgressBar::ValueChangedSignalType& ValueChangedSignal(); + /** * Connects a callback function with the object's signals. * @param[in] object The object providing the signal. @@ -168,73 +213,29 @@ private: Domain CalcDomain( const Vector2& currentSize ); /** - * Create the track for the ProgressBar - * - * @return The track actor - */ - Toolkit::ImageView CreateTrack(); - - /** - * Create the progress track for the ProgressBar - * - * @return The track actor - */ - Toolkit::ImageView CreateProgress(); - - /** - * Create all the children - */ - void CreateChildren(); - - /** - * Set value choosing whether to fire signals or not - * - * @paramp[in] value The value to set - * @param[in] raiseSignals Configure signals to be raised or not. - */ - void DisplayValue( float value, bool raiseSignals ); - - /** - * Create the image for the track - * - * @param[in] filename The track image - */ - void SetTrackVisual( const std::string& filename ); - - /** - * @brief Set the track visual from an Dali::Property::Map - * - * @param[in] map The Dali::Property::Map to use for to display + * Set indeterminate visual transition animation */ - void SetTrackVisual( Dali::Property::Map map ); + void SetIndeterminateVisualTransition( Toolkit::TransitionData transtion ); /** - * @brief Return the track image. - * - * @return The track image. + * Convert value to transition data */ - std::string GetTrackVisual(); + Toolkit::TransitionData ConvertPropertyToTransition( const Property::Value& value ); /** - * Create the image for the progress bar - * - * @param[in] filename The progress bar image + * Update progress bar label when progress value is changed */ - void SetProgressVisual( const std::string& filename ); + void CreateVisualsForComponent( Property::Index index, const Property::Value& value, const float visualDepth ); /** - * @brief Set the progress visual from an Dali::Property::Map - * - * @param[in] map The Dali::Property::Map to use for to display + * Update progress bar label when progress value is changed */ - void SetProgressVisual( Dali::Property::Map map ); + bool GetPropertyMapForVisual( Property::Index visualIndex, Property::Map& retreivedMap ) const; /** - * @brief Return the progress bar image. - * - * @return The progress bar image if it exists. + * Check if we should start animating */ - std::string GetProgressVisual(); + virtual void OnStageConnection( int depth ); private: @@ -246,23 +247,15 @@ private: private: - Domain mDomain; ///< Current domain of the handle - - Toolkit::ImageView mTrack; ///< Track image - Toolkit::ImageView mProgress; ///< Progress bar - Toolkit::TextLabel mValueTextLabel; ///< Text value to show progress percentage - Toolkit::ProgressBar::ValueChangedSignalType mValueChangedSignal; ///< Signal emitted when the value is changed - - std::string mTrackVisual; ///< Image for track image - std::string mProgressVisual; ///< Image for progress bar image - - Property::Map mTrackMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise - Property::Map mProgressMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise + Domain mDomain; ///< Current domain of the handle - Vector2 mTrackVisualSize; ///< Size of the track image used - Vector2 mProgressVisualSize; ///< Size of progress image used + Animation mIndeterminateVisualAni; ///< Animation for indetrminate visual. Transition animation. + Toolkit::ProgressBar::ValueChangedSignalType mValueChangedSignal; ///< Signal emitted when the value is changed - float mValue; ///< Current value of ProgressBar + Toolkit::TransitionData mIndeterminateVisualTransition; ///< Transition data map for mIndeterminateVisualAni + float mProgressValue; ///< Current value of ProgressBar + float mSecondaryProgressValue; ///< Current loading value of ProgressBar + bool mIndeterminate; ///< Whether the progress state is determined or not }; } // namespace Internal diff --git a/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json b/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json index 1809436..187702c 100644 --- a/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json @@ -182,19 +182,52 @@ }, "ProgressBar": { - "progressValue": 0, "trackVisual":{ - "url":"{DALI_IMAGE_DIR}progress-skin.9.png", - "size":[24,24] + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-track.9.png" }, "progressVisual":{ - "url":"{DALI_IMAGE_DIR}progress-skin-progress.9.png", - "size":[24,24] - } - }, - "ProgressBarValueTextLabel": - { - "textColor":[0.8,0.8,1,1] + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-progress.9.png" + }, + "secondaryProgressVisual":{ + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-secondary-progress.9.png" + }, + "indeterminateVisual":{ + "visualType":"IMAGE", + "pixelArea":[0.0, 0.0, 10.0, 1.0], + "wrapModeU":"REPEAT", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-indeterminate.png" + }, + "indeterminateVisualAnimation": + [ + { + "target":"indeterminateVisual", + "property":"pixelArea", + "initialValue":[0.0, 0.0, 10.0, 1.0], + "targetValue":[-1.0, 0.0, 10.0, 1.0], + "animator": + { + "alphaFunction":"DEFAULT", + "timePeriod": + { + "duration":0.8, + "delay":0 + } + } + } + ], + "labelVisual":{ + "visualType": "TEXT", + "textColor": [ 1.0, 1.0, 1.0, 1.0 ], + "pointSize" : 12.0, // Point size must always be provided to Text Visual + "horizontalAlignment": "CENTER", + "verticalAlignment": "CENTER" + }, + "progressValue": 0.0, + "secondaryProgressValue":0.0, + "indeterminate": false }, "Button": { diff --git a/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json b/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json index 0684889..a40c517 100644 --- a/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json @@ -229,19 +229,52 @@ }, "ProgressBar": { - "progressValue": 0, "trackVisual":{ - "url":"{DALI_IMAGE_DIR}progress-skin.9.png", - "size":[24,24] + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-track.9.png" }, "progressVisual":{ - "url":"{DALI_IMAGE_DIR}progress-skin-progress.9.png", - "size":[24,24] - } - }, - "ProgressBarValueTextLabel": - { - "textColor":[0.8,0.8,1,1] + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-progress.9.png" + }, + "secondaryProgressVisual":{ + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-secondary-progress.9.png" + }, + "indeterminateVisual":{ + "visualType":"IMAGE", + "pixelArea":[0.0, 0.0, 10.0, 1.0], + "wrapModeU":"REPEAT", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-indeterminate.png" + }, + "indeterminateVisualAnimation": + [ + { + "target":"indeterminateVisual", + "property":"pixelArea", + "initialValue":[0.0, 0.0, 10.0, 1.0], + "targetValue":[-1.0, 0.0, 10.0, 1.0], + "animator": + { + "alphaFunction":"DEFAULT", + "timePeriod": + { + "duration":0.8, + "delay":0 + } + } + } + ], + "labelVisual":{ + "visualType": "TEXT", + "textColor": [ 1.0, 1.0, 1.0, 1.0 ], + "pointSize" : 12.0, // Point size must always be provided to Text Visual + "horizontalAlignment": "CENTER", + "verticalAlignment": "CENTER" + }, + "progressValue": 0.0, + "secondaryProgressValue":0.0, + "indeterminate": false }, "Button": { diff --git a/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json b/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json index 85d168f..6b3a131 100644 --- a/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json @@ -203,19 +203,52 @@ }, "ProgressBar": { - "progressValue": 0, "trackVisual":{ - "url":"{DALI_IMAGE_DIR}progress-skin.9.png", - "size":[24,24] + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-track.9.png" }, "progressVisual":{ - "url":"{DALI_IMAGE_DIR}progress-skin-progress.9.png", - "size":[24,24] - } - }, - "ProgressBarValueTextLabel": - { - "textColor":[0.8,0.8,1,1] + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-progress.9.png" + }, + "secondaryProgressVisual":{ + "visualType":"IMAGE", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-secondary-progress.9.png" + }, + "indeterminateVisual":{ + "visualType":"IMAGE", + "pixelArea":[0.0, 0.0, 10.0, 1.0], + "wrapModeU":"REPEAT", + "url":"{DALI_IMAGE_DIR}progress-bar-skin-indeterminate.png" + }, + "indeterminateVisualAnimation": + [ + { + "target":"indeterminateVisual", + "property":"pixelArea", + "initialValue":[0.0, 0.0, 10.0, 1.0], + "targetValue":[-1.0, 0.0, 10.0, 1.0], + "animator": + { + "alphaFunction":"DEFAULT", + "timePeriod": + { + "duration":0.8, + "delay":0 + } + } + } + ], + "labelVisual":{ + "visualType": "TEXT", + "textColor": [ 1.0, 1.0, 1.0, 1.0 ], + "pointSize" : 12.0, // Point size must always be provided to Text Visual + "horizontalAlignment": "CENTER", + "verticalAlignment": "CENTER" + }, + "progressValue": 0.0, + "secondaryProgressValue":0.0, + "indeterminate": false }, "Button": { diff --git a/dali-toolkit/styles/images-common/progress-bar-skin-indeterminate.png b/dali-toolkit/styles/images-common/progress-bar-skin-indeterminate.png new file mode 100644 index 0000000..df99c15 Binary files /dev/null and b/dali-toolkit/styles/images-common/progress-bar-skin-indeterminate.png differ diff --git a/dali-toolkit/styles/images-common/progress-bar-skin-progress.9.png b/dali-toolkit/styles/images-common/progress-bar-skin-progress.9.png new file mode 100644 index 0000000..b77b29d Binary files /dev/null and b/dali-toolkit/styles/images-common/progress-bar-skin-progress.9.png differ diff --git a/dali-toolkit/styles/images-common/progress-bar-skin-secondary-progress.9.png b/dali-toolkit/styles/images-common/progress-bar-skin-secondary-progress.9.png new file mode 100644 index 0000000..54184e5 Binary files /dev/null and b/dali-toolkit/styles/images-common/progress-bar-skin-secondary-progress.9.png differ diff --git a/dali-toolkit/styles/images-common/progress-bar-skin-track.9.png b/dali-toolkit/styles/images-common/progress-bar-skin-track.9.png new file mode 100644 index 0000000..92a1dee Binary files /dev/null and b/dali-toolkit/styles/images-common/progress-bar-skin-track.9.png differ diff --git a/dali-toolkit/styles/images-common/progress-skin-progress.9.png b/dali-toolkit/styles/images-common/progress-skin-progress.9.png deleted file mode 100644 index f02cd0d..0000000 Binary files a/dali-toolkit/styles/images-common/progress-skin-progress.9.png and /dev/null differ diff --git a/dali-toolkit/styles/images-common/progress-skin.9.png b/dali-toolkit/styles/images-common/progress-skin.9.png deleted file mode 100644 index e1c2ca0..0000000 Binary files a/dali-toolkit/styles/images-common/progress-skin.9.png and /dev/null differ