瀏覽代碼

Merge pull request #29060 from volzhs/toggled-group

Refactor BaseButton event handling
Rémi Verschelde 6 年之前
父節點
當前提交
8689af6238
共有 2 個文件被更改,包括 36 次插入167 次删除
  1. 36 166
      scene/gui/base_button.cpp
  2. 0 1
      scene/gui/base_button.h

+ 36 - 166
scene/gui/base_button.cpp

@@ -56,185 +56,53 @@ void BaseButton::_gui_input(Ref<InputEvent> p_event) {
 	if (status.disabled) // no interaction with disabled button
 	if (status.disabled) // no interaction with disabled button
 		return;
 		return;
 
 
-	Ref<InputEventMouseButton> b = p_event;
+	Ref<InputEventMouseButton> mouse_button = p_event;
+	bool ui_accept = p_event->is_action("ui_accept") && !p_event->is_echo();
 
 
-	if (b.is_valid()) {
-		if (((1 << (b->get_button_index() - 1)) & button_mask) == 0)
-			return;
-
-		if (status.pressing_button)
-			return;
-
-		if (action_mode == ACTION_MODE_BUTTON_PRESS) {
-
-			if (b->is_pressed()) {
-
-				emit_signal("button_down");
-
-				if (!toggle_mode) { //mouse press attempt
-
-					status.press_attempt = true;
-					status.pressing_inside = true;
+	bool button_masked = mouse_button.is_valid() && ((1 << (mouse_button->get_button_index() - 1)) & button_mask) > 0;
+	if (button_masked || ui_accept) {
+		if (p_event->is_pressed()) {
+			status.press_attempt = true;
+			status.pressing_inside = true;
+			emit_signal("button_down");
+		}
 
 
-					pressed();
-					if (get_script_instance()) {
-						Variant::CallError ce;
-						get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce);
+		if (status.press_attempt && status.pressing_inside) {
+			if (toggle_mode) {
+				if ((p_event->is_pressed() && action_mode == ACTION_MODE_BUTTON_PRESS) || (!p_event->is_pressed() && action_mode == ACTION_MODE_BUTTON_RELEASE)) {
+					if (action_mode == ACTION_MODE_BUTTON_PRESS) {
+						status.press_attempt = false;
+						status.pressing_inside = false;
 					}
 					}
-
-					_unpress_group();
-					emit_signal("pressed");
-
-				} else {
-
 					status.pressed = !status.pressed;
 					status.pressed = !status.pressed;
-					pressed();
-
 					_unpress_group();
 					_unpress_group();
-					emit_signal("pressed");
-
 					toggled(status.pressed);
 					toggled(status.pressed);
-					if (get_script_instance()) {
-						get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed);
-					}
-					emit_signal("toggled", status.pressed);
+					pressed();
 				}
 				}
-
 			} else {
 			} else {
-
-				emit_signal("button_up");
-
-				/* this is pointless		if (status.press_attempt && status.pressing_inside) {
-					//released();
-					emit_signal("released");
+				if (!p_event->is_pressed()) {
+					pressed();
 				}
 				}
-*/
-				status.press_attempt = false;
 			}
 			}
-			update();
-			return;
 		}
 		}
 
 
-		if (b->is_pressed()) {
-
-			status.press_attempt = true;
-			status.pressing_inside = true;
-			emit_signal("button_down");
-
-		} else {
-
+		if (!p_event->is_pressed()) { // pressed state should be correct with button_up signal
 			emit_signal("button_up");
 			emit_signal("button_up");
-
-			if (status.press_attempt && status.pressing_inside) {
-
-				if (!toggle_mode) { //mouse press attempt
-
-					pressed();
-					if (get_script_instance()) {
-						Variant::CallError ce;
-						get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce);
-					}
-
-					_unpress_group();
-					emit_signal("pressed");
-
-				} else {
-
-					status.pressed = !status.pressed;
-
-					pressed();
-					_unpress_group();
-					emit_signal("pressed");
-
-					toggled(status.pressed);
-					if (get_script_instance()) {
-						get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed);
-					}
-					emit_signal("toggled", status.pressed);
-				}
-			}
-
 			status.press_attempt = false;
 			status.press_attempt = false;
 		}
 		}
 
 
 		update();
 		update();
+		return;
 	}
 	}
 
 
