Fix and rename mouse filter recursive behavior

and focus mode recursive behavior.
This commit is contained in:
kit
2025-04-09 12:40:40 -04:00
parent a8598cd8e2
commit d16e8b7ca4
10 changed files with 282 additions and 173 deletions

View File

@@ -138,6 +138,62 @@ TEST_CASE("[SceneTree][Control] Focus") {
memdelete(child_ctrl);
}
SUBCASE("[SceneTree][Control] Grab focus with focus behavior recursive") {
CHECK_UNARY_FALSE(ctrl->has_focus());
// Cannot grab focus if focus behavior is disabled.
ctrl->set_focus_mode(Control::FocusMode::FOCUS_ALL);
ctrl->set_focus_behavior_recursive(Control::FOCUS_BEHAVIOR_DISABLED);
ERR_PRINT_OFF
ctrl->grab_focus();
ERR_PRINT_ON
CHECK_UNARY_FALSE(ctrl->has_focus());
// Cannot grab focus if focus behavior is enabled but focus mode is none.
ctrl->set_focus_mode(Control::FocusMode::FOCUS_NONE);
ctrl->set_focus_behavior_recursive(Control::FOCUS_BEHAVIOR_ENABLED);
ERR_PRINT_OFF
ctrl->grab_focus();
ERR_PRINT_ON
CHECK_UNARY_FALSE(ctrl->has_focus());
// Can grab focus if focus behavior is enabled and focus mode is all.
ctrl->set_focus_mode(Control::FocusMode::FOCUS_ALL);
ctrl->set_focus_behavior_recursive(Control::FOCUS_BEHAVIOR_ENABLED);
ctrl->grab_focus();
CHECK_UNARY(ctrl->has_focus());
}
SUBCASE("[SceneTree][Control] Children focus with focus behavior recursive") {
Control *child_control = memnew(Control);
ctrl->add_child(child_control);
// Can grab focus on child if parent focus behavior is inherit.
ctrl->set_focus_mode(Control::FocusMode::FOCUS_ALL);
ctrl->set_focus_behavior_recursive(Control::FOCUS_BEHAVIOR_INHERITED);
child_control->set_focus_mode(Control::FocusMode::FOCUS_ALL);
child_control->set_focus_behavior_recursive(Control::FOCUS_BEHAVIOR_INHERITED);
child_control->grab_focus();
CHECK_UNARY(child_control->has_focus());
// Cannot grab focus on child if parent focus behavior is disabled.
ctrl->set_focus_mode(Control::FocusMode::FOCUS_ALL);
ctrl->set_focus_behavior_recursive(Control::FOCUS_BEHAVIOR_DISABLED);
child_control->set_focus_mode(Control::FocusMode::FOCUS_ALL);
child_control->set_focus_behavior_recursive(Control::FOCUS_BEHAVIOR_INHERITED);
ERR_PRINT_OFF
child_control->grab_focus();
ERR_PRINT_ON
CHECK_UNARY_FALSE(child_control->has_focus());
memdelete(child_control);
}
memdelete(ctrl);
}

View File

@@ -512,6 +512,45 @@ TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
CHECK_FALSE(node_d->invalid_order);
}
SUBCASE("[Viewport][GuiInputEvent] Mouse behavior recursive disables mouse motion events.") {
node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
// Enabled when parent is set to inherit.
node_h->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_INHERITED);
node_i->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_INHERITED);
SEND_GUI_MOUSE_MOTION_EVENT(on_i, MouseButtonMask::NONE, Key::NONE);
CHECK(node_i->mouse_over);
CHECK(node_i->mouse_over_self);
// Enabled when parent is set to enabled.
node_h->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_ENABLED);
node_i->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_INHERITED);
SEND_GUI_MOUSE_MOTION_EVENT(on_i, MouseButtonMask::NONE, Key::NONE);
CHECK(node_i->mouse_over);
CHECK(node_i->mouse_over_self);
// Disabled when parent is set to disabled.
node_h->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_DISABLED);
node_i->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_INHERITED);
SEND_GUI_MOUSE_MOTION_EVENT(on_i, MouseButtonMask::NONE, Key::NONE);
CHECK_FALSE(node_i->mouse_over);
CHECK_FALSE(node_i->mouse_over_self);
// Enabled when set to enabled and parent is set to disabled.
node_h->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_DISABLED);
node_i->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_ENABLED);
SEND_GUI_MOUSE_MOTION_EVENT(on_i, MouseButtonMask::NONE, Key::NONE);
CHECK(node_i->mouse_over);
CHECK(node_i->mouse_over_self);
// Disabled when it is set to disabled.
node_h->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_ENABLED);
node_i->set_mouse_behavior_recursive(Control::MOUSE_BEHAVIOR_DISABLED);
SEND_GUI_MOUSE_MOTION_EVENT(on_i, MouseButtonMask::NONE, Key::NONE);
CHECK_FALSE(node_i->mouse_over);
CHECK_FALSE(node_i->mouse_over_self);
}
SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification propagation.") {
node_d->set_mouse_filter(Control::MOUSE_FILTER_PASS);
node_g->set_mouse_filter(Control::MOUSE_FILTER_PASS);