|
@@ -8151,6 +8151,93 @@ TEST_CASE("[SceneTree][TextEdit] gutters") {
|
|
// Merging tested via CodeEdit 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_clicked");
|
|
SIGNAL_UNWATCH(text_edit, "gutter_added");
|
|
SIGNAL_UNWATCH(text_edit, "gutter_added");
|
|
SIGNAL_UNWATCH(text_edit, "gutter_removed");
|
|
SIGNAL_UNWATCH(text_edit, "gutter_removed");
|