From ced221df4a9be5cee4dbdc4f4d26b305ac0e5282 Mon Sep 17 00:00:00 2001 From: attila Date: Tue, 17 May 2022 12:45:43 +0200 Subject: [PATCH] DropShadower: Fix bug when setOwner() is called with a component without a parent Until now when a Component without a parent was passed to setOwner() the ParentVisibilityChangedListener would not install any hooks to any components, hence it would not be notified, when the owner was added to a parent. --- .../juce_gui_basics/misc/juce_DropShadower.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/juce_gui_basics/misc/juce_DropShadower.cpp b/modules/juce_gui_basics/misc/juce_DropShadower.cpp index cbd05cc7f0..0b42607e5a 100644 --- a/modules/juce_gui_basics/misc/juce_DropShadower.cpp +++ b/modules/juce_gui_basics/misc/juce_DropShadower.cpp @@ -82,8 +82,7 @@ public: ParentVisibilityChangedListener (Component& r, ComponentListener& l) : root (&r), listener (&l) { - if (auto* firstParent = root->getParentComponent()) - updateParentHierarchy (firstParent); + updateParentHierarchy(); if ((SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0) { @@ -99,16 +98,16 @@ public: comp->removeComponentListener (this); } - void componentVisibilityChanged (Component&) override + void componentVisibilityChanged (Component& component) override { - listener->componentVisibilityChanged (*root); + if (root != &component) + listener->componentVisibilityChanged (*root); } void componentParentHierarchyChanged (Component& component) override { if (root == &component) - if (auto* firstParent = root->getParentComponent()) - updateParentHierarchy (firstParent); + updateParentHierarchy(); } bool isWindowOnVirtualDesktop() const noexcept { return isOnVirtualDesktop; } @@ -129,13 +128,13 @@ private: WeakReference ref; }; - void updateParentHierarchy (Component* rootComponent) + void updateParentHierarchy() { const auto lastSeenComponents = std::exchange (observedComponents, [&] { std::set result; - for (auto node = rootComponent; node != nullptr; node = node->getParentComponent()) + for (auto node = root; node != nullptr; node = node->getParentComponent()) result.emplace (*node); return result;