@@ -8151,6 +8151,93 @@ TEST_CASE("[SceneTree][TextEdit] gutters") {
8151
8151
// Merging tested via CodeEdit gutters.
8152
8152
}
8153
8153
8154
+ SUBCASE("[TextEdit] gutter mouse") {
8155
+ DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton());
8156
+ // Set size for mouse input.
8157
+ text_edit->set_size(Size2(200, 200));
8158
+
8159
+ text_edit->set_text("test1\ntest2\ntest3\ntest4");
8160
+ text_edit->grab_focus();
8161
+
8162
+ text_edit->add_gutter();
8163
+ text_edit->set_gutter_name(0, "test_gutter");
8164
+ text_edit->set_gutter_width(0, 10);
8165
+ text_edit->set_gutter_clickable(0, true);
8166
+
8167
+ text_edit->add_gutter();
8168
+ text_edit->set_gutter_name(1, "test_gutter_not_clickable");
8169
+ text_edit->set_gutter_width(1, 10);
8170
+ text_edit->set_gutter_clickable(1, false);
8171
+
8172
+ text_edit->add_gutter();
8173
+ CHECK(text_edit->get_gutter_count() == 3);
8174
+ text_edit->set_gutter_name(2, "test_gutter_3");
8175
+ text_edit->set_gutter_width(2, 10);
8176
+ text_edit->set_gutter_clickable(2, true);
8177
+
8178
+ MessageQueue::get_singleton()->flush();
8179
+ const int line_height = text_edit->get_line_height();
8180
+
8181
+ // Defaults to none.
8182
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
8183
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
8184
+
8185
+ // Hover over gutter.
8186
+ SEND_GUI_MOUSE_MOTION_EVENT(Point2(5, line_height + line_height / 2), MouseButtonMask::NONE, Key::NONE);
8187
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(0, 1));
8188
+ SIGNAL_CHECK_FALSE("gutter_clicked");
8189
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_POINTING_HAND);
8190
+
8191
+ // Click on gutter.
8192
+ SEND_GUI_MOUSE_BUTTON_EVENT(Point2(5, line_height / 2), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
8193
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(0, 0));
8194
+ SIGNAL_CHECK("gutter_clicked", build_array(build_array(0, 0)));
8195
+
8196
+ // Click on gutter on another line.
8197
+ SEND_GUI_MOUSE_BUTTON_EVENT(Point2(5, line_height * 3 + line_height / 2), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
8198
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(0, 3));
8199
+ SIGNAL_CHECK("gutter_clicked", build_array(build_array(3, 0)));
8200
+
8201
+ // Unclickable gutter can be hovered.
8202
+ SEND_GUI_MOUSE_MOTION_EVENT(Point2(15, line_height + line_height / 2), MouseButtonMask::NONE, Key::NONE);
8203
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(1, 1));
8204
+ SIGNAL_CHECK_FALSE("gutter_clicked");
8205
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
8206
+
8207
+ // Unclickable gutter can be clicked.
8208
+ SEND_GUI_MOUSE_BUTTON_EVENT(Point2(15, line_height * 2 + line_height / 2), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
8209
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(1, 2));
8210
+ SIGNAL_CHECK("gutter_clicked", build_array(build_array(2, 1)));
8211
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
8212
+
8213
+ // Hover past last line.
8214
+ SEND_GUI_MOUSE_MOTION_EVENT(Point2(5, line_height * 5), MouseButtonMask::NONE, Key::NONE);
8215
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
8216
+ SIGNAL_CHECK_FALSE("gutter_clicked");
8217
+ CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW);
8218
+
8219
+ // Click on gutter past last line.
8220
+ SEND_GUI_MOUSE_BUTTON_EVENT(Point2(5, line_height * 5), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE);
8221
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
8222
+ SIGNAL_CHECK_FALSE("gutter_clicked");
8223
+
8224
+ // Mouse exit resets hover.
8225
+ SEND_GUI_MOUSE_MOTION_EVENT(Point2(5, line_height + line_height / 2), MouseButtonMask::NONE, Key::NONE);
8226
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(0, 1));
8227
+ SEND_GUI_MOUSE_MOTION_EVENT(Point2(-1, -1), MouseButtonMask::NONE, Key::NONE);
8228
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
8229
+
8230
+ // Removing gutter updates hover.
8231
+ SEND_GUI_MOUSE_MOTION_EVENT(Point2(25, line_height + line_height / 2), MouseButtonMask::NONE, Key::NONE);
8232
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(2, 1));
8233
+ text_edit->remove_gutter(2);
8234
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(-1, -1));
8235
+
8236
+ // Updating size updates hover.
8237
+ text_edit->set_gutter_width(1, 20);
8238
+ CHECK(text_edit->get_hovered_gutter() == Vector2i(1, 1));
8239
+ }
8240
+
8154
8241
SIGNAL_UNWATCH(text_edit, "gutter_clicked");
8155
8242
SIGNAL_UNWATCH(text_edit, "gutter_added");
8156
8243
SIGNAL_UNWATCH(text_edit, "gutter_removed");
0 commit comments