diff --git a/LibGUI/GRadioButton.cpp b/LibGUI/GRadioButton.cpp index d432823de7e632..773bfd2369fdea 100644 --- a/LibGUI/GRadioButton.cpp +++ b/LibGUI/GRadioButton.cpp @@ -55,13 +55,11 @@ void GRadioButton::for_each_in_group(Callback callback) { if (!parent()) return; - for (auto& object : parent()->children()) { - if (!object->is_widget()) - continue; - if (!static_cast(object)->is_radio_button()) - continue; - callback(*static_cast(object)); - } + for_each_child_widget([&] (auto& child) { + if (!child.is_radio_button()) + return IterationDecision::Continue; + return callback(static_cast(child)); + }); } void GRadioButton::click() @@ -71,6 +69,7 @@ void GRadioButton::click() for_each_in_group([this] (auto& button) { if (&button != this) button.set_checked(false); + return IterationDecision::Continue; }); set_checked(true); } diff --git a/LibGUI/GSplitter.cpp b/LibGUI/GSplitter.cpp index 393dfd456992f8..567dfb46932550 100644 --- a/LibGUI/GSplitter.cpp +++ b/LibGUI/GSplitter.cpp @@ -40,17 +40,15 @@ void GSplitter::mousedown_event(GMouseEvent& event) GWidget* first_resizee { nullptr }; GWidget* second_resizee { nullptr }; int fudge = layout()->spacing(); - for (auto* child : children()) { - if (!child->is_widget()) - continue; - auto& child_widget = *static_cast(child); - int child_start = m_orientation == Orientation::Horizontal ? child_widget.relative_rect().left() : child_widget.relative_rect().top(); - int child_end = m_orientation == Orientation::Horizontal ? child_widget.relative_rect().right() : child_widget.relative_rect().bottom(); + for_each_child_widget([&] (auto& child) { + int child_start = m_orientation == Orientation::Horizontal ? child.relative_rect().left() : child.relative_rect().top(); + int child_end = m_orientation == Orientation::Horizontal ? child.relative_rect().right() : child.relative_rect().bottom(); if (x_or_y > child_end && (x_or_y - fudge) <= child_end) - first_resizee = &child_widget; + first_resizee = &child; if (x_or_y < child_start && (x_or_y + fudge) >= child_start) - second_resizee = &child_widget; - } + second_resizee = &child; + return IterationDecision::Continue; + }); ASSERT(first_resizee && second_resizee); m_first_resizee = first_resizee->make_weak_ptr(); m_second_resizee = second_resizee->make_weak_ptr(); diff --git a/LibGUI/GTabWidget.cpp b/LibGUI/GTabWidget.cpp index 2fb1ffbeb736f8..62d6cd58e009b2 100644 --- a/LibGUI/GTabWidget.cpp +++ b/LibGUI/GTabWidget.cpp @@ -61,12 +61,10 @@ void GTabWidget::child_event(CChildEvent& event) } else if (event.type() == GEvent::ChildRemoved) { if (m_active_widget == &child) { GWidget* new_active_widget = nullptr; - for (auto* new_child : children()) { - if (new_child->is_widget()) { - new_active_widget = static_cast(new_child); - break; - } - } + for_each_child_widget([&] (auto& new_child) { + new_active_widget = &new_child; + return IterationDecision::Abort; + }); set_active_widget(new_active_widget); } } diff --git a/LibGUI/GWidget.cpp b/LibGUI/GWidget.cpp index 506108ca0287d5..68cb7c29e7672f 100644 --- a/LibGUI/GWidget.cpp +++ b/LibGUI/GWidget.cpp @@ -116,15 +116,15 @@ void GWidget::handle_paint_event(GPaintEvent& event) #endif } paint_event(event); - for (auto* ch : children()) { - auto* child = (GWidget*)ch; - if (!child->is_visible()) - continue; - if (child->relative_rect().intersects(event.rect())) { - GPaintEvent local_event(event.rect().intersected(child->relative_rect()).translated(-child->relative_position())); - child->event(local_event); + for_each_child_widget([&] (auto& child) { + if (!child.is_visible()) + return IterationDecision::Continue; + if (child.relative_rect().intersects(event.rect())) { + GPaintEvent local_event(event.rect().intersected(child.relative_rect()).translated(-child.relative_position())); + child.event(local_event); } - } + return IterationDecision::Continue; + }); second_paint_event(event); } diff --git a/LibGUI/GWidget.h b/LibGUI/GWidget.h index 781e91a0793e5a..4b42245e96f4f8 100644 --- a/LibGUI/GWidget.h +++ b/LibGUI/GWidget.h @@ -185,6 +185,16 @@ class GWidget : public CObject { void register_local_shortcut_action(Badge, GAction&); void unregister_local_shortcut_action(Badge, GAction&); + template + void for_each_child_widget(Callback callback) + { + for_each_child([&] (auto& child) { + if (child.is_widget()) + return callback(static_cast(child)); + return IterationDecision::Continue; + }); + } + virtual bool is_radio_button() const { return false; } private: diff --git a/LibGUI/GWindow.cpp b/LibGUI/GWindow.cpp index 2f6c0207faf58d..cccb2fda2406cb 100644 --- a/LibGUI/GWindow.cpp +++ b/LibGUI/GWindow.cpp @@ -526,16 +526,14 @@ Vector GWindow::focusable_widgets() const Function collect_focusable_widgets = [&] (GWidget& widget) { if (widget.accepts_focus()) collected_widgets.append(&widget); - for (auto& child : widget.children()) { - if (!child->is_widget()) - continue; - auto& child_widget = *static_cast(child); - if (!child_widget.is_visible()) - continue; - if (!child_widget.is_enabled()) - continue; - collect_focusable_widgets(child_widget); - } + widget.for_each_child_widget([&] (auto& child) { + if (!child.is_visible()) + return IterationDecision::Continue; + if (!child.is_enabled()) + return IterationDecision::Continue; + collect_focusable_widgets(child); + return IterationDecision::Continue; + }); }; collect_focusable_widgets(*m_main_widget);