Преглед на файлове

GTableView: Only paint the currently visible table rows

This makes painting way faster for models with large amounts of data.
Andreas Kling преди 5 години
родител
ревизия
229dbd0ab2
променени са 1 файла, в които са добавени 11 реда и са изтрити 2 реда
  1. 11 2
      Libraries/LibGUI/GTableView.cpp

+ 11 - 2
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();