Browse Source

Fixed a bug when using drag and drop on devices with both mouse and touch inputs

tags/2021-05-28
ed 7 years ago
parent
commit
3ed0e05c9e
1 changed files with 19 additions and 9 deletions
  1. +19
    -9
      modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp

+ 19
- 9
modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp View File

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


Loading…
Cancel
Save