| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  spin_box.cpp                                                         */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2021-01-01 20:13:46 +01:00
										 |  |  | /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* 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
										 |  |  | #include "spin_box.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-04 13:36:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 15:19:37 +02:00
										 |  |  | #include "core/input/input.h"
 | 
					
						
							| 
									
										
										
										
											2019-08-29 23:48:50 +02:00
										 |  |  | #include "core/math/expression.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | Size2 SpinBox::get_minimum_size() const { | 
					
						
							|  |  |  | 	Size2 ms = line_edit->get_combined_minimum_size(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ms.width += last_w; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return ms; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpinBox::_value_changed(double) { | 
					
						
							| 
									
										
										
										
											2020-09-03 14:22:16 +03:00
										 |  |  | 	String value = TS->format_number(String::num(get_value(), Math::range_step_decimals(get_step()))); | 
					
						
							| 
									
										
										
										
											2021-12-09 03:42:46 -06:00
										 |  |  | 	if (!prefix.is_empty()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		value = prefix + " " + value; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-12-09 03:42:46 -06:00
										 |  |  | 	if (!suffix.is_empty()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		value += " " + suffix; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	line_edit->set_text(value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-16 09:43:34 -07:00
										 |  |  | void SpinBox::_text_submitted(const String &p_string) { | 
					
						
							| 
									
										
										
										
											2019-08-29 23:48:50 +02:00
										 |  |  | 	Ref<Expression> expr; | 
					
						
							| 
									
										
										
										
											2021-06-17 16:03:09 -06:00
										 |  |  | 	expr.instantiate(); | 
					
						
							| 
									
										
										
										
											2020-09-03 14:22:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	String num = TS->parse_number(p_string); | 
					
						
							| 
									
										
										
										
											2019-08-30 14:28:32 +02:00
										 |  |  | 	// Ignore the prefix and suffix in the expression
 | 
					
						
							| 
									
										
										
										
											2020-09-03 14:22:16 +03:00
										 |  |  | 	Error err = expr->parse(num.trim_prefix(prefix + " ").trim_suffix(" " + suffix)); | 
					
						
							| 
									
										
										
										
											2019-08-29 23:48:50 +02:00
										 |  |  | 	if (err != OK) { | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2019-08-29 23:48:50 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-02 01:20:12 +02:00
										 |  |  | 	Variant value = expr->execute(Array(), nullptr, false); | 
					
						
							| 
									
										
										
										
											2019-08-29 23:48:50 +02:00
										 |  |  | 	if (value.get_type() != Variant::NIL) { | 
					
						
							|  |  |  | 		set_value(value); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-26 22:10:11 +10:00
										 |  |  | 	_value_changed(0); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-27 20:24:27 +10:00
										 |  |  | void SpinBox::_text_changed(const String &p_string) { | 
					
						
							|  |  |  | 	int cursor_pos = line_edit->get_caret_column(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_text_submitted(p_string); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Line edit 'set_text' method resets the cursor position so we need to undo that.
 | 
					
						
							|  |  |  | 	line_edit->set_caret_column(cursor_pos); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | LineEdit *SpinBox::get_line_edit() { | 
					
						
							|  |  |  | 	return line_edit; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | void SpinBox::_line_edit_input(const Ref<InputEvent> &p_event) { | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 19:04:56 +01:00
										 |  |  | void SpinBox::_range_click_timeout() { | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 	if (!drag.enabled && Input::get_singleton()->is_mouse_button_pressed(MouseButton::LEFT)) { | 
					
						
							| 
									
										
										
										
											2017-09-10 15:37:49 +02:00
										 |  |  | 		bool up = get_local_mouse_position().y < (get_size().height / 2); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		set_value(get_value() + (up ? get_step() : -get_step())); | 
					
						
							| 
									
										
										
										
											2015-12-08 19:04:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (range_click_timer->is_one_shot()) { | 
					
						
							|  |  |  | 			range_click_timer->set_wait_time(0.075); | 
					
						
							|  |  |  | 			range_click_timer->set_one_shot(false); | 
					
						
							|  |  |  | 			range_click_timer->start(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		range_click_timer->stop(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-06 22:22:24 +01:00
										 |  |  | void SpinBox::_release_mouse() { | 
					
						
							|  |  |  | 	if (drag.enabled) { | 
					
						
							|  |  |  | 		drag.enabled = false; | 
					
						
							|  |  |  | 		Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); | 
					
						
							|  |  |  | 		warp_mouse(drag.capture_pos); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 12:37:22 -03:00
										 |  |  | void SpinBox::gui_input(const Ref<InputEvent> &p_event) { | 
					
						
							| 
									
										
										
										
											2021-04-05 08:52:21 +02:00
										 |  |  | 	ERR_FAIL_COND(p_event.is_null()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-25 03:15:42 +09:00
										 |  |  | 	if (!is_editable()) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 	Ref<InputEventMouseButton> mb = p_event; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 	if (mb.is_valid() && mb->is_pressed()) { | 
					
						
							| 
									
										
										
										
											2017-06-03 10:54:24 +02:00
										 |  |  | 		bool up = mb->get_position().y < (get_size().height / 2); | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		switch (mb->get_button_index()) { | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			case MouseButton::LEFT: { | 
					
						
							| 
									
										
										
										
											2019-10-21 16:42:17 -07:00
										 |  |  | 				line_edit->grab_focus(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				set_value(get_value() + (up ? get_step() : -get_step())); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 19:04:56 +01:00
										 |  |  | 				range_click_timer->set_wait_time(0.6); | 
					
						
							|  |  |  | 				range_click_timer->set_one_shot(true); | 
					
						
							|  |  |  | 				range_click_timer->start(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-27 07:57:30 +02:00
										 |  |  | 				drag.allowed = true; | 
					
						
							|  |  |  | 				drag.capture_pos = mb->get_position(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} break; | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			case MouseButton::RIGHT: { | 
					
						
							| 
									
										
										
										
											2016-11-25 03:15:42 +09:00
										 |  |  | 				line_edit->grab_focus(); | 
					
						
							| 
									
										
										
										
											2019-10-21 16:42:17 -07:00
										 |  |  | 				set_value((up ? get_max() : get_min())); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} break; | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			case MouseButton::WHEEL_UP: { | 
					
						
							| 
									
										
										
										
											2016-11-25 03:15:42 +09:00
										 |  |  | 				if (line_edit->has_focus()) { | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 					set_value(get_value() + get_step() * mb->get_factor()); | 
					
						
							| 
									
										
										
										
											2016-11-25 03:15:42 +09:00
										 |  |  | 					accept_event(); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} break; | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 			case MouseButton::WHEEL_DOWN: { | 
					
						
							| 
									
										
										
										
											2016-11-25 03:15:42 +09:00
										 |  |  | 				if (line_edit->has_focus()) { | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 					set_value(get_value() - get_step() * mb->get_factor()); | 
					
						
							| 
									
										
										
										
											2016-11-25 03:15:42 +09:00
										 |  |  | 					accept_event(); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} break; | 
					
						
							| 
									
										
										
										
											2021-03-25 16:56:12 -04:00
										 |  |  | 			default: | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 	if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 		//set_default_cursor_shape(CURSOR_ARROW);
 | 
					
						
							| 
									
										
										
										
											2015-12-08 19:04:56 +01:00
										 |  |  | 		range_click_timer->stop(); | 
					
						
							| 
									
										
										
										
											2021-03-06 22:22:24 +01:00
										 |  |  | 		_release_mouse(); | 
					
						
							| 
									
										
										
										
											2018-08-27 07:57:30 +02:00
										 |  |  | 		drag.allowed = false; | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 	Ref<InputEventMouseMotion> mm = p_event; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-13 16:31:57 -05:00
										 |  |  | 	if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 		if (drag.enabled) { | 
					
						
							| 
									
										
										
										
											2018-08-27 07:57:30 +02:00
										 |  |  | 			drag.diff_y += mm->get_relative().y; | 
					
						
							| 
									
										
										
										
											2021-10-16 01:22:57 +02:00
										 |  |  | 			float diff_y = -0.01 * Math::pow(ABS(drag.diff_y), 1.8f) * SIGN(drag.diff_y); | 
					
						
							| 
									
										
										
										
											2018-08-27 07:57:30 +02:00
										 |  |  | 			set_value(CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max())); | 
					
						
							|  |  |  | 		} else if (drag.allowed && drag.capture_pos.distance_to(mm->get_position()) > 2) { | 
					
						
							| 
									
										
										
										
											2020-04-28 15:19:37 +02:00
										 |  |  | 			Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			drag.enabled = true; | 
					
						
							|  |  |  | 			drag.base_val = get_value(); | 
					
						
							| 
									
										
										
										
											2018-08-27 07:57:30 +02:00
										 |  |  | 			drag.diff_y = 0; | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpinBox::_line_edit_focus_exit() { | 
					
						
							| 
									
										
										
										
											2019-08-12 03:39:27 -07:00
										 |  |  | 	// discontinue because the focus_exit was caused by right-click context menu
 | 
					
						
							| 
									
										
										
										
											2021-07-16 18:36:05 -03:00
										 |  |  | 	if (line_edit->is_menu_visible()) { | 
					
						
							| 
									
										
										
										
											2019-08-12 03:39:27 -07:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-12 03:39:27 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-16 09:43:34 -07:00
										 |  |  | 	_text_submitted(line_edit->get_text()); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-11 15:43:37 -03:00
										 |  |  | inline void SpinBox::_adjust_width_for_icon(const Ref<Texture2D> &icon) { | 
					
						
							| 
									
										
										
										
											2018-02-05 22:42:30 +01:00
										 |  |  | 	int w = icon->get_width(); | 
					
						
							| 
									
										
										
										
											2020-09-03 14:22:16 +03:00
										 |  |  | 	if ((w != last_w)) { | 
					
						
							| 
									
										
										
										
											2020-12-22 16:24:29 +00:00
										 |  |  | 		line_edit->set_offset(SIDE_LEFT, 0); | 
					
						
							|  |  |  | 		line_edit->set_offset(SIDE_RIGHT, -w); | 
					
						
							| 
									
										
										
										
											2018-02-05 22:42:30 +01:00
										 |  |  | 		last_w = w; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void SpinBox::_notification(int p_what) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_what == NOTIFICATION_DRAW) { | 
					
						
							| 
									
										
										
										
											2021-07-17 18:22:52 -03:00
										 |  |  | 		Ref<Texture2D> updown = get_theme_icon(SNAME("updown")); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 22:42:30 +01:00
										 |  |  | 		_adjust_width_for_icon(updown); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		RID ci = get_canvas_item(); | 
					
						
							|  |  |  | 		Size2i size = get_size(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-03 14:22:16 +03:00
										 |  |  | 		if (is_layout_rtl()) { | 
					
						
							|  |  |  | 			updown->draw(ci, Point2i(0, (size.height - updown->get_height()) / 2)); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			updown->draw(ci, Point2i(size.width - updown->get_width(), (size.height - updown->get_height()) / 2)); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	} else if (p_what == NOTIFICATION_FOCUS_EXIT) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		//_value_changed(0);
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	} else if (p_what == NOTIFICATION_ENTER_TREE) { | 
					
						
							| 
									
										
										
										
											2021-07-17 18:22:52 -03:00
										 |  |  | 		_adjust_width_for_icon(get_theme_icon(SNAME("updown"))); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		_value_changed(0); | 
					
						
							| 
									
										
										
										
											2021-03-06 22:22:24 +01:00
										 |  |  | 	} else if (p_what == NOTIFICATION_EXIT_TREE) { | 
					
						
							|  |  |  | 		_release_mouse(); | 
					
						
							| 
									
										
										
										
											2020-09-03 14:22:16 +03:00
										 |  |  | 	} else if (p_what == NOTIFICATION_TRANSLATION_CHANGED) { | 
					
						
							|  |  |  | 		_value_changed(0); | 
					
						
							| 
									
										
										
										
											2019-12-10 02:11:22 +01:00
										 |  |  | 	} else if (p_what == NOTIFICATION_THEME_CHANGED) { | 
					
						
							| 
									
										
										
										
											2021-12-06 14:02:34 +01:00
										 |  |  | 		call_deferred(SNAME("update_minimum_size")); | 
					
						
							|  |  |  | 		get_line_edit()->call_deferred(SNAME("update_minimum_size")); | 
					
						
							| 
									
										
										
										
											2020-09-03 14:22:16 +03:00
										 |  |  | 	} else if (p_what == NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) { | 
					
						
							|  |  |  | 		update(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-24 20:58:47 -06:00
										 |  |  | void SpinBox::set_horizontal_alignment(HorizontalAlignment p_alignment) { | 
					
						
							|  |  |  | 	line_edit->set_horizontal_alignment(p_alignment); | 
					
						
							| 
									
										
										
										
											2018-08-25 05:17:07 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-24 20:58:47 -06:00
										 |  |  | HorizontalAlignment SpinBox::get_horizontal_alignment() const { | 
					
						
							|  |  |  | 	return line_edit->get_horizontal_alignment(); | 
					
						
							| 
									
										
										
										
											2018-08-25 05:17:07 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpinBox::set_suffix(const String &p_suffix) { | 
					
						
							|  |  |  | 	suffix = p_suffix; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	_value_changed(0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | String SpinBox::get_suffix() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return suffix; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpinBox::set_prefix(const String &p_prefix) { | 
					
						
							|  |  |  | 	prefix = p_prefix; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	_value_changed(0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | String SpinBox::get_prefix() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return prefix; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-08 23:26:13 +02:00
										 |  |  | void SpinBox::set_update_on_text_changed(bool p_enabled) { | 
					
						
							|  |  |  | 	if (update_on_text_changed == p_enabled) { | 
					
						
							| 
									
										
										
										
											2020-04-27 20:24:27 +10:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-08 23:26:13 +02:00
										 |  |  | 	update_on_text_changed = p_enabled; | 
					
						
							| 
									
										
										
										
											2020-04-27 20:24:27 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-08 23:26:13 +02:00
										 |  |  | 	if (p_enabled) { | 
					
						
							| 
									
										
										
										
											2020-04-27 20:24:27 +10:00
										 |  |  | 		line_edit->connect("text_changed", callable_mp(this, &SpinBox::_text_changed), Vector<Variant>(), CONNECT_DEFERRED); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		line_edit->disconnect("text_changed", callable_mp(this, &SpinBox::_text_changed)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool SpinBox::get_update_on_text_changed() const { | 
					
						
							|  |  |  | 	return update_on_text_changed; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-08 23:26:13 +02:00
										 |  |  | void SpinBox::set_editable(bool p_enabled) { | 
					
						
							|  |  |  | 	line_edit->set_editable(p_enabled); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool SpinBox::is_editable() const { | 
					
						
							|  |  |  | 	return line_edit->is_editable(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-09 13:44:23 +00:00
										 |  |  | void SpinBox::apply() { | 
					
						
							| 
									
										
										
										
											2021-06-16 09:43:34 -07:00
										 |  |  | 	_text_submitted(line_edit->get_text()); | 
					
						
							| 
									
										
										
										
											2020-01-09 13:44:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void SpinBox::_bind_methods() { | 
					
						
							| 
									
										
										
										
											2021-11-24 20:58:47 -06:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_horizontal_alignment", "alignment"), &SpinBox::set_horizontal_alignment); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_horizontal_alignment"), &SpinBox::get_horizontal_alignment); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_suffix", "suffix"), &SpinBox::set_suffix); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_suffix"), &SpinBox::get_suffix); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("set_prefix", "prefix"), &SpinBox::set_prefix); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_prefix"), &SpinBox::get_prefix); | 
					
						
							| 
									
										
										
										
											2021-10-08 23:26:13 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_editable", "enabled"), &SpinBox::set_editable); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("is_editable"), &SpinBox::is_editable); | 
					
						
							| 
									
										
										
										
											2021-10-08 23:26:13 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_update_on_text_changed", "enabled"), &SpinBox::set_update_on_text_changed); | 
					
						
							| 
									
										
										
										
											2020-04-27 20:24:27 +10:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_update_on_text_changed"), &SpinBox::get_update_on_text_changed); | 
					
						
							| 
									
										
										
										
											2020-01-09 13:44:23 +00:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("apply"), &SpinBox::apply); | 
					
						
							| 
									
										
										
										
											2017-08-09 13:19:41 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_line_edit"), &SpinBox::get_line_edit); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-24 20:58:47 -06:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "alignment", PROPERTY_HINT_ENUM, "Left,Center,Right,Fill"), "set_horizontal_alignment", "get_horizontal_alignment"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editable"), "set_editable", "is_editable"); | 
					
						
							| 
									
										
										
										
											2020-04-27 20:24:27 +10:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "update_on_text_changed"), "set_update_on_text_changed", "get_update_on_text_changed"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "prefix"), "set_prefix", "get_prefix"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "suffix"), "set_suffix", "get_suffix"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SpinBox::SpinBox() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	line_edit = memnew(LineEdit); | 
					
						
							| 
									
										
										
										
											2021-08-25 15:49:30 +02:00
										 |  |  | 	add_child(line_edit, false, INTERNAL_MODE_FRONT); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-22 16:24:29 +00:00
										 |  |  | 	line_edit->set_anchors_and_offsets_preset(Control::PRESET_WIDE); | 
					
						
							| 
									
										
										
										
											2019-05-21 14:49:53 +02:00
										 |  |  | 	line_edit->set_mouse_filter(MOUSE_FILTER_PASS); | 
					
						
							| 
									
										
										
										
											2021-11-24 20:58:47 -06:00
										 |  |  | 	line_edit->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_LEFT); | 
					
						
							| 
									
										
										
										
											2020-09-03 14:22:16 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-16 09:43:34 -07:00
										 |  |  | 	line_edit->connect("text_submitted", callable_mp(this, &SpinBox::_text_submitted), Vector<Variant>(), CONNECT_DEFERRED); | 
					
						
							| 
									
										
										
										
											2020-02-21 18:28:45 +01:00
										 |  |  | 	line_edit->connect("focus_exited", callable_mp(this, &SpinBox::_line_edit_focus_exit), Vector<Variant>(), CONNECT_DEFERRED); | 
					
						
							|  |  |  | 	line_edit->connect("gui_input", callable_mp(this, &SpinBox::_line_edit_input)); | 
					
						
							| 
									
										
										
										
											2015-12-08 19:04:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	range_click_timer = memnew(Timer); | 
					
						
							| 
									
										
										
										
											2020-02-21 18:28:45 +01:00
										 |  |  | 	range_click_timer->connect("timeout", callable_mp(this, &SpinBox::_range_click_timeout)); | 
					
						
							| 
									
										
										
										
											2021-08-25 15:49:30 +02:00
										 |  |  | 	add_child(range_click_timer, false, INTERNAL_MODE_FRONT); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } |