diff --git a/Libraries/LibGUI/IconView.cpp b/Libraries/LibGUI/IconView.cpp index 60251670db..e613a4369e 100644 --- a/Libraries/LibGUI/IconView.cpp +++ b/Libraries/LibGUI/IconView.cpp @@ -735,4 +735,42 @@ void IconView::move_cursor(CursorMovement movement, SelectionUpdate selection_up set_cursor(new_index, selection_update); } +template +inline IterationDecision IconView::for_each_item_intersecting_rect(const Gfx::IntRect& rect, Function f) const +{ + ASSERT(model()); + if (rect.is_empty()) + return IterationDecision::Continue; + int begin_row, begin_column; + column_row_from_content_position(rect.top_left(), begin_row, begin_column); + int end_row, end_column; + column_row_from_content_position(rect.bottom_right(), end_row, end_column); + int items_per_column = end_column - begin_column + 1; + int item_index = max(0, begin_row * m_visual_column_count + begin_column); + int last_index = min(item_count(), end_row * m_visual_column_count + end_column + 1); + while (item_index < last_index) { + for (int i = item_index; i < min(item_index + items_per_column, last_index); i++) { + auto& item_data = get_item_data(i); + if (item_data.is_intersecting(rect)) { + auto decision = f(item_data); + if (decision != IterationDecision::Continue) + return decision; + } + } + item_index += m_visual_column_count; + }; + return IterationDecision::Continue; +} + +template +inline IterationDecision IconView::for_each_item_intersecting_rects(const Vector& rects, Function f) const +{ + for (auto& rect : rects) { + auto decision = for_each_item_intersecting_rect(rect, f); + if (decision != IterationDecision::Continue) + return decision; + } + return IterationDecision::Continue; +} + } diff --git a/Libraries/LibGUI/IconView.h b/Libraries/LibGUI/IconView.h index 14faed7929..67a3d39421 100644 --- a/Libraries/LibGUI/IconView.h +++ b/Libraries/LibGUI/IconView.h @@ -102,42 +102,10 @@ private: }; template - IterationDecision for_each_item_intersecting_rect(const Gfx::IntRect& rect, Function f) const - { - ASSERT(model()); - if (rect.is_empty()) - return IterationDecision::Continue; - int begin_row, begin_column; - column_row_from_content_position(rect.top_left(), begin_row, begin_column); - int end_row, end_column; - column_row_from_content_position(rect.bottom_right(), end_row, end_column); - int items_per_column = end_column - begin_column + 1; - int item_index = max(0, begin_row * m_visual_column_count + begin_column); - int last_index = min(item_count(), end_row * m_visual_column_count + end_column + 1); - while (item_index < last_index) { - for (int i = item_index; i < min(item_index + items_per_column, last_index); i++) { - auto& item_data = get_item_data(i); - if (item_data.is_intersecting(rect)) { - auto decision = f(item_data); - if (decision != IterationDecision::Continue) - return decision; - } - } - item_index += m_visual_column_count; - }; - return IterationDecision::Continue; - } + IterationDecision for_each_item_intersecting_rect(const Gfx::IntRect&, Function) const; template - IterationDecision for_each_item_intersecting_rects(const Vector& rects, Function f) const - { - for (auto& rect : rects) { - auto decision = for_each_item_intersecting_rect(rect, f); - if (decision != IterationDecision::Continue) - return decision; - } - return IterationDecision::Continue; - } + IterationDecision for_each_item_intersecting_rects(const Vector&, Function) const; void column_row_from_content_position(const Gfx::IntPoint& content_position, int& row, int& column) const {