X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fprogress-bar%2Fprogress-bar-impl.cpp;h=100630734b3fccc595d4d9369a822ba01340417f;hp=d591c5a976c596f2c2cd8eb87b0fa09a77a9feda;hb=19179e76939a18697e6919177a4c561586e8d30b;hpb=535870c8f9a4033ea411b89d30f2ddc1342ac7ee diff --git a/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp b/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp old mode 100755 new mode 100644 index d591c5a..1006307 --- a/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp +++ b/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -19,55 +19,58 @@ #include // EXTERNAL INCLUDES -#include // for strcmp -#include -#include -#include -#include -#include -#include #include #include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include // for strcmp +#include #include namespace Dali { - namespace Toolkit { - namespace Internal { - namespace // Unnamed namespace { - BaseHandle Create() { return Dali::Toolkit::ProgressBar::New(); } +// clang-format off // 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, "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_BEGIN(Toolkit::ProgressBar, Toolkit::Control, Create) + +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() +// clang-format on struct ProgressDepthIndex { @@ -82,10 +85,38 @@ struct ProgressDepthIndex }; }; -float DEFAULT_VALUE = 0.0f; -float DEFAULT_LOWER_BOUND = 0.0f; -float DEFAULT_UPPER_BOUND = 1.0f; -float DEFAULT_FONT_SIZE = 12.0f; +float DEFAULT_VALUE = 0.0f; +float DEFAULT_LOWER_BOUND = 0.0f; +float DEFAULT_UPPER_BOUND = 1.0f; +float DEFAULT_FONT_SIZE = 12.0f; +const char* CIRCULAR_PROGRESS_BAR_STYLE_NAME = "CircularProgressBar"; + +void BackupVisualProperties(const Control* control, Property::Index index, Property::Map& map) +{ + Toolkit::Visual::Base visual = DevelControl::GetVisual(*control, index); + + if(visual) + { + map.Clear(); + visual.CreatePropertyMap(map); + } +} + +void RestoreVisualProperties(Control* control, Property::Index index, Property::Map& map, int depth) +{ + if(!map.Empty()) + { + Toolkit::Visual::Base visual = DevelControl::GetVisual(*control, index); + + Visual::Base& visualImpl = Toolkit::GetImplementation(visual); + + visualImpl.SetProperties(map); + + DevelControl::UnregisterVisual(*control, index); + + DevelControl::RegisterVisual(*control, index, visual, true, depth); + } +} } // Unnamed namespace @@ -93,13 +124,25 @@ float DEFAULT_FONT_SIZE = 12.0f; // ProgressBar /////////////////////////////////////////////////////////////////////////////////////////////////// -Dali::Toolkit::ProgressBar ProgressBar::New() +Dali::Toolkit::ProgressBar ProgressBar::New(DevelProgressBar::Style progressBarStyle) { // Create the implementation - ProgressBarPtr progressBar( new ProgressBar() ); + ProgressBarPtr progressBar(new ProgressBar()); - // Pass ownership to CustomActor via derived handle - Dali::Toolkit::ProgressBar handle( *progressBar ); + Dali::Toolkit::ProgressBar handle(*progressBar); + + switch(progressBarStyle) + { + case DevelProgressBar::Style::CIRCULAR: + { + progressBar->SetStyleName(CIRCULAR_PROGRESS_BAR_STYLE_NAME); + break; + } + default: + { + break; + } + } // Second-phase init of the implementation // This can only be done after the CustomActor connection has been made... @@ -109,10 +152,10 @@ Dali::Toolkit::ProgressBar ProgressBar::New() } ProgressBar::ProgressBar() -: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), - mProgressValue( DEFAULT_VALUE ), - mSecondaryProgressValue( DEFAULT_VALUE ), - mIndeterminate( false ) +: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)), + mProgressValue(DEFAULT_VALUE), + mSecondaryProgressValue(DEFAULT_VALUE), + mIndeterminate(false) { } @@ -122,107 +165,89 @@ ProgressBar::~ProgressBar() void ProgressBar::OnInitialize() { + DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) { + return std::unique_ptr( + new AccessibleImpl(actor, Dali::Accessibility::Role::PROGRESS_BAR)); + }); + //Enable highightability + Self().SetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true); } -void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container ) +void ProgressBar::OnRelayout(const Vector2& size, RelayoutContainer& container) { + Vector2 trackSize(size); + mDomain = CalcDomain(size); - Vector2 trackSize( size ); - mDomain = CalcDomain( size ); - - trackSize.width = std::max( 0.0f, size.width ); // Ensure we don't go negative + trackSize.width = std::max(0.0f, size.width); // Ensure we don't go negative - Toolkit::Visual::Base trackVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::TRACK_VISUAL ); - Toolkit::Visual::Base secondProgressVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL ); - Toolkit::Visual::Base progressVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::PROGRESS_VISUAL ); - Toolkit::Visual::Base labelVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::LABEL_VISUAL ); - Toolkit::Visual::Base indeterminateVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL ); + Toolkit::Visual::Base trackVisual = DevelControl::GetVisual(*this, Toolkit::ProgressBar::Property::TRACK_VISUAL); + Toolkit::Visual::Base labelVisual = DevelControl::GetVisual(*this, Toolkit::ProgressBar::Property::LABEL_VISUAL); + Toolkit::Visual::Base indeterminateVisual = DevelControl::GetVisual(*this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL); - if( trackVisual ) + if(trackVisual) { Property::Map visualTransform; - visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize ) - .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ); + visualTransform.Add(Toolkit::Visual::Transform::Property::SIZE, trackSize) + .Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)) + .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)); - trackVisual.SetTransformAndSize( visualTransform, trackSize ); + trackVisual.SetTransformAndSize(visualTransform, trackSize); } - if( secondProgressVisual ) - { - Property::Map visualTransform; + ApplyProgressToVisualTransform(mSecondaryProgressValue, trackSize, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL); - 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_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ) - .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 ); - } + ApplyProgressToVisualTransform(mProgressValue, trackSize, Toolkit::ProgressBar::Property::PROGRESS_VISUAL); - if( progressVisual ) + if(labelVisual) { 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_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ) - .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 ); + visualTransform.Add(Toolkit::Visual::Transform::Property::SIZE, trackSize) + .Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)) + .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)); + labelVisual.SetTransformAndSize(visualTransform, trackSize); } - if( labelVisual ) + if(indeterminateVisual) { Property::Map visualTransform; - visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize ) - .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ); - labelVisual.SetTransformAndSize( visualTransform, trackSize ); + visualTransform.Add(Toolkit::Visual::Transform::Property::SIZE, trackSize) + .Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)) + .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)); + indeterminateVisual.SetTransformAndSize(visualTransform, trackSize); } - - if( indeterminateVisual ) - { - Property::Map visualTransform; - - visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, trackSize ) - .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::DevelVisual::Transform::Property::SIZE_POLICY, Vector2( DevelVisual::Transform::Policy::ABSOLUTE, DevelVisual::Transform::Policy::ABSOLUTE ) ); - indeterminateVisual.SetTransformAndSize( visualTransform, trackSize ); - } - } Vector3 ProgressBar::GetNaturalSize() { // Return the bigger size after comparing trackVisual naturalSize and labelVisual naturalSize - Toolkit::Visual::Base trackVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::TRACK_VISUAL ); - Toolkit::Visual::Base labelVisual = DevelControl::GetVisual( *this, Toolkit::ProgressBar::Property::LABEL_VISUAL ); + Toolkit::Visual::Base trackVisual = DevelControl::GetVisual(*this, Toolkit::ProgressBar::Property::TRACK_VISUAL); + Toolkit::Visual::Base labelVisual = DevelControl::GetVisual(*this, Toolkit::ProgressBar::Property::LABEL_VISUAL); Size trackSize; Size labelSize; - if ( trackVisual ) + if(trackVisual) { - trackVisual.GetNaturalSize( trackSize ); + trackVisual.GetNaturalSize(trackSize); } - if ( labelVisual ) + if(labelVisual) { - labelVisual.GetNaturalSize( labelSize ); + labelVisual.GetNaturalSize(labelSize); } Vector3 naturalSize; - naturalSize.width = ( trackSize.width > labelSize.width ) ? trackSize.width: labelSize.width; - naturalSize.height = ( trackSize.height > labelSize.height ) ? trackSize.height: labelSize.height; + naturalSize.width = (trackSize.width > labelSize.width) ? trackSize.width : labelSize.width; + naturalSize.height = (trackSize.height > labelSize.height) ? trackSize.height : labelSize.height; return naturalSize; } -ProgressBar::Domain ProgressBar::CalcDomain( const Vector2& currentSize ) +ProgressBar::Domain ProgressBar::CalcDomain(const Vector2& currentSize) { - return Domain( Vector2( 0.0f, 0.0f ), currentSize ); + return Domain(Vector2(0.0f, 0.0f), currentSize); } Toolkit::ProgressBar::ValueChangedSignalType& ProgressBar::ValueChangedSignal() @@ -230,18 +255,24 @@ Toolkit::ProgressBar::ValueChangedSignalType& ProgressBar::ValueChangedSignal() return mValueChangedSignal; } -void ProgressBar::SetProgressValue( float value ) +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 ) ) ) ) + if((mProgressValue != value) && + ((value >= DEFAULT_LOWER_BOUND) || (Equals(value, DEFAULT_LOWER_BOUND))) && + ((value <= DEFAULT_UPPER_BOUND) || (Equals(value, DEFAULT_UPPER_BOUND)))) { - mProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND ); + mProgressValue = Clamp(value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND); - Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() ); - mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue ); + ApplyProgressToVisual(mProgressValue, Toolkit::ProgressBar::Property::PROGRESS_VISUAL, ProgressDepthIndex::PROGRESS_VISUAL); + + Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast(Self()); + mValueChangedSignal.Emit(self, mProgressValue, mSecondaryProgressValue); + if(Self() == Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor()) + { + Control::Impl::GetAccessibilityObject(Self())->Emit(Dali::Accessibility::ObjectPropertyChangeEvent::VALUE); + } RelayoutRequest(); } } @@ -251,18 +282,20 @@ float ProgressBar::GetProgressValue() const return mProgressValue; } -void ProgressBar::SetSecondaryProgressValue( float value ) +void ProgressBar::SetSecondaryProgressValue(float value) { // 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 ) ) ) ) + if((mSecondaryProgressValue != value) && + ((value >= DEFAULT_LOWER_BOUND) || (Equals(value, DEFAULT_LOWER_BOUND))) && + ((value <= DEFAULT_UPPER_BOUND) || (Equals(value, DEFAULT_UPPER_BOUND)))) { - mSecondaryProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND ); + mSecondaryProgressValue = Clamp(value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND); + + ApplyProgressToVisual(mSecondaryProgressValue, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL); - Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() ); - mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue ); + Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast(Self()); + mValueChangedSignal.Emit(self, mProgressValue, mSecondaryProgressValue); RelayoutRequest(); } @@ -273,25 +306,32 @@ float ProgressBar::GetSecondaryProgressValue() const return mSecondaryProgressValue; } -void ProgressBar::SetIndeterminate( bool value ) +void ProgressBar::SetIndeterminate(bool value) { mIndeterminate = value; - DevelControl::EnableVisual( *this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL, mIndeterminate ); + DevelControl::EnableVisual(*this, Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL, mIndeterminate); - if( mIndeterminate ) + if(mIndeterminate) { RelayoutRequest(); - if( mIndeterminateVisualTransition ) + if(mIndeterminateVisualTransition) { PlayIndeterminateVisualTransition(); } } else { - if( mIndeterminateVisualAni ) + if(mIndeterminateVisualAni) { mIndeterminateVisualAni.Stop(); } + + // Restore previous visual data after animation finished. + RestoreVisualProperties(this, Toolkit::ProgressBar::Property::TRACK_VISUAL, mTrackVisualMap, ProgressDepthIndex::TRACK_VISUAL); + RestoreVisualProperties(this, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, mSecondaryProgressVisualMap, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL); + RestoreVisualProperties(this, Toolkit::ProgressBar::Property::PROGRESS_VISUAL, mProgressVisualMap, ProgressDepthIndex::PROGRESS_VISUAL); + + RelayoutRequest(); } } @@ -300,10 +340,10 @@ bool ProgressBar::GetIndeterminate() const return mIndeterminate; } -void ProgressBar::SetIndeterminateVisualTransition( Toolkit::TransitionData transition ) +void ProgressBar::SetIndeterminateVisualTransition(Toolkit::TransitionData transition) { mIndeterminateVisualTransition = transition; - if( mIndeterminate ) + if(mIndeterminate) { PlayIndeterminateVisualTransition(); } @@ -311,32 +351,37 @@ void ProgressBar::SetIndeterminateVisualTransition( Toolkit::TransitionData tran void ProgressBar::PlayIndeterminateVisualTransition() { - if( mIndeterminateVisualAni ) + // Store current visual data before animation changes it. + BackupVisualProperties(this, Toolkit::ProgressBar::Property::TRACK_VISUAL, mTrackVisualMap); + BackupVisualProperties(this, Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL, mSecondaryProgressVisualMap); + BackupVisualProperties(this, Toolkit::ProgressBar::Property::PROGRESS_VISUAL, mProgressVisualMap); + + if(mIndeterminateVisualAni) { mIndeterminateVisualAni.Stop(); mIndeterminateVisualAni.Clear(); } - mIndeterminateVisualAni = DevelControl::CreateTransition( *this, mIndeterminateVisualTransition ); + mIndeterminateVisualAni = DevelControl::CreateTransition(*this, mIndeterminateVisualTransition); - if( mIndeterminate && mIndeterminateVisualAni ) + if(mIndeterminate && mIndeterminateVisualAni) { mIndeterminateVisualAni.SetLooping(true); mIndeterminateVisualAni.Play(); } } -Toolkit::TransitionData ProgressBar::ConvertPropertyToTransition( const Property::Value& value ) +Toolkit::TransitionData ProgressBar::ConvertPropertyToTransition(const Property::Value& value) { Toolkit::TransitionData transitionData; - if( value.GetType() == Property::ARRAY ) + if(value.GetType() == Property::ARRAY) { - transitionData = Toolkit::TransitionData::New( *value.GetArray() ); + transitionData = Toolkit::TransitionData::New(*value.GetArray()); } - else if( value.GetType() == Property::MAP ) + else if(value.GetType() == Property::MAP) { - transitionData = Toolkit::TransitionData::New( *value.GetMap() ); + transitionData = Toolkit::TransitionData::New(*value.GetMap()); } return transitionData; @@ -350,71 +395,111 @@ Toolkit::TransitionData ProgressBar::ConvertPropertyToTransition( const Property * 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 ) +void ProgressBar::CreateVisualsForComponent(Property::Index index, const Property::Value& value, const int visualDepth) { Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get(); - Toolkit::Visual::Base progressVisual; + Toolkit::Visual::Base progressVisual; std::string imageUrl; - if( value.Get( imageUrl ) ) + if(value.Get(imageUrl)) { - if ( !imageUrl.empty() ) + if(!imageUrl.empty()) { - progressVisual = visualFactory.CreateVisual( imageUrl, ImageDimensions() ); + progressVisual = visualFactory.CreateVisual(imageUrl, ImageDimensions()); } } else // Does this code make text-visual can be accepted as visual? { // 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. + const Property::Map* map = value.GetMap(); + if(map && !map->Empty()) // Empty map results in current visual removal. { - progressVisual = visualFactory.CreateVisual( *map ); + progressVisual = visualFactory.CreateVisual(*map); } } - if ( progressVisual ) + if(progressVisual) { - if( index == Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL ) + if(index == Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL) { - DevelControl::RegisterVisual( *this, index, progressVisual, mIndeterminate, visualDepth ); + DevelControl::RegisterVisual(*this, index, progressVisual, mIndeterminate, visualDepth); } else { - DevelControl::RegisterVisual( *this, index, progressVisual, true, visualDepth ); + DevelControl::RegisterVisual(*this, index, progressVisual, true, visualDepth); } } else { - DevelControl::UnregisterVisual( *this, index ); + DevelControl::UnregisterVisual(*this, index); } } -bool ProgressBar::GetPropertyMapForVisual( Property::Index visualIndex, Property::Map& retreivedMap ) const +bool ProgressBar::GetPropertyMapForVisual(Property::Index visualIndex, Property::Map& retreivedMap) const { - bool success = false; - Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, visualIndex ); + bool success = false; + Toolkit::Visual::Base visual = DevelControl::GetVisual(*this, visualIndex); - if ( visual ) + if(visual) { - visual.CreatePropertyMap( retreivedMap ); + visual.CreatePropertyMap(retreivedMap); success = true; } return success; } +void ProgressBar::ApplyProgressToVisual(float progress, Property::Index index, int depth) +{ + Toolkit::Visual::Base visual = DevelControl::GetVisual(*this, index); + + if(visual && static_cast(visual.GetType()) == DevelVisual::ARC && !mIndeterminate) + { + Visual::Base& visualImpl = Toolkit::GetImplementation(visual); + + Property::Map map; + + map[Toolkit::DevelArcVisual::Property::SWEEP_ANGLE] = Property::Value(360.0f * progress); + + visualImpl.SetProperties(map); + + DevelControl::UnregisterVisual(*this, index); + DevelControl::RegisterVisual(*this, index, visual, true, depth); + } +} + +void ProgressBar::ApplyProgressToVisualTransform(float progress, Vector2 trackSize, Property::Index index) +{ + Toolkit::Visual::Base visual = DevelControl::GetVisual(*this, index); + + if(visual) + { + Property::Map visualTransform; + + if(static_cast(visual.GetType()) != DevelVisual::ARC) + { + visualTransform.Add(Toolkit::Visual::Transform::Property::SIZE, Vector2(mDomain.from.x + progress * (mDomain.to.x - mDomain.from.x), trackSize.height)) + .Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)) + .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)) + .Add(Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN) + .Add(Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN); + } + + visual.SetTransformAndSize(visualTransform, trackSize); + } +} + // Static class method to support script connecting signals -bool ProgressBar::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) +bool ProgressBar::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor) { - Dali::BaseHandle handle( object ); + Dali::BaseHandle handle(object); - bool connected = true; - Toolkit::ProgressBar ProgressBar = Toolkit::ProgressBar::DownCast( handle ); + bool connected = true; + Toolkit::ProgressBar ProgressBar = Toolkit::ProgressBar::DownCast(handle); - if( 0 == strcmp( signalName.c_str(), SIGNAL_VALUE_CHANGED ) ) + if(0 == strcmp(signalName.c_str(), SIGNAL_VALUE_CHANGED)) { - ProgressBar.ValueChangedSignal().Connect( tracker, functor ); + ProgressBar.ValueChangedSignal().Connect(tracker, functor); } else { @@ -425,116 +510,118 @@ bool ProgressBar::DoConnectSignal( BaseObject* object, ConnectionTrackerInterfac return connected; } -void ProgressBar::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value ) +void ProgressBar::SetProperty(BaseObject* object, Property::Index propertyIndex, const Property::Value& value) { - Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast( Dali::BaseHandle( object ) ); + Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast(Dali::BaseHandle(object)); - if ( progressBar ) + if(progressBar) { - ProgressBar& progressBarImpl( GetImpl( progressBar ) ); + ProgressBar& progressBarImpl(GetImpl(progressBar)); - switch ( propertyIndex ) + switch(propertyIndex) { case Toolkit::ProgressBar::Property::TRACK_VISUAL: { - progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::TRACK_VISUAL ); + progressBarImpl.CreateVisualsForComponent(propertyIndex, value, ProgressDepthIndex::TRACK_VISUAL); break; } case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VISUAL: { - progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL ); + progressBarImpl.CreateVisualsForComponent(propertyIndex, value, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL); + progressBarImpl.ApplyProgressToVisual(progressBarImpl.mSecondaryProgressValue, propertyIndex, ProgressDepthIndex::SECONDARY_PROGRESS_VISUAL); break; } case Toolkit::ProgressBar::Property::PROGRESS_VISUAL: { - progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::PROGRESS_VISUAL ); + progressBarImpl.CreateVisualsForComponent(propertyIndex, value, ProgressDepthIndex::PROGRESS_VISUAL); + progressBarImpl.ApplyProgressToVisual(progressBarImpl.mProgressValue, propertyIndex, ProgressDepthIndex::PROGRESS_VISUAL); break; } case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL: { - progressBarImpl.CreateVisualsForComponent( propertyIndex, value, ProgressDepthIndex::INDETERMINATE_VISUAL ); + progressBarImpl.CreateVisualsForComponent(propertyIndex, value, ProgressDepthIndex::INDETERMINATE_VISUAL); break; } case Toolkit::ProgressBar::Property::LABEL_VISUAL: { Property::Map map; - std::string textString; + std::string textString; - if ( value.Get( textString ) ) + if(value.Get(textString)) { // set new text string as TEXT property - Property::Map newTextMap; - Toolkit::Visual::Base label = DevelControl::GetVisual( progressBarImpl, Toolkit::ProgressBar::Property::LABEL_VISUAL ); + Property::Map newTextMap; + Toolkit::Visual::Base label = DevelControl::GetVisual(progressBarImpl, Toolkit::ProgressBar::Property::LABEL_VISUAL); - if( label ) + if(label) { - label.CreatePropertyMap( map ); + label.CreatePropertyMap(map); } // if LABEL_VISUAL doesn't set before, add Visual property "TYPE" to create new text Visual - if( map.Empty() ) + 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::Visual::Property::TYPE, Toolkit::Visual::TEXT); + newTextMap.Add(Toolkit::TextVisual::Property::POINT_SIZE, DEFAULT_FONT_SIZE); } - newTextMap.Add( Toolkit::TextVisual::Property::TEXT, textString ); + newTextMap.Add(Toolkit::TextVisual::Property::TEXT, textString); - map.Merge( newTextMap ); + map.Merge(newTextMap); } else { - value.Get( map ); + value.Get(map); } - if( !map.Empty() ) + if(!map.Empty()) { - progressBarImpl.CreateVisualsForComponent( propertyIndex, map, ProgressDepthIndex::LABEL_VISUAL ); + progressBarImpl.CreateVisualsForComponent(propertyIndex, map, ProgressDepthIndex::LABEL_VISUAL); } break; } case Toolkit::ProgressBar::Property::PROGRESS_VALUE: { - progressBarImpl.SetProgressValue( value.Get< float >() ); + progressBarImpl.SetProgressValue(value.Get()); break; } case Toolkit::ProgressBar::Property::SECONDARY_PROGRESS_VALUE: { - progressBarImpl.SetSecondaryProgressValue( value.Get< float >() ); + progressBarImpl.SetSecondaryProgressValue(value.Get()); break; } case Toolkit::ProgressBar::Property::INDETERMINATE: { - progressBarImpl.SetIndeterminate( value.Get< bool >() ); + progressBarImpl.SetIndeterminate(value.Get()); break; } case Toolkit::ProgressBar::Property::INDETERMINATE_VISUAL_ANIMATION: { - progressBarImpl.SetIndeterminateVisualTransition( progressBarImpl.ConvertPropertyToTransition( value ) ); + progressBarImpl.SetIndeterminateVisualTransition(progressBarImpl.ConvertPropertyToTransition(value)); break; } } } } -Property::Value ProgressBar::GetProperty( BaseObject* object, Property::Index propertyIndex ) +Property::Value ProgressBar::GetProperty(BaseObject* object, Property::Index propertyIndex) { Property::Value value; - Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast( Dali::BaseHandle( object ) ); + Toolkit::ProgressBar progressBar = Toolkit::ProgressBar::DownCast(Dali::BaseHandle(object)); - if ( progressBar ) + if(progressBar) { - ProgressBar& progressBarImpl( GetImpl( progressBar ) ); + ProgressBar& progressBarImpl(GetImpl(progressBar)); - switch ( propertyIndex ) + switch(propertyIndex) { case Toolkit::ProgressBar::Property::TRACK_VISUAL: case Toolkit::ProgressBar::Property::PROGRESS_VISUAL: @@ -543,7 +630,7 @@ Property::Value ProgressBar::GetProperty( BaseObject* object, Property::Index pr case Toolkit::ProgressBar::Property::LABEL_VISUAL: { Property::Map visualProperty; - if ( progressBarImpl.GetPropertyMapForVisual( propertyIndex, visualProperty ) ) + if(progressBarImpl.GetPropertyMapForVisual(propertyIndex, visualProperty)) { value = visualProperty; } @@ -578,17 +665,50 @@ Property::Value ProgressBar::GetProperty( BaseObject* object, Property::Index pr return value; } -void ProgressBar::OnStageConnection( int depth ) +void ProgressBar::OnSceneConnection(int depth) { // Chain up first (ensures visuals are ready to draw) - Control::OnStageConnection( depth ); + Control::OnSceneConnection(depth); - if( mIndeterminate ) + if(mIndeterminate) { PlayIndeterminateVisualTransition(); } } +double ProgressBar::AccessibleImpl::GetMinimum() +{ + return DEFAULT_LOWER_BOUND; +} + +double ProgressBar::AccessibleImpl::GetCurrent() +{ + auto self = Toolkit::ProgressBar::DownCast(Self()); + return self.GetProperty(Toolkit::ProgressBar::Property::PROGRESS_VALUE).Get(); +} + +double ProgressBar::AccessibleImpl::GetMaximum() +{ + return DEFAULT_UPPER_BOUND; +} + +bool ProgressBar::AccessibleImpl::SetCurrent(double current) +{ + if(current < GetMinimum() || current > GetMaximum()) + { + return false; + } + + auto self = Toolkit::ProgressBar::DownCast(Self()); + self.SetProperty(Toolkit::ProgressBar::Property::PROGRESS_VALUE, static_cast(current)); + return true; +} + +double ProgressBar::AccessibleImpl::GetMinimumIncrement() +{ + return 0.0; +} + } // namespace Internal } // namespace Toolkit