1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-10 10:01:13 +09:00

LibGUI: Defer line reflow during text insertion

Add a deferral counter and defer reflowing the visual lines until the
counter is at zero. Use this to defer reflow when inserting text.

This fixes glacial slowdown while paste large amounts of text.
This commit is contained in:
Andreas Kling 2020-05-27 19:18:40 +02:00
parent 30edd198ec
commit a8f0e4d56e
Notes: sideshowbarker 2024-07-19 06:04:07 +09:00
2 changed files with 42 additions and 0 deletions

View file

@ -1197,6 +1197,7 @@ void TextEditor::delete_selection()
void TextEditor::insert_at_cursor_or_replace_selection(const StringView& text)
{
ReflowDeferrer defer(*this);
ASSERT(!is_readonly());
if (has_selection())
delete_selection();
@ -1224,6 +1225,7 @@ void TextEditor::paste()
{
if (is_readonly())
return;
auto paste_text = Clipboard::the().data();
printf("Paste: \"%s\"\n", paste_text.characters());
@ -1231,6 +1233,20 @@ void TextEditor::paste()
insert_at_cursor_or_replace_selection(paste_text);
}
void TextEditor::defer_reflow()
{
++m_reflow_deferred;
}
void TextEditor::undefer_reflow()
{
ASSERT(m_reflow_deferred);
if (!--m_reflow_deferred) {
if (m_reflow_requested)
recompute_all_visual_lines();
}
}
void TextEditor::enter_event(Core::Event&)
{
ASSERT(window());
@ -1359,6 +1375,11 @@ void TextEditor::clear_selection()
void TextEditor::recompute_all_visual_lines()
{
if (m_reflow_deferred) {
m_reflow_requested = true;
return;
}
int y_offset = 0;
for (size_t line_index = 0; line_index < line_count(); ++line_index) {
recompute_visual_lines(line_index);