浏览代码

Spreadsheet: Only append new columns/rows every 50ms

Fixes #5550.
AnotherTest 4 年之前
父节点
当前提交
9f8d518e82

+ 18 - 6
Userland/Applications/Spreadsheet/SpreadsheetView.cpp

@@ -69,13 +69,25 @@ void InfinitelyScrollableTableView::did_scroll()
     TableView::did_scroll();
     TableView::did_scroll();
     auto& vscrollbar = vertical_scrollbar();
     auto& vscrollbar = vertical_scrollbar();
     auto& hscrollbar = horizontal_scrollbar();
     auto& hscrollbar = horizontal_scrollbar();
-    if (vscrollbar.is_visible() && vscrollbar.value() == vscrollbar.max()) {
-        if (on_reaching_vertical_end)
-            on_reaching_vertical_end();
+    if (!m_vertical_scroll_end_timer->is_active()) {
+        if (vscrollbar.is_visible() && vscrollbar.value() == vscrollbar.max()) {
+            m_vertical_scroll_end_timer->on_timeout = [&] {
+                if (on_reaching_vertical_end)
+                    on_reaching_vertical_end();
+                m_vertical_scroll_end_timer->stop();
+            };
+            m_vertical_scroll_end_timer->start(50);
+        }
     }
     }
-    if (hscrollbar.is_visible() && hscrollbar.value() == hscrollbar.max()) {
-        if (on_reaching_horizontal_end)
-            on_reaching_horizontal_end();
+    if (!m_horizontal_scroll_end_timer->is_active()) {
+        if (hscrollbar.is_visible() && hscrollbar.value() == hscrollbar.max()) {
+            m_horizontal_scroll_end_timer->on_timeout = [&] {
+                if (on_reaching_horizontal_end)
+                    on_reaching_horizontal_end();
+                m_horizontal_scroll_end_timer->stop();
+            };
+            m_horizontal_scroll_end_timer->start(50);
+        }
     }
     }
 }
 }
 
 

+ 7 - 0
Userland/Applications/Spreadsheet/SpreadsheetView.h

@@ -86,6 +86,11 @@ public:
     Function<void()> on_reaching_horizontal_end;
     Function<void()> on_reaching_horizontal_end;
 
 
 private:
 private:
+    InfinitelyScrollableTableView()
+        : m_horizontal_scroll_end_timer(Core::Timer::construct())
+        , m_vertical_scroll_end_timer(Core::Timer::construct())
+    {
+    }
     virtual void did_scroll() override;
     virtual void did_scroll() override;
     virtual void mousemove_event(GUI::MouseEvent&) override;
     virtual void mousemove_event(GUI::MouseEvent&) override;
     virtual void mouseup_event(GUI::MouseEvent&) override;
     virtual void mouseup_event(GUI::MouseEvent&) override;
@@ -93,6 +98,8 @@ private:
     bool m_should_intercept_drag { false };
     bool m_should_intercept_drag { false };
     bool m_has_committed_to_dragging { false };
     bool m_has_committed_to_dragging { false };
     GUI::ModelIndex m_starting_selection_index;
     GUI::ModelIndex m_starting_selection_index;
+    RefPtr<Core::Timer> m_horizontal_scroll_end_timer;
+    RefPtr<Core::Timer> m_vertical_scroll_end_timer;
 };
 };
 
 
 class SpreadsheetView final : public GUI::Widget {
 class SpreadsheetView final : public GUI::Widget {