diff options
Diffstat (limited to 'scene/gui')
-rw-r--r-- | scene/gui/text_edit.cpp | 81 |
1 files changed, 38 insertions, 43 deletions
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 8c928513f3..7fbd412de8 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -3851,8 +3851,14 @@ void TextEdit::undo() { } } - cursor_set_line(undo_stack_pos->get().from_line); - cursor_set_column(undo_stack_pos->get().from_column); + if (undo_stack_pos->get().type == TextOperation::TYPE_REMOVE) { + cursor_set_line(undo_stack_pos->get().to_line); + cursor_set_column(undo_stack_pos->get().to_column); + _cancel_code_hint(); + } else { + cursor_set_line(undo_stack_pos->get().from_line); + cursor_set_column(undo_stack_pos->get().from_column); + } update(); } @@ -3995,28 +4001,19 @@ void TextEdit::set_completion(bool p_enabled,const Vector<String>& p_prefixes) { void TextEdit::_confirm_completion() { - String remaining=completion_current.substr(completion_base.length(),completion_current.length()-completion_base.length()); - String l = text[cursor.line]; - bool same=true; - //if what is going to be inserted is the same as what it is, don't change it - for(int i=0;i<remaining.length();i++) { - int c=i+cursor.column; - if (c>=l.length() || l[c]!=remaining[i]) { - same=false; - break; - } - } + begin_complex_operation(); - if (same) - cursor_set_column(cursor.column+remaining.length()); - else { - insert_text_at_cursor(remaining); - if (remaining.ends_with("(") && auto_brace_completion_enabled) { - insert_text_at_cursor(")"); - cursor.column--; - } + _remove_text(cursor.line, cursor.column - completion_base.length(), cursor.line, cursor.column); + cursor_set_column(cursor.column - completion_base.length(), false); + insert_text_at_cursor(completion_current); + + if (completion_current.ends_with("(") && auto_brace_completion_enabled) { + insert_text_at_cursor(")"); + cursor.column--; } + end_complex_operation(); + _cancel_completion(); } @@ -4119,30 +4116,29 @@ void TextEdit::_update_completion_candidates() { completion_index=0; completion_base=s; int ci_match=0; + Vector<float> sim_cache; for(int i=0;i<completion_strings.size();i++) { - if (completion_strings[i].begins_with(s)) { + if (s.is_subsequence_ofi(completion_strings[i])) { // don't remove duplicates if no input is provided - if (completion_options.find(completion_strings[i]) != -1 && s != "") { + if (s != "" && completion_options.find(completion_strings[i]) != -1) { continue; } - completion_options.push_back(completion_strings[i]); - int m=0; - int max=MIN(completion_current.length(),completion_strings[i].length()); - if (max<ci_match) - continue; - for(int j=0;j<max;j++) { - - if (j>=completion_strings[i].length()) - break; - if (completion_current[j]!=completion_strings[i][j]) - break; - m++; - } - if (m>ci_match) { - ci_match=m; - completion_index=completion_options.size()-1; + // Calculate the similarity to keep completions in good order + float similarity = s.similarity(completion_strings[i]); + int comp_size = completion_options.size(); + if (comp_size == 0) { + completion_options.push_back(completion_strings[i]); + sim_cache.push_back(similarity); + } else { + float comp_sim; + int pos = 0; + do { + comp_sim = sim_cache[pos++]; + } while(pos < comp_size && similarity <= comp_sim); + pos--; // Pos will be off by one + completion_options.insert(pos, completion_strings[i]); + sim_cache.insert(pos, similarity); } - } } @@ -4155,7 +4151,8 @@ void TextEdit::_update_completion_candidates() { } - completion_current=completion_options[completion_index]; + // The top of the list is the best match + completion_current=completion_options[0]; #if 0 // even there's only one option, user still get the chance to choose using it or not if (completion_options.size()==1) { @@ -4167,8 +4164,6 @@ void TextEdit::_update_completion_candidates() { } #endif - if (completion_options.size()==1 && s==completion_options[0]) - _cancel_completion(); completion_enabled=true; } |