Ver código fonte

GTableView: Only paint the currently visible table rows

This makes painting way faster for models with large amounts of data.
Andreas Kling 5 anos atrás
pai
commit
229dbd0ab2
1 arquivos alterados com 11 adições e 2 exclusões
  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());
     painter.translate(-horizontal_scrollbar().value(), -vertical_scrollbar().value());
 
 
     int exposed_width = max(content_size().width(), width());
     int exposed_width = max(content_size().width(), width());
-    int painted_item_index = 0;
     int y_offset = header_height();
     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);
         bool is_selected_row = selection().contains_row(row_index);
         int y = y_offset + painted_item_index * item_height();
         int y = y_offset + painted_item_index * item_height();