Add set_value_no_signal() to Range

This commit is contained in:
kobewi 2022-10-31 23:12:53 +01:00 committed by Ricardo Subtil
parent 26a584179c
commit fdae01de10
4 changed files with 23 additions and 8 deletions

View file

@ -9,6 +9,13 @@
<tutorials> <tutorials>
</tutorials> </tutorials>
<methods> <methods>
<method name="set_value_no_signal">
<return type="void" />
<argument index="0" name="value" type="float" />
<description>
Sets the [Range]'s current value to the specified [member value], without emitting the [signal value_changed] signal.
</description>
</method>
<method name="share"> <method name="share">
<return type="void" /> <return type="void" />
<argument index="0" name="with" type="Node" /> <argument index="0" name="with" type="Node" />
@ -52,7 +59,7 @@
If greater than 0, [code]value[/code] will always be rounded to a multiple of [code]step[/code]. If [code]rounded[/code] is also [code]true[/code], [code]value[/code] will first be rounded to a multiple of [code]step[/code] then rounded to the nearest integer. If greater than 0, [code]value[/code] will always be rounded to a multiple of [code]step[/code]. If [code]rounded[/code] is also [code]true[/code], [code]value[/code] will first be rounded to a multiple of [code]step[/code] then rounded to the nearest integer.
</member> </member>
<member name="value" type="float" setter="set_value" getter="get_value" default="0.0"> <member name="value" type="float" setter="set_value" getter="get_value" default="0.0">
Range's current value. 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.
</member> </member>
</members> </members>
<signals> <signals>

View file

@ -211,14 +211,13 @@ bool BaseButton::is_disabled() const {
} }
void BaseButton::set_pressed(bool p_pressed) { void BaseButton::set_pressed(bool p_pressed) {
if (!toggle_mode) { bool prev_pressed = status.pressed;
return; set_pressed_no_signal(p_pressed);
}
if (status.pressed == p_pressed) { if (status.pressed == prev_pressed) {
return; return;
} }
_change_notify("pressed"); _change_notify("pressed");
status.pressed = p_pressed;
if (p_pressed) { if (p_pressed) {
_unpress_group(); _unpress_group();

View file

@ -77,6 +77,15 @@ void Range::Shared::emit_changed(const char *p_what) {
} }
void Range::set_value(double p_val) { void Range::set_value(double p_val) {
double prev_val = shared->val;
set_value_no_signal(p_val);
if (shared->val != prev_val) {
shared->emit_value_changed();
}
}
void Range::set_value_no_signal(double p_val) {
if (shared->step > 0) { if (shared->step > 0) {
p_val = Math::round((p_val - shared->min) / shared->step) * shared->step + shared->min; p_val = Math::round((p_val - shared->min) / shared->step) * shared->step + shared->min;
} }
@ -98,8 +107,6 @@ void Range::set_value(double p_val) {
} }
shared->val = p_val; shared->val = p_val;
shared->emit_value_changed();
} }
void Range::set_min(double p_min) { void Range::set_min(double p_min) {
shared->min = p_min; shared->min = p_min;
@ -237,6 +244,7 @@ void Range::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_page"), &Range::get_page); ClassDB::bind_method(D_METHOD("get_page"), &Range::get_page);
ClassDB::bind_method(D_METHOD("get_as_ratio"), &Range::get_as_ratio); ClassDB::bind_method(D_METHOD("get_as_ratio"), &Range::get_as_ratio);
ClassDB::bind_method(D_METHOD("set_value", "value"), &Range::set_value); ClassDB::bind_method(D_METHOD("set_value", "value"), &Range::set_value);
ClassDB::bind_method(D_METHOD("set_value_no_signal", "value"), &Range::set_value_no_signal);
ClassDB::bind_method(D_METHOD("set_min", "minimum"), &Range::set_min); ClassDB::bind_method(D_METHOD("set_min", "minimum"), &Range::set_min);
ClassDB::bind_method(D_METHOD("set_max", "maximum"), &Range::set_max); ClassDB::bind_method(D_METHOD("set_max", "maximum"), &Range::set_max);
ClassDB::bind_method(D_METHOD("set_step", "step"), &Range::set_step); ClassDB::bind_method(D_METHOD("set_step", "step"), &Range::set_step);

View file

@ -66,6 +66,7 @@ protected:
public: public:
void set_value(double p_val); void set_value(double p_val);
void set_value_no_signal(double p_val);
void set_min(double p_min); void set_min(double p_min);
void set_max(double p_max); void set_max(double p_max);
void set_step(double p_step); void set_step(double p_step);