diff --git a/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp b/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp index 58f016197b..4575a13d6f 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp +++ b/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp @@ -104,23 +104,29 @@ void ComponentBoundsConstrainer::setBoundsForComponent (Component* component, { jassert (component != nullptr); - Rectangle limits, bounds (targetBounds); - BorderSize border; + auto bounds = targetBounds; - if (auto* parent = component->getParentComponent()) + auto limits = [&]() -> Rectangle { - limits.setSize (parent->getWidth(), parent->getHeight()); - } - else + if (auto* parent = component->getParentComponent()) + return { parent->getWidth(), parent->getHeight() }; + + if (auto* display = Desktop::getInstance().getDisplays().getDisplayForPoint (targetBounds.getCentre())) + return component->getLocalArea (nullptr, display->userArea) + component->getPosition(); + + const auto max = std::numeric_limits::max(); + return { max, max }; + }(); + + auto border = [&]() -> BorderSize { - if (auto* peer = component->getPeer()) - if (const auto frameSize = peer->getFrameSizeIfPresent()) - border = *frameSize; + if (component->getParentComponent() == nullptr) + if (auto* peer = component->getPeer()) + if (const auto frameSize = peer->getFrameSizeIfPresent()) + return *frameSize; - auto screenBounds = Desktop::getInstance().getDisplays().getDisplayForPoint (targetBounds.getCentre())->userArea; - - limits = component->getLocalArea (nullptr, screenBounds) + component->getPosition(); - } + return {}; + }(); border.addTo (bounds);