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:
parent
30edd198ec
commit
a8f0e4d56e
Notes:
sideshowbarker
2024-07-19 06:04:07 +09:00
Author: https://github.com/awesomekling
Commit: a8f0e4d56e
2 changed files with 42 additions and 0 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue