diff options
Diffstat (limited to 'Libraries/LibGUI')
-rw-r--r-- | Libraries/LibGUI/Splitter.cpp | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/Libraries/LibGUI/Splitter.cpp b/Libraries/LibGUI/Splitter.cpp index caec8f06e5..b4ad00c6ea 100644 --- a/Libraries/LibGUI/Splitter.cpp +++ b/Libraries/LibGUI/Splitter.cpp @@ -86,23 +86,30 @@ void Splitter::leave_event(Core::Event&) bool Splitter::get_resize_candidates_at(const Gfx::IntPoint& position, Widget*& first, Widget*& second) { int x_or_y = position.primary_offset_for_orientation(m_orientation); + Widget* previous_widget = nullptr; + bool found_candidates = false; + for_each_child_widget([&](auto& child_widget) { + if (!child_widget.is_visible()) { + // We need to skip over widgets that are not visible as they + // are not necessarily in the correct location (anymore) + return IterationDecision::Continue; + } + if (!previous_widget) { + previous_widget = &child_widget; + return IterationDecision::Continue; + } - auto child_widgets = this->child_widgets(); - if (child_widgets.size() < 2) - return false; - - for (size_t i = 0; i < child_widgets.size() - 1; ++i) { - auto* first_candidate = child_widgets[i]; - auto* second_candidate = child_widgets[i + 1]; - - if (x_or_y > first_candidate->content_rect().last_edge_for_orientation(m_orientation) - && x_or_y <= second_candidate->content_rect().first_edge_for_orientation(m_orientation)) { - first = first_candidate; - second = second_candidate; - return true; + if (x_or_y > previous_widget->content_rect().last_edge_for_orientation(m_orientation) + && x_or_y <= child_widget.content_rect().first_edge_for_orientation(m_orientation)) { + first = previous_widget; + second = &child_widget; + found_candidates = true; + return IterationDecision::Break; } - } - return false; + + return IterationDecision::Continue; + }); + return found_candidates; } void Splitter::mousedown_event(MouseEvent& event) |