Restore script editor state between sessions
This commit is contained in:
parent
b7cf4c2050
commit
6ea253aa77
@ -1180,17 +1180,57 @@ Variant CodeTextEditor::get_edit_state() {
|
|||||||
Dictionary state;
|
Dictionary state;
|
||||||
|
|
||||||
state["scroll_position"] = text_editor->get_v_scroll();
|
state["scroll_position"] = text_editor->get_v_scroll();
|
||||||
|
state["h_scroll_position"] = text_editor->get_h_scroll();
|
||||||
state["column"] = text_editor->cursor_get_column();
|
state["column"] = text_editor->cursor_get_column();
|
||||||
state["row"] = text_editor->cursor_get_line();
|
state["row"] = text_editor->cursor_get_line();
|
||||||
|
|
||||||
|
state["selection"] = get_text_edit()->is_selection_active();
|
||||||
|
if (get_text_edit()->is_selection_active()) {
|
||||||
|
state["selection_from_line"] = text_editor->get_selection_from_line();
|
||||||
|
state["selection_from_column"] = text_editor->get_selection_from_column();
|
||||||
|
state["selection_to_line"] = text_editor->get_selection_to_line();
|
||||||
|
state["selection_to_column"] = text_editor->get_selection_to_column();
|
||||||
|
}
|
||||||
|
|
||||||
|
state["folded_lines"] = text_editor->get_folded_lines();
|
||||||
|
state["breakpoints"] = text_editor->get_breakpoints_array();
|
||||||
|
|
||||||
|
state["syntax_highlighter"] = TTR("Standard");
|
||||||
|
SyntaxHighlighter *syntax_highlighter = text_editor->_get_syntax_highlighting();
|
||||||
|
if (syntax_highlighter) {
|
||||||
|
state["syntax_highlighter"] = syntax_highlighter->get_name();
|
||||||
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeTextEditor::set_edit_state(const Variant &p_state) {
|
void CodeTextEditor::set_edit_state(const Variant &p_state) {
|
||||||
Dictionary state = p_state;
|
Dictionary state = p_state;
|
||||||
text_editor->cursor_set_column(state["column"]);
|
|
||||||
|
/* update the row first as it sets the column to 0 */
|
||||||
text_editor->cursor_set_line(state["row"]);
|
text_editor->cursor_set_line(state["row"]);
|
||||||
|
text_editor->cursor_set_column(state["column"]);
|
||||||
text_editor->set_v_scroll(state["scroll_position"]);
|
text_editor->set_v_scroll(state["scroll_position"]);
|
||||||
|
text_editor->set_h_scroll(state["h_scroll_position"]);
|
||||||
|
|
||||||
|
if (state.has("selection")) {
|
||||||
|
text_editor->select(state["selection_from_line"], state["selection_from_column"], state["selection_to_line"], state["selection_to_column"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.has("folded_lines")) {
|
||||||
|
Vector<int> folded_lines = state["folded_lines"];
|
||||||
|
for (int i = 0; i < folded_lines.size(); i++) {
|
||||||
|
text_editor->fold_line(folded_lines[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.has("breakpoints")) {
|
||||||
|
Array breakpoints = state["breakpoints"];
|
||||||
|
for (int i = 0; i < breakpoints.size(); i++) {
|
||||||
|
text_editor->set_line_as_breakpoint(breakpoints[i], true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
text_editor->grab_focus();
|
text_editor->grab_focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2521,6 +2521,7 @@ int EditorNode::_next_unsaved_scene(bool p_valid_filename, int p_start) {
|
|||||||
void EditorNode::_exit_editor() {
|
void EditorNode::_exit_editor() {
|
||||||
exiting = true;
|
exiting = true;
|
||||||
resource_preview->stop(); //stop early to avoid crashes
|
resource_preview->stop(); //stop early to avoid crashes
|
||||||
|
_save_docks();
|
||||||
get_tree()->quit();
|
get_tree()->quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2482,22 +2482,33 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
|
|||||||
for (int i = 0; i < scripts.size(); i++) {
|
for (int i = 0; i < scripts.size(); i++) {
|
||||||
|
|
||||||
String path = scripts[i];
|
String path = scripts[i];
|
||||||
|
|
||||||
|
Dictionary script_info = scripts[i];
|
||||||
|
if (!script_info.empty()) {
|
||||||
|
path = script_info["path"];
|
||||||
|
}
|
||||||
|
|
||||||
if (!FileAccess::exists(path))
|
if (!FileAccess::exists(path))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (extensions.find(path.get_extension())) {
|
if (extensions.find(path.get_extension())) {
|
||||||
Ref<Script> scr = ResourceLoader::load(path);
|
Ref<Script> scr = ResourceLoader::load(path);
|
||||||
if (scr.is_valid()) {
|
if (!scr.is_valid()) {
|
||||||
edit(scr);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
edit(scr);
|
||||||
|
} else {
|
||||||
|
Error error;
|
||||||
|
Ref<TextFile> text_file = _load_text_file(path, &error);
|
||||||
|
if (error != OK || !text_file.is_valid()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
edit(text_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
Error error;
|
if (!script_info.empty()) {
|
||||||
Ref<TextFile> text_file = _load_text_file(path, &error);
|
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_child(i));
|
||||||
if (error == OK && text_file.is_valid()) {
|
se->set_edit_state(script_info["state"]);
|
||||||
edit(text_file);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2537,7 +2548,11 @@ void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) {
|
|||||||
if (!path.is_resource_file())
|
if (!path.is_resource_file())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
scripts.push_back(path);
|
Dictionary script_info;
|
||||||
|
script_info["path"] = path;
|
||||||
|
script_info["state"] = se->get_edit_state();
|
||||||
|
|
||||||
|
scripts.push_back(script_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i));
|
EditorHelp *eh = Object::cast_to<EditorHelp>(tab_container->get_child(i));
|
||||||
|
@ -318,7 +318,6 @@ void ScriptTextEditor::_notification(int p_what) {
|
|||||||
switch (p_what) {
|
switch (p_what) {
|
||||||
case NOTIFICATION_READY:
|
case NOTIFICATION_READY:
|
||||||
_load_theme_settings();
|
_load_theme_settings();
|
||||||
_change_syntax_highlighter(EditorSettings::get_singleton()->get_project_metadata("script_text_editor", "syntax_highlighter", 0));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -363,6 +362,14 @@ Variant ScriptTextEditor::get_edit_state() {
|
|||||||
void ScriptTextEditor::set_edit_state(const Variant &p_state) {
|
void ScriptTextEditor::set_edit_state(const Variant &p_state) {
|
||||||
|
|
||||||
code_editor->set_edit_state(p_state);
|
code_editor->set_edit_state(p_state);
|
||||||
|
|
||||||
|
Dictionary state = p_state;
|
||||||
|
if (state.has("syntax_highlighter")) {
|
||||||
|
int idx = highlighter_menu->get_item_idx_from_text(state["syntax_highlighter"]);
|
||||||
|
if (idx >= 0) {
|
||||||
|
_change_syntax_highlighter(idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptTextEditor::_convert_case(CodeTextEditor::CaseStyle p_case) {
|
void ScriptTextEditor::_convert_case(CodeTextEditor::CaseStyle p_case) {
|
||||||
@ -1024,7 +1031,6 @@ void ScriptTextEditor::_change_syntax_highlighter(int p_idx) {
|
|||||||
}
|
}
|
||||||
// highlighter_menu->set_item_checked(p_idx, true);
|
// highlighter_menu->set_item_checked(p_idx, true);
|
||||||
set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]);
|
set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]);
|
||||||
EditorSettings::get_singleton()->set_project_metadata("script_text_editor", "syntax_highlighter", p_idx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptTextEditor::_bind_methods() {
|
void ScriptTextEditor::_bind_methods() {
|
||||||
|
@ -66,7 +66,6 @@ void TextEditor::_change_syntax_highlighter(int p_idx) {
|
|||||||
el = el->next();
|
el = el->next();
|
||||||
}
|
}
|
||||||
set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]);
|
set_syntax_highlighter(highlighters[highlighter_menu->get_item_text(p_idx)]);
|
||||||
EditorSettings::get_singleton()->set_project_metadata("text_editor", "syntax_highlighter", p_idx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextEditor::_load_theme_settings() {
|
void TextEditor::_load_theme_settings() {
|
||||||
@ -234,6 +233,14 @@ Variant TextEditor::get_edit_state() {
|
|||||||
void TextEditor::set_edit_state(const Variant &p_state) {
|
void TextEditor::set_edit_state(const Variant &p_state) {
|
||||||
|
|
||||||
code_editor->set_edit_state(p_state);
|
code_editor->set_edit_state(p_state);
|
||||||
|
|
||||||
|
Dictionary state = p_state;
|
||||||
|
if (state.has("syntax_highlighter")) {
|
||||||
|
int idx = highlighter_menu->get_item_idx_from_text(state["syntax_highlighter"]);
|
||||||
|
if (idx >= 0) {
|
||||||
|
_change_syntax_highlighter(idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextEditor::trim_trailing_whitespace() {
|
void TextEditor::trim_trailing_whitespace() {
|
||||||
@ -299,7 +306,6 @@ void TextEditor::_notification(int p_what) {
|
|||||||
switch (p_what) {
|
switch (p_what) {
|
||||||
case NOTIFICATION_READY:
|
case NOTIFICATION_READY:
|
||||||
_load_theme_settings();
|
_load_theme_settings();
|
||||||
_change_syntax_highlighter(EditorSettings::get_singleton()->get_project_metadata("text_editor", "syntax_highlighter", 0));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5189,6 +5189,17 @@ bool TextEdit::is_folded(int p_line) const {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector<int> TextEdit::get_folded_lines() const {
|
||||||
|
Vector<int> folded_lines;
|
||||||
|
|
||||||
|
for (int i = 0; i < text.size(); i++) {
|
||||||
|
if (is_folded(i)) {
|
||||||
|
folded_lines.push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return folded_lines;
|
||||||
|
}
|
||||||
|
|
||||||
void TextEdit::fold_line(int p_line) {
|
void TextEdit::fold_line(int p_line) {
|
||||||
|
|
||||||
ERR_FAIL_INDEX(p_line, text.size());
|
ERR_FAIL_INDEX(p_line, text.size());
|
||||||
|
@ -490,6 +490,7 @@ public:
|
|||||||
|
|
||||||
bool can_fold(int p_line) const;
|
bool can_fold(int p_line) const;
|
||||||
bool is_folded(int p_line) const;
|
bool is_folded(int p_line) const;
|
||||||
|
Vector<int> get_folded_lines() const;
|
||||||
void fold_line(int p_line);
|
void fold_line(int p_line);
|
||||||
void unfold_line(int p_line);
|
void unfold_line(int p_line);
|
||||||
void toggle_fold_line(int p_line);
|
void toggle_fold_line(int p_line);
|
||||||
|
Loading…
Reference in New Issue
Block a user