From 85c230140586e59cedeeda0d34b921a0cf661d7b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Artur=20=C5=9Awigo=C5=84?= Date: Wed, 16 Sep 2020 17:14:52 +0200 Subject: [PATCH] [AT-SPI] Implement proper accessibility for Slider Change-Id: Idb6bb5a14d6178df800b19efbfd23dd8d2197808 --- .../controls/progress-bar/progress-bar-impl.cpp | 2 +- .../internal/controls/slider/slider-impl.cpp | 52 ++++++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) 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 bdf7b0a..dc90b46 100644 --- a/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp +++ b/dali-toolkit/internal/controls/progress-bar/progress-bar-impl.cpp @@ -697,7 +697,7 @@ bool ProgressBar::AccessibleImpl::SetCurrent( double current ) return true; } -double ProgressBar::AccessibleImpl::GetMinimumIncrement() { return 0.001; } +double ProgressBar::AccessibleImpl::GetMinimumIncrement() { return 0.0; } } // namespace Internal diff --git a/dali-toolkit/internal/controls/slider/slider-impl.cpp b/dali-toolkit/internal/controls/slider/slider-impl.cpp index a010d05..3c48abc 100644 --- a/dali-toolkit/internal/controls/slider/slider-impl.cpp +++ b/dali-toolkit/internal/controls/slider/slider-impl.cpp @@ -614,6 +614,7 @@ Toolkit::TextLabel Slider::CreatePopupText() textLabel.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" ); textLabel.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" ); textLabel.SetProperty( Actor::Property::PADDING, Padding( POPUP_TEXT_PADDING, POPUP_TEXT_PADDING, 0.0f, 0.0f ) ); + textLabel.SetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false ); return textLabel; } @@ -697,6 +698,7 @@ void Slider::CreateHandleValueDisplay() mHandleValueTextLabel.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); mHandleValueTextLabel.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" ); mHandleValueTextLabel.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" ); + mHandleValueTextLabel.SetProperty( Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, false ); mHandle.Add( mHandleValueTextLabel ); } } @@ -1437,17 +1439,61 @@ double Slider::AccessibleImpl::GetMaximum() bool Slider::AccessibleImpl::SetCurrent( double current ) { - if( current < GetMinimum() || current > GetMaximum() ) + if (current < GetMinimum() || current > GetMaximum()) return false; + auto p = Toolkit::Slider::DownCast( self ); - p.SetProperty( Toolkit::Slider::Property::VALUE, static_cast< float >( current ) ); + auto &impl = Toolkit::GetImpl(p); + + const float prev = p.GetProperty(Toolkit::Slider::Property::VALUE); + float next = static_cast(current); + + if (fabsf(next - prev) < Math::MACHINE_EPSILON_0) + { + // do nothing + } + else if (p.GetProperty(Toolkit::Slider::Property::SNAP_TO_MARKS)) + { + auto marks = p.GetProperty(Toolkit::Slider::Property::MARKS); + + int prevIdx; + if (impl.MarkReached(impl.MapValuePercentage(prev), prevIdx)) + { + int nextIdx = prevIdx; + nextIdx += (next > prev) ? 1 : -1; + + if (nextIdx < 0 || nextIdx >= static_cast(marks.Count())) + return false; + + next = marks[nextIdx].Get(); + } + else + { + next = impl.MapBounds(impl.SnapToMark(impl.MapValuePercentage(next)), impl.GetLowerBound(), impl.GetUpperBound()); + } + } + else + { + next = impl.MapBounds(impl.MarkFilter(impl.MapValuePercentage(next)), impl.GetLowerBound(), impl.GetUpperBound()); + } + + impl.SetValue(next); + impl.DisplayPopup(next); + return true; } double Slider::AccessibleImpl::GetMinimumIncrement() { auto p = Toolkit::Slider::DownCast( self ); - return p.GetProperty( Toolkit::Slider::Property::MARK_TOLERANCE ).Get< float >(); + + bool hasMarks = !p.GetProperty(Toolkit::Slider::Property::MARKS).Empty(); + float tolerance = p.GetProperty(Toolkit::Slider::Property::MARK_TOLERANCE); + + if (!hasMarks || fabsf(tolerance) < 0.01) + return 0.0; // let screen-reader choose the increment + + return Math::MACHINE_EPSILON_10000 + tolerance * (GetMaximum() - GetMinimum()); } } // namespace Internal -- 2.7.4