1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 12:55:09 +00:00

LibGUI: Don't recompute line-wrapping over and over during set_text()

This makes the TextEditor start up fast for large files again.
This commit is contained in:
Andreas Kling 2019-11-23 17:41:14 +01:00
parent 9a157b5e81
commit fc14bdd442
4 changed files with 36 additions and 16 deletions

View file

@ -11,6 +11,7 @@ GTextDocument::GTextDocument(Client* client)
void GTextDocument::set_text(const StringView& text) void GTextDocument::set_text(const StringView& text)
{ {
m_client_notifications_enabled = false;
m_spans.clear(); m_spans.clear();
remove_all_lines(); remove_all_lines();
@ -30,6 +31,10 @@ void GTextDocument::set_text(const StringView& text)
add_line(i); add_line(i);
} }
add_line(i); add_line(i);
m_client_notifications_enabled = true;
for (auto* client : m_clients)
client->document_did_set_text();
} }
int GTextDocumentLine::first_non_whitespace_column() const int GTextDocumentLine::first_non_whitespace_column() const
@ -122,29 +127,37 @@ void GTextDocumentLine::truncate(GTextDocument& document, int length)
void GTextDocument::append_line(NonnullOwnPtr<GTextDocumentLine> line) void GTextDocument::append_line(NonnullOwnPtr<GTextDocumentLine> line)
{ {
lines().append(move(line)); lines().append(move(line));
for (auto* client : m_clients) if (m_client_notifications_enabled) {
client->document_did_append_line(); for (auto* client : m_clients)
client->document_did_append_line();
}
} }
void GTextDocument::insert_line(int line_index, NonnullOwnPtr<GTextDocumentLine> line) void GTextDocument::insert_line(int line_index, NonnullOwnPtr<GTextDocumentLine> line)
{ {
lines().insert(line_index, move(line)); lines().insert(line_index, move(line));
for (auto* client : m_clients) if (m_client_notifications_enabled) {
client->document_did_insert_line(line_index); for (auto* client : m_clients)
client->document_did_insert_line(line_index);
}
} }
void GTextDocument::remove_line(int line_index) void GTextDocument::remove_line(int line_index)
{ {
lines().remove(line_index); lines().remove(line_index);
for (auto* client : m_clients) if (m_client_notifications_enabled) {
client->document_did_remove_line(line_index); for (auto* client : m_clients)
client->document_did_remove_line(line_index);
}
} }
void GTextDocument::remove_all_lines() void GTextDocument::remove_all_lines()
{ {
lines().clear(); lines().clear();
for (auto* client : m_clients) if (m_client_notifications_enabled) {
client->document_did_remove_all_lines(); for (auto* client : m_clients)
client->document_did_remove_all_lines();
}
} }
GTextDocument::Client::~Client() GTextDocument::Client::~Client()
@ -163,8 +176,10 @@ void GTextDocument::unregister_client(Client& client)
void GTextDocument::update_views(Badge<GTextDocumentLine>) void GTextDocument::update_views(Badge<GTextDocumentLine>)
{ {
for (auto* client : m_clients) if (m_client_notifications_enabled) {
client->document_did_change(); for (auto* client : m_clients)
client->document_did_change();
}
} }
String GTextDocument::text_in_range(const GTextRange& a_range) const String GTextDocument::text_in_range(const GTextRange& a_range) const
@ -326,9 +341,3 @@ Optional<GTextDocumentSpan> GTextDocument::first_non_skippable_span_after(const
} }
return {}; return {};
} }

View file

@ -36,6 +36,7 @@ public:
virtual void document_did_remove_line(int) = 0; virtual void document_did_remove_line(int) = 0;
virtual void document_did_remove_all_lines() = 0; virtual void document_did_remove_all_lines() = 0;
virtual void document_did_change() = 0; virtual void document_did_change() = 0;
virtual void document_did_set_text() = 0;
}; };
static NonnullRefPtr<GTextDocument> create(Client* client = nullptr) static NonnullRefPtr<GTextDocument> create(Client* client = nullptr)
@ -90,6 +91,7 @@ private:
Vector<GTextDocumentSpan> m_spans; Vector<GTextDocumentSpan> m_spans;
HashTable<Client*> m_clients; HashTable<Client*> m_clients;
bool m_client_notifications_enabled { true };
}; };
class GTextDocumentLine { class GTextDocumentLine {

View file

@ -1613,6 +1613,14 @@ void GTextEditor::document_did_change()
update(); update();
} }
void GTextEditor::document_did_set_text()
{
m_line_visual_data.clear();
for (int i = 0; i < m_document->line_count(); ++i)
m_line_visual_data.append(make<LineVisualData>());
document_did_change();
}
void GTextEditor::set_document(GTextDocument& document) void GTextEditor::set_document(GTextDocument& document)
{ {
if (m_document.ptr() == &document) if (m_document.ptr() == &document)

View file

@ -133,6 +133,7 @@ private:
virtual void document_did_remove_line(int) override; virtual void document_did_remove_line(int) override;
virtual void document_did_remove_all_lines() override; virtual void document_did_remove_all_lines() override;
virtual void document_did_change() override; virtual void document_did_change() override;
virtual void document_did_set_text() override;
void create_actions(); void create_actions();
void paint_ruler(Painter&); void paint_ruler(Painter&);