|
@@ -111,7 +111,7 @@ ConnectionInfoDialog::ConnectionInfoDialog() {
|
|
|
Vector<String> ScriptTextEditor::get_functions() {
|
|
|
String errortxt;
|
|
|
int line = -1, col;
|
|
|
- TextEdit *te = code_editor->get_text_edit();
|
|
|
+ CodeEdit *te = code_editor->get_text_editor();
|
|
|
String text = te->get_text();
|
|
|
List<String> fnc;
|
|
|
|
|
@@ -130,9 +130,9 @@ void ScriptTextEditor::apply_code() {
|
|
|
if (script.is_null()) {
|
|
|
return;
|
|
|
}
|
|
|
- script->set_source_code(code_editor->get_text_edit()->get_text());
|
|
|
+ script->set_source_code(code_editor->get_text_editor()->get_text());
|
|
|
script->update_exports();
|
|
|
- code_editor->get_text_edit()->get_syntax_highlighter()->update_cache();
|
|
|
+ code_editor->get_text_editor()->get_syntax_highlighter()->update_cache();
|
|
|
}
|
|
|
|
|
|
RES ScriptTextEditor::get_edited_resource() const {
|
|
@@ -145,9 +145,9 @@ void ScriptTextEditor::set_edited_resource(const RES &p_res) {
|
|
|
|
|
|
script = p_res;
|
|
|
|
|
|
- code_editor->get_text_edit()->set_text(script->get_source_code());
|
|
|
- code_editor->get_text_edit()->clear_undo_history();
|
|
|
- code_editor->get_text_edit()->tag_saved_version();
|
|
|
+ code_editor->get_text_editor()->set_text(script->get_source_code());
|
|
|
+ code_editor->get_text_editor()->clear_undo_history();
|
|
|
+ code_editor->get_text_editor()->tag_saved_version();
|
|
|
|
|
|
emit_signal("name_changed");
|
|
|
code_editor->update_line_and_column();
|
|
@@ -167,9 +167,19 @@ void ScriptTextEditor::enable_editor() {
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::_load_theme_settings() {
|
|
|
- TextEdit *text_edit = code_editor->get_text_edit();
|
|
|
+ CodeEdit *text_edit = code_editor->get_text_editor();
|
|
|
text_edit->clear_keywords();
|
|
|
|
|
|
+ Color updated_safe_line_number_color = EDITOR_GET("text_editor/highlighting/safe_line_number_color");
|
|
|
+ if (updated_safe_line_number_color != safe_line_number_color) {
|
|
|
+ safe_line_number_color = updated_safe_line_number_color;
|
|
|
+ for (int i = 0; i < text_edit->get_line_count(); i++) {
|
|
|
+ if (text_edit->get_line_gutter_item_color(i, line_number_gutter) != default_line_number_color) {
|
|
|
+ text_edit->set_line_gutter_item_color(i, line_number_gutter, safe_line_number_color);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
Color background_color = EDITOR_GET("text_editor/highlighting/background_color");
|
|
|
Color completion_background_color = EDITOR_GET("text_editor/highlighting/completion_background_color");
|
|
|
Color completion_selected_color = EDITOR_GET("text_editor/highlighting/completion_selected_color");
|
|
@@ -178,7 +188,6 @@ void ScriptTextEditor::_load_theme_settings() {
|
|
|
Color completion_font_color = EDITOR_GET("text_editor/highlighting/completion_font_color");
|
|
|
Color text_color = EDITOR_GET("text_editor/highlighting/text_color");
|
|
|
Color line_number_color = EDITOR_GET("text_editor/highlighting/line_number_color");
|
|
|
- Color safe_line_number_color = EDITOR_GET("text_editor/highlighting/safe_line_number_color");
|
|
|
Color caret_color = EDITOR_GET("text_editor/highlighting/caret_color");
|
|
|
Color caret_background_color = EDITOR_GET("text_editor/highlighting/caret_background_color");
|
|
|
Color text_selected_color = EDITOR_GET("text_editor/highlighting/text_selected_color");
|
|
@@ -203,7 +212,6 @@ void ScriptTextEditor::_load_theme_settings() {
|
|
|
text_edit->add_theme_color_override("completion_font_color", completion_font_color);
|
|
|
text_edit->add_theme_color_override("font_color", text_color);
|
|
|
text_edit->add_theme_color_override("line_number_color", line_number_color);
|
|
|
- text_edit->add_theme_color_override("safe_line_number_color", safe_line_number_color);
|
|
|
text_edit->add_theme_color_override("caret_color", caret_color);
|
|
|
text_edit->add_theme_color_override("caret_background_color", caret_background_color);
|
|
|
text_edit->add_theme_color_override("font_color_selected", text_selected_color);
|
|
@@ -233,7 +241,7 @@ void ScriptTextEditor::_set_theme_for_script() {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- TextEdit *text_edit = code_editor->get_text_edit();
|
|
|
+ CodeEdit *text_edit = code_editor->get_text_editor();
|
|
|
text_edit->get_syntax_highlighter()->update_cache();
|
|
|
|
|
|
/* add keywords for auto completion */
|
|
@@ -284,10 +292,10 @@ void ScriptTextEditor::_show_warnings_panel(bool p_show) {
|
|
|
|
|
|
void ScriptTextEditor::_warning_clicked(Variant p_line) {
|
|
|
if (p_line.get_type() == Variant::INT) {
|
|
|
- code_editor->get_text_edit()->cursor_set_line(p_line.operator int64_t());
|
|
|
+ code_editor->get_text_editor()->cursor_set_line(p_line.operator int64_t());
|
|
|
} else if (p_line.get_type() == Variant::DICTIONARY) {
|
|
|
Dictionary meta = p_line.operator Dictionary();
|
|
|
- code_editor->get_text_edit()->insert_at("# warning-ignore:" + meta["code"].operator String(), meta["line"].operator int64_t() - 1);
|
|
|
+ code_editor->get_text_editor()->insert_at("# warning-ignore:" + meta["code"].operator String(), meta["line"].operator int64_t() - 1);
|
|
|
_validate_script();
|
|
|
}
|
|
|
}
|
|
@@ -295,7 +303,7 @@ void ScriptTextEditor::_warning_clicked(Variant p_line) {
|
|
|
void ScriptTextEditor::reload_text() {
|
|
|
ERR_FAIL_COND(script.is_null());
|
|
|
|
|
|
- TextEdit *te = code_editor->get_text_edit();
|
|
|
+ CodeEdit *te = code_editor->get_text_editor();
|
|
|
int column = te->cursor_get_column();
|
|
|
int row = te->cursor_get_line();
|
|
|
int h = te->get_h_scroll();
|
|
@@ -313,20 +321,20 @@ void ScriptTextEditor::reload_text() {
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::add_callback(const String &p_function, PackedStringArray p_args) {
|
|
|
- String code = code_editor->get_text_edit()->get_text();
|
|
|
+ String code = code_editor->get_text_editor()->get_text();
|
|
|
int pos = script->get_language()->find_function(p_function, code);
|
|
|
if (pos == -1) {
|
|
|
//does not exist
|
|
|
- code_editor->get_text_edit()->deselect();
|
|
|
- pos = code_editor->get_text_edit()->get_line_count() + 2;
|
|
|
+ code_editor->get_text_editor()->deselect();
|
|
|
+ pos = code_editor->get_text_editor()->get_line_count() + 2;
|
|
|
String func = script->get_language()->make_function("", p_function, p_args);
|
|
|
//code=code+func;
|
|
|
- code_editor->get_text_edit()->cursor_set_line(pos + 1);
|
|
|
- code_editor->get_text_edit()->cursor_set_column(1000000); //none shall be that big
|
|
|
- code_editor->get_text_edit()->insert_text_at_cursor("\n\n" + func);
|
|
|
+ code_editor->get_text_editor()->cursor_set_line(pos + 1);
|
|
|
+ code_editor->get_text_editor()->cursor_set_column(1000000); //none shall be that big
|
|
|
+ code_editor->get_text_editor()->insert_text_at_cursor("\n\n" + func);
|
|
|
}
|
|
|
- code_editor->get_text_edit()->cursor_set_line(pos);
|
|
|
- code_editor->get_text_edit()->cursor_set_column(1);
|
|
|
+ code_editor->get_text_editor()->cursor_set_line(pos);
|
|
|
+ code_editor->get_text_editor()->cursor_set_column(1);
|
|
|
}
|
|
|
|
|
|
bool ScriptTextEditor::show_members_overview() {
|
|
@@ -334,12 +342,13 @@ bool ScriptTextEditor::show_members_overview() {
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::update_settings() {
|
|
|
+ code_editor->get_text_editor()->set_gutter_draw(connection_gutter, EditorSettings::get_singleton()->get("text_editor/appearance/show_info_gutter"));
|
|
|
code_editor->update_editor_settings();
|
|
|
}
|
|
|
|
|
|
bool ScriptTextEditor::is_unsaved() {
|
|
|
const bool unsaved =
|
|
|
- code_editor->get_text_edit()->get_version() != code_editor->get_text_edit()->get_saved_version() ||
|
|
|
+ code_editor->get_text_editor()->get_version() != code_editor->get_text_editor()->get_saved_version() ||
|
|
|
script->get_path().empty(); // In memory.
|
|
|
return unsaved;
|
|
|
}
|
|
@@ -385,7 +394,7 @@ void ScriptTextEditor::convert_indent_to_tabs() {
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::tag_saved_version() {
|
|
|
- code_editor->get_text_edit()->tag_saved_version();
|
|
|
+ code_editor->get_text_editor()->tag_saved_version();
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::goto_line(int p_line, bool p_with_error) {
|
|
@@ -409,7 +418,7 @@ void ScriptTextEditor::clear_executing_line() {
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::ensure_focus() {
|
|
|
- code_editor->get_text_edit()->grab_focus();
|
|
|
+ code_editor->get_text_editor()->grab_focus();
|
|
|
}
|
|
|
|
|
|
String ScriptTextEditor::get_name() {
|
|
@@ -443,7 +452,7 @@ Ref<Texture2D> ScriptTextEditor::get_theme_icon() {
|
|
|
void ScriptTextEditor::_validate_script() {
|
|
|
String errortxt;
|
|
|
int line = -1, col;
|
|
|
- TextEdit *te = code_editor->get_text_edit();
|
|
|
+ CodeEdit *te = code_editor->get_text_editor();
|
|
|
|
|
|
String text = te->get_text();
|
|
|
List<String> fnc;
|
|
@@ -540,16 +549,16 @@ void ScriptTextEditor::_validate_script() {
|
|
|
te->set_line_as_marked(i, line == i);
|
|
|
if (highlight_safe) {
|
|
|
if (safe_lines.has(i + 1)) {
|
|
|
- te->set_line_as_safe(i, true);
|
|
|
+ te->set_line_gutter_item_color(i, line_number_gutter, safe_line_number_color);
|
|
|
last_is_safe = true;
|
|
|
} else if (last_is_safe && (te->is_line_comment(i) || te->get_line(i).strip_edges().empty())) {
|
|
|
- te->set_line_as_safe(i, true);
|
|
|
+ te->set_line_gutter_item_color(i, line_number_gutter, safe_line_number_color);
|
|
|
} else {
|
|
|
- te->set_line_as_safe(i, false);
|
|
|
+ te->set_line_gutter_item_color(i, line_number_gutter, default_line_number_color);
|
|
|
last_is_safe = false;
|
|
|
}
|
|
|
} else {
|
|
|
- te->set_line_as_safe(i, false);
|
|
|
+ te->set_line_gutter_item_color(line, 1, default_line_number_color);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -566,7 +575,7 @@ void ScriptTextEditor::_update_bookmark_list() {
|
|
|
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_bookmark"), BOOKMARK_GOTO_NEXT);
|
|
|
bookmarks_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_bookmark"), BOOKMARK_GOTO_PREV);
|
|
|
|
|
|
- Array bookmark_list = code_editor->get_text_edit()->get_bookmarks_array();
|
|
|
+ Array bookmark_list = code_editor->get_text_editor()->get_bookmarked_lines();
|
|
|
if (bookmark_list.size() == 0) {
|
|
|
return;
|
|
|
}
|
|
@@ -576,7 +585,7 @@ void ScriptTextEditor::_update_bookmark_list() {
|
|
|
for (int i = 0; i < bookmark_list.size(); i++) {
|
|
|
// Strip edges to remove spaces or tabs.
|
|
|
// Also replace any tabs by spaces, since we can't print tabs in the menu.
|
|
|
- String line = code_editor->get_text_edit()->get_line(bookmark_list[i]).replace("\t", " ").strip_edges();
|
|
|
+ String line = code_editor->get_text_editor()->get_line(bookmark_list[i]).replace("\t", " ").strip_edges();
|
|
|
|
|
|
// Limit the size of the line if too big.
|
|
|
if (line.length() > 50) {
|
|
@@ -593,7 +602,7 @@ void ScriptTextEditor::_bookmark_item_pressed(int p_idx) {
|
|
|
_edit_option(bookmarks_menu->get_item_id(p_idx));
|
|
|
} else {
|
|
|
code_editor->goto_line(bookmarks_menu->get_item_metadata(p_idx));
|
|
|
- code_editor->get_text_edit()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
|
|
|
+ code_editor->get_text_editor()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -704,7 +713,7 @@ void ScriptTextEditor::_code_complete_script(const String &p_code, List<ScriptCo
|
|
|
String hint;
|
|
|
Error err = script->get_language()->complete_code(p_code, script->get_path(), base, r_options, r_force, hint);
|
|
|
if (err == OK) {
|
|
|
- code_editor->get_text_edit()->set_code_hint(hint);
|
|
|
+ code_editor->get_text_editor()->set_code_hint(hint);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -717,7 +726,7 @@ void ScriptTextEditor::_update_breakpoint_list() {
|
|
|
breakpoints_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_next_breakpoint"), DEBUG_GOTO_NEXT_BREAKPOINT);
|
|
|
breakpoints_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_previous_breakpoint"), DEBUG_GOTO_PREV_BREAKPOINT);
|
|
|
|
|
|
- Array breakpoint_list = code_editor->get_text_edit()->get_breakpoints_array();
|
|
|
+ Array breakpoint_list = code_editor->get_text_editor()->get_breakpointed_lines();
|
|
|
if (breakpoint_list.size() == 0) {
|
|
|
return;
|
|
|
}
|
|
@@ -727,7 +736,7 @@ void ScriptTextEditor::_update_breakpoint_list() {
|
|
|
for (int i = 0; i < breakpoint_list.size(); i++) {
|
|
|
// Strip edges to remove spaces or tabs.
|
|
|
// Also replace any tabs by spaces, since we can't print tabs in the menu.
|
|
|
- String line = code_editor->get_text_edit()->get_line(breakpoint_list[i]).replace("\t", " ").strip_edges();
|
|
|
+ String line = code_editor->get_text_editor()->get_line(breakpoint_list[i]).replace("\t", " ").strip_edges();
|
|
|
|
|
|
// Limit the size of the line if too big.
|
|
|
if (line.length() > 50) {
|
|
@@ -744,12 +753,12 @@ void ScriptTextEditor::_breakpoint_item_pressed(int p_idx) {
|
|
|
_edit_option(breakpoints_menu->get_item_id(p_idx));
|
|
|
} else {
|
|
|
code_editor->goto_line(breakpoints_menu->get_item_metadata(p_idx));
|
|
|
- code_editor->get_text_edit()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
|
|
|
+ code_editor->get_text_editor()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::_breakpoint_toggled(int p_row) {
|
|
|
- EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), p_row + 1, code_editor->get_text_edit()->is_line_set_as_breakpoint(p_row));
|
|
|
+ EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), p_row + 1, code_editor->get_text_editor()->is_line_breakpointed(p_row));
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_column) {
|
|
@@ -771,7 +780,7 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
|
|
|
EditorNode::get_singleton()->load_resource(p_symbol);
|
|
|
}
|
|
|
|
|
|
- } else if (script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK) {
|
|
|
+ } else if (script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK) {
|
|
|
_goto_line(p_row);
|
|
|
|
|
|
result.class_name = result.class_name.trim_prefix("_");
|
|
@@ -866,7 +875,7 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::_validate_symbol(const String &p_symbol) {
|
|
|
- TextEdit *text_edit = code_editor->get_text_edit();
|
|
|
+ CodeEdit *text_edit = code_editor->get_text_editor();
|
|
|
|
|
|
Node *base = get_tree()->get_edited_scene_root();
|
|
|
if (base) {
|
|
@@ -874,7 +883,7 @@ void ScriptTextEditor::_validate_symbol(const String &p_symbol) {
|
|
|
}
|
|
|
|
|
|
ScriptLanguage::LookupResult result;
|
|
|
- if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK || (ProjectSettings::get_singleton()->has_autoload(p_symbol) && ProjectSettings::get_singleton()->get_autoload(p_symbol).is_singleton)) {
|
|
|
+ if (ScriptServer::is_global_class(p_symbol) || p_symbol.is_resource_file() || script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_lookup_completion(), p_symbol, script->get_path(), base, result) == OK || (ProjectSettings::get_singleton()->has_autoload(p_symbol) && ProjectSettings::get_singleton()->get_autoload(p_symbol).is_singleton)) {
|
|
|
text_edit->set_highlighted_word(p_symbol);
|
|
|
} else if (p_symbol.is_rel_path()) {
|
|
|
String path = _get_absolute_path(p_symbol);
|
|
@@ -902,8 +911,15 @@ void ScriptTextEditor::update_toggle_scripts_button() {
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::_update_connected_methods() {
|
|
|
- TextEdit *text_edit = code_editor->get_text_edit();
|
|
|
- text_edit->clear_info_icons();
|
|
|
+ CodeEdit *text_edit = code_editor->get_text_editor();
|
|
|
+ for (int i = 0; i < text_edit->get_line_count(); i++) {
|
|
|
+ if (text_edit->get_line_gutter_metadata(i, connection_gutter) == "") {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ text_edit->set_line_gutter_metadata(i, connection_gutter, "");
|
|
|
+ text_edit->set_line_gutter_icon(i, connection_gutter, nullptr);
|
|
|
+ text_edit->set_line_gutter_clickable(i, connection_gutter, false);
|
|
|
+ }
|
|
|
missing_connections.clear();
|
|
|
|
|
|
if (!script_is_valid) {
|
|
@@ -943,8 +959,10 @@ void ScriptTextEditor::_update_connected_methods() {
|
|
|
for (int j = 0; j < functions.size(); j++) {
|
|
|
String name = functions[j].get_slice(":", 0);
|
|
|
if (name == connection.callable.get_method()) {
|
|
|
- line = functions[j].get_slice(":", 1).to_int();
|
|
|
- text_edit->set_line_info_icon(line - 1, get_parent_control()->get_theme_icon("Slot", "EditorIcons"), connection.callable.get_method());
|
|
|
+ line = functions[j].get_slice(":", 1).to_int() - 1;
|
|
|
+ text_edit->set_line_gutter_metadata(line, connection_gutter, connection.callable.get_method());
|
|
|
+ text_edit->set_line_gutter_icon(line, connection_gutter, get_parent_control()->get_theme_icon("Slot", "EditorIcons"));
|
|
|
+ text_edit->set_line_gutter_clickable(line, connection_gutter, true);
|
|
|
methods_found.insert(connection.callable.get_method());
|
|
|
break;
|
|
|
}
|
|
@@ -974,18 +992,41 @@ void ScriptTextEditor::_update_connected_methods() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ScriptTextEditor::_lookup_connections(int p_row, String p_method) {
|
|
|
+void ScriptTextEditor::_update_gutter_indexes() {
|
|
|
+ for (int i = 0; i < code_editor->get_text_editor()->get_gutter_count(); i++) {
|
|
|
+ if (code_editor->get_text_editor()->get_gutter_name(i) == "connection_gutter") {
|
|
|
+ connection_gutter = i;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (code_editor->get_text_editor()->get_gutter_name(i) == "line_numbers") {
|
|
|
+ line_number_gutter = i;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void ScriptTextEditor::_gutter_clicked(int p_line, int p_gutter) {
|
|
|
+ if (p_gutter != connection_gutter) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ String method = code_editor->get_text_editor()->get_line_gutter_metadata(p_line, p_gutter);
|
|
|
+ if (method == "") {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
Node *base = get_tree()->get_edited_scene_root();
|
|
|
if (!base) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
Vector<Node *> nodes = _find_all_node_for_script(base, base, script);
|
|
|
- connection_info_dialog->popup_connections(p_method, nodes);
|
|
|
+ connection_info_dialog->popup_connections(method, nodes);
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::_edit_option(int p_op) {
|
|
|
- TextEdit *tx = code_editor->get_text_edit();
|
|
|
+ CodeEdit *tx = code_editor->get_text_editor();
|
|
|
|
|
|
switch (p_op) {
|
|
|
case EDIT_UNDO: {
|
|
@@ -1109,7 +1150,7 @@ void ScriptTextEditor::_edit_option(int p_op) {
|
|
|
} break;
|
|
|
case EDIT_EVALUATE: {
|
|
|
Expression expression;
|
|
|
- Vector<String> lines = code_editor->get_text_edit()->get_selection_text().split("\n");
|
|
|
+ Vector<String> lines = code_editor->get_text_editor()->get_selection_text().split("\n");
|
|
|
PackedStringArray results;
|
|
|
|
|
|
for (int i = 0; i < lines.size(); i++) {
|
|
@@ -1128,9 +1169,9 @@ void ScriptTextEditor::_edit_option(int p_op) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- code_editor->get_text_edit()->begin_complex_operation(); //prevents creating a two-step undo
|
|
|
- code_editor->get_text_edit()->insert_text_at_cursor(String("\n").join(results));
|
|
|
- code_editor->get_text_edit()->end_complex_operation();
|
|
|
+ code_editor->get_text_editor()->begin_complex_operation(); //prevents creating a two-step undo
|
|
|
+ code_editor->get_text_editor()->insert_text_at_cursor(String("\n").join(results));
|
|
|
+ code_editor->get_text_editor()->end_complex_operation();
|
|
|
} break;
|
|
|
case SEARCH_FIND: {
|
|
|
code_editor->get_find_replace_bar()->popup_search();
|
|
@@ -1145,14 +1186,14 @@ void ScriptTextEditor::_edit_option(int p_op) {
|
|
|
code_editor->get_find_replace_bar()->popup_replace();
|
|
|
} break;
|
|
|
case SEARCH_IN_FILES: {
|
|
|
- String selected_text = code_editor->get_text_edit()->get_selection_text();
|
|
|
+ String selected_text = code_editor->get_text_editor()->get_selection_text();
|
|
|
|
|
|
// Yep, because it doesn't make sense to instance this dialog for every single script open...
|
|
|
// So this will be delegated to the ScriptEditor.
|
|
|
emit_signal("search_in_files_requested", selected_text);
|
|
|
} break;
|
|
|
case REPLACE_IN_FILES: {
|
|
|
- String selected_text = code_editor->get_text_edit()->get_selection_text();
|
|
|
+ String selected_text = code_editor->get_text_editor()->get_selection_text();
|
|
|
|
|
|
emit_signal("replace_in_files_requested", selected_text);
|
|
|
} break;
|
|
@@ -1177,24 +1218,22 @@ void ScriptTextEditor::_edit_option(int p_op) {
|
|
|
} break;
|
|
|
case DEBUG_TOGGLE_BREAKPOINT: {
|
|
|
int line = tx->cursor_get_line();
|
|
|
- bool dobreak = !tx->is_line_set_as_breakpoint(line);
|
|
|
+ bool dobreak = !tx->is_line_breakpointed(line);
|
|
|
tx->set_line_as_breakpoint(line, dobreak);
|
|
|
EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), line + 1, dobreak);
|
|
|
} break;
|
|
|
case DEBUG_REMOVE_ALL_BREAKPOINTS: {
|
|
|
- List<int> bpoints;
|
|
|
- tx->get_breakpoints(&bpoints);
|
|
|
+ Array bpoints = tx->get_breakpointed_lines();
|
|
|
|
|
|
- for (List<int>::Element *E = bpoints.front(); E; E = E->next()) {
|
|
|
- int line = E->get();
|
|
|
- bool dobreak = !tx->is_line_set_as_breakpoint(line);
|
|
|
+ for (int i = 0; i < bpoints.size(); i++) {
|
|
|
+ int line = bpoints[i];
|
|
|
+ bool dobreak = !tx->is_line_breakpointed(line);
|
|
|
tx->set_line_as_breakpoint(line, dobreak);
|
|
|
EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), line + 1, dobreak);
|
|
|
}
|
|
|
} break;
|
|
|
case DEBUG_GOTO_NEXT_BREAKPOINT: {
|
|
|
- List<int> bpoints;
|
|
|
- tx->get_breakpoints(&bpoints);
|
|
|
+ Array bpoints = tx->get_breakpointed_lines();
|
|
|
if (bpoints.size() <= 0) {
|
|
|
return;
|
|
|
}
|
|
@@ -1202,13 +1241,13 @@ void ScriptTextEditor::_edit_option(int p_op) {
|
|
|
int line = tx->cursor_get_line();
|
|
|
|
|
|
// wrap around
|
|
|
- if (line >= bpoints[bpoints.size() - 1]) {
|
|
|
+ if (line >= (int)bpoints[bpoints.size() - 1]) {
|
|
|
tx->unfold_line(bpoints[0]);
|
|
|
tx->cursor_set_line(bpoints[0]);
|
|
|
tx->center_viewport_to_cursor();
|
|
|
} else {
|
|
|
- for (List<int>::Element *E = bpoints.front(); E; E = E->next()) {
|
|
|
- int bline = E->get();
|
|
|
+ for (int i = 0; i < bpoints.size(); i++) {
|
|
|
+ int bline = bpoints[i];
|
|
|
if (bline > line) {
|
|
|
tx->unfold_line(bline);
|
|
|
tx->cursor_set_line(bline);
|
|
@@ -1220,21 +1259,20 @@ void ScriptTextEditor::_edit_option(int p_op) {
|
|
|
|
|
|
} break;
|
|
|
case DEBUG_GOTO_PREV_BREAKPOINT: {
|
|
|
- List<int> bpoints;
|
|
|
- tx->get_breakpoints(&bpoints);
|
|
|
+ Array bpoints = tx->get_breakpointed_lines();
|
|
|
if (bpoints.size() <= 0) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
int line = tx->cursor_get_line();
|
|
|
// wrap around
|
|
|
- if (line <= bpoints[0]) {
|
|
|
+ if (line <= (int)bpoints[0]) {
|
|
|
tx->unfold_line(bpoints[bpoints.size() - 1]);
|
|
|
tx->cursor_set_line(bpoints[bpoints.size() - 1]);
|
|
|
tx->center_viewport_to_cursor();
|
|
|
} else {
|
|
|
- for (List<int>::Element *E = bpoints.back(); E; E = E->prev()) {
|
|
|
- int bline = E->get();
|
|
|
+ for (int i = bpoints.size(); i >= 0; i--) {
|
|
|
+ int bline = bpoints[i];
|
|
|
if (bline < line) {
|
|
|
tx->unfold_line(bline);
|
|
|
tx->cursor_set_line(bline);
|
|
@@ -1303,7 +1341,7 @@ void ScriptTextEditor::set_syntax_highlighter(Ref<EditorSyntaxHighlighter> p_hig
|
|
|
el = el->next();
|
|
|
}
|
|
|
|
|
|
- TextEdit *te = code_editor->get_text_edit();
|
|
|
+ CodeEdit *te = code_editor->get_text_editor();
|
|
|
p_highlighter->_set_edited_resource(script);
|
|
|
te->set_syntax_highlighter(p_highlighter);
|
|
|
}
|
|
@@ -1312,6 +1350,16 @@ void ScriptTextEditor::_change_syntax_highlighter(int p_idx) {
|
|
|
set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]);
|
|
|
}
|
|
|
|
|
|
+void ScriptTextEditor::_notification(int p_what) {
|
|
|
+ switch (p_what) {
|
|
|
+ case NOTIFICATION_THEME_CHANGED: {
|
|
|
+ code_editor->get_text_editor()->set_gutter_width(connection_gutter, code_editor->get_text_editor()->get_row_height());
|
|
|
+ } break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void ScriptTextEditor::_bind_methods() {
|
|
|
ClassDB::bind_method("_update_connected_methods", &ScriptTextEditor::_update_connected_methods);
|
|
|
|
|
@@ -1331,7 +1379,7 @@ void ScriptTextEditor::clear_edit_menu() {
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::reload(bool p_soft) {
|
|
|
- TextEdit *te = code_editor->get_text_edit();
|
|
|
+ CodeEdit *te = code_editor->get_text_editor();
|
|
|
Ref<Script> scr = script;
|
|
|
if (scr.is_null()) {
|
|
|
return;
|
|
@@ -1342,12 +1390,12 @@ void ScriptTextEditor::reload(bool p_soft) {
|
|
|
scr->get_language()->reload_tool_script(scr, soft);
|
|
|
}
|
|
|
|
|
|
-void ScriptTextEditor::get_breakpoints(List<int> *p_breakpoints) {
|
|
|
- code_editor->get_text_edit()->get_breakpoints(p_breakpoints);
|
|
|
+Array ScriptTextEditor::get_breakpoints() {
|
|
|
+ return code_editor->get_text_editor()->get_breakpointed_lines();
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::set_tooltip_request_func(String p_method, Object *p_obj) {
|
|
|
- code_editor->get_text_edit()->set_tooltip_request_func(p_obj, p_method, this);
|
|
|
+ code_editor->get_text_editor()->set_tooltip_request_func(p_obj, p_method, this);
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::set_debugger_active(bool p_active) {
|
|
@@ -1393,7 +1441,7 @@ static Node *_find_script_node(Node *p_edited_scene, Node *p_current_node, const
|
|
|
void ScriptTextEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
|
|
|
Dictionary d = p_data;
|
|
|
|
|
|
- TextEdit *te = code_editor->get_text_edit();
|
|
|
+ CodeEdit *te = code_editor->get_text_editor();
|
|
|
int row, col;
|
|
|
te->_get_mouse_pos(p_point, row, col);
|
|
|
|
|
@@ -1466,7 +1514,7 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
|
|
|
Point2 local_pos;
|
|
|
bool create_menu = false;
|
|
|
|
|
|
- TextEdit *tx = code_editor->get_text_edit();
|
|
|
+ CodeEdit *tx = code_editor->get_text_editor();
|
|
|
if (mb.is_valid() && mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
|
|
|
local_pos = mb->get_global_position() - tx->get_global_position();
|
|
|
create_menu = true;
|
|
@@ -1519,7 +1567,7 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
|
|
|
base = _find_node_for_script(base, base, script);
|
|
|
}
|
|
|
ScriptLanguage::LookupResult result;
|
|
|
- if (script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), word_at_pos, script->get_path(), base, result) == OK) {
|
|
|
+ if (script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_lookup_completion(), word_at_pos, script->get_path(), base, result) == OK) {
|
|
|
open_docs = true;
|
|
|
}
|
|
|
}
|
|
@@ -1567,17 +1615,17 @@ void ScriptTextEditor::_color_changed(const Color &p_color) {
|
|
|
new_args = String("(" + rtos(p_color.r) + ", " + rtos(p_color.g) + ", " + rtos(p_color.b) + ", " + rtos(p_color.a) + ")");
|
|
|
}
|
|
|
|
|
|
- String line = code_editor->get_text_edit()->get_line(color_position.x);
|
|
|
+ String line = code_editor->get_text_editor()->get_line(color_position.x);
|
|
|
int color_args_pos = line.find(color_args, color_position.y);
|
|
|
String line_with_replaced_args = line;
|
|
|
line_with_replaced_args.erase(color_args_pos, color_args.length());
|
|
|
line_with_replaced_args = line_with_replaced_args.insert(color_args_pos, new_args);
|
|
|
|
|
|
color_args = new_args;
|
|
|
- code_editor->get_text_edit()->begin_complex_operation();
|
|
|
- code_editor->get_text_edit()->set_line(color_position.x, line_with_replaced_args);
|
|
|
- code_editor->get_text_edit()->end_complex_operation();
|
|
|
- code_editor->get_text_edit()->update();
|
|
|
+ code_editor->get_text_editor()->begin_complex_operation();
|
|
|
+ code_editor->get_text_editor()->set_line(color_position.x, line_with_replaced_args);
|
|
|
+ code_editor->get_text_editor()->end_complex_operation();
|
|
|
+ code_editor->get_text_editor()->update();
|
|
|
}
|
|
|
|
|
|
void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition, Vector2 p_pos) {
|
|
@@ -1636,12 +1684,15 @@ void ScriptTextEditor::_enable_code_editor() {
|
|
|
code_editor->connect("show_warnings_panel", callable_mp(this, &ScriptTextEditor::_show_warnings_panel));
|
|
|
code_editor->connect("validate_script", callable_mp(this, &ScriptTextEditor::_validate_script));
|
|
|
code_editor->connect("load_theme_settings", callable_mp(this, &ScriptTextEditor::_load_theme_settings));
|
|
|
- code_editor->get_text_edit()->connect("breakpoint_toggled", callable_mp(this, &ScriptTextEditor::_breakpoint_toggled));
|
|
|
- code_editor->get_text_edit()->connect("symbol_lookup", callable_mp(this, &ScriptTextEditor::_lookup_symbol));
|
|
|
- code_editor->get_text_edit()->connect("symbol_validate", callable_mp(this, &ScriptTextEditor::_validate_symbol));
|
|
|
- code_editor->get_text_edit()->connect("info_clicked", callable_mp(this, &ScriptTextEditor::_lookup_connections));
|
|
|
- code_editor->get_text_edit()->connect("gui_input", callable_mp(this, &ScriptTextEditor::_text_edit_gui_input));
|
|
|
+ code_editor->get_text_editor()->connect("breakpoint_toggled", callable_mp(this, &ScriptTextEditor::_breakpoint_toggled));
|
|
|
+ code_editor->get_text_editor()->connect("symbol_lookup", callable_mp(this, &ScriptTextEditor::_lookup_symbol));
|
|
|
+ code_editor->get_text_editor()->connect("symbol_validate", callable_mp(this, &ScriptTextEditor::_validate_symbol));
|
|
|
+ code_editor->get_text_editor()->connect("gutter_added", callable_mp(this, &ScriptTextEditor::_update_gutter_indexes));
|
|
|
+ code_editor->get_text_editor()->connect("gutter_removed", callable_mp(this, &ScriptTextEditor::_update_gutter_indexes));
|
|
|
+ code_editor->get_text_editor()->connect("gutter_clicked", callable_mp(this, &ScriptTextEditor::_gutter_clicked));
|
|
|
+ code_editor->get_text_editor()->connect("gui_input", callable_mp(this, &ScriptTextEditor::_text_edit_gui_input));
|
|
|
code_editor->show_toggle_scripts_button();
|
|
|
+ _update_gutter_indexes();
|
|
|
|
|
|
editor_box->add_child(warnings_panel);
|
|
|
warnings_panel->add_theme_font_override(
|
|
@@ -1758,6 +1809,16 @@ ScriptTextEditor::ScriptTextEditor() {
|
|
|
code_editor->set_code_complete_func(_code_complete_scripts, this);
|
|
|
code_editor->set_v_size_flags(SIZE_EXPAND_FILL);
|
|
|
|
|
|
+ code_editor->get_text_editor()->set_draw_breakpoints_gutter(true);
|
|
|
+ code_editor->get_text_editor()->set_draw_executing_lines_gutter(true);
|
|
|
+
|
|
|
+ connection_gutter = 1;
|
|
|
+ code_editor->get_text_editor()->add_gutter(connection_gutter);
|
|
|
+ code_editor->get_text_editor()->set_gutter_name(connection_gutter, "connection_gutter");
|
|
|
+ code_editor->get_text_editor()->set_gutter_draw(connection_gutter, false);
|
|
|
+ code_editor->get_text_editor()->set_gutter_overwritable(connection_gutter, true);
|
|
|
+ code_editor->get_text_editor()->set_gutter_type(connection_gutter, TextEdit::GUTTER_TPYE_ICON);
|
|
|
+
|
|
|
warnings_panel = memnew(RichTextLabel);
|
|
|
warnings_panel->set_custom_minimum_size(Size2(0, 100 * EDSCALE));
|
|
|
warnings_panel->set_h_size_flags(SIZE_EXPAND_FILL);
|
|
@@ -1768,12 +1829,12 @@ ScriptTextEditor::ScriptTextEditor() {
|
|
|
|
|
|
update_settings();
|
|
|
|
|
|
- code_editor->get_text_edit()->set_callhint_settings(
|
|
|
+ code_editor->get_text_editor()->set_callhint_settings(
|
|
|
EditorSettings::get_singleton()->get("text_editor/completion/put_callhint_tooltip_below_current_line"),
|
|
|
EditorSettings::get_singleton()->get("text_editor/completion/callhint_tooltip_offset"));
|
|
|
|
|
|
- code_editor->get_text_edit()->set_select_identifiers_on_hover(true);
|
|
|
- code_editor->get_text_edit()->set_context_menu_enabled(false);
|
|
|
+ code_editor->get_text_editor()->set_select_identifiers_on_hover(true);
|
|
|
+ code_editor->get_text_editor()->set_context_menu_enabled(false);
|
|
|
|
|
|
context_menu = memnew(PopupMenu);
|
|
|
|
|
@@ -1816,7 +1877,7 @@ ScriptTextEditor::ScriptTextEditor() {
|
|
|
|
|
|
connection_info_dialog = memnew(ConnectionInfoDialog);
|
|
|
|
|
|
- code_editor->get_text_edit()->set_drag_forwarding(this);
|
|
|
+ code_editor->get_text_editor()->set_drag_forwarding(this);
|
|
|
}
|
|
|
|
|
|
ScriptTextEditor::~ScriptTextEditor() {
|