Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion doc/classes/Range.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@
Called when the [Range]'s value is changed (following the same conditions as [signal value_changed]).
</description>
</method>
<method name="set_value_no_signal">
<return type="void" />
<param index="0" name="value" type="float" />
<description>
Sets the [Range]'s current value to the specified [param value], without emitting the [signal value_changed] signal.
</description>
</method>
<method name="share">
<return type="void" />
<param index="0" name="with" type="Node" />
Expand Down Expand Up @@ -59,7 +66,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.
</member>
<member name="value" type="float" setter="set_value" getter="get_value">
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>
</members>
<signals>
Expand Down
11 changes: 4 additions & 7 deletions scene/gui/base_button.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,13 +218,12 @@ bool BaseButton::is_disabled() const {
}

void BaseButton::set_pressed(bool p_pressed) {
if (!toggle_mode) {
return;
}
if (status.pressed == p_pressed) {
bool prev_pressed = status.pressed;
set_pressed_no_signal(p_pressed);

if (status.pressed == prev_pressed) {
return;
}
status.pressed = p_pressed;

if (p_pressed) {
_unpress_group();
Expand All @@ -233,8 +232,6 @@ void BaseButton::set_pressed(bool p_pressed) {
}
}
_toggled(status.pressed);

queue_redraw();
}

void BaseButton::set_pressed_no_signal(bool p_pressed) {
Expand Down
12 changes: 10 additions & 2 deletions scene/gui/range.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,15 @@ void Range::Shared::emit_changed(const char *p_what) {
}

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) {
p_val = Math::round(p_val / shared->step) * shared->step;
}
Expand All @@ -101,8 +110,6 @@ void Range::set_value(double p_val) {
}

shared->val = p_val;

shared->emit_value_changed();
}

void Range::set_min(double p_min) {
Expand Down Expand Up @@ -267,6 +274,7 @@ void Range::_bind_methods() {
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("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_max", "maximum"), &Range::set_max);
ClassDB::bind_method(D_METHOD("set_step", "step"), &Range::set_step);
Expand Down
1 change: 1 addition & 0 deletions scene/gui/range.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ class Range : public Control {

public:
void set_value(double p_val);
void set_value_no_signal(double p_val);
void set_min(double p_min);
void set_max(double p_max);
void set_step(double p_step);
Expand Down