You've already forked godot
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:
@@ -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"));
|
||||
|
||||
Reference in New Issue
Block a user