From a3219c7fc6dd08dc34e79ac9b4a3e0d323e346df Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Tue, 21 Aug 2018 19:20:03 +0100 Subject: [PATCH] Linux: Fixed a DragAndDrop issue between different containers --- .../mouse/juce_DragAndDropContainer.cpp | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp index c9545402d5..ea55467214 100644 --- a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp +++ b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp @@ -243,13 +243,34 @@ private: return dynamic_cast (currentlyOverComp.get()); } + static Component* findDesktopComponentBelow (Point screenPos) + { + auto& desktop = Desktop::getInstance(); + + for (auto i = desktop.getNumComponents(); --i >= 0;) + { + auto* desktopComponent = desktop.getComponent (i); + auto dPoint = desktopComponent->getLocalPoint (nullptr, screenPos); + + if (auto* c = desktopComponent->getComponentAt (dPoint)) + { + auto cPoint = c->getLocalPoint (desktopComponent, dPoint); + + if (c->hitTest (cPoint.getX(), cPoint.getY())) + return c; + } + } + + return nullptr; + } + DragAndDropTarget* findTarget (Point screenPos, Point& relativePos, Component*& resultComponent) const { auto* hit = getParentComponent(); if (hit == nullptr) - hit = Desktop::getInstance().findComponentAt (screenPos); + hit = findDesktopComponentBelow (screenPos); else hit = hit->getComponentAt (hit->getLocalPoint (nullptr, screenPos));