Unify TextServer built-in module and GDExtension code.
This commit is contained in:
parent
178961a6dc
commit
f19cd44346
49 changed files with 4658 additions and 3126 deletions
|
|
@ -671,10 +671,6 @@ void add_exposed_classes(Context &r_context) {
|
|||
} else {
|
||||
exposed_class.methods.push_back(method);
|
||||
}
|
||||
|
||||
if (method.is_virtual) {
|
||||
TEST_COND(String(method.name)[0] != '_', "Virtual method ", String(method.name), " does not start with underscore.");
|
||||
}
|
||||
}
|
||||
|
||||
// Add signals
|
||||
|
|
|
|||
|
|
@ -2901,291 +2901,293 @@ TEST_CASE("[SceneTree][CodeEdit] completion") {
|
|||
}
|
||||
|
||||
SUBCASE("[CodeEdit] autocomplete completion") {
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
code_edit->set_code_completion_enabled(true);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
if (TS->has_feature(TextServer::FEATURE_FONT_DYNAMIC) && TS->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) {
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
code_edit->set_code_completion_enabled(true);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
|
||||
code_edit->update_code_completion_options();
|
||||
code_edit->set_code_completion_selected_index(1);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
CHECK(code_edit->get_code_completion_option(0).size() == 0);
|
||||
CHECK(code_edit->get_code_completion_options().size() == 0);
|
||||
code_edit->update_code_completion_options();
|
||||
code_edit->set_code_completion_selected_index(1);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
CHECK(code_edit->get_code_completion_option(0).size() == 0);
|
||||
CHECK(code_edit->get_code_completion_options().size() == 0);
|
||||
|
||||
/* Adding does not update the list. */
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_0.", "item_0");
|
||||
/* Adding does not update the list. */
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_0.", "item_0");
|
||||
|
||||
code_edit->set_code_completion_selected_index(1);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
CHECK(code_edit->get_code_completion_option(0).size() == 0);
|
||||
CHECK(code_edit->get_code_completion_options().size() == 0);
|
||||
code_edit->set_code_completion_selected_index(1);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
CHECK(code_edit->get_code_completion_option(0).size() == 0);
|
||||
CHECK(code_edit->get_code_completion_options().size() == 0);
|
||||
|
||||
/* After update, pending add should not be counted, */
|
||||
/* also does not work on col 0 */
|
||||
code_edit->insert_text_at_caret("i");
|
||||
code_edit->update_code_completion_options();
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), RES(), Color(1, 0, 0));
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
|
||||
/* After update, pending add should not be counted, */
|
||||
/* also does not work on col 0 */
|
||||
code_edit->insert_text_at_caret("i");
|
||||
code_edit->update_code_completion_options();
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), RES(), Color(1, 0, 0));
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
|
||||
|
||||
ERR_PRINT_OFF;
|
||||
code_edit->set_code_completion_selected_index(1);
|
||||
ERR_PRINT_ON;
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
CHECK(code_edit->get_code_completion_option(0).size() == 6);
|
||||
CHECK(code_edit->get_code_completion_options().size() == 1);
|
||||
ERR_PRINT_OFF;
|
||||
code_edit->set_code_completion_selected_index(1);
|
||||
ERR_PRINT_ON;
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
CHECK(code_edit->get_code_completion_option(0).size() == 6);
|
||||
CHECK(code_edit->get_code_completion_options().size() == 1);
|
||||
|
||||
/* Check cancel closes completion. */
|
||||
SEND_GUI_ACTION(code_edit, "ui_cancel");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
/* Check cancel closes completion. */
|
||||
SEND_GUI_ACTION(code_edit, "ui_cancel");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
|
||||
code_edit->update_code_completion_options();
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
code_edit->set_code_completion_selected_index(1);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 1);
|
||||
CHECK(code_edit->get_code_completion_option(0).size() == 6);
|
||||
CHECK(code_edit->get_code_completion_options().size() == 3);
|
||||
code_edit->update_code_completion_options();
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
code_edit->set_code_completion_selected_index(1);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 1);
|
||||
CHECK(code_edit->get_code_completion_option(0).size() == 6);
|
||||
CHECK(code_edit->get_code_completion_options().size() == 3);
|
||||
|
||||
/* Check data. */
|
||||
Dictionary option = code_edit->get_code_completion_option(0);
|
||||
CHECK((int)option["kind"] == (int)CodeEdit::CodeCompletionKind::KIND_CLASS);
|
||||
CHECK(option["display_text"] == "item_0.");
|
||||
CHECK(option["insert_text"] == "item_0");
|
||||
CHECK(option["font_color"] == Color(1, 0, 0));
|
||||
CHECK(option["icon"] == RES());
|
||||
CHECK(option["default_value"] == Color(1, 0, 0));
|
||||
/* Check data. */
|
||||
Dictionary option = code_edit->get_code_completion_option(0);
|
||||
CHECK((int)option["kind"] == (int)CodeEdit::CodeCompletionKind::KIND_CLASS);
|
||||
CHECK(option["display_text"] == "item_0.");
|
||||
CHECK(option["insert_text"] == "item_0");
|
||||
CHECK(option["font_color"] == Color(1, 0, 0));
|
||||
CHECK(option["icon"] == RES());
|
||||
CHECK(option["default_value"] == Color(1, 0, 0));
|
||||
|
||||
/* Set size for mouse input. */
|
||||
code_edit->set_size(Size2(100, 100));
|
||||
/* Set size for mouse input. */
|
||||
code_edit->set_size(Size2(100, 100));
|
||||
|
||||
/* Check input. */
|
||||
SEND_GUI_ACTION(code_edit, "ui_end");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 2);
|
||||
/* Check input. */
|
||||
SEND_GUI_ACTION(code_edit, "ui_end");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 2);
|
||||
|
||||
SEND_GUI_ACTION(code_edit, "ui_home");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
SEND_GUI_ACTION(code_edit, "ui_home");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
|
||||
SEND_GUI_ACTION(code_edit, "ui_page_down");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 2);
|
||||
SEND_GUI_ACTION(code_edit, "ui_page_down");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 2);
|
||||
|
||||
SEND_GUI_ACTION(code_edit, "ui_page_up");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
SEND_GUI_ACTION(code_edit, "ui_page_up");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
|
||||
SEND_GUI_ACTION(code_edit, "ui_up");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 2);
|
||||
SEND_GUI_ACTION(code_edit, "ui_up");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 2);
|
||||
|
||||
SEND_GUI_ACTION(code_edit, "ui_down");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
SEND_GUI_ACTION(code_edit, "ui_down");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
|
||||
SEND_GUI_KEY_EVENT(code_edit, Key::T);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
SEND_GUI_KEY_EVENT(code_edit, Key::T);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
|
||||
SEND_GUI_ACTION(code_edit, "ui_left");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
SEND_GUI_ACTION(code_edit, "ui_left");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
|
||||
SEND_GUI_ACTION(code_edit, "ui_right");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
SEND_GUI_ACTION(code_edit, "ui_right");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_backspace");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_backspace");
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
|
||||
Point2 caret_pos = code_edit->get_caret_draw_pos();
|
||||
caret_pos.y -= code_edit->get_line_height();
|
||||
SEND_GUI_MOUSE_EVENT(code_edit, caret_pos, MouseButton::WHEEL_DOWN, MouseButton::NONE);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 1);
|
||||
Point2 caret_pos = code_edit->get_caret_draw_pos();
|
||||
caret_pos.y -= code_edit->get_line_height();
|
||||
SEND_GUI_MOUSE_EVENT(code_edit, caret_pos, MouseButton::WHEEL_DOWN, MouseButton::NONE);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 1);
|
||||
|
||||
SEND_GUI_MOUSE_EVENT(code_edit, caret_pos, MouseButton::WHEEL_UP, MouseButton::NONE);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
SEND_GUI_MOUSE_EVENT(code_edit, caret_pos, MouseButton::WHEEL_UP, MouseButton::NONE);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 0);
|
||||
|
||||
/* Single click selects. */
|
||||
SEND_GUI_MOUSE_EVENT(code_edit, caret_pos, MouseButton::LEFT, MouseButton::MASK_LEFT);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 2);
|
||||
/* Single click selects. */
|
||||
SEND_GUI_MOUSE_EVENT(code_edit, caret_pos, MouseButton::LEFT, MouseButton::MASK_LEFT);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == 2);
|
||||
|
||||
/* Double click inserts. */
|
||||
SEND_GUI_DOUBLE_CLICK(code_edit, caret_pos);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
CHECK(code_edit->get_line(0) == "item_2");
|
||||
/* Double click inserts. */
|
||||
SEND_GUI_DOUBLE_CLICK(code_edit, caret_pos);
|
||||
CHECK(code_edit->get_code_completion_selected_index() == -1);
|
||||
CHECK(code_edit->get_line(0) == "item_2");
|
||||
|
||||
code_edit->set_auto_brace_completion_enabled(false);
|
||||
code_edit->set_auto_brace_completion_enabled(false);
|
||||
|
||||
/* Does nothing in readonly. */
|
||||
code_edit->undo();
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
code_edit->set_editable(false);
|
||||
code_edit->confirm_code_completion();
|
||||
code_edit->set_editable(true);
|
||||
CHECK(code_edit->get_line(0) == "i");
|
||||
/* Does nothing in readonly. */
|
||||
code_edit->undo();
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
code_edit->set_editable(false);
|
||||
code_edit->confirm_code_completion();
|
||||
code_edit->set_editable(true);
|
||||
CHECK(code_edit->get_line(0) == "i");
|
||||
|
||||
/* Replace */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0 test");
|
||||
/* Replace */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0 test");
|
||||
|
||||
/* Replace string. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("\"item_1 test\"");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "\"item_0\"");
|
||||
/* Replace string. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("\"item_1 test\"");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "\"item_0\"");
|
||||
|
||||
/* Normal replace if no end is given. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("\"item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "\"item_0\" test");
|
||||
/* Normal replace if no end is given. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("\"item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "\"item_0\" test");
|
||||
|
||||
/* Insert at completion. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_accept");
|
||||
CHECK(code_edit->get_line(0) == "item_01 test");
|
||||
/* Insert at completion. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_accept");
|
||||
CHECK(code_edit->get_line(0) == "item_01 test");
|
||||
|
||||
/* Insert at completion with string should have same output. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("\"item_1 test\"");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_accept");
|
||||
CHECK(code_edit->get_line(0) == "\"item_0\"1 test\"");
|
||||
/* Insert at completion with string should have same output. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("\"item_1 test\"");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_accept");
|
||||
CHECK(code_edit->get_line(0) == "\"item_0\"1 test\"");
|
||||
|
||||
/* Merge symbol at end on insert text. */
|
||||
/* End on completion entry. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 7);
|
||||
/* Merge symbol at end on insert text. */
|
||||
/* End on completion entry. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 7);
|
||||
|
||||
/* End of text*/
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1( test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 6);
|
||||
/* End of text*/
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1( test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 6);
|
||||
|
||||
/* End of both. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1( test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 7);
|
||||
/* End of both. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1( test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 7);
|
||||
|
||||
/* Full set. */
|
||||
/* End on completion entry. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 8);
|
||||
/* Full set. */
|
||||
/* End on completion entry. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 8);
|
||||
|
||||
/* End of text*/
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1() test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 6);
|
||||
/* End of text*/
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1() test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 6);
|
||||
|
||||
/* End of both. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1() test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 8);
|
||||
/* End of both. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1() test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 8);
|
||||
|
||||
/* Autobrace completion. */
|
||||
code_edit->set_auto_brace_completion_enabled(true);
|
||||
/* Autobrace completion. */
|
||||
code_edit->set_auto_brace_completion_enabled(true);
|
||||
|
||||
/* End on completion entry. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 7);
|
||||
/* End on completion entry. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 7);
|
||||
|
||||
/* End of text*/
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1( test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 6);
|
||||
/* End of text*/
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1( test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 6);
|
||||
|
||||
/* End of both. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1( test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 7);
|
||||
/* End of both. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1( test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0(", "item_0(");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0( test");
|
||||
CHECK(code_edit->get_caret_column() == 7);
|
||||
|
||||
/* Full set. */
|
||||
/* End on completion entry. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 8);
|
||||
/* Full set. */
|
||||
/* End on completion entry. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1 test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 8);
|
||||
|
||||
/* End of text*/
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1() test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 6);
|
||||
/* End of text*/
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1() test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0", "item_0");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 6);
|
||||
|
||||
/* End of both. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1() test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 8);
|
||||
/* End of both. */
|
||||
code_edit->clear();
|
||||
code_edit->insert_text_at_caret("item_1() test");
|
||||
code_edit->set_caret_column(2);
|
||||
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0()", "item_0()");
|
||||
code_edit->update_code_completion_options();
|
||||
SEND_GUI_ACTION(code_edit, "ui_text_completion_replace");
|
||||
CHECK(code_edit->get_line(0) == "item_0() test");
|
||||
CHECK(code_edit->get_caret_column() == 8);
|
||||
}
|
||||
}
|
||||
|
||||
memdelete(code_edit);
|
||||
|
|
@ -3198,33 +3200,35 @@ TEST_CASE("[SceneTree][CodeEdit] symbol lookup") {
|
|||
code_edit->set_symbol_lookup_on_click_enabled(true);
|
||||
CHECK(code_edit->is_symbol_lookup_on_click_enabled());
|
||||
|
||||
/* Set size for mouse input. */
|
||||
code_edit->set_size(Size2(100, 100));
|
||||
if (TS->has_feature(TextServer::FEATURE_FONT_DYNAMIC) && TS->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) {
|
||||
/* Set size for mouse input. */
|
||||
code_edit->set_size(Size2(100, 100));
|
||||
|
||||
code_edit->set_text("this is some text");
|
||||
code_edit->set_text("this is some text");
|
||||
|
||||
Point2 caret_pos = code_edit->get_caret_draw_pos();
|
||||
caret_pos.x += 58;
|
||||
SEND_GUI_MOUSE_EVENT(code_edit, caret_pos, MouseButton::NONE, MouseButton::NONE);
|
||||
CHECK(code_edit->get_text_for_symbol_lookup() == "this is s" + String::chr(0xFFFF) + "ome text");
|
||||
Point2 caret_pos = code_edit->get_caret_draw_pos();
|
||||
caret_pos.x += 58;
|
||||
SEND_GUI_MOUSE_EVENT(code_edit, caret_pos, MouseButton::NONE, MouseButton::NONE);
|
||||
CHECK(code_edit->get_text_for_symbol_lookup() == "this is s" + String::chr(0xFFFF) + "ome text");
|
||||
|
||||
SIGNAL_WATCH(code_edit, "symbol_validate");
|
||||
SIGNAL_WATCH(code_edit, "symbol_validate");
|
||||
|
||||
#ifdef OSX_ENABLED
|
||||
SEND_GUI_KEY_EVENT(code_edit, Key::META);
|
||||
SEND_GUI_KEY_EVENT(code_edit, Key::META);
|
||||
#else
|
||||
SEND_GUI_KEY_EVENT(code_edit, Key::CTRL);
|
||||
SEND_GUI_KEY_EVENT(code_edit, Key::CTRL);
|
||||
#endif
|
||||
|
||||
Array signal_args;
|
||||
Array arg;
|
||||
arg.push_back("some");
|
||||
signal_args.push_back(arg);
|
||||
SIGNAL_CHECK("symbol_validate", signal_args);
|
||||
Array signal_args;
|
||||
Array arg;
|
||||
arg.push_back("some");
|
||||
signal_args.push_back(arg);
|
||||
SIGNAL_CHECK("symbol_validate", signal_args);
|
||||
|
||||
SIGNAL_UNWATCH(code_edit, "symbol_validate");
|
||||
SIGNAL_UNWATCH(code_edit, "symbol_validate");
|
||||
|
||||
memdelete(code_edit);
|
||||
memdelete(code_edit);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("[SceneTree][CodeEdit] line length guidelines") {
|
||||
|
|
|
|||
|
|
@ -46,10 +46,14 @@ TEST_SUITE("[[TextServer]") {
|
|||
Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i);
|
||||
TEST_FAIL_COND(ts.is_null(), "Invalid TS interface.");
|
||||
|
||||
if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RID font = ts->create_font();
|
||||
ts->font_set_data_ptr(font, _font_NotoSans_Regular, _font_NotoSans_Regular_size);
|
||||
TEST_FAIL_COND(font == RID(), "Loading font failed.");
|
||||
ts->free(font);
|
||||
ts->free_rid(font);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -58,12 +62,16 @@ TEST_SUITE("[[TextServer]") {
|
|||
Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i);
|
||||
TEST_FAIL_COND(ts.is_null(), "Invalid TS interface.");
|
||||
|
||||
if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RID font1 = ts->create_font();
|
||||
ts->font_set_data_ptr(font1, _font_NotoSans_Regular, _font_NotoSans_Regular_size);
|
||||
RID font2 = ts->create_font();
|
||||
ts->font_set_data_ptr(font2, _font_NotoSansThaiUI_Regular, _font_NotoSansThaiUI_Regular_size);
|
||||
|
||||
Vector<RID> font;
|
||||
Array font;
|
||||
font.push_back(font1);
|
||||
font.push_back(font2);
|
||||
|
||||
|
|
@ -93,10 +101,10 @@ TEST_SUITE("[[TextServer]") {
|
|||
TEST_FAIL_COND(glyphs[j].font_size != 16, "Incorrect glyph font size.");
|
||||
}
|
||||
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
|
||||
for (int j = 0; j < font.size(); j++) {
|
||||
ts->free(font[j]);
|
||||
ts->free_rid(font[j]);
|
||||
}
|
||||
font.clear();
|
||||
}
|
||||
|
|
@ -107,7 +115,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i);
|
||||
TEST_FAIL_COND(ts.is_null(), "Invalid TS interface.");
|
||||
|
||||
if (!ts->has_feature(TextServer::FEATURE_BIDI_LAYOUT)) {
|
||||
if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_BIDI_LAYOUT)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -116,7 +124,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
RID font2 = ts->create_font();
|
||||
ts->font_set_data_ptr(font2, _font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size);
|
||||
|
||||
Vector<RID> font;
|
||||
Array font;
|
||||
font.push_back(font1);
|
||||
font.push_back(font2);
|
||||
|
||||
|
|
@ -145,10 +153,10 @@ TEST_SUITE("[[TextServer]") {
|
|||
}
|
||||
}
|
||||
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
|
||||
for (int j = 0; j < font.size(); j++) {
|
||||
ts->free(font[j]);
|
||||
ts->free_rid(font[j]);
|
||||
}
|
||||
font.clear();
|
||||
}
|
||||
|
|
@ -159,6 +167,10 @@ TEST_SUITE("[[TextServer]") {
|
|||
Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i);
|
||||
TEST_FAIL_COND(ts.is_null(), "Invalid TS interface.");
|
||||
|
||||
if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RID font1 = ts->create_font();
|
||||
ts->font_set_data_ptr(font1, _font_NotoSans_Regular, _font_NotoSans_Regular_size);
|
||||
RID font2 = ts->create_font();
|
||||
|
|
@ -166,7 +178,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
RID font3 = ts->create_font();
|
||||
ts->font_set_data_ptr(font3, _font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size);
|
||||
|
||||
Vector<RID> font;
|
||||
Array font;
|
||||
font.push_back(font1);
|
||||
font.push_back(font2);
|
||||
font.push_back(font3);
|
||||
|
|
@ -198,7 +210,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags.");
|
||||
}
|
||||
}
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
}
|
||||
|
||||
{
|
||||
|
|
@ -241,7 +253,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
}
|
||||
}
|
||||
}
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
}
|
||||
|
||||
{
|
||||
|
|
@ -294,7 +306,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
}
|
||||
}
|
||||
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
}
|
||||
|
||||
{
|
||||
|
|
@ -322,7 +334,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags.");
|
||||
}
|
||||
}
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
}
|
||||
|
||||
if (ts->has_feature(TextServer::FEATURE_BREAK_ITERATORS)) {
|
||||
|
|
@ -350,11 +362,11 @@ TEST_SUITE("[[TextServer]") {
|
|||
TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags.");
|
||||
}
|
||||
}
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
}
|
||||
|
||||
for (int j = 0; j < font.size(); j++) {
|
||||
ts->free(font[j]);
|
||||
ts->free_rid(font[j]);
|
||||
}
|
||||
font.clear();
|
||||
}
|
||||
|
|
@ -365,6 +377,10 @@ TEST_SUITE("[[TextServer]") {
|
|||
Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i);
|
||||
TEST_FAIL_COND(ts.is_null(), "Invalid TS interface.");
|
||||
|
||||
if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String test_1 = U"test test test";
|
||||
// 5^ 10^
|
||||
|
||||
|
|
@ -373,7 +389,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
RID font2 = ts->create_font();
|
||||
ts->font_set_data_ptr(font2, _font_NotoSansThaiUI_Regular, _font_NotoSansThaiUI_Regular_size);
|
||||
|
||||
Vector<RID> font;
|
||||
Array font;
|
||||
font.push_back(font1);
|
||||
font.push_back(font2);
|
||||
|
||||
|
|
@ -395,10 +411,10 @@ TEST_SUITE("[[TextServer]") {
|
|||
TEST_FAIL_COND(brks[5] != 14, "Invalid line break position.");
|
||||
}
|
||||
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
|
||||
for (int j = 0; j < font.size(); j++) {
|
||||
ts->free(font[j]);
|
||||
ts->free_rid(font[j]);
|
||||
}
|
||||
font.clear();
|
||||
}
|
||||
|
|
@ -409,12 +425,16 @@ TEST_SUITE("[[TextServer]") {
|
|||
Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i);
|
||||
TEST_FAIL_COND(ts.is_null(), "Invalid TS interface.");
|
||||
|
||||
if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RID font1 = ts->create_font();
|
||||
ts->font_set_data_ptr(font1, _font_NotoSans_Regular, _font_NotoSans_Regular_size);
|
||||
RID font2 = ts->create_font();
|
||||
ts->font_set_data_ptr(font2, _font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size);
|
||||
|
||||
Vector<RID> font;
|
||||
Array font;
|
||||
font.push_back(font1);
|
||||
font.push_back(font2);
|
||||
|
||||
|
|
@ -438,7 +458,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
width = ts->shaped_text_fit_to_width(ctx, 100, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA);
|
||||
TEST_FAIL_COND((width <= width_old || width > 100), "Invalid fill width.");
|
||||
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
|
||||
ctx = ts->create_shaped_text();
|
||||
TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed.");
|
||||
|
|
@ -451,7 +471,7 @@ TEST_SUITE("[[TextServer]") {
|
|||
width = ts->shaped_text_fit_to_width(ctx, 100, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA);
|
||||
TEST_FAIL_COND((width <= width_old || width > 100), "Invalid fill width.");
|
||||
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
}
|
||||
|
||||
ctx = ts->create_shaped_text();
|
||||
|
|
@ -463,10 +483,10 @@ TEST_SUITE("[[TextServer]") {
|
|||
width = ts->shaped_text_fit_to_width(ctx, 100, TextServer::JUSTIFICATION_WORD_BOUND);
|
||||
TEST_FAIL_COND((width <= width_old || width > 100), "Invalid fill width.");
|
||||
|
||||
ts->free(ctx);
|
||||
ts->free_rid(ctx);
|
||||
|
||||
for (int j = 0; j < font.size(); j++) {
|
||||
ts->free(font[j]);
|
||||
ts->free_rid(font[j]);
|
||||
}
|
||||
font.clear();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue