| 
									
										
										
										
											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
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2020-01-01 11:16:22 +01:00
										 |  |  | /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2020 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
										 |  |  | 
 | 
					
						
							|  |  |  | #include "core/input/input_filter.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) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-23 17:27:55 +02:00
										 |  |  | 	String value = String::num(get_value(), Math::range_step_decimals(get_step())); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (prefix != "") | 
					
						
							|  |  |  | 		value = prefix + " " + value; | 
					
						
							|  |  |  | 	if (suffix != "") | 
					
						
							|  |  |  | 		value += " " + suffix; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	line_edit->set_text(value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpinBox::_text_entered(const String &p_string) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-29 23:48:50 +02:00
										 |  |  | 	Ref<Expression> expr; | 
					
						
							|  |  |  | 	expr.instance(); | 
					
						
							| 
									
										
										
										
											2019-08-30 14:28:32 +02:00
										 |  |  | 	// Ignore the prefix and suffix in the expression
 | 
					
						
							|  |  |  | 	Error err = expr->parse(p_string.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); | 
					
						
							|  |  |  | 		_value_changed(0); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											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() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-04 13:36:09 -03:00
										 |  |  | 	if (!drag.enabled && InputFilter::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { | 
					
						
							| 
									
										
										
										
											2015-12-08 19:04:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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()) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			case BUTTON_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; | 
					
						
							|  |  |  | 			case BUTTON_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; | 
					
						
							|  |  |  | 			case BUTTON_WHEEL_UP: { | 
					
						
							| 
									
										
										
										
											2016-11-25 03:15:42 +09:00
										 |  |  | 				if (line_edit->has_focus()) { | 
					
						
							| 
									
										
										
										
											2017-02-22 00:45:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 			case BUTTON_WHEEL_DOWN: { | 
					
						
							| 
									
										
										
										
											2016-11-25 03:15:42 +09:00
										 |  |  | 				if (line_edit->has_focus()) { | 
					
						
							| 
									
										
										
										
											2017-02-22 00:45:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-27 07:57:30 +02:00
										 |  |  | 	if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_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(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 		if (drag.enabled) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			drag.enabled = false; | 
					
						
							| 
									
										
										
										
											2020-03-04 13:36:09 -03:00
										 |  |  | 			InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 			warp_mouse(drag.capture_pos); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-27 07:57:30 +02:00
										 |  |  | 	if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 			float diff_y = -0.01 * Math::pow(ABS(drag.diff_y), 1.8f) * SGN(drag.diff_y); | 
					
						
							|  |  |  | 			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) { | 
					
						
							| 
									
										
										
										
											2015-08-29 01:43:21 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-04 13:36:09 -03:00
										 |  |  | 			InputFilter::get_singleton()->set_mouse_mode(InputFilter::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
 | 
					
						
							|  |  |  | 	if (line_edit->get_menu()->is_visible()) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	_text_entered(line_edit->get_text()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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(); | 
					
						
							|  |  |  | 	if (w != last_w) { | 
					
						
							|  |  |  | 		line_edit->set_margin(MARGIN_RIGHT, -w); | 
					
						
							|  |  |  | 		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) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 		Ref<Texture2D> updown = get_theme_icon("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(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-03 06:02:06 +09:00
										 |  |  | 		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) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 		_adjust_width_for_icon(get_theme_icon("updown")); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		_value_changed(0); | 
					
						
							| 
									
										
										
										
											2019-12-10 02:11:22 +01:00
										 |  |  | 	} else if (p_what == NOTIFICATION_THEME_CHANGED) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		call_deferred("minimum_size_changed"); | 
					
						
							|  |  |  | 		get_line_edit()->call_deferred("minimum_size_changed"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-25 05:17:07 +02:00
										 |  |  | void SpinBox::set_align(LineEdit::Align p_align) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	line_edit->set_align(p_align); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | LineEdit::Align SpinBox::get_align() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return line_edit->get_align(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpinBox::set_suffix(const String &p_suffix) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	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) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpinBox::set_editable(bool p_editable) { | 
					
						
							|  |  |  | 	line_edit->set_editable(p_editable); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool SpinBox::is_editable() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return line_edit->is_editable(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-09 13:44:23 +00:00
										 |  |  | void SpinBox::apply() { | 
					
						
							|  |  |  | 	_text_entered(line_edit->get_text()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void SpinBox::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 12:47:24 +01:00
										 |  |  | 	//ClassDB::bind_method(D_METHOD("_value_changed"),&SpinBox::_value_changed);
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("_gui_input"), &SpinBox::_gui_input); | 
					
						
							| 
									
										
										
										
											2018-08-25 05:17:07 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_align", "align"), &SpinBox::set_align); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_align"), &SpinBox::get_align); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("set_editable", "editable"), &SpinBox::set_editable); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_editable"), &SpinBox::is_editable); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-08 11:30:02 -03:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "align", PROPERTY_HINT_ENUM, "Left,Center,Right,Fill"), "set_align", "get_align"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editable"), "set_editable", "is_editable"); | 
					
						
							|  |  |  | 	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() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	last_w = 0; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	line_edit = memnew(LineEdit); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	add_child(line_edit); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 00:12:33 +02:00
										 |  |  | 	line_edit->set_anchors_and_margins_preset(Control::PRESET_WIDE); | 
					
						
							| 
									
										
										
										
											2019-05-21 14:49:53 +02:00
										 |  |  | 	line_edit->set_mouse_filter(MOUSE_FILTER_PASS); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	//connect("value_changed",this,"_value_changed");
 | 
					
						
							| 
									
										
										
										
											2020-02-21 18:28:45 +01:00
										 |  |  | 	line_edit->connect("text_entered", callable_mp(this, &SpinBox::_text_entered), Vector<Variant>(), CONNECT_DEFERRED); | 
					
						
							|  |  |  | 	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)); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	drag.enabled = false; | 
					
						
							| 
									
										
										
										
											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)); | 
					
						
							| 
									
										
										
										
											2015-12-08 19:04:56 +01:00
										 |  |  | 	add_child(range_click_timer); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } |