From 229dbd0ab219d8d681a5428b59a71848ffa7a60f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 18 Sep 2019 14:10:09 +0200 Subject: [PATCH] GTableView: Only paint the currently visible table rows This makes painting way faster for models with large amounts of data. --- Libraries/LibGUI/GTableView.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Libraries/LibGUI/GTableView.cpp b/Libraries/LibGUI/GTableView.cpp index 635df9d110..376cc8cc36 100644 --- a/Libraries/LibGUI/GTableView.cpp +++ b/Libraries/LibGUI/GTableView.cpp @@ -260,10 +260,19 @@ void GTableView::paint_event(GPaintEvent& event) painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value()); int exposed_width = max(content_size().width(), width()); - int painted_item_index = 0; int y_offset = header_height(); - for (int row_index = 0; row_index < model()->row_count(); ++row_index) { + int first_visible_row = index_at_event_position(frame_inner_rect().top_left()).row(); + int last_visible_row = index_at_event_position(frame_inner_rect().bottom_right()).row(); + + if (first_visible_row == -1) + first_visible_row = 0; + if (last_visible_row == -1) + last_visible_row = model()->row_count() - 1; + + int painted_item_index = first_visible_row; + + for (int row_index = first_visible_row; row_index <= last_visible_row; ++row_index) { bool is_selected_row = selection().contains_row(row_index); int y = y_offset + painted_item_index * item_height();