瀏覽代碼

Merge pull request #76279 from TheSecondReal0/buttongroup-unpress

Add an option for ButtonGroups to be unpressed
Rémi Verschelde 2 年之前
父節點
當前提交
1f76ad0286
共有 3 個文件被更改,包括 18 次插入1 次删除
  1. 3 0
      doc/classes/ButtonGroup.xml
  2. 12 1
      scene/gui/base_button.cpp
  3. 3 0
      scene/gui/base_button.h

+ 3 - 0
doc/classes/ButtonGroup.xml

@@ -24,6 +24,9 @@
 		</method>
 	</methods>
 	<members>
+		<member name="allow_unpress" type="bool" setter="set_allow_unpress" getter="is_allow_unpress" default="false">
+			If [code]true[/code], it is possible to unpress all buttons in this [ButtonGroup].
+		</member>
 		<member name="resource_local_to_scene" type="bool" setter="set_local_to_scene" getter="is_local_to_scene" overrides="Resource" default="true" />
 	</members>
 	<signals>

+ 12 - 1
scene/gui/base_button.cpp

@@ -40,7 +40,7 @@ void BaseButton::_unpress_group() {
 		return;
 	}
 
-	if (toggle_mode) {
+	if (toggle_mode && !button_group->is_allow_unpress()) {
 		status.pressed = true;
 	}
 
@@ -537,9 +537,20 @@ BaseButton *ButtonGroup::get_pressed_button() {
 	return nullptr;
 }
 
+void ButtonGroup::set_allow_unpress(bool p_enabled) {
+	allow_unpress = p_enabled;
+}
+bool ButtonGroup::is_allow_unpress() {
+	return allow_unpress;
+}
+
 void ButtonGroup::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_pressed_button"), &ButtonGroup::get_pressed_button);
 	ClassDB::bind_method(D_METHOD("get_buttons"), &ButtonGroup::_get_buttons);
+	ClassDB::bind_method(D_METHOD("set_allow_unpress", "enabled"), &ButtonGroup::set_allow_unpress);
+	ClassDB::bind_method(D_METHOD("is_allow_unpress"), &ButtonGroup::is_allow_unpress);
+
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "allow_unpress"), "set_allow_unpress", "is_allow_unpress");
 
 	ADD_SIGNAL(MethodInfo("pressed", PropertyInfo(Variant::OBJECT, "button", PROPERTY_HINT_RESOURCE_TYPE, "BaseButton")));
 }

+ 3 - 0
scene/gui/base_button.h

@@ -152,6 +152,7 @@ class ButtonGroup : public Resource {
 	GDCLASS(ButtonGroup, Resource);
 	friend class BaseButton;
 	HashSet<BaseButton *> buttons;
+	bool allow_unpress = false;
 
 protected:
 	static void _bind_methods();
@@ -160,6 +161,8 @@ public:
 	BaseButton *get_pressed_button();
 	void get_buttons(List<BaseButton *> *r_buttons);
 	TypedArray<BaseButton> _get_buttons();
+	void set_allow_unpress(bool p_enabled);
+	bool is_allow_unpress();
 	ButtonGroup();
 };