| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*  slider.h                                                              */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*                         This file is part of:                          */ | 
					
						
							|  |  |  | /*                             GODOT ENGINE                               */ | 
					
						
							|  |  |  | /*                        https://godotengine.org                         */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ | 
					
						
							|  |  |  | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining  */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the        */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including    */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,    */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to     */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to  */ | 
					
						
							|  |  |  | /* the following conditions:                                              */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be         */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.        */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,        */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF     */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY   */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,   */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE      */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                 */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "scene/gui/range.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Slider : public Range { | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	GDCLASS(Slider, Range); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-09 12:36:08 +08:00
										 |  |  | public: | 
					
						
							|  |  |  | 	enum TickPosition { | 
					
						
							|  |  |  | 		TICK_POSITION_BOTTOM_RIGHT, | 
					
						
							|  |  |  | 		TICK_POSITION_TOP_LEFT, | 
					
						
							|  |  |  | 		TICK_POSITION_BOTH, | 
					
						
							|  |  |  | 		TICK_POSITION_CENTER, | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	struct Grab { | 
					
						
							| 
									
										
										
										
											2021-02-09 18:24:36 +01:00
										 |  |  | 		int pos = 0; | 
					
						
							| 
									
										
										
										
											2023-12-21 11:23:35 +08:00
										 |  |  | 		double uvalue = 0.0; // Value at `pos`.
 | 
					
						
							|  |  |  | 		double value_before_dragging = 0.0; | 
					
						
							| 
									
										
										
										
											2021-02-09 18:24:36 +01:00
										 |  |  | 		bool active = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} grab; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-09 18:24:36 +01:00
										 |  |  | 	int ticks = 0; | 
					
						
							| 
									
										
										
										
											2025-06-09 12:36:08 +08:00
										 |  |  | 	TickPosition ticks_position = TICK_POSITION_BOTTOM_RIGHT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-09 18:24:36 +01:00
										 |  |  | 	bool mouse_inside = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Orientation orientation; | 
					
						
							| 
									
										
										
										
											2022-07-14 18:33:00 -05:00
										 |  |  | 	double custom_step = -1.0; | 
					
						
							| 
									
										
										
										
											2021-02-09 18:24:36 +01:00
										 |  |  | 	bool editable = true; | 
					
						
							|  |  |  | 	bool scrollable = true; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-09 11:25:56 -05:00
										 |  |  | 	const float DEFAULT_GAMEPAD_EVENT_DELAY_MS = 0.5; | 
					
						
							|  |  |  | 	const float GAMEPAD_EVENT_REPEAT_RATE_MS = 1.0 / 20; | 
					
						
							|  |  |  | 	float gamepad_event_delay_ms = DEFAULT_GAMEPAD_EVENT_DELAY_MS; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 15:02:40 +03:00
										 |  |  | 	struct ThemeCache { | 
					
						
							|  |  |  | 		Ref<StyleBox> slider_style; | 
					
						
							|  |  |  | 		Ref<StyleBox> grabber_area_style; | 
					
						
							|  |  |  | 		Ref<StyleBox> grabber_area_hl_style; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Ref<Texture2D> grabber_icon; | 
					
						
							|  |  |  | 		Ref<Texture2D> grabber_hl_icon; | 
					
						
							|  |  |  | 		Ref<Texture2D> grabber_disabled_icon; | 
					
						
							|  |  |  | 		Ref<Texture2D> tick_icon; | 
					
						
							| 
									
										
										
										
											2022-11-23 14:56:10 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		bool center_grabber = false; | 
					
						
							|  |  |  | 		int grabber_offset = 0; | 
					
						
							| 
									
										
										
										
											2025-06-09 12:36:08 +08:00
										 |  |  | 		int tick_offset = 0; | 
					
						
							| 
									
										
										
										
											2022-08-31 15:02:40 +03:00
										 |  |  | 	} theme_cache; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2022-08-31 15:02:40 +03:00
										 |  |  | 	bool ticks_on_borders = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 12:37:22 -03:00
										 |  |  | 	virtual void gui_input(const Ref<InputEvent> &p_event) override; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _notification(int p_what); | 
					
						
							| 
									
										
										
										
											2025-06-09 12:36:08 +08:00
										 |  |  | 	void _validate_property(PropertyInfo &p_property) const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2020-07-10 11:34:39 +01:00
										 |  |  | 	virtual Size2 get_minimum_size() const override; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-14 18:33:00 -05:00
										 |  |  | 	void set_custom_step(double p_custom_step); | 
					
						
							|  |  |  | 	double get_custom_step() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void set_ticks(int p_count); | 
					
						
							|  |  |  | 	int get_ticks() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_ticks_on_borders(bool); | 
					
						
							|  |  |  | 	bool get_ticks_on_borders() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-09 12:36:08 +08:00
										 |  |  | 	void set_ticks_position(TickPosition p_ticks_position); | 
					
						
							|  |  |  | 	TickPosition get_ticks_position() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 17:58:53 +07:00
										 |  |  | 	void set_editable(bool p_editable); | 
					
						
							|  |  |  | 	bool is_editable() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-07 12:35:59 +03:00
										 |  |  | 	void set_scrollable(bool p_scrollable); | 
					
						
							|  |  |  | 	bool is_scrollable() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Slider(Orientation p_orientation = VERTICAL); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-09 12:36:08 +08:00
										 |  |  | VARIANT_ENUM_CAST(Slider::TickPosition); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | class HSlider : public Slider { | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	GDCLASS(HSlider, Slider); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-12-06 21:36:34 +01:00
										 |  |  | 	HSlider() : | 
					
						
							|  |  |  | 			Slider(HORIZONTAL) { set_v_size_flags(0); } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class VSlider : public Slider { | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	GDCLASS(VSlider, Slider); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-12-06 21:36:34 +01:00
										 |  |  | 	VSlider() : | 
					
						
							|  |  |  | 			Slider(VERTICAL) { set_h_size_flags(0); } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; |