diff --git a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp index 4f1a25b849..1d8cc0e306 100644 --- a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp +++ b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp @@ -45,7 +45,9 @@ public: : sourceDetails (desc, sourceComponent, Point()), image (im), owner (ddc), mouseDragSource (draggingSource->getComponentUnderMouse()), - imageOffset (offset), originalMouseIndex (draggingSource->getIndex()) + imageOffset (offset), + originalInputSourceIndex (draggingSource->getIndex()), + originalInputSourceType (draggingSource->getType()) { updateSize(); @@ -68,7 +70,7 @@ public: { mouseDragSource->removeMouseListener (this); - if (DragAndDropTarget* const current = getCurrentlyOver()) + if (auto* current = getCurrentlyOver()) if (current->isInterestedInDragSource (sourceDetails)) current->itemDragExit (sourceDetails); } @@ -87,14 +89,14 @@ public: void mouseUp (const MouseEvent& e) override { - if (e.originalComponent != this && e.source.getIndex() == originalMouseIndex) + if (e.originalComponent != this && isOriginalInputSource (e.source)) { if (mouseDragSource != nullptr) mouseDragSource->removeMouseListener (this); // (note: use a local copy of this in case the callback runs // a modal loop and deletes this object before the method completes) - DragAndDropTarget::SourceDetails details (sourceDetails); + auto details = sourceDetails; DragAndDropTarget* finalTarget = nullptr; auto wasVisible = isVisible(); @@ -105,7 +107,7 @@ public: if (wasVisible) // fade the component and remove it - it'll be deleted later by the timer callback dismissWithAnimation (finalTarget == nullptr); - if (Component* parent = getParentComponent()) + if (auto* parent = getParentComponent()) parent->removeChildComponent (this); if (finalTarget != nullptr) @@ -120,7 +122,7 @@ public: void mouseDrag (const MouseEvent& e) override { - if (e.originalComponent != this && e.source.getIndex() == originalMouseIndex) + if (e.originalComponent != this && isOriginalInputSource (e.source)) updateLocation (true, e.getScreenPosition()); } @@ -180,14 +182,15 @@ public: } else { - if (auto* ms = Desktop::getInstance().getMouseSource (originalMouseIndex)) + for (auto& s : Desktop::getInstance().getMouseSources()) { - if (! ms->isDragging()) + if (isOriginalInputSource (s) && ! s.isDragging()) { if (mouseDragSource != nullptr) mouseDragSource->removeMouseListener (this); deleteSelf(); + break; } } } @@ -222,7 +225,8 @@ private: const Point imageOffset; bool hasCheckedForExternalDrag = false; Time lastTimeOverTarget; - int originalMouseIndex; + int originalInputSourceIndex; + MouseInputSource::InputSourceType originalInputSourceType; void updateSize() { @@ -363,6 +367,12 @@ private: } } + bool isOriginalInputSource (const MouseInputSource& sourceToCheck) + { + return (sourceToCheck.getType() == originalInputSourceType + && sourceToCheck.getIndex() == originalInputSourceIndex); + } + JUCE_DECLARE_NON_COPYABLE (DragImageComponent) };