-	Ref<InputEventMouseMotion> mm = p_event;
-
-	if (mm.is_valid()) {
-		if (status.press_attempt && status.pressing_button == 0) {
+	Ref<InputEventMouseMotion> mouse_motion = p_event;
+	if (mouse_motion.is_valid()) {
+		if (status.press_attempt) {
 			bool last_press_inside = status.pressing_inside;
 			bool last_press_inside = status.pressing_inside;
-			status.pressing_inside = has_point(mm->get_position());
-			if (last_press_inside != status.pressing_inside)
+			status.pressing_inside = has_point(mouse_motion->get_position());
+			if (last_press_inside != status.pressing_inside) {
 				update();
 				update();
-		}
-	}
-
-	if (!mm.is_valid() && !b.is_valid()) {
-
-		if (p_event->is_echo()) {
-			return;
-		}
-
-		if (status.disabled) {
-			return;
-		}
-
-		if (status.press_attempt && status.pressing_button == 0) {
-			return;
-		}
-
-		if (p_event->is_action("ui_accept")) {
-
-			if (p_event->is_pressed()) {
-
-				status.pressing_button++;
-				status.press_attempt = true;
-				status.pressing_inside = true;
-				emit_signal("button_down");
-
-			} else if (status.press_attempt) {
-
-				if (status.pressing_button)
-					status.pressing_button--;
-
-				if (status.pressing_button)
-					return;
-
-				status.press_attempt = false;
-				status.pressing_inside = false;
-
-				emit_signal("button_up");
-
-				if (!toggle_mode) { //mouse press attempt
-
-					pressed();
-					if (get_script_instance()) {
-						Variant::CallError ce;
-						get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce);
-					}
-
-					_unpress_group();
-					emit_signal("pressed");
-				} else {
-
-					status.pressed = !status.pressed;
-
-					pressed();
-					_unpress_group();
-					emit_signal("pressed");
-
-					toggled(status.pressed);
-					if (get_script_instance()) {
-						get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed);
-					}
-					emit_signal("toggled", status.pressed);
-				}
 			}
 			}
-
-			accept_event();
-			update();
 		}
 		}
 	}
 	}
 }
 }
@@ -255,7 +123,6 @@ void BaseButton::_notification(int p_what) {
 
 
 		if (status.press_attempt) {
 		if (status.press_attempt) {
 			status.press_attempt = false;
 			status.press_attempt = false;
-			status.pressing_button = 0;
 			update();
 			update();
 		}
 		}
 	}
 	}
@@ -268,9 +135,8 @@ void BaseButton::_notification(int p_what) {
 
 
 	if (p_what == NOTIFICATION_FOCUS_EXIT) {
 	if (p_what == NOTIFICATION_FOCUS_EXIT) {
 
 
-		if (status.pressing_button && status.press_attempt) {
+		if (status.press_attempt) {
 			status.press_attempt = false;
 			status.press_attempt = false;
-			status.pressing_button = 0;
 			status.hovering = false;
 			status.hovering = false;
 			update();
 			update();
 		} else if (status.hovering) {
 		} else if (status.hovering) {
@@ -290,21 +156,23 @@ void BaseButton::_notification(int p_what) {
 		status.hovering = false;
 		status.hovering = false;
 		status.press_attempt = false;
 		status.press_attempt = false;
 		status.pressing_inside = false;
 		status.pressing_inside = false;
-		status.pressing_button = 0;
 	}
 	}
 }
 }
 
 
 void BaseButton::pressed() {
 void BaseButton::pressed() {
 
 
-	if (get_script_instance())
-		get_script_instance()->call("pressed");
+	if (get_script_instance()) {
+		get_script_instance()->call(SceneStringNames::get_singleton()->_pressed);
+	}
+	emit_signal("pressed");
 }
 }
 
 
 void BaseButton::toggled(bool p_pressed) {
 void BaseButton::toggled(bool p_pressed) {
 
 
 	if (get_script_instance()) {
 	if (get_script_instance()) {
-		get_script_instance()->call("toggled", p_pressed);
+		get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, p_pressed);
 	}
 	}
+	emit_signal("toggled", p_pressed);
 }
 }
 
 
 void BaseButton::set_disabled(bool p_disabled) {
 void BaseButton::set_disabled(bool p_disabled) {
@@ -318,7 +186,6 @@ void BaseButton::set_disabled(bool p_disabled) {
 		}
 		}
 		status.press_attempt = false;
 		status.press_attempt = false;
 		status.pressing_inside = false;
 		status.pressing_inside = false;
-		status.pressing_button = 0;
 	}
 	}
 	update();
 	update();
 	_change_notify("disabled");
 	_change_notify("disabled");
@@ -341,6 +208,10 @@ void BaseButton::set_pressed(bool p_pressed) {
 	if (p_pressed) {
 	if (p_pressed) {
 		_unpress_group();
 		_unpress_group();
 	}
 	}
+	if (toggle_mode) {
+		toggled(status.pressed);
+	}
+
 	update();
 	update();
 }
 }
 
 
@@ -585,7 +456,6 @@ BaseButton::BaseButton() {
 	status.hovering = false;
 	status.hovering = false;
 	status.pressing_inside = false;
 	status.pressing_inside = false;
 	status.disabled = false;
 	status.disabled = false;
-	status.pressing_button = 0;
 	set_focus_mode(FOCUS_ALL);
 	set_focus_mode(FOCUS_ALL);
 	enabled_focus_mode = FOCUS_ALL;
 	enabled_focus_mode = FOCUS_ALL;
 	action_mode = ACTION_MODE_BUTTON_RELEASE;
 	action_mode = ACTION_MODE_BUTTON_RELEASE;

+ 0 - 1
scene/gui/base_button.h

@@ -65,7 +65,6 @@ private:
 		bool pressing_inside;
 		bool pressing_inside;
 
 
 		bool disabled;
 		bool disabled;
-		int pressing_button;
 
 
 	} status;
 	} status;