Procházet zdrojové kódy

TextEditor: Fix hang on "Replace All"

Davi před 3 roky
rodič
revize
0d459553fd
1 změnil soubory, kde provedl 4 přidání a 2 odebrání
  1. 4 2
      Userland/Applications/TextEditor/MainWidget.cpp

+ 4 - 2
Userland/Applications/TextEditor/MainWidget.cpp

@@ -157,16 +157,18 @@ MainWidget::MainWidget()
     m_replace_all_action = GUI::Action::create("Replace &All", { Mod_Ctrl, Key_F2 }, [&](auto&) {
         auto needle = m_find_textbox->text();
         auto substitute = m_replace_textbox->text();
+        auto length_delta = substitute.length() - needle.length();
         if (needle.is_empty())
             return;
         if (m_use_regex)
             m_editor->document().update_regex_matches(needle);
 
-        auto found_range = m_editor->document().find_next(needle, {}, GUI::TextDocument::SearchShouldWrap::Yes, m_use_regex, m_match_case);
+        auto found_range = m_editor->document().find_next(needle, {}, GUI::TextDocument::SearchShouldWrap::No, m_use_regex, m_match_case);
         while (found_range.is_valid()) {
             m_editor->set_selection(found_range);
             m_editor->insert_at_cursor_or_replace_selection(substitute);
-            found_range = m_editor->document().find_next(needle, {}, GUI::TextDocument::SearchShouldWrap::Yes, m_use_regex, m_match_case);
+            auto next_start = GUI::TextPosition(found_range.end().line(), found_range.end().column() + length_delta);
+            found_range = m_editor->document().find_next(needle, next_start, GUI::TextDocument::SearchShouldWrap::No, m_use_regex, m_match_case);
         }
     });