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:
parent
4c943cca2c
commit
d844e30614
8 changed files with 31 additions and 17 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 != "")
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue