1 #ifndef DALI_TOOLKIT_INTERNAL_SLIDER_H
2 #define DALI_TOOLKIT_INTERNAL_SLIDER_H
5 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/devel-api/atspi-interfaces/value.h>
23 #include <dali/public-api/adaptor-framework/timer.h>
24 #include <dali/public-api/object/property-array.h>
25 #include <dali/public-api/object/property-map.h>
28 #include <dali-toolkit/devel-api/controls/control-devel.h>
29 #include <dali-toolkit/internal/controls/control/control-data-impl.h>
30 #include <dali-toolkit/public-api/controls/control-impl.h>
31 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
32 #include <dali-toolkit/public-api/controls/slider/slider.h>
33 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
45 typedef Dali::IntrusivePtr<Slider> SliderPtr;
48 * @copydoc Toolkit::Slider
50 class Slider : public Control
53 typedef Property::Array MarkList;
56 * Create a new Slider.
58 * @return A public handle to the newly allocated Slider.
60 static Dali::Toolkit::Slider New();
66 * Set marks from a list
68 * @param[in] marks The list of marks to set
70 void SetMarks(const MarkList& marks);
73 * Get the list of marks
75 * @return The marks list
77 const MarkList& GetMarks() const;
80 * Set if should snap to marks or not
82 * @param[in] snap Flag to snap to marks or not
84 void SetSnapToMarks(bool snap);
87 * Return if snap to marks is set or not
89 * @return If snap to marks is set
91 bool GetSnapToMarks() const;
94 * Set the value of the slider
96 * @param[in] value The value to set. Will be clamped to [lowerBound .. upperBound]
98 void SetValue(float value);
101 * Get the value of the slider
103 * @return The current value of the slider
105 float GetValue() const;
110 * @param[in] region The hit region
112 void SetHitRegion(const Vector2& region);
117 * @return The hit region
119 const Vector2& GetHitRegion() const;
122 * Set the track region
124 * @param[in] region The track region
126 void SetTrackRegion(const Vector2& region);
129 * Get the track region
131 * @return The track region
133 const Vector2& GetTrackRegion() const;
136 * @brief Set the disabled color.
138 * @param[in] color The disabled color.
140 void SetDisabledColor(const Vector4& color);
143 * @brief Get disabled color
145 * @return The disabled color
147 Vector4 GetDisabledColor() const;
150 * Set the value precision to be used for numbers in the slider
152 * @param[in] precision The number of decimal places to use for printing numbers
154 void SetValuePrecision(int precision);
157 * Get value precision
159 * @return The value precision
161 int GetValuePrecision() const;
166 * @param[in] showPopup The show popup flag
168 void SetShowPopup(bool showPopup);
171 * Get show value in popup
173 * @return The show value flag
175 bool GetShowPopup() const;
178 * Set show value on handle
180 * @param[in] showValue The show value flag
182 void SetShowValue(bool showValue);
185 * Get show value on handle
187 * @return The show value flag
189 bool GetShowValue() const;
194 * param[in] enabled Set the enabled flag
196 void SetEnabled(bool enabled);
199 * Return if enabled or not
203 bool IsEnabled() const;
206 * @brief Set the mark tolerance
208 * The tolerance is the percentage of the slider width for which snapping to
211 * @param[in] tolerance The percentage of width for which to snap
213 void SetMarkTolerance(float tolerance);
216 * Return the mark tolerance
218 * @return The tolerance set for snapping to marks
220 float GetMarkTolerance() const;
226 * @copydoc Toolkit::Slider::ValueChangedSignal()
228 Toolkit::Slider::ValueChangedSignalType& ValueChangedSignal();
231 * copydoc Toolkit::Slider::SlidingFinishedSignal()
233 Toolkit::Slider::ValueChangedSignalType& SlidingFinishedSignal();
236 * @copydoc Toolkit::Slider::MarkReachedSignal()
238 Toolkit::Slider::MarkReachedSignalType& MarkReachedSignal();
241 * Connects a callback function with the object's signals.
242 * @param[in] object The object providing the signal.
243 * @param[in] tracker Used to disconnect the signal.
244 * @param[in] signalName The signal to connect to.
245 * @param[in] functor A newly allocated FunctorDelegate.
246 * @return True if the signal was connected.
247 * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
249 static bool DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor);
254 * Called when a property of an object of this type is set.
255 * @param[in] object The object whose property is set.
256 * @param[in] index The property index.
257 * @param[in] value The new property value.
259 static void SetProperty(BaseObject* object, Property::Index index, const Property::Value& value);
262 * Called to retrieve a property of an object of this type.
263 * @param[in] object The object whose property is to be retrieved.
264 * @param[in] index The property index.
265 * @return The current value of the property.
267 static Property::Value GetProperty(BaseObject* object, Property::Index propertyIndex);
271 * Construct a new Slider.
276 * A reference counted object may only be deleted by calling Unreference()
281 * @copydoc CustomActorImpl::OnRelayout
283 void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
287 * Domain is a from/to pair
297 Domain(Vector2 fromVal, Vector2 toVal)
317 * @copydoc Toolkit::Control::OnInitialize()
319 void OnInitialize() override;
322 * @copydoc Toolkit::Internal::Control::CreateAccessibleObject()
324 DevelControl::ControlAccessible* CreateAccessibleObject() override;
329 * @param[in] actor The actor the event is raised for
330 * @param[in] touch The touch info
331 * @return If touch is handled or not
333 bool OnTouch(Actor actor, const TouchEvent& touch);
338 * @param[in] actor The actor the event is raised for
339 * @param[in] gesture The pan event info
341 void OnPan(Actor actor, const PanGesture& gesture);
344 * @copydoc Control::OnPan
346 using Control::OnPan;
349 * Map a position onto a domain and return the result as a percentage
351 * @param[in] point The point to map onto the domain
352 * @return The result as a percentage [0..1]
354 float MapPercentage(const Vector2& point);
357 * Map a value in the range to a percentage
359 * @param[in] point The value in range [lowerBound..upperBound]
360 * @return The result as a percentage [0..1]
362 float MapValuePercentage(float value);
365 * Convert a point in local hit space into domain space
367 * @param[in] x The x position to convert
368 * @return The x position in domain space
370 float HitSpaceToDomain(float x);
373 * Map a percentage onto the slider's bounds
375 * @param[in] percent The current value of slider in percent
376 * @param[in] lowerBound The lower bound to map onto
377 * @param[in] upperBound The upper bound to map onto
378 * @return The value of percent mapped from lowerBound to upperBound
380 float MapBounds(float percent, float lowerBound, float upperBound);
383 * Get the range of the valid values the slider handle can move between
385 * @param[in] currentSize The current size of the slider
386 * @return The range as a domain pair
388 Domain CalcDomain(const Vector2& currentSize);
391 * Create the hit region
393 * @return The hit region actor
395 Actor CreateHitRegion();
398 * Create the track for the slider
400 * @return The track actor
402 Toolkit::ImageView CreateTrack();
405 * Create the progress track for the slider
407 * @return The track actor
409 Toolkit::ImageView CreateProgress();
412 * Create the handle for the slider
414 * @return The created image handle
416 Toolkit::ImageView CreateHandle();
419 * Create the popup arrow
421 * @return The created image handle
423 Toolkit::ImageView CreatePopupArrow();
428 * @return The created image handle
430 Toolkit::ImageView CreatePopup();
433 * Create the textview for the popup
435 * @return The textview created for the popup
437 Toolkit::TextLabel CreatePopupText();
440 * Create the value display for the slider
442 * @return The created root actor of the display
444 Actor CreateValueDisplay();
447 * Set the skin based on the current state
452 * Create all the children
454 void CreateChildren();
467 * Display the popup for a set duration with the given value
469 * @param[in] value The value to display in the popup
471 void DisplayPopup(float value);
474 * If there are marks present, filter the incoming percent based on snapping to any nearby marks
476 * @param[in] value The incoming value on the slider to filter
477 * @return The filtered percentage snapped to any nearby marks
479 float MarkFilter(float value);
482 * If there are marks present, snap the incoming percent to the nearest mark
484 * @param[in] value The incoming value on the slider to snap
485 * @return The filtered percentage snapped to the nearest mark
487 float SnapToMark(float value);
490 * Search for if a mark has been reached
492 * @param[in] value The value to search against
493 * @param[out] outIndex The index of the mark if found
494 * @return If a mark has been found to match percent
496 bool MarkReached(float value, int& outIndex);
499 * Handler for when the value view needs to be hidden
501 * @return If handled or not
503 bool HideValueView();
506 * Set value choosing whether to fire signals or not
508 * @paramp[in] value The value to set
509 * @param[in] raiseSignals Configure signals to be raised or not.
511 void DisplayValue(float value, bool raiseSignals);
514 * Create the image for the track
516 * @param[in] filename The track image
518 void SetTrackVisual(const std::string& filename);
521 * @brief Set the track visual from an Dali::Property::Map
523 * @param[in] map The Dali::Property::Map to use for to display
525 void SetTrackVisual(Dali::Property::Map map);
528 * @brief Return the track image.
530 * @return The track image.
532 std::string GetTrackVisual();
535 * Create the image for the progress bar
537 * @param[in] filename The progress bar image
539 void SetProgressVisual(const std::string& filename);
542 * @brief Set the progress visual from an Dali::Property::Map
544 * @param[in] map The Dali::Property::Map to use for to display
546 void SetProgressVisual(Dali::Property::Map map);
549 * @brief Return the progress bar image.
551 * @return The progress bar image if it exists.
553 std::string GetProgressVisual();
556 * @brief Create the image for the popup
558 * @param[in] filename The popup image
560 void CreatePopupImage(const std::string& filename);
563 * @brief Set the popup image
565 * @param[in] filename The popup image to set
567 void SetPopupVisual(const std::string& filename);
570 * @brief Set the popup from an Dali::Property::Map
572 * @param[in] map The Dali::Property::Map to use for to display
574 void SetPopupVisual(Dali::Property::Map map);
577 * @brief Return the popup image.
579 * @return The popup image if it exists.
581 std::string GetPopupVisual();
584 * @brief Set the popup arrow image
586 * @param[in] filename The popup arrow image to set
588 void SetPopupArrowVisual(const std::string& filename);
591 * @brief Set the popup arrow from an Dali::Property::Map
593 * @param[in] map The Dali::Property::Map to use for to display
595 void SetPopupArrowVisual(Dali::Property::Map map);
598 * @brief Return the popup arrow image.
600 * @return The popup arrow image if it exists.
602 std::string GetPopupArrowVisual();
605 * Create the image for the popup arrow
607 * @param[in] filename The popup arrow image to load and set
609 void CreatePopupArrowImage(const std::string& filename);
612 * Set the size of the progress bar region
614 * @param[in] region The size of the region to set
616 void ResizeProgressRegion(const Vector2& region);
619 * Create the image for the handle
621 * @param[in] filename The handle image
623 void SetHandleVisual(const std::string& filename);
626 * @brief Set the handle visual from an Dali::Property::Map
628 * @param[in] map The Dali::Property::Map to use for to display
630 void SetHandleVisual(Property::Map map);
633 * @brief Return the handle image.
635 * @return The handle image if it exists.
637 std::string GetHandleVisual();
640 * Reset the size of the handle
642 * @param[in] size The size of the handle to set
644 void ResizeHandleSize(const Vector2& size);
647 * Create and display the value on the handle
649 void CreateHandleValueDisplay();
652 * Remove and destroy the handle value display
654 void DestroyHandleValueDisplay();
657 * Set the size of the handle
659 * @param[in] size The handle size
661 void SetHandleSize(const Vector2& size);
664 * Get the size of the handle
666 * @return The handle size
668 const Vector2& GetHandleSize() const;
671 * Set the lower bound of the slider's value
673 * @param[in] bound The value to set for the lower bound
675 void SetLowerBound(float bound);
678 * Get the lower bound of the slider's value
680 * @return The lower bound value
682 float GetLowerBound() const;
685 * Set the upper bound of the slider's value
687 * @param[in] bound The value to set for the upper bound
689 void SetUpperBound(float bound);
692 * Get the upper bound of the slider's value
694 * @return The upper bound value
696 float GetUpperBound() const;
700 Slider(const Slider&);
703 Slider& operator=(const Slider& rhs);
706 Domain mDomain; ///< Current domain of the handle
708 Actor mHitArea; ///< The input handler
709 Actor mValueDisplay; ///< Display of the value
710 Toolkit::ImageView mTrack; ///< Track image
711 Toolkit::ImageView mHandle; ///< Slider handle
712 Toolkit::ImageView mProgress; ///< Progress bar
713 Toolkit::ImageView mPopup; ///< Popup backing
714 Toolkit::ImageView mPopupArrow; ///< Popup arrow backing
716 Toolkit::TextLabel mValueTextLabel; //< The text value in popup
717 Toolkit::TextLabel mHandleValueTextLabel; ///< The text value on handle
718 Vector2 mHandleLastTouchPoint; ///< The last touch point for the handle
719 Timer mValueTimer; ///< Timer used to hide value view
721 Toolkit::Slider::ValueChangedSignalType mValueChangedSignal; ///< Signal emitted when the value is changed
722 Toolkit::Slider::ValueChangedSignalType mSlidingFinishedSignal; ///< Signal emitted when a sliding is finished
723 Toolkit::Slider::MarkReachedSignalType mMarkReachedSignal; ///< Signal emitted when a mark is reached
725 SliderState mState; ///< The state of the slider
727 PanGestureDetector mPanDetector; ///< Hit region pan detector
729 MarkList mMarks; ///< List of discreet marks
731 std::string mPopupVisual; ///< Image for popup image
732 std::string mPopupArrowVisual; ///< Image for popup arrow image
733 std::string mTrackVisual; ///< Image for track image
734 std::string mHandleVisual; ///< Image for handle image
735 std::string mProgressVisual; ///< Image for progress bar image
737 Property::Map mPopupMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
738 Property::Map mTrackMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
739 Property::Map mHandleMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
740 Property::Map mProgressMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
741 Property::Map mPopupArrowMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
743 Vector4 mDisabledColor; ///< The color to tint the slider when disabled
745 Vector2 mHitRegion; ///< Size of hit region
746 Vector2 mTrackRegion; ///< Size of track region
747 Vector2 mHandleSize; ///< Size of the handle
749 float mLowerBound = 0.0f; ///< Lower bound on value
750 float mUpperBound = 1.0f; ///< Upper bound on value
751 float mValue = 0.0f; ///< Current value of slider
753 float mMarkTolerance = 0.05f; ///< Tolerance in percentage of slider width for which to snap to marks
755 int mValuePrecision; ///< The precision to use for outputting the value
757 bool mShowPopup : 1, ///< Show the popup or not
758 mShowValue : 1, ///< Whether to display the value number or not on the handle
759 mSnapToMarks : 1; ///< Turn on or off snapping to marks
762 class SliderAccessible : public DevelControl::ControlAccessible,
763 public virtual Dali::Accessibility::Value
766 using DevelControl::ControlAccessible::ControlAccessible;
769 * @copydoc Dali::Accessibility::Value::GetMinimum()
771 double GetMinimum() const override;
774 * @copydoc Dali::Accessibility::Value::GetCurrent()
776 double GetCurrent() const override;
779 * @copydoc Dali::Accessibility::Value::GetValueText()
781 std::string GetValueText() const override;
784 * @copydoc Dali::Accessibility::Value::GetMaximum()
786 double GetMaximum() const override;
789 * @copydoc Dali::Accessibility::Value::SetCurrent()
791 bool SetCurrent(double) override;
794 * @copydoc Dali::Accessibility::Value::GetMinimumIncrement()
796 double GetMinimumIncrement() const override;
800 } // namespace Internal
802 // Helpers for public-api forwarding methods
804 inline Toolkit::Internal::Slider& GetImpl(Toolkit::Slider& pub)
806 DALI_ASSERT_ALWAYS(pub);
808 Dali::RefObject& handle = pub.GetImplementation();
810 return static_cast<Toolkit::Internal::Slider&>(handle);
813 inline const Toolkit::Internal::Slider& GetImpl(const Toolkit::Slider& pub)
815 DALI_ASSERT_ALWAYS(pub);
817 const Dali::RefObject& handle = pub.GetImplementation();
819 return static_cast<const Toolkit::Internal::Slider&>(handle);
822 } // namespace Toolkit
826 #endif // DALI_TOOLKIT_INTERNAL_SLIDER_H