From 5e439bb3c88a269406b2a7617c6b3d116797f250 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 17 Sep 2019 21:11:52 +0200 Subject: [PATCH] VisualBuilder: Fix hit testing for composite widgets When we ask LibGUI to hit test, it may return a subwidget of a widget composed of many smaller widgets. In those cases we need to locate the appropriate corresponding VBWidget for the composite widget. --- DevTools/VisualBuilder/VBForm.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/DevTools/VisualBuilder/VBForm.cpp b/DevTools/VisualBuilder/VBForm.cpp index a2545367a6..bd9838ffc5 100644 --- a/DevTools/VisualBuilder/VBForm.cpp +++ b/DevTools/VisualBuilder/VBForm.cpp @@ -113,7 +113,13 @@ VBWidget* VBForm::widget_at(const Point& position) auto result = hit_test(position, GWidget::ShouldRespectGreediness::No); if (!result.widget) return nullptr; - return m_gwidget_map.get(result.widget).value_or(nullptr); + auto* gwidget = result.widget; + while (gwidget) { + if (auto* widget = m_gwidget_map.get(gwidget).value_or(nullptr)) + return widget; + gwidget = gwidget->parent_widget(); + } + return nullptr; } void VBForm::grabber_mousedown_event(GMouseEvent& event, Direction grabber) @@ -411,9 +417,12 @@ void VBForm::delete_selected_widgets() for_each_selected_widget([&](auto& widget) { to_delete.append(&widget); }); + if (to_delete.is_empty()) + return; for (auto& widget : to_delete) m_widgets.remove_first_matching([&widget](auto& entry) { return entry == widget; }); on_widget_selected(single_selected_widget()); + update(); } template