1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-18 14:21:41 +00:00

Merge pull request #110459 from YeldhamDev/let_the_poor_ints_slide

Allow to use sliders for integers in `EditorSpinSlider`
This commit is contained in:
Thaddeus Crews
2025-09-22 13:28:52 -05:00
21 changed files with 189 additions and 97 deletions

View File

@@ -38,15 +38,20 @@
#include "scene/theme/theme_db.h"
String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
String value = get_text_value() + suffix;
if (!read_only && grabber->is_visible()) {
String tooltip = value;
Key key = (OS::get_singleton()->has_feature("macos") || OS::get_singleton()->has_feature("web_macos") || OS::get_singleton()->has_feature("web_ios")) ? Key::META : Key::CTRL;
return TS->format_number(rtos(get_value())) + suffix + "\n\n" + vformat(TTR("Hold %s to round to integers.\nHold Shift for more precise changes."), find_keycode_name(key));
if (!editing_integer) {
tooltip += "\n\n" + vformat(TTR("Hold %s to round to integers."), find_keycode_name(key));
}
return tooltip + "\n" + TTR("Hold Shift for more precise changes.");
}
return TS->format_number(rtos(get_value())) + suffix;
return value;
}
String EditorSpinSlider::get_text_value() const {
return TS->format_number(String::num(get_value(), Math::range_step_decimals(get_step())));
return TS->format_number(editing_integer ? itos(get_value()) : rtos(get_value()));
}
void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) {
@@ -109,17 +114,8 @@ void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) {
pre_grab_value = get_max();
}
if (mm->is_command_or_control_pressed()) {
// If control was just pressed, don't make the value do a huge jump in magnitude.
if (grabbing_spinner_dist_cache != 0) {
pre_grab_value += grabbing_spinner_dist_cache * get_step();
grabbing_spinner_dist_cache = 0;
}
set_value(Math::round(pre_grab_value + get_step() * grabbing_spinner_dist_cache * 10));
} else {
set_value(pre_grab_value + get_step() * grabbing_spinner_dist_cache);
}
double new_value = pre_grab_value + get_step() * grabbing_spinner_dist_cache;
set_value((mm->is_command_or_control_pressed() && !editing_integer) ? Math::round(new_value) : new_value);
}
} else if (updown_offset != -1) {
bool new_hover = (!is_layout_rtl() && mm->get_position().x > updown_offset) || (is_layout_rtl() && mm->get_position().x < updown_offset);
@@ -158,6 +154,7 @@ void EditorSpinSlider::_grab_end() {
if (grabbing_spinner) {
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
Input::get_singleton()->warp_mouse(grabbing_spinner_mouse_pos);
mouse_over_grabber = true;
queue_redraw();
grabbing_spinner = false;
emit_signal("ungrabbed");
@@ -207,7 +204,12 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
grab_focus(true);
emit_signal("grabbed");
} else {
grabbing_grabber = false;
if (grabbing_grabber) {
grabbing_grabber = false;
if (!mouse_over_grabber) {
queue_redraw();
}
}
mousewheel_over_grabber = false;
emit_signal("ungrabbed");
}
@@ -377,8 +379,8 @@ void EditorSpinSlider::_draw_spin_slider() {
}
TS->free_rid(num_rid);
if (!hide_slider) {
if (editing_integer) {
if (control_state != CONTROL_STATE_HIDE) {
if (editing_integer && control_state == CONTROL_STATE_DEFAULT) {
Ref<Texture2D> updown2 = read_only ? theme_cache.updown_disabled_icon : theme_cache.updown_icon;
int updown_vofs = (size.height - updown2->get_height()) / 2;
if (rtl) {
@@ -427,7 +429,7 @@ void EditorSpinSlider::_draw_spin_slider() {
if (display_grabber) {
Ref<Texture2D> grabber_tex;
if (mouse_over_grabber) {
if (mouse_over_grabber || grabbing_grabber) {
grabber_tex = get_theme_icon(SNAME("grabber_highlight"), SNAME("HSlider"));
} else {
grabber_tex = get_theme_icon(SNAME("grabber"), SNAME("HSlider"));
@@ -453,7 +455,7 @@ void EditorSpinSlider::_draw_spin_slider() {
void EditorSpinSlider::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
grabbing_spinner_speed = EDITOR_GET("interface/inspector/float_drag_speed");
grabbing_spinner_speed = editing_integer ? EDITOR_GET("interface/inspector/integer_drag_speed") : EDITOR_GET("interface/inspector/float_drag_speed");
_update_value_input_stylebox();
} break;
@@ -523,22 +525,35 @@ Size2 EditorSpinSlider::get_minimum_size() const {
return ms;
}
void EditorSpinSlider::set_hide_slider(bool p_hide) {
hide_slider = p_hide;
void EditorSpinSlider::set_control_state(ControlState p_state) {
control_state = p_state;
queue_redraw();
}
bool EditorSpinSlider::is_hiding_slider() const {
return hide_slider;
EditorSpinSlider::ControlState EditorSpinSlider::get_control_state() const {
return control_state;
}
#ifndef DISABLE_DEPRECATED
void EditorSpinSlider::set_hide_slider(bool p_hide) {
set_control_state(p_hide ? CONTROL_STATE_HIDE : CONTROL_STATE_DEFAULT);
}
bool EditorSpinSlider::is_hiding_slider() const {
return control_state == CONTROL_STATE_HIDE;
}
#endif
void EditorSpinSlider::set_editing_integer(bool p_editing_integer) {
if (p_editing_integer == editing_integer) {
return;
}
editing_integer = p_editing_integer;
queue_redraw();
if (is_inside_tree()) {
grabbing_spinner_speed = editing_integer ? EDITOR_GET("interface/inspector/integer_drag_speed") : EDITOR_GET("interface/inspector/float_drag_speed");
queue_redraw();
}
}
bool EditorSpinSlider::is_editing_integer() const {
@@ -701,8 +716,12 @@ void EditorSpinSlider::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_flat", "flat"), &EditorSpinSlider::set_flat);
ClassDB::bind_method(D_METHOD("is_flat"), &EditorSpinSlider::is_flat);
ClassDB::bind_method(D_METHOD("set_control_state", "state"), &EditorSpinSlider::set_control_state);
ClassDB::bind_method(D_METHOD("get_control_state"), &EditorSpinSlider::get_control_state);
#ifndef DISABLE_DEPRECATED
ClassDB::bind_method(D_METHOD("set_hide_slider", "hide_slider"), &EditorSpinSlider::set_hide_slider);
ClassDB::bind_method(D_METHOD("is_hiding_slider"), &EditorSpinSlider::is_hiding_slider);
#endif
ClassDB::bind_method(D_METHOD("set_editing_integer", "editing_integer"), &EditorSpinSlider::set_editing_integer);
ClassDB::bind_method(D_METHOD("is_editing_integer"), &EditorSpinSlider::is_editing_integer);
@@ -711,9 +730,16 @@ void EditorSpinSlider::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::STRING, "suffix"), "set_suffix", "get_suffix");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "read_only"), "set_read_only", "is_read_only");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flat"), "set_flat", "is_flat");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "control_state"), "set_control_state", "get_control_state");
#ifndef DISABLE_DEPRECATED
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "hide_slider"), "set_hide_slider", "is_hiding_slider");
#endif
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editing_integer"), "set_editing_integer", "is_editing_integer");
BIND_ENUM_CONSTANT(CONTROL_STATE_DEFAULT);
BIND_ENUM_CONSTANT(CONTROL_STATE_PREFER_SLIDER);
BIND_ENUM_CONSTANT(CONTROL_STATE_HIDE);
ADD_SIGNAL(MethodInfo("grabbed"));
ADD_SIGNAL(MethodInfo("ungrabbed"));
ADD_SIGNAL(MethodInfo("updown_pressed"));