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=a24de27a1aecf98d5b020dca65c61311295ecfce;hp=a5376216df0feb9eb22f1a165c20f00939e17304;hb=f546dd5d83a968e573f8f053a01ce43df32c71a0;hpb=eaebf2e8aa5903e4acbb37ae46050e009863146c 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 a537621..a24de27 --- a/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp +++ b/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp @@ -25,13 +25,16 @@ #include #include #include -#include +#include #include #include +#include +#include +#include #include #include -#include -#include +#include +#include #include #include @@ -86,6 +89,35 @@ 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,14 +125,26 @@ 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() ); - // Pass ownership to CustomActor via derived handle 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... progressBar->Initialize(); @@ -122,6 +166,10 @@ ProgressBar::~ProgressBar() void ProgressBar::OnInitialize() { + DevelControl::SetAccessibilityConstructor( Self(), []( Dali::Actor actor ) { + return std::unique_ptr< Dali::Accessibility::Accessible >( + new AccessibleImpl( actor, Dali::Accessibility::Role::PROGRESS_BAR ) ); + } ); } void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container ) @@ -133,8 +181,6 @@ void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container 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 ); @@ -142,44 +188,24 @@ void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container { 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 ); } - 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 ); - } - - if( progressVisual ) - { - 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 ); - } + ApplyProgressToVisualTransform( mProgressValue, trackSize, Toolkit::ProgressBar::Property::PROGRESS_VISUAL ); if( labelVisual ) { 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 ) ); labelVisual.SetTransformAndSize( visualTransform, trackSize ); } @@ -187,9 +213,9 @@ void ProgressBar::OnRelayout( const Vector2& size, RelayoutContainer& container { 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 ) ); indeterminateVisual.SetTransformAndSize( visualTransform, trackSize ); } @@ -240,6 +266,8 @@ void ProgressBar::SetProgressValue( float value ) { mProgressValue = Clamp( value, DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND ); + ApplyProgressToVisual( mProgressValue, Toolkit::ProgressBar::Property::PROGRESS_VISUAL, ProgressDepthIndex::PROGRESS_VISUAL ); + Toolkit::ProgressBar self = Toolkit::ProgressBar::DownCast( Self() ); mValueChangedSignal.Emit( self, mProgressValue, mSecondaryProgressValue ); RelayoutRequest(); @@ -261,6 +289,8 @@ void ProgressBar::SetSecondaryProgressValue( float value ) { 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 ); @@ -292,6 +322,13 @@ void ProgressBar::SetIndeterminate( bool value ) { 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(); } } @@ -311,6 +348,11 @@ void ProgressBar::SetIndeterminateVisualTransition( Toolkit::TransitionData tran void ProgressBar::PlayIndeterminateVisualTransition() { + // 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(); @@ -366,7 +408,7 @@ void ProgressBar::CreateVisualsForComponent( Property::Index index, const Proper 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(); + const Property::Map *map = value.GetMap(); if( map && !map->Empty() ) // Empty map results in current visual removal. { progressVisual = visualFactory.CreateVisual( *map ); @@ -404,6 +446,47 @@ bool ProgressBar::GetPropertyMapForVisual( Property::Index visualIndex, Property 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 ) { @@ -444,12 +527,14 @@ void ProgressBar::SetProperty( BaseObject* object, Property::Index propertyIndex case Toolkit::ProgressBar::Property::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.ApplyProgressToVisual( progressBarImpl.mProgressValue, propertyIndex, ProgressDepthIndex::PROGRESS_VISUAL ); break; } @@ -478,7 +563,7 @@ void ProgressBar::SetProperty( BaseObject* object, Property::Index propertyIndex // 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::Visual::Property::TYPE, Toolkit::Visual::TEXT ); newTextMap.Add( Toolkit::TextVisual::Property::POINT_SIZE, DEFAULT_FONT_SIZE ); } newTextMap.Add( Toolkit::TextVisual::Property::TEXT, textString ); @@ -578,10 +663,10 @@ 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 ) { @@ -589,6 +674,29 @@ void ProgressBar::OnStageConnection( int depth ) } } +double ProgressBar::AccessibleImpl::GetMinimum() { return DEFAULT_LOWER_BOUND; } + +double ProgressBar::AccessibleImpl::GetCurrent() +{ + auto p = Toolkit::ProgressBar::DownCast( self ); + return p.GetProperty( Toolkit::ProgressBar::Property::PROGRESS_VALUE ) + .Get< float >(); +} + +double ProgressBar::AccessibleImpl::GetMaximum() { return DEFAULT_UPPER_BOUND; } + +bool ProgressBar::AccessibleImpl::SetCurrent( double current ) +{ + if( current < GetMinimum() || current > GetMaximum() ) + return false; + auto p = Toolkit::ProgressBar::DownCast( self ); + p.SetProperty( Toolkit::ProgressBar::Property::PROGRESS_VALUE, + static_cast< float >( current ) ); + return true; +} + +double ProgressBar::AccessibleImpl::GetMinimumIncrement() { return 0.001; } + } // namespace Internal } // namespace Toolkit