Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save WhalesState/5f1e6e903eaad348aa334c70d706cf6c to your computer and use it in GitHub Desktop.

Select an option

Save WhalesState/5f1e6e903eaad348aa334c70d706cf6c to your computer and use it in GitHub Desktop.
From 05414d207f1292d800343b9ee323192bcc775751 Mon Sep 17 00:00:00 2001
From: Mounir Tohami <53877170+WhalesState@users.noreply.github.com>
Date: Sun, 14 Sep 2025 18:43:15 +0300
Subject: [PATCH] Show slider for ranged integers in EditorSpinSlider
Co-authored-by: Michael Alexsander <michaelalexsander@protonmail.com>
---
doc/classes/EditorSettings.xml | 3 +++
doc/classes/EditorSpinSlider.xml | 2 +-
editor/gui/editor_spin_slider.cpp | 28 +++++++++++++++++++++-------
editor/settings/editor_settings.cpp | 1 +
4 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml
index 1501a2f3d66f..31b7e43c9ead 100644
--- a/doc/classes/EditorSettings.xml
+++ b/doc/classes/EditorSettings.xml
@@ -1026,6 +1026,9 @@
<member name="interface/inspector/horizontal_vector_types_editing" type="bool" setter="" getter="">
If [code]true[/code], [Vector3], [Vector3i], [Vector4], [Vector4i], [Rect2], [Rect2i], [Plane], and [Quaternion] properties are shown on a single line in the inspector instead of multiple lines. This is overall more compact, but it can be harder to view and edit large values without expanding the inspector horizontally.
</member>
+ <member name="interface/inspector/integer_drag_speed" type="float" setter="" getter="">
+ Base speed for increasing/decreasing integer values by dragging them in the inspector.
+ </member>
<member name="interface/inspector/max_array_dictionary_items_per_page" type="int" setter="" getter="">
The number of [Array] or [Dictionary] items to display on each "page" in the inspector. Higher values allow viewing more values per page, but take more time to load. This increased load time is noticeable when selecting nodes that have array or dictionary properties in the editor.
</member>
diff --git a/doc/classes/EditorSpinSlider.xml b/doc/classes/EditorSpinSlider.xml
index 4540435cbb73..0d68d12fd433 100644
--- a/doc/classes/EditorSpinSlider.xml
+++ b/doc/classes/EditorSpinSlider.xml
@@ -11,7 +11,7 @@
</tutorials>
<members>
<member name="editing_integer" type="bool" setter="set_editing_integer" getter="is_editing_integer" default="false">
- If [code]true[/code], the [EditorSpinSlider] is considered to be editing an integer value. If [code]false[/code], the [EditorSpinSlider] is considered to be editing a floating-point value. This is used to determine whether a slider should be drawn. The slider is only drawn for floats; integers use up-down arrows similar to [SpinBox] instead.
+ If [code]true[/code], the [EditorSpinSlider] is considered to be editing an integer value. If [code]false[/code], the [EditorSpinSlider] is considered to be editing a floating-point value. This is used to determine whether the up-down arrows (similar to those in [SpinBox]) should be drawn if range isn't being used. It will also use [member EditorSettings.interface/inspector/integer_drag_speed] instead of [member EditorSettings.interface/inspector/float_drag_speed] if the value is ranged.
</member>
<member name="flat" type="bool" setter="set_flat" getter="is_flat" default="false">
If [code]true[/code], the slider will not draw background.
diff --git a/editor/gui/editor_spin_slider.cpp b/editor/gui/editor_spin_slider.cpp
index c7ba9f62451b..712b031c28d3 100644
--- a/editor/gui/editor_spin_slider.cpp
+++ b/editor/gui/editor_spin_slider.cpp
@@ -44,7 +44,11 @@ String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
if (!read_only && grabber->is_visible()) {
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())) + "\n\n" + vformat(TTR("Hold %s to round to integers.\nHold Shift for more precise changes."), find_keycode_name(key));
+ String tooltip = TS->format_number(rtos(get_value()));
+ if (!editing_integer) {
+ tooltip += "\n\n" + vformat(TTR("Hold %s to round to integers."), find_keycode_name(key));
+ }
+ return tooltip + "\nHold Shift for more precise changes.";
}
return TS->format_number(rtos(get_value()));
}
@@ -168,7 +172,9 @@ void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) {
}
double new_value = pre_grab_value + (is_layout_rtl() ? -get_step() : get_step()) * grabbing_spinner_dist_cache;
- set_value(mm->is_command_or_control_pressed() ? Math::round(new_value) : new_value);
+ bool ctrl_pressed = mm->is_command_or_control_pressed() && !editing_integer;
+
+ set_value(ctrl_pressed ? Math::round(new_value) : new_value);
}
} else if (updown_offset.x != -1) {
if (!updown_pressed) {
@@ -205,6 +211,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");
@@ -254,7 +261,13 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
grab_focus();
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");
queue_redraw();
@@ -431,7 +444,7 @@ void EditorSpinSlider::_draw_spin_slider() {
return;
}
- if (editing_integer) {
+ if (editing_integer && get_max() == get_min()) {
int icon_sep = MAX(0, theme_cache.updown_v_separation);
int icon_max_height = (size.height - icon_sep - style_min_size.height) / 2;
const Size2 up_icon_ms = theme_cache.up_icon->get_size();
@@ -521,7 +534,7 @@ void EditorSpinSlider::_draw_spin_slider() {
grabbing_spinner_mouse_pos = get_global_position() + grabber_rect.get_center();
if (display_grabber) {
- grabber->set_texture(mouse_over_grabber ? theme_cache.grabber_highlight_icon : theme_cache.grabber_icon);
+ grabber->set_texture(mouse_over_grabber || grabbing_grabber ? theme_cache.grabber_highlight_icon : theme_cache.grabber_icon);
grabber->reset_size();
grabber->set_position(grabber_rect.get_center() - grabber->get_size() * 0.5);
@@ -541,7 +554,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;
@@ -604,7 +617,7 @@ void EditorSpinSlider::_notification(int p_what) {
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
if (EditorSettings::get_singleton()->check_changed_settings_in_group("interface/inspector")) {
- 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");
}
} break;
}
@@ -649,6 +662,7 @@ void EditorSpinSlider::set_editing_integer(bool p_editing_integer) {
}
editing_integer = p_editing_integer;
+ grabbing_spinner_speed = editing_integer ? EDITOR_GET("interface/inspector/integer_drag_speed") : EDITOR_GET("interface/inspector/float_drag_speed");
queue_redraw();
}
diff --git a/editor/settings/editor_settings.cpp b/editor/settings/editor_settings.cpp
index 8abb3bb20ad7..e844efa76b41 100644
--- a/editor/settings/editor_settings.cpp
+++ b/editor/settings/editor_settings.cpp
@@ -549,6 +549,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_RANGE, "interface/inspector/max_array_dictionary_items_per_page", 20, "10,100,1")
EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/show_low_level_opentype_features", false, "")
EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/inspector/float_drag_speed", 5.0, "0.1,100,0.01")
+ EDITOR_SETTING_BASIC(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/inspector/integer_drag_speed", 0.5, "0.1,10,0.01")
EDITOR_SETTING_BASIC(Variant::INT, PROPERTY_HINT_ENUM, "interface/inspector/nested_color_mode", 0, "Containers & Resources,Resources,External Resources")
EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/inspector/delimitate_all_container_and_resources", true, "")
EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_ENUM, "interface/inspector/default_property_name_style", EditorPropertyNameProcessor::STYLE_CAPITALIZED, "Raw (e.g. \"z_index\"),Capitalized (e.g. \"Z Index\"),Localized (e.g. \"Z Index\")", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment