Skip to content

Commit 01511f6

Browse files
committed
Fix snapping logic in Range
1 parent 2a9ff39 commit 01511f6

File tree

2 files changed

+4
-2
lines changed

2 files changed

+4
-2
lines changed

doc/classes/Range.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
</member>
6565
<member name="size_flags_vertical" type="int" setter="set_v_size_flags" getter="get_v_size_flags" overrides="Control" enum="Control.SizeFlags" is_bitfield="true" default="0" />
6666
<member name="step" type="float" setter="set_step" getter="get_step" default="0.01">
67-
If greater than 0, [member value] will always be rounded to a multiple of this property's value. If [member rounded] is also [code]true[/code], [member value] will first be rounded to a multiple of this property's value, then rounded to the nearest integer.
67+
If greater than 0, [member value] will always be rounded to a multiple of this property's value above [member min_value]. For example, if [member min_value] is [code]0.1[/code] and step is 0.2, then [member value] is limited to [code]0.1[/code], [code]0.3[/code], [code]0.5[/code], and so on. If [member rounded] is also [code]true[/code], [member value] will first be rounded to a multiple of this property's value, then rounded to the nearest integer.
6868
</member>
6969
<member name="value" type="float" setter="set_value" getter="get_value" default="0.0">
7070
Range's current value. Changing this property (even via code) will trigger [signal value_changed] signal. Use [method set_value_no_signal] if you want to avoid it.

scene/gui/range.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ void Range::_set_value_no_signal(double p_val) {
140140

141141
double Range::_calc_value(double p_val, double p_step) const {
142142
if (p_step > 0) {
143-
p_val = Math::round((p_val - shared->min) / p_step) * p_step + shared->min;
143+
// TODO: In the future, with C++23, we can move to std::float128_t for more robust precise calculations.
144+
// Subtract min, to support cases like min = 0.1, step = 0.2, snaps to 0.1, 0.3, 0.5, etc.
145+
p_val = Math::snapped(p_val - shared->min, p_step) + shared->min;
144146
}
145147

146148
if (_rounded_values) {

0 commit comments

Comments
 (0)