Created
September 14, 2025 17:48
-
-
Save WhalesState/5f1e6e903eaad348aa334c70d706cf6c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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