[AT-SPI] Remove SetAccessibilityConstructor()
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / slider / slider-impl.h
1 #ifndef DALI_TOOLKIT_INTERNAL_SLIDER_H
2 #define DALI_TOOLKIT_INTERNAL_SLIDER_H
3
4 /*
5  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // EXTERNAL INCLUDES
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>
26
27 // INTERNAL INCLUDES
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>
34
35 namespace Dali
36 {
37 namespace Toolkit
38 {
39 class Button;
40
41 namespace Internal
42 {
43 class Slider;
44
45 typedef Dali::IntrusivePtr<Slider> SliderPtr;
46
47 /**
48  * @copydoc Toolkit::Slider
49  */
50 class Slider : public Control
51 {
52 public:
53   typedef Property::Array MarkList;
54
55   /**
56    * Create a new Slider.
57    *
58    * @return A public handle to the newly allocated Slider.
59    */
60   static Dali::Toolkit::Slider New();
61
62 public:
63   // Properties
64
65   /**
66    * Set marks from a list
67    *
68    * @param[in] marks The list of marks to set
69    */
70   void SetMarks(const MarkList& marks);
71
72   /**
73    * Get the list of marks
74    *
75    * @return The marks list
76    */
77   const MarkList& GetMarks() const;
78
79   /**
80    * Set if should snap to marks or not
81    *
82    * @param[in] snap Flag to snap to marks or not
83    */
84   void SetSnapToMarks(bool snap);
85
86   /**
87    * Return if snap to marks is set or not
88    *
89    * @return If snap to marks is set
90    */
91   bool GetSnapToMarks() const;
92
93   /**
94    * Set the value of the slider
95    *
96    * @param[in] value The value to set. Will be clamped to [lowerBound .. upperBound]
97    */
98   void SetValue(float value);
99
100   /**
101    * Get the value of the slider
102    *
103    * @return The current value of the slider
104    */
105   float GetValue() const;
106
107   /**
108    * Set hit region
109    *
110    * @param[in] region The hit region
111    */
112   void SetHitRegion(const Vector2& region);
113
114   /**
115    * Get hit region
116    *
117    * @return The hit region
118    */
119   const Vector2& GetHitRegion() const;
120
121   /**
122    * Set the track region
123    *
124    * @param[in] region The track region
125    */
126   void SetTrackRegion(const Vector2& region);
127
128   /**
129    * Get the track region
130    *
131    * @return The track region
132    */
133   const Vector2& GetTrackRegion() const;
134
135   /**
136    * @brief Set the disabled color.
137    *
138    * @param[in] color The disabled color.
139    */
140   void SetDisabledColor(const Vector4& color);
141
142   /**
143    * @brief Get disabled color
144    *
145    * @return The disabled color
146    */
147   Vector4 GetDisabledColor() const;
148
149   /**
150    * Set the value precision to be used for numbers in the slider
151    *
152    * @param[in] precision The number of decimal places to use for printing numbers
153    */
154   void SetValuePrecision(int precision);
155
156   /**
157    * Get value precision
158    *
159    * @return The value precision
160    */
161   int GetValuePrecision() const;
162
163   /**
164    * Show the popup
165    *
166    * @param[in] showPopup The show popup flag
167    */
168   void SetShowPopup(bool showPopup);
169
170   /**
171    * Get show value in popup
172    *
173    * @return The show value flag
174    */
175   bool GetShowPopup() const;
176
177   /**
178    * Set show value on handle
179    *
180    * @param[in] showValue The show value flag
181    */
182   void SetShowValue(bool showValue);
183
184   /**
185    * Get show value on handle
186    *
187    * @return The show value flag
188    */
189   bool GetShowValue() const;
190
191   /**
192    * Set enabled
193    *
194    * param[in] enabled Set the enabled flag
195    */
196   void SetEnabled(bool enabled);
197
198   /**
199    * Return if enabled or not
200    *
201    * @return If enabled
202    */
203   bool IsEnabled() const;
204
205   /**
206    * @brief Set the mark tolerance
207    *
208    * The tolerance is the percentage of the slider width for which snapping to
209    * marks occurs
210    *
211    * @param[in] tolerance The percentage of width for which to snap
212    */
213   void SetMarkTolerance(float tolerance);
214
215   /**
216    * Return the mark tolerance
217    *
218    * @return The tolerance set for snapping to marks
219    */
220   float GetMarkTolerance() const;
221
222 public:
223   //Signals
224
225   /**
226    * @copydoc Toolkit::Slider::ValueChangedSignal()
227    */
228   Toolkit::Slider::ValueChangedSignalType& ValueChangedSignal();
229
230   /**
231    * copydoc Toolkit::Slider::SlidingFinishedSignal()
232    */
233   Toolkit::Slider::ValueChangedSignalType& SlidingFinishedSignal();
234
235   /**
236    * @copydoc Toolkit::Slider::MarkReachedSignal()
237    */
238   Toolkit::Slider::MarkReachedSignalType& MarkReachedSignal();
239
240   /**
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.
248    */
249   static bool DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor);
250
251   // Properties
252
253   /**
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.
258    */
259   static void SetProperty(BaseObject* object, Property::Index index, const Property::Value& value);
260
261   /**
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.
266    */
267   static Property::Value GetProperty(BaseObject* object, Property::Index propertyIndex);
268
269 protected:
270   /**
271    * Construct a new Slider.
272    */
273   Slider();
274
275   /**
276    * A reference counted object may only be deleted by calling Unreference()
277    */
278   virtual ~Slider();
279
280   /**
281    * @copydoc CustomActorImpl::OnRelayout
282    */
283   void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
284
285 private:
286   /**
287    * Domain is a from/to pair
288    */
289   struct Domain
290   {
291     Vector2 from;
292     Vector2 to;
293
294     Domain()
295     {
296     }
297     Domain(Vector2 fromVal, Vector2 toVal)
298     : from(fromVal),
299       to(toVal)
300     {
301     }
302   };
303
304   /**
305    * Slider states
306    */
307   enum SliderState
308   {
309     NORMAL,
310     DISABLED,
311     PRESSED,
312     FOCUSED
313   };
314
315 private:
316   /**
317    * @copydoc Toolkit::Control::OnInitialize()
318    */
319   void OnInitialize() override;
320
321   /**
322    * @copydoc Toolkit::Internal::Control::CreateAccessibleObject()
323    */
324   DevelControl::ControlAccessible* CreateAccessibleObject() override;
325
326   /**
327    * Hit region touch
328    *
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
332    */
333   bool OnTouch(Actor actor, const TouchEvent& touch);
334
335   /**
336    * Pan gesture event
337    *
338    * @param[in] actor The actor the event is raised for
339    * @param[in] gesture The pan event info
340    */
341   void OnPan(Actor actor, const PanGesture& gesture);
342
343   /**
344    * Map a position onto a domain and return the result as a percentage
345    *
346    * @param[in] point The point to map onto the domain
347    * @return The result as a percentage [0..1]
348    */
349   float MapPercentage(const Vector2& point);
350
351   /**
352    * Map a value in the range to a percentage
353    *
354    * @param[in] point The value in range [lowerBound..upperBound]
355    * @return The result as a percentage [0..1]
356    */
357   float MapValuePercentage(float value);
358
359   /**
360    * Convert a point in local hit space into domain space
361    *
362    * @param[in] x The x position to convert
363    * @return The x position in domain space
364    */
365   float HitSpaceToDomain(float x);
366
367   /**
368    * Map a percentage onto the slider's bounds
369    *
370    * @param[in] percent The current value of slider in percent
371    * @param[in] lowerBound The lower bound to map onto
372    * @param[in] upperBound The upper bound to map onto
373    * @return The value of percent mapped from lowerBound to upperBound
374    */
375   float MapBounds(float percent, float lowerBound, float upperBound);
376
377   /**
378    * Get the range of the valid values the slider handle can move between
379    *
380    * @param[in] currentSize The current size of the slider
381    * @return The range as a domain pair
382    */
383   Domain CalcDomain(const Vector2& currentSize);
384
385   /**
386    * Create the hit region
387    *
388    * @return The hit region actor
389    */
390   Actor CreateHitRegion();
391
392   /**
393    * Create the track for the slider
394    *
395    * @return The track actor
396    */
397   Toolkit::ImageView CreateTrack();
398
399   /**
400    * Create the progress track for the slider
401    *
402    * @return The track actor
403    */
404   Toolkit::ImageView CreateProgress();
405
406   /**
407    * Create the handle for the slider
408    *
409    * @return The created image handle
410    */
411   Toolkit::ImageView CreateHandle();
412
413   /**
414    * Create the popup arrow
415    *
416    * @return The created image handle
417    */
418   Toolkit::ImageView CreatePopupArrow();
419
420   /**
421    * Create the popup
422    *
423    * @return The created image handle
424    */
425   Toolkit::ImageView CreatePopup();
426
427   /**
428    * Create the textview for the popup
429    *
430    * @return The textview created for the popup
431    */
432   Toolkit::TextLabel CreatePopupText();
433
434   /**
435    * Create the value display for the slider
436    *
437    * @return The created root actor of the display
438    */
439   Actor CreateValueDisplay();
440
441   /**
442    * Set the skin based on the current state
443    */
444   void UpdateSkin();
445
446   /**
447    * Create all the children
448    */
449   void CreateChildren();
450
451   /**
452    * Create value popup
453    */
454   void AddPopup();
455
456   /**
457    * Remove value popup
458    */
459   void RemovePopup();
460
461   /**
462    * Display the popup for a set duration with the given value
463    *
464    * @param[in] value The value to display in the popup
465    */
466   void DisplayPopup(float value);
467
468   /**
469    * If there are marks present, filter the incoming percent based on snapping to any nearby marks
470    *
471    * @param[in] value The incoming value on the slider to filter
472    * @return The filtered percentage snapped to any nearby marks
473    */
474   float MarkFilter(float value);
475
476   /**
477    * If there are marks present, snap the incoming percent to the nearest mark
478    *
479    * @param[in] value The incoming value on the slider to snap
480    * @return The filtered percentage snapped to the nearest mark
481    */
482   float SnapToMark(float value);
483
484   /**
485    * Search for if a mark has been reached
486    *
487    * @param[in] value The value to search against
488    * @param[out] outIndex The index of the mark if found
489    * @return If a mark has been found to match percent
490    */
491   bool MarkReached(float value, int& outIndex);
492
493   /**
494    * Handler for when the value view needs to be hidden
495    *
496    * @return If handled or not
497    */
498   bool HideValueView();
499
500   /**
501    * Set value choosing whether to fire signals or not
502    *
503    * @paramp[in] value The value to set
504    * @param[in] raiseSignals Configure signals to be raised or not.
505    */
506   void DisplayValue(float value, bool raiseSignals);
507
508   /**
509    * Create the image for the track
510    *
511    * @param[in] filename The track image
512    */
513   void SetTrackVisual(const std::string& filename);
514
515   /**
516    * @brief Set the track visual from an Dali::Property::Map
517    *
518    * @param[in] map The Dali::Property::Map to use for to display
519    */
520   void SetTrackVisual(Dali::Property::Map map);
521
522   /**
523    * @brief Return the track image.
524    *
525    * @return The track image.
526    */
527   std::string GetTrackVisual();
528
529   /**
530    * Create the image for the progress bar
531    *
532    * @param[in] filename The progress bar image
533    */
534   void SetProgressVisual(const std::string& filename);
535
536   /**
537    * @brief Set the progress visual from an Dali::Property::Map
538    *
539    * @param[in] map The Dali::Property::Map to use for to display
540    */
541   void SetProgressVisual(Dali::Property::Map map);
542
543   /**
544    * @brief Return the progress bar image.
545    *
546    * @return The progress bar image if it exists.
547    */
548   std::string GetProgressVisual();
549
550   /**
551    * @brief Create the image for the popup
552    *
553    * @param[in] filename The popup image
554    */
555   void CreatePopupImage(const std::string& filename);
556
557   /**
558    * @brief Set the popup image
559    *
560    * @param[in] filename The popup image to set
561    */
562   void SetPopupVisual(const std::string& filename);
563
564   /**
565    * @brief Set the popup from an Dali::Property::Map
566    *
567    * @param[in] map The Dali::Property::Map to use for to display
568    */
569   void SetPopupVisual(Dali::Property::Map map);
570
571   /**
572    * @brief Return the popup image.
573    *
574    * @return The popup image if it exists.
575    */
576   std::string GetPopupVisual();
577
578   /**
579    * @brief Set the popup arrow image
580    *
581    * @param[in] filename The popup arrow image to set
582    */
583   void SetPopupArrowVisual(const std::string& filename);
584
585   /**
586    * @brief Set the popup arrow from an Dali::Property::Map
587    *
588    * @param[in] map The Dali::Property::Map to use for to display
589    */
590   void SetPopupArrowVisual(Dali::Property::Map map);
591
592   /**
593    * @brief Return the popup arrow image.
594    *
595    * @return The popup arrow image if it exists.
596    */
597   std::string GetPopupArrowVisual();
598
599   /**
600    * Create the image for the popup arrow
601    *
602    * @param[in] filename The popup arrow image to load and set
603    */
604   void CreatePopupArrowImage(const std::string& filename);
605
606   /**
607    * Set the size of the progress bar region
608    *
609    * @param[in] region The size of the region to set
610    */
611   void ResizeProgressRegion(const Vector2& region);
612
613   /**
614    * Create the image for the handle
615    *
616    * @param[in] filename The handle image
617    */
618   void SetHandleVisual(const std::string& filename);
619
620   /**
621    * @brief Set the handle visual from an Dali::Property::Map
622    *
623    * @param[in] map The Dali::Property::Map to use for to display
624    */
625   void SetHandleVisual(Property::Map map);
626
627   /**
628    * @brief Return the handle image.
629    *
630    * @return The handle image if it exists.
631    */
632   std::string GetHandleVisual();
633
634   /**
635    * Reset the size of the handle
636    *
637    * @param[in] size The size of the handle to set
638    */
639   void ResizeHandleSize(const Vector2& size);
640
641   /**
642    * Create and display the value on the handle
643    */
644   void CreateHandleValueDisplay();
645
646   /**
647    * Remove and destroy the handle value display
648    */
649   void DestroyHandleValueDisplay();
650
651   /**
652    * Set the size of the handle
653    *
654    * @param[in] size The handle size
655    */
656   void SetHandleSize(const Vector2& size);
657
658   /**
659    * Get the size of the handle
660    *
661    * @return The handle size
662    */
663   const Vector2& GetHandleSize() const;
664
665   /**
666    * Set the lower bound of the slider's value
667    *
668    * @param[in] bound The value to set for the lower bound
669    */
670   void SetLowerBound(float bound);
671
672   /**
673    * Get the lower bound of the slider's value
674    *
675    * @return The lower bound value
676    */
677   float GetLowerBound() const;
678
679   /**
680    * Set the upper bound of the slider's value
681    *
682    * @param[in] bound The value to set for the upper bound
683    */
684   void SetUpperBound(float bound);
685
686   /**
687    * Get the upper bound of the slider's value
688    *
689    * @return The upper bound value
690    */
691   float GetUpperBound() const;
692
693 private:
694   // Undefined
695   Slider(const Slider&);
696
697   // Undefined
698   Slider& operator=(const Slider& rhs);
699
700 private:
701   Domain mDomain; ///< Current domain of the handle
702
703   Actor              mHitArea;      ///< The input handler
704   Actor              mValueDisplay; ///< Display of the value
705   Toolkit::ImageView mTrack;        ///< Track image
706   Toolkit::ImageView mHandle;       ///< Slider handle
707   Toolkit::ImageView mProgress;     ///< Progress bar
708   Toolkit::ImageView mPopup;        ///< Popup backing
709   Toolkit::ImageView mPopupArrow;   ///< Popup arrow backing
710
711   Toolkit::TextLabel mValueTextLabel;       //< The text value in popup
712   Toolkit::TextLabel mHandleValueTextLabel; ///< The text value on handle
713   Vector2            mHandleLastTouchPoint; ///< The last touch point for the handle
714   Timer              mValueTimer;           ///< Timer used to hide value view
715
716   Toolkit::Slider::ValueChangedSignalType mValueChangedSignal;    ///< Signal emitted when the value is changed
717   Toolkit::Slider::ValueChangedSignalType mSlidingFinishedSignal; ///< Signal emitted when a sliding is finished
718   Toolkit::Slider::MarkReachedSignalType  mMarkReachedSignal;     ///< Signal emitted when a mark is reached
719
720   SliderState mState; ///< The state of the slider
721
722   PanGestureDetector mPanDetector; ///< Hit region pan detector
723
724   MarkList mMarks; ///< List of discreet marks
725
726   std::string mPopupVisual;      ///< Image for popup image
727   std::string mPopupArrowVisual; ///< Image for popup arrow image
728   std::string mTrackVisual;      ///< Image for track image
729   std::string mHandleVisual;     ///< Image for handle image
730   std::string mProgressVisual;   ///< Image for progress bar image
731
732   Property::Map mPopupMap;      ///< the Property::Map if the image came from a Property::Map, empty otherwise
733   Property::Map mTrackMap;      ///< the Property::Map if the image came from a Property::Map, empty otherwise
734   Property::Map mHandleMap;     ///< the Property::Map if the image came from a Property::Map, empty otherwise
735   Property::Map mProgressMap;   ///< the Property::Map if the image came from a Property::Map, empty otherwise
736   Property::Map mPopupArrowMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
737
738   Vector4 mDisabledColor; ///< The color to tint the slider when disabled
739
740   Vector2 mHitRegion;   ///< Size of hit region
741   Vector2 mTrackRegion; ///< Size of track region
742   Vector2 mHandleSize;  ///< Size of the handle
743
744   float mLowerBound = 0.0f; ///< Lower bound on value
745   float mUpperBound = 1.0f; ///< Upper bound on value
746   float mValue      = 0.0f; ///< Current value of slider
747
748   float mMarkTolerance = 0.05f; ///< Tolerance in percentage of slider width for which to snap to marks
749
750   int mValuePrecision; ///< The precision to use for outputting the value
751
752   bool mShowPopup : 1, ///< Show the popup or not
753     mShowValue : 1,    ///< Whether to display the value number or not on the handle
754     mSnapToMarks : 1;  ///< Turn on or off snapping to marks
755
756 protected:
757   class SliderAccessible : public DevelControl::ControlAccessible,
758                            public virtual Dali::Accessibility::Value
759   {
760   public:
761     using DevelControl::ControlAccessible::ControlAccessible;
762
763     /**
764      * @copydoc Dali::Accessibility::Value::GetMinimum()
765      */
766     double GetMinimum() const override;
767
768     /**
769      * @copydoc Dali::Accessibility::Value::GetCurrent()
770      */
771     double GetCurrent() const override;
772
773     /**
774      * @copydoc Dali::Accessibility::Value::GetMaximum()
775      */
776     double GetMaximum() const override;
777
778     /**
779      * @copydoc Dali::Accessibility::Value::SetCurrent()
780      */
781     bool SetCurrent(double) override;
782
783     /**
784      * @copydoc Dali::Accessibility::Value::GetMinimumIncrement()
785      */
786     double GetMinimumIncrement() const override;
787   };
788 };
789
790 } // namespace Internal
791
792 // Helpers for public-api forwarding methods
793
794 inline Toolkit::Internal::Slider& GetImpl(Toolkit::Slider& pub)
795 {
796   DALI_ASSERT_ALWAYS(pub);
797
798   Dali::RefObject& handle = pub.GetImplementation();
799
800   return static_cast<Toolkit::Internal::Slider&>(handle);
801 }
802
803 inline const Toolkit::Internal::Slider& GetImpl(const Toolkit::Slider& pub)
804 {
805   DALI_ASSERT_ALWAYS(pub);
806
807   const Dali::RefObject& handle = pub.GetImplementation();
808
809   return static_cast<const Toolkit::Internal::Slider&>(handle);
810 }
811
812 } // namespace Toolkit
813
814 } // namespace Dali
815
816 #endif // DALI_TOOLKIT_INTERNAL_SLIDER_H