Inspector: Make default float step configurable

Also allow lifting the decimal step formatting with a hint range step
of 0. A new `range_step_decimals()` is added for this to avoid breaking
compatibility on the general purpose `step_decimals()` (which still
returns 0 for an input step of 0).

Supersedes #25470.
Partial fix for #18251.
This commit is contained in:
Rémi Verschelde 2019-07-23 17:27:55 +02:00
parent 4c943cca2c
commit d844e30614
8 changed files with 31 additions and 17 deletions

View file

@ -79,6 +79,15 @@ int Math::step_decimals(double p_step) {
return 0; return 0;
} }
// Only meant for editor usage in float ranges, where a step of 0
// means that decimal digits should not be limited in String::num.
int Math::range_step_decimals(double p_step) {
if (p_step < 0.0000000000001) {
return 16; // Max value hardcoded in String::num
}
return step_decimals(p_step);
}
double Math::dectime(double p_value, double p_amount, double p_step) { double Math::dectime(double p_value, double p_amount, double p_step) {
double sgn = p_value < 0 ? -1.0 : 1.0; double sgn = p_value < 0 ? -1.0 : 1.0;
double val = Math::abs(p_value); double val = Math::abs(p_value);

View file

@ -270,6 +270,7 @@ public:
// double only, as these functions are mainly used by the editor and not performance-critical, // double only, as these functions are mainly used by the editor and not performance-critical,
static double ease(double p_x, double p_c); static double ease(double p_x, double p_c);
static int step_decimals(double p_step); static int step_decimals(double p_step);
static int range_step_decimals(double p_step);
static double stepify(double p_value, double p_step); static double stepify(double p_value, double p_step);
static double dectime(double p_value, double p_amount, double p_step); static double dectime(double p_value, double p_amount, double p_step);

View file

@ -5557,6 +5557,8 @@ EditorNode::EditorNode() {
EDITOR_DEF_RST("interface/scene_tabs/restore_scenes_on_load", false); EDITOR_DEF_RST("interface/scene_tabs/restore_scenes_on_load", false);
EDITOR_DEF_RST("interface/scene_tabs/show_thumbnail_on_hover", true); EDITOR_DEF_RST("interface/scene_tabs/show_thumbnail_on_hover", true);
EDITOR_DEF_RST("interface/inspector/capitalize_properties", true); EDITOR_DEF_RST("interface/inspector/capitalize_properties", true);
EDITOR_DEF_RST("interface/inspector/default_float_step", 0.001);
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::REAL, "interface/inspector/default_float_step", PROPERTY_HINT_EXP_RANGE, "0,1,0"));
EDITOR_DEF_RST("interface/inspector/disable_folding", false); EDITOR_DEF_RST("interface/inspector/disable_folding", false);
EDITOR_DEF_RST("interface/inspector/auto_unfold_foreign_scenes", true); EDITOR_DEF_RST("interface/inspector/auto_unfold_foreign_scenes", true);
EDITOR_DEF("interface/inspector/horizontal_vector2_editing", false); EDITOR_DEF("interface/inspector/horizontal_vector2_editing", false);

View file

@ -2904,6 +2904,8 @@ void EditorInspectorDefaultPlugin::parse_begin(Object *p_object) {
bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
float default_float_step = EDITOR_GET("interface/inspector/default_float_step");
switch (p_type) { switch (p_type) {
// atomic types // atomic types
@ -3010,7 +3012,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} else { } else {
EditorPropertyFloat *editor = memnew(EditorPropertyFloat); EditorPropertyFloat *editor = memnew(EditorPropertyFloat);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
bool exp_range = false; bool exp_range = false;
bool greater = true, lesser = true; bool greater = true, lesser = true;
@ -3107,7 +3109,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
case Variant::VECTOR2: { case Variant::VECTOR2: {
EditorPropertyVector2 *editor = memnew(EditorPropertyVector2); EditorPropertyVector2 *editor = memnew(EditorPropertyVector2);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
@ -3125,7 +3127,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break; // 5 } break; // 5
case Variant::RECT2: { case Variant::RECT2: {
EditorPropertyRect2 *editor = memnew(EditorPropertyRect2); EditorPropertyRect2 *editor = memnew(EditorPropertyRect2);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
@ -3142,7 +3144,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break; } break;
case Variant::VECTOR3: { case Variant::VECTOR3: {
EditorPropertyVector3 *editor = memnew(EditorPropertyVector3); EditorPropertyVector3 *editor = memnew(EditorPropertyVector3);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
@ -3160,7 +3162,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break; } break;
case Variant::TRANSFORM2D: { case Variant::TRANSFORM2D: {
EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D); EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
@ -3178,7 +3180,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break; } break;
case Variant::PLANE: { case Variant::PLANE: {
EditorPropertyPlane *editor = memnew(EditorPropertyPlane); EditorPropertyPlane *editor = memnew(EditorPropertyPlane);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
@ -3195,7 +3197,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break; } break;
case Variant::QUAT: { case Variant::QUAT: {
EditorPropertyQuat *editor = memnew(EditorPropertyQuat); EditorPropertyQuat *editor = memnew(EditorPropertyQuat);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
@ -3212,7 +3214,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break; // 10 } break; // 10
case Variant::AABB: { case Variant::AABB: {
EditorPropertyAABB *editor = memnew(EditorPropertyAABB); EditorPropertyAABB *editor = memnew(EditorPropertyAABB);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
@ -3229,7 +3231,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break; } break;
case Variant::BASIS: { case Variant::BASIS: {
EditorPropertyBasis *editor = memnew(EditorPropertyBasis); EditorPropertyBasis *editor = memnew(EditorPropertyBasis);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {
@ -3246,7 +3248,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break; } break;
case Variant::TRANSFORM: { case Variant::TRANSFORM: {
EditorPropertyTransform *editor = memnew(EditorPropertyTransform); EditorPropertyTransform *editor = memnew(EditorPropertyTransform);
double min = -65535, max = 65535, step = 0.001; double min = -65535, max = 65535, step = default_float_step;
bool hide_slider = true; bool hide_slider = true;
if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) {

View file

@ -38,9 +38,9 @@ String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
} }
String EditorSpinSlider::get_text_value() const { String EditorSpinSlider::get_text_value() const {
int zeros = Math::step_decimals(get_step()); return String::num(get_value(), Math::range_step_decimals(get_step()));
return String::num(get_value(), zeros);
} }
void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
if (read_only) if (read_only)

View file

@ -1095,7 +1095,7 @@
<argument index="0" name="step" type="float"> <argument index="0" name="step" type="float">
</argument> </argument>
<description> <description>
Returns the position of the first non-zero digit, after the decimal point. Returns the position of the first non-zero digit, after the decimal point. Note that the maximum return value is 10, which is a design decision in the implementation.
[codeblock] [codeblock]
# n is 0 # n is 0
n = step_decimals(5) n = step_decimals(5)

View file

@ -40,7 +40,7 @@ Size2 SpinBox::get_minimum_size() const {
void SpinBox::_value_changed(double) { void SpinBox::_value_changed(double) {
String value = String::num(get_value(), Math::step_decimals(get_step())); String value = String::num(get_value(), Math::range_step_decimals(get_step()));
if (prefix != "") if (prefix != "")
value = prefix + " " + value; value = prefix + " " + value;
if (suffix != "") if (suffix != "")

View file

@ -1315,7 +1315,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
Ref<Texture> updown = cache.updown; Ref<Texture> updown = cache.updown;
String valtext = String::num(p_item->cells[i].val, Math::step_decimals(p_item->cells[i].step)); String valtext = String::num(p_item->cells[i].val, Math::range_step_decimals(p_item->cells[i].step));
//String valtext = rtos( p_item->cells[i].val ); //String valtext = rtos( p_item->cells[i].val );
if (p_item->cells[i].suffix != String()) if (p_item->cells[i].suffix != String())
@ -1926,7 +1926,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool
} else { } else {
editor_text = String::num(p_item->cells[col].val, Math::step_decimals(p_item->cells[col].step)); editor_text = String::num(p_item->cells[col].val, Math::range_step_decimals(p_item->cells[col].step));
if (select_mode == SELECT_MULTI && get_tree()->get_event_count() == focus_in_id) if (select_mode == SELECT_MULTI && get_tree()->get_event_count() == focus_in_id)
bring_up_editor = false; bring_up_editor = false;
} }
@ -2755,7 +2755,7 @@ bool Tree::edit_selected() {
text_editor->set_position(textedpos); text_editor->set_position(textedpos);
text_editor->set_size(rect.size); text_editor->set_size(rect.size);
text_editor->clear(); text_editor->clear();
text_editor->set_text(c.mode == TreeItem::CELL_MODE_STRING ? c.text : String::num(c.val, Math::step_decimals(c.step))); text_editor->set_text(c.mode == TreeItem::CELL_MODE_STRING ? c.text : String::num(c.val, Math::range_step_decimals(c.step)));
text_editor->select_all(); text_editor->select_all();
if (c.mode == TreeItem::CELL_MODE_RANGE) { if (c.mode == TreeItem::CELL_MODE_RANGE) {