mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Extract Syntax highlighting from TextEdit and add EditorSyntaxHighlighter
- Extacted all syntax highlighting code from text edit - Removed enable syntax highlighting from text edit - Added line_edited_from signal to text_edit - Renamed get/set_syntax_highlighting to get/set_syntax_highlighter - Added EditorSyntaxHighligher
This commit is contained in:
parent
156daddaaf
commit
bc4cee4458
25 changed files with 1330 additions and 932 deletions
|
@ -132,7 +132,7 @@ void ScriptTextEditor::apply_code() {
|
|||
}
|
||||
script->set_source_code(code_editor->get_text_edit()->get_text());
|
||||
script->update_exports();
|
||||
_update_member_keywords();
|
||||
code_editor->get_text_edit()->get_syntax_highlighter()->update_cache();
|
||||
}
|
||||
|
||||
RES ScriptTextEditor::get_edited_resource() const {
|
||||
|
@ -155,43 +155,9 @@ void ScriptTextEditor::set_edited_resource(const RES &p_res) {
|
|||
_validate_script();
|
||||
}
|
||||
|
||||
void ScriptTextEditor::_update_member_keywords() {
|
||||
member_keywords.clear();
|
||||
code_editor->get_text_edit()->clear_member_keywords();
|
||||
Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
|
||||
|
||||
StringName instance_base = script->get_instance_base_type();
|
||||
|
||||
if (instance_base == StringName()) {
|
||||
return;
|
||||
}
|
||||
List<PropertyInfo> plist;
|
||||
ClassDB::get_property_list(instance_base, &plist);
|
||||
|
||||
for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
|
||||
String name = E->get().name;
|
||||
if (E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_SUBGROUP) {
|
||||
continue;
|
||||
}
|
||||
if (name.find("/") != -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
code_editor->get_text_edit()->add_member_keyword(name, member_variable_color);
|
||||
}
|
||||
|
||||
List<String> clist;
|
||||
ClassDB::get_integer_constant_list(instance_base, &clist);
|
||||
|
||||
for (List<String>::Element *E = clist.front(); E; E = E->next()) {
|
||||
code_editor->get_text_edit()->add_member_keyword(E->get(), member_variable_color);
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptTextEditor::_load_theme_settings() {
|
||||
TextEdit *text_edit = code_editor->get_text_edit();
|
||||
|
||||
text_edit->clear_colors();
|
||||
text_edit->clear_keywords();
|
||||
|
||||
Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
|
||||
Color completion_background_color = EDITOR_GET("text_editor/highlighting/completion_background_color");
|
||||
|
@ -210,9 +176,6 @@ void ScriptTextEditor::_load_theme_settings() {
|
|||
Color current_line_color = EDITOR_GET("text_editor/highlighting/current_line_color");
|
||||
Color line_length_guideline_color = EDITOR_GET("text_editor/highlighting/line_length_guideline_color");
|
||||
Color word_highlighted_color = EDITOR_GET("text_editor/highlighting/word_highlighted_color");
|
||||
Color number_color = EDITOR_GET("text_editor/highlighting/number_color");
|
||||
Color function_color = EDITOR_GET("text_editor/highlighting/function_color");
|
||||
Color member_variable_color = EDITOR_GET("text_editor/highlighting/member_variable_color");
|
||||
Color mark_color = EDITOR_GET("text_editor/highlighting/mark_color");
|
||||
Color bookmark_color = EDITOR_GET("text_editor/highlighting/bookmark_color");
|
||||
Color breakpoint_color = EDITOR_GET("text_editor/highlighting/breakpoint_color");
|
||||
|
@ -220,13 +183,6 @@ void ScriptTextEditor::_load_theme_settings() {
|
|||
Color code_folding_color = EDITOR_GET("text_editor/highlighting/code_folding_color");
|
||||
Color search_result_color = EDITOR_GET("text_editor/highlighting/search_result_color");
|
||||
Color search_result_border_color = EDITOR_GET("text_editor/highlighting/search_result_border_color");
|
||||
Color symbol_color = EDITOR_GET("text_editor/highlighting/symbol_color");
|
||||
Color keyword_color = EDITOR_GET("text_editor/highlighting/keyword_color");
|
||||
Color basetype_color = EDITOR_GET("text_editor/highlighting/base_type_color");
|
||||
Color type_color = EDITOR_GET("text_editor/highlighting/engine_type_color");
|
||||
Color usertype_color = EDITOR_GET("text_editor/highlighting/user_type_color");
|
||||
Color comment_color = EDITOR_GET("text_editor/highlighting/comment_color");
|
||||
Color string_color = EDITOR_GET("text_editor/highlighting/string_color");
|
||||
|
||||
text_edit->add_theme_color_override("background_color", background_color);
|
||||
text_edit->add_theme_color_override("completion_background_color", completion_background_color);
|
||||
|
@ -245,9 +201,6 @@ void ScriptTextEditor::_load_theme_settings() {
|
|||
text_edit->add_theme_color_override("current_line_color", current_line_color);
|
||||
text_edit->add_theme_color_override("line_length_guideline_color", line_length_guideline_color);
|
||||
text_edit->add_theme_color_override("word_highlighted_color", word_highlighted_color);
|
||||
text_edit->add_theme_color_override("number_color", number_color);
|
||||
text_edit->add_theme_color_override("function_color", function_color);
|
||||
text_edit->add_theme_color_override("member_variable_color", member_variable_color);
|
||||
text_edit->add_theme_color_override("bookmark_color", bookmark_color);
|
||||
text_edit->add_theme_color_override("breakpoint_color", breakpoint_color);
|
||||
text_edit->add_theme_color_override("executing_line_color", executing_line_color);
|
||||
|
@ -255,18 +208,9 @@ void ScriptTextEditor::_load_theme_settings() {
|
|||
text_edit->add_theme_color_override("code_folding_color", code_folding_color);
|
||||
text_edit->add_theme_color_override("search_result_color", search_result_color);
|
||||
text_edit->add_theme_color_override("search_result_border_color", search_result_border_color);
|
||||
text_edit->add_theme_color_override("symbol_color", symbol_color);
|
||||
|
||||
text_edit->add_theme_constant_override("line_spacing", EDITOR_DEF("text_editor/theme/line_spacing", 6));
|
||||
|
||||
colors_cache.symbol_color = symbol_color;
|
||||
colors_cache.keyword_color = keyword_color;
|
||||
colors_cache.basetype_color = basetype_color;
|
||||
colors_cache.type_color = type_color;
|
||||
colors_cache.usertype_color = usertype_color;
|
||||
colors_cache.comment_color = comment_color;
|
||||
colors_cache.string_color = string_color;
|
||||
|
||||
theme_loaded = true;
|
||||
if (!script.is_null()) {
|
||||
_set_theme_for_script();
|
||||
|
@ -279,98 +223,47 @@ void ScriptTextEditor::_set_theme_for_script() {
|
|||
}
|
||||
|
||||
TextEdit *text_edit = code_editor->get_text_edit();
|
||||
text_edit->get_syntax_highlighter()->update_cache();
|
||||
|
||||
List<String> keywords;
|
||||
script->get_language()->get_reserved_words(&keywords);
|
||||
|
||||
for (List<String>::Element *E = keywords.front(); E; E = E->next()) {
|
||||
text_edit->add_keyword_color(E->get(), colors_cache.keyword_color);
|
||||
/* add keywords for auto completion */
|
||||
// singleton autoloads (as types, just as engine singletons are)
|
||||
Map<StringName, ProjectSettings::AutoloadInfo> autoloads = ProjectSettings::get_singleton()->get_autoload_list();
|
||||
for (Map<StringName, ProjectSettings::AutoloadInfo>::Element *E = autoloads.front(); E; E = E->next()) {
|
||||
const ProjectSettings::AutoloadInfo &info = E->value();
|
||||
if (info.is_singleton) {
|
||||
text_edit->add_keyword(info.name);
|
||||
}
|
||||
}
|
||||
|
||||
//colorize core types
|
||||
const Color basetype_color = colors_cache.basetype_color;
|
||||
text_edit->add_keyword_color("String", basetype_color);
|
||||
text_edit->add_keyword_color("Vector2", basetype_color);
|
||||
text_edit->add_keyword_color("Vector2i", basetype_color);
|
||||
text_edit->add_keyword_color("Rect2", basetype_color);
|
||||
text_edit->add_keyword_color("Rect2i", basetype_color);
|
||||
text_edit->add_keyword_color("Vector3", basetype_color);
|
||||
text_edit->add_keyword_color("Vector3i", basetype_color);
|
||||
text_edit->add_keyword_color("Transform2D", basetype_color);
|
||||
text_edit->add_keyword_color("Plane", basetype_color);
|
||||
text_edit->add_keyword_color("Quat", basetype_color);
|
||||
text_edit->add_keyword_color("AABB", basetype_color);
|
||||
text_edit->add_keyword_color("Basis", basetype_color);
|
||||
text_edit->add_keyword_color("Transform", basetype_color);
|
||||
text_edit->add_keyword_color("Color", basetype_color);
|
||||
text_edit->add_keyword_color("StringName", basetype_color);
|
||||
text_edit->add_keyword_color("NodePath", basetype_color);
|
||||
text_edit->add_keyword_color("RID", basetype_color);
|
||||
text_edit->add_keyword_color("Object", basetype_color);
|
||||
text_edit->add_keyword_color("Callable", basetype_color);
|
||||
text_edit->add_keyword_color("Dictionary", basetype_color);
|
||||
text_edit->add_keyword_color("Array", basetype_color);
|
||||
text_edit->add_keyword_color("PackedByteArray", basetype_color);
|
||||
text_edit->add_keyword_color("PackedInt32Array", basetype_color);
|
||||
text_edit->add_keyword_color("PackedInt64Array", basetype_color);
|
||||
text_edit->add_keyword_color("PackedFloat32Array", basetype_color);
|
||||
text_edit->add_keyword_color("PackedFloat64Array", basetype_color);
|
||||
text_edit->add_keyword_color("PackedStringArray", basetype_color);
|
||||
text_edit->add_keyword_color("PackedVector2Array", basetype_color);
|
||||
text_edit->add_keyword_color("PackedVector3Array", basetype_color);
|
||||
text_edit->add_keyword_color("PackedColorArray", basetype_color);
|
||||
|
||||
//colorize engine types
|
||||
// engine types
|
||||
List<StringName> types;
|
||||
ClassDB::get_class_list(&types);
|
||||
|
||||
for (List<StringName>::Element *E = types.front(); E; E = E->next()) {
|
||||
String n = E->get();
|
||||
if (n.begins_with("_")) {
|
||||
n = n.substr(1, n.length());
|
||||
}
|
||||
|
||||
text_edit->add_keyword_color(n, colors_cache.type_color);
|
||||
text_edit->add_keyword(n);
|
||||
}
|
||||
_update_member_keywords();
|
||||
|
||||
//colorize user types
|
||||
// user types
|
||||
List<StringName> global_classes;
|
||||
ScriptServer::get_global_class_list(&global_classes);
|
||||
|
||||
for (List<StringName>::Element *E = global_classes.front(); E; E = E->next()) {
|
||||
text_edit->add_keyword_color(E->get(), colors_cache.usertype_color);
|
||||
text_edit->add_keyword(E->get());
|
||||
}
|
||||
|
||||
//colorize singleton autoloads (as types, just as engine singletons are)
|
||||
Map<StringName, ProjectSettings::AutoloadInfo> autoloads = ProjectSettings::get_singleton()->get_autoload_list();
|
||||
for (Map<StringName, ProjectSettings::AutoloadInfo>::Element *E = autoloads.front(); E; E = E->next()) {
|
||||
const ProjectSettings::AutoloadInfo &info = E->value();
|
||||
if (info.is_singleton) {
|
||||
text_edit->add_keyword_color(info.name, colors_cache.usertype_color);
|
||||
}
|
||||
List<String> keywords;
|
||||
script->get_language()->get_reserved_words(&keywords);
|
||||
for (List<String>::Element *E = keywords.front(); E; E = E->next()) {
|
||||
text_edit->add_keyword(E->get());
|
||||
}
|
||||
|
||||
//colorize comments
|
||||
List<String> comments;
|
||||
script->get_language()->get_comment_delimiters(&comments);
|
||||
|
||||
for (List<String>::Element *E = comments.front(); E; E = E->next()) {
|
||||
String comment = E->get();
|
||||
String beg = comment.get_slice(" ", 0);
|
||||
String end = comment.get_slice_count(" ") > 1 ? comment.get_slice(" ", 1) : String();
|
||||
|
||||
text_edit->add_color_region(beg, end, colors_cache.comment_color, end == "");
|
||||
}
|
||||
|
||||
//colorize strings
|
||||
List<String> strings;
|
||||
script->get_language()->get_string_delimiters(&strings);
|
||||
for (List<String>::Element *E = strings.front(); E; E = E->next()) {
|
||||
String string = E->get();
|
||||
String beg = string.get_slice(" ", 0);
|
||||
String end = string.get_slice_count(" ") > 1 ? string.get_slice(" ", 1) : String();
|
||||
text_edit->add_color_region(beg, end, colors_cache.string_color, end == "");
|
||||
// core types
|
||||
List<String> core_types;
|
||||
script->get_language()->get_core_type_words(&core_types);
|
||||
for (List<String>::Element *E = core_types.front(); E; E = E->next()) {
|
||||
text_edit->add_keyword(E->get());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -555,7 +448,7 @@ void ScriptTextEditor::_validate_script() {
|
|||
if (!script->is_tool()) {
|
||||
script->set_source_code(text);
|
||||
script->update_exports();
|
||||
_update_member_keywords();
|
||||
te->get_syntax_highlighter()->update_cache();
|
||||
}
|
||||
|
||||
functions.clear();
|
||||
|
@ -1380,23 +1273,20 @@ void ScriptTextEditor::_edit_option_toggle_inline_comment() {
|
|||
code_editor->toggle_inline_comment(delimiter);
|
||||
}
|
||||
|
||||
void ScriptTextEditor::add_syntax_highlighter(Ref<SyntaxHighlighter> p_highlighter) {
|
||||
void ScriptTextEditor::add_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) {
|
||||
highlighters[p_highlighter->_get_name()] = p_highlighter;
|
||||
highlighter_menu->add_radio_check_item(p_highlighter->_get_name());
|
||||
}
|
||||
|
||||
void ScriptTextEditor::set_syntax_highlighter(Ref<SyntaxHighlighter> p_highlighter) {
|
||||
void ScriptTextEditor::set_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_highlighter) {
|
||||
TextEdit *te = code_editor->get_text_edit();
|
||||
te->set_syntax_highlighting(p_highlighter);
|
||||
if (p_highlighter.is_valid()) {
|
||||
highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(p_highlighter->_get_name()), true);
|
||||
} else {
|
||||
highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(TTR("Standard")), true);
|
||||
}
|
||||
p_highlighter->_set_edited_resource(script);
|
||||
te->set_syntax_highlighter(p_highlighter);
|
||||
highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(p_highlighter->_get_name()), true);
|
||||
}
|
||||
|
||||
void ScriptTextEditor::_change_syntax_highlighter(int p_idx) {
|
||||
Map<String, Ref<SyntaxHighlighter> >::Element *el = highlighters.front();
|
||||
Map<String, Ref<EditorSyntaxHighlighter>>::Element *el = highlighters.front();
|
||||
while (el != nullptr) {
|
||||
highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(el->key()), false);
|
||||
el = el->next();
|
||||
|
@ -1826,14 +1716,21 @@ ScriptTextEditor::ScriptTextEditor() {
|
|||
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/capitalize", TTR("Capitalize"), KEY_MASK_SHIFT | KEY_F6), EDIT_CAPITALIZE);
|
||||
convert_case->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
|
||||
|
||||
highlighters[TTR("Standard")] = Ref<SyntaxHighlighter>();
|
||||
highlighter_menu = memnew(PopupMenu);
|
||||
highlighter_menu->set_name("highlighter_menu");
|
||||
edit_menu->get_popup()->add_child(highlighter_menu);
|
||||
edit_menu->get_popup()->add_submenu_item(TTR("Syntax Highlighter"), "highlighter_menu");
|
||||
highlighter_menu->add_radio_check_item(TTR("Standard"));
|
||||
highlighter_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_change_syntax_highlighter));
|
||||
|
||||
Ref<EditorPlainTextSyntaxHighlighter> plain_highlighter;
|
||||
plain_highlighter.instance();
|
||||
add_syntax_highlighter(plain_highlighter);
|
||||
|
||||
Ref<EditorStandardSyntaxHighlighter> highlighter;
|
||||
highlighter.instance();
|
||||
add_syntax_highlighter(highlighter);
|
||||
set_syntax_highlighter(highlighter);
|
||||
|
||||
search_menu = memnew(MenuButton);
|
||||
edit_hb->add_child(search_menu);
|
||||
search_menu->set_text(TTR("Search"));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue