Fixed all the crashes (and potential crashed) in the editor's text editor module I could find. Also fixed some smaller usability issues.

This commit is contained in:
Relintai 2024-01-12 13:41:19 +01:00
parent 810711bc89
commit caa3c095cd
2 changed files with 57 additions and 40 deletions

View File

@ -42,9 +42,10 @@ void TextEditorSettings::store_opened_files(ItemList *filecontainer) {
for (int child = 0; child < filecontainer->get_item_count(); ++child) { for (int child = 0; child < filecontainer->get_item_count(); ++child) {
Array metaarr = filecontainer->get_item_metadata(child); Array metaarr = filecontainer->get_item_metadata(child);
Variant e = metaarr[0]; ObjectID editor = metaarr[0];
Control *c = e; TextEditorVanillaEditor *ed = Object::cast_to<TextEditorVanillaEditor>(ObjectDB::get_instance(editor));
TextEditorVanillaEditor *ed = Object::cast_to<TextEditorVanillaEditor>(c);
ERR_CONTINUE(!ed);
String filepath = ed->get_current_path(); String filepath = ed->get_current_path();
Array a = Array(); Array a = Array();
@ -58,9 +59,10 @@ void TextEditorSettings::store_opened_files(ItemList *filecontainer) {
void TextEditorSettings::remove_opened_file(const int index, ItemList *filecontainer) { void TextEditorSettings::remove_opened_file(const int index, ItemList *filecontainer) {
Array metaarr = filecontainer->get_item_metadata(index); Array metaarr = filecontainer->get_item_metadata(index);
Variant e = metaarr[0]; ObjectID editor = metaarr[0];
Control *c = e; TextEditorVanillaEditor *ed = Object::cast_to<TextEditorVanillaEditor>(ObjectDB::get_instance(editor));
TextEditorVanillaEditor *ed = Object::cast_to<TextEditorVanillaEditor>(c);
ERR_FAIL_COND(!ed);
String filepath = ed->get_current_path(); String filepath = ed->get_current_path();
String f = filepath.get_file(); String f = filepath.get_file();

View File

@ -190,12 +190,15 @@ void TextFileEditor::_on_font_selected(const String &font_path) {
} }
void TextFileEditor::_on_fileitem_pressed(const int index) { void TextFileEditor::_on_fileitem_pressed(const int index) {
ERR_FAIL_INDEX(index, _open_file_list->get_item_count());
current_file_index = index; current_file_index = index;
Array selected_item_metadata = _open_file_list->get_item_metadata(current_file_index); Array selected_item_metadata = _open_file_list->get_item_metadata(current_file_index);
// TODO Make this store ObjectIDs ObjectID editor = selected_item_metadata[0];
Control *c = selected_item_metadata[0]; TextEditorVanillaEditor *e = Object::cast_to<TextEditorVanillaEditor>(ObjectDB::get_instance(editor));
TextEditorVanillaEditor *e = Object::cast_to<TextEditorVanillaEditor>(c);
ERR_FAIL_COND(!e);
String extension = e->get_current_path().get_file().get_extension(); String extension = e->get_current_path().get_file().get_extension();
@ -229,46 +232,46 @@ void TextFileEditor::_on_fileitem_pressed(const int index) {
} }
void TextFileEditor::open_file(const String &path, const String &font) { void TextFileEditor::open_file(const String &path, const String &font) {
if (current_file_path != path) { for (int i = 0; i < _open_file_list->get_item_count(); ++i) {
for (int i = 0; i < _open_file_list->get_item_count(); ++i) { Array selected_item_metadata = _open_file_list->get_item_metadata(i);
Array selected_item_metadata = _open_file_list->get_item_metadata(i);
Control *c = selected_item_metadata[0]; ObjectID editor = selected_item_metadata[0];
TextEditorVanillaEditor *e = Object::cast_to<TextEditorVanillaEditor>(c); TextEditorVanillaEditor *e = Object::cast_to<TextEditorVanillaEditor>(ObjectDB::get_instance(editor));
if (e) { if (e) {
if (e->get_current_path() == path) { if (e->get_current_path() == path) {
_open_file_list->select(i); _open_file_list->select(i);
_on_fileitem_pressed(i); _on_fileitem_pressed(i);
return; return;
}
} }
} }
current_file_path = path;
TextEditorVanillaEditor *vanilla_editor = open_in_vanillaeditor(path);
Ref<Font> edf = vanilla_editor->get("custom_fonts/font");
//TODO this logic seems wrong
if (font != "null" && edf.is_valid()) {
vanilla_editor->set_font(font);
}
generate_file_item(path, vanilla_editor);
last_opened_files->store_opened_files(_open_file_list);
} }
current_file_path = path;
TextEditorVanillaEditor *vanilla_editor = open_in_vanillaeditor(path);
Ref<Font> edf = vanilla_editor->get("custom_fonts/font");
//TODO this logic seems wrong
if (font != "null" && edf.is_valid()) {
vanilla_editor->set_font(font);
}
generate_file_item(path, vanilla_editor);
last_opened_files->store_opened_files(_open_file_list);
current_editor->show(); current_editor->show();
} }
void TextFileEditor::generate_file_item(const String &path, Control *veditor) { void TextFileEditor::generate_file_item(const String &path, Control *veditor) {
ERR_FAIL_COND(!veditor);
open_file_name->set_text(path); open_file_name->set_text(path);
_open_file_list->add_item(path.get_file(), nullptr, true); _open_file_list->add_item(path.get_file(), nullptr, true);
current_file_index = _open_file_list->get_item_count() - 1; current_file_index = _open_file_list->get_item_count() - 1;
Array arr; Array arr;
arr.push_back(veditor); arr.push_back(veditor->get_instance_id());
_open_file_list->set_item_metadata(current_file_index, arr); _open_file_list->set_item_metadata(current_file_index, arr);
_open_file_list->select(_open_file_list->get_item_count() - 1); _open_file_list->select(_open_file_list->get_item_count() - 1);
@ -319,15 +322,23 @@ void TextFileEditor::close_file(const int index) {
} }
void TextFileEditor::confirm_close(const int index) { void TextFileEditor::confirm_close(const int index) {
ERR_FAIL_INDEX(index, _open_file_list->get_item_count());
last_opened_files->remove_opened_file(index, _open_file_list); last_opened_files->remove_opened_file(index, _open_file_list);
_open_file_list->remove_item(index); _open_file_list->remove_item(index);
open_file_name->clear(); open_file_name->clear();
current_editor->queue_delete(); current_editor->queue_delete();
current_editor = NULL; current_editor = NULL;
current_file_path = "";
if (index > 0) { if (index > 0) {
_open_file_list->select(index - 1); _open_file_list->select(index - 1);
_on_fileitem_pressed(index - 1); _on_fileitem_pressed(index - 1);
} else {
if (_open_file_list->get_item_count() > 0) {
_open_file_list->select(0);
_on_fileitem_pressed(0);
}
} }
} }
@ -396,7 +407,7 @@ void TextFileEditor::save_file(const String &current_path) {
current_editor->update_lastmodified(last_modified, "save"); current_editor->update_lastmodified(last_modified, "save");
Array arr; Array arr;
arr.push_back(current_editor); arr.push_back(current_editor->get_instance_id());
_open_file_list->set_item_metadata(current_file_index, arr); _open_file_list->set_item_metadata(current_file_index, arr);
@ -409,18 +420,22 @@ void TextFileEditor::save_file(const String &current_path) {
} }
void TextFileEditor::clean_editor() { void TextFileEditor::clean_editor() {
List<Node *> nodes; for (int child = 0; child < _open_file_list->get_item_count(); ++child) {
Array metaarr = _open_file_list->get_item_metadata(child);
ObjectID editor = metaarr[0];
TextEditorVanillaEditor *ed = Object::cast_to<TextEditorVanillaEditor>(ObjectDB::get_instance(editor));
get_tree()->get_nodes_in_group("vanilla_editor", &nodes); if (ed) {
ed->queue_delete();
for (List<Node *>::Element *e = nodes.front(); e; e = e->next()) { }
e->get()->queue_delete();
} }
current_editor = NULL; current_editor = NULL;
current_file_path = "";
open_file_name->clear(); open_file_name->clear();
_open_file_list->clear(); _open_file_list->clear();
last_opened_files->store_opened_files(_open_file_list);
} }
void TextFileEditor::csv_preview() { void TextFileEditor::csv_preview() {