This commit is contained in:
Spartan322
2025-01-24 12:10:41 -05:00
60 changed files with 980 additions and 401 deletions

View File

@@ -8153,6 +8153,93 @@ TEST_CASE("[SceneTree][TextEdit] gutters") {
// Merging tested via CodeEdit gutters.
}
SUBCASE("[TextEdit] gutter mouse") {
DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton());
// Set size for mouse input.
text_edit->set_size(Size2(200, 200));
text_edit->set_text("test1\ntest2\ntest3\ntest4");
text_edit->grab_focus();
text_edit->add_gutter();
text_edit->set_gutter_name(0, "test_gutter");
text_edit->set_gutter_width(0, 10);
text_edit->set_gutter_clickable(0, true);
text_edit->add_gutter();
text_edit->set_gutter_name(1, "test_gutter_not_clickable");
text_edit->set_gutter_width(1, 10);
text_edit->set_gutter_clickable(1, false);
text_edit->add_gutter();
CHECK(text_edit->get_gutter_count() == 3);
text_edit->set_gutter_name(2, "test_gutter_3");
text_edit->set_gutter_width(2, 10);
text_edit->set_gutter_clickable(2, true);
MessageQueue::get_singleton()->flush();
const int line_height = text_edit->get_line_height();
// Defaults to none.
CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
// Hover over gutter.
SEND_GUI_MOUSE_MOTION_EVENT(Point2(5, line_height + line_height / 2), MouseButtonMask::NONE, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(0, 1));
SIGNAL_CHECK_FALSE("gutter_clicked");
CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_POINTING_HAND);
// Click on gutter.
SEND_GUI_MOUSE_BUTTON_EVENT(Point2(5, line_height / 2), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(0, 0));
SIGNAL_CHECK("gutter_clicked", build_array(build_array(0, 0)));
// Click on gutter on another line.
SEND_GUI_MOUSE_BUTTON_EVENT(Point2(5, line_height * 3 + line_height / 2), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(0, 3));
SIGNAL_CHECK("gutter_clicked", build_array(build_array(3, 0)));
// Unclickable gutter can be hovered.
SEND_GUI_MOUSE_MOTION_EVENT(Point2(15, line_height + line_height / 2), MouseButtonMask::NONE, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(1, 1));
SIGNAL_CHECK_FALSE("gutter_clicked");
CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
// Unclickable gutter can be clicked.
SEND_GUI_MOUSE_BUTTON_EVENT(Point2(15, line_height * 2 + line_height / 2), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(1, 2));
SIGNAL_CHECK("gutter_clicked", build_array(build_array(2, 1)));
CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
// Hover past last line.
SEND_GUI_MOUSE_MOTION_EVENT(Point2(5, line_height * 5), MouseButtonMask::NONE, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
SIGNAL_CHECK_FALSE("gutter_clicked");
CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
// Click on gutter past last line.
SEND_GUI_MOUSE_BUTTON_EVENT(Point2(5, line_height * 5), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
SIGNAL_CHECK_FALSE("gutter_clicked");
// Mouse exit resets hover.
SEND_GUI_MOUSE_MOTION_EVENT(Point2(5, line_height + line_height / 2), MouseButtonMask::NONE, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(0, 1));
SEND_GUI_MOUSE_MOTION_EVENT(Point2(-1, -1), MouseButtonMask::NONE, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
// Removing gutter updates hover.
SEND_GUI_MOUSE_MOTION_EVENT(Point2(25, line_height + line_height / 2), MouseButtonMask::NONE, Key::NONE);
CHECK(text_edit->get_hovered_gutter() == Vector2i(2, 1));
text_edit->remove_gutter(2);
CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
// Updating size updates hover.
text_edit->set_gutter_width(1, 20);
CHECK(text_edit->get_hovered_gutter() == Vector2i(1, 1));
}
SIGNAL_UNWATCH(text_edit, "gutter_clicked");
SIGNAL_UNWATCH(text_edit, "gutter_added");
SIGNAL_UNWATCH(text_edit, "gutter_removed");