Browse Source

ComponentPeer: Correctly scale drag and drop coordinates to account for global scale

v6.1.6
reuk 3 years ago
parent
commit
eb6e579f0a
No known key found for this signature in database GPG Key ID: 9ADCD339CFC98A11
5 changed files with 36 additions and 41 deletions
  1. +12
    -0
      modules/juce_gui_basics/components/juce_Component.cpp
  2. +9
    -21
      modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp
  3. +8
    -15
      modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
  4. +3
    -2
      modules/juce_gui_basics/native/juce_win32_Windowing.cpp
  5. +4
    -3
      modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp

+ 12
- 0
modules/juce_gui_basics/components/juce_Component.cpp View File

@@ -275,6 +275,18 @@ struct ScalingHelpers
static Rectangle<int> subtractPosition (Rectangle<int> p, const Component& c) noexcept { return p - c.getPosition(); }
static Point<float> subtractPosition (Point<float> p, const Component& c) noexcept { return p - c.getPosition().toFloat(); }
static Rectangle<float> subtractPosition (Rectangle<float> p, const Component& c) noexcept { return p - c.getPosition().toFloat(); }
static Point<float> screenPosToLocalPos (Component& comp, Point<float> pos)
{
if (auto* peer = comp.getPeer())
{
pos = peer->globalToLocal (pos);
auto& peerComp = peer->getComponent();
return comp.getLocalPoint (&peerComp, unscaledScreenPosToScaled (peerComp, pos));
}
return comp.getLocalPoint (nullptr, unscaledScreenPosToScaled (comp, pos));
}
};
static const char colourPropertyPrefix[] = "jcclr_";


+ 9
- 21
modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp View File

@@ -57,18 +57,6 @@ public:
return lastPeer;
}
static Point<float> screenPosToLocalPos (Component& comp, Point<float> pos)
{
if (auto* peer = comp.getPeer())
{
pos = peer->globalToLocal (pos);
auto& peerComp = peer->getComponent();
return comp.getLocalPoint (&peerComp, ScalingHelpers::unscaledScreenPosToScaled (peerComp, pos));
}
return comp.getLocalPoint (nullptr, ScalingHelpers::unscaledScreenPosToScaled (comp, pos));
}
Component* findComponentAt (Point<float> screenPos)
{
if (auto* peer = getPeer())
@@ -106,7 +94,7 @@ public:
//==============================================================================
#if JUCE_DUMP_MOUSE_EVENTS
#define JUCE_MOUSE_EVENT_DBG(desc, screenPos) DBG ("Mouse " << desc << " #" << index \
<< ": " << screenPosToLocalPos (comp, screenPos).toString() \
<< ": " << ScalingHelpers::screenPosToLocalPos (comp, screenPos).toString() \
<< " - Comp: " << String::toHexString ((pointer_sized_int) &comp));
#else
#define JUCE_MOUSE_EVENT_DBG(desc, screenPos)
@@ -115,26 +103,26 @@ public:
void sendMouseEnter (Component& comp, const PointerState& pointerState, Time time)
{
JUCE_MOUSE_EVENT_DBG ("enter", pointerState.position)
comp.internalMouseEnter (MouseInputSource (this), screenPosToLocalPos (comp, pointerState.position), time);
comp.internalMouseEnter (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time);
}
void sendMouseExit (Component& comp, const PointerState& pointerState, Time time)
{
JUCE_MOUSE_EVENT_DBG ("exit", pointerState.position)
comp.internalMouseExit (MouseInputSource (this), screenPosToLocalPos (comp, pointerState.position), time);
comp.internalMouseExit (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time);
}
void sendMouseMove (Component& comp, const PointerState& pointerState, Time time)
{
JUCE_MOUSE_EVENT_DBG ("move", pointerState.position)
comp.internalMouseMove (MouseInputSource (this), screenPosToLocalPos (comp, pointerState.position), time);
comp.internalMouseMove (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, pointerState.position), time);
}
void sendMouseDown (Component& comp, const PointerState& pointerState, Time time)
{
JUCE_MOUSE_EVENT_DBG ("down", pointerState.position)
comp.internalMouseDown (MouseInputSource (this),
pointerState.withPosition (screenPosToLocalPos (comp, pointerState.position)),
pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)),
time);
}
@@ -142,7 +130,7 @@ public:
{
JUCE_MOUSE_EVENT_DBG ("drag", pointerState.position)
comp.internalMouseDrag (MouseInputSource (this),
pointerState.withPosition (screenPosToLocalPos (comp, pointerState.position)),
pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)),
time);
}
@@ -150,7 +138,7 @@ public:
{
JUCE_MOUSE_EVENT_DBG ("up", pointerState.position)
comp.internalMouseUp (MouseInputSource (this),
pointerState.withPosition (screenPosToLocalPos (comp, pointerState.position)),
pointerState.withPosition (ScalingHelpers::screenPosToLocalPos (comp, pointerState.position)),
time,
oldMods);
}
@@ -158,13 +146,13 @@ public:
void sendMouseWheel (Component& comp, Point<float> screenPos, Time time, const MouseWheelDetails& wheel)
{
JUCE_MOUSE_EVENT_DBG ("wheel", screenPos)
comp.internalMouseWheel (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, wheel);
comp.internalMouseWheel (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, screenPos), time, wheel);
}
void sendMagnifyGesture (Component& comp, Point<float> screenPos, Time time, float amount)
{
JUCE_MOUSE_EVENT_DBG ("magnify", screenPos)
comp.internalMagnifyGesture (MouseInputSource (this), screenPosToLocalPos (comp, screenPos), time, amount);
comp.internalMagnifyGesture (MouseInputSource (this), ScalingHelpers::screenPosToLocalPos (comp, screenPos), time, amount);
}
//==============================================================================


+ 8
- 15
modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm View File

@@ -1458,7 +1458,7 @@ public:
return [NSArray arrayWithObjects: type, (NSString*) kPasteboardTypeFileURLPromise, NSPasteboardTypeString, nil];
}
BOOL sendDragCallback (const int type, id <NSDraggingInfo> sender)
BOOL sendDragCallback (bool (ComponentPeer::* callback) (const DragInfo&), id <NSDraggingInfo> sender)
{
NSPasteboard* pasteboard = [sender draggingPasteboard];
NSString* contentType = [pasteboard availableTypeFromArray: getSupportedDragTypes()];
@@ -1466,9 +1466,10 @@ public:
if (contentType == nil)
return false;
NSPoint p = [view convertPoint: [sender draggingLocation] fromView: nil];
const auto p = localToGlobal (convertToPointFloat ([view convertPoint: [sender draggingLocation] fromView: nil]));
ComponentPeer::DragInfo dragInfo;
dragInfo.position.setXY ((int) p.x, (int) p.y);
dragInfo.position = ScalingHelpers::screenPosToLocalPos (component, p).roundToInt();
if (contentType == NSPasteboardTypeString)
dragInfo.text = nsStringToJuce ([pasteboard stringForType: NSPasteboardTypeString]);
@@ -1476,15 +1477,7 @@ public:
dragInfo.files = getDroppedFiles (pasteboard, contentType);
if (! dragInfo.isEmpty())
{
switch (type)
{
case 0: return handleDragMove (dragInfo);
case 1: return handleDragExit (dragInfo);
case 2: return handleDragDrop (dragInfo);
default: jassertfalse; break;
}
}
return (this->*callback) (dragInfo);
return false;
}
@@ -2217,7 +2210,7 @@ private:
static NSDragOperation draggingUpdated (id self, SEL, id<NSDraggingInfo> sender)
{
if (auto* owner = getOwner (self))
if (owner->sendDragCallback (0, sender))
if (owner->sendDragCallback (&NSViewComponentPeer::handleDragMove, sender))
return NSDragOperationGeneric;
return NSDragOperationNone;
@@ -2230,7 +2223,7 @@ private:
static void draggingExited (id self, SEL, id<NSDraggingInfo> sender)
{
callOnOwner (self, &NSViewComponentPeer::sendDragCallback, 1, sender);
callOnOwner (self, &NSViewComponentPeer::sendDragCallback, &NSViewComponentPeer::handleDragExit, sender);
}
static BOOL prepareForDragOperation (id, SEL, id<NSDraggingInfo>)
@@ -2241,7 +2234,7 @@ private:
static BOOL performDragOperation (id self, SEL, id<NSDraggingInfo> sender)
{
auto* owner = getOwner (self);
return owner != nullptr && owner->sendDragCallback (2, sender);
return owner != nullptr && owner->sendDragCallback (&NSViewComponentPeer::handleDragDrop, sender);
}
static void concludeDragOperation (id, SEL, id<NSDraggingInfo>) {}


+ 3
- 2
modules/juce_gui_basics/native/juce_win32_Windowing.cpp View File

@@ -2000,8 +2000,9 @@ public:
private:
Point<float> getMousePos (POINTL mousePos) const
{
return peer.getComponent().getLocalPoint (nullptr, convertPhysicalScreenPointToLogical (pointFromPOINT ({ mousePos.x, mousePos.y }),
(HWND) peer.getNativeHandle()).toFloat());
const auto originalPos = pointFromPOINT ({ mousePos.x, mousePos.y });
const auto logicalPos = convertPhysicalScreenPointToLogical (originalPos, peer.hwnd);
return ScalingHelpers::screenPosToLocalPos (peer.component, logicalPos.toFloat());
}
struct DroppedData


+ 4
- 3
modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp View File

@@ -156,9 +156,10 @@ public:
if (windowH == 0)
windowH = (::Window) peer->getNativeHandle();
auto dropPos = Desktop::getInstance().getDisplays().physicalToLogical (Point<int> ((int) clientMsg.data.l[2] >> 16,
(int) clientMsg.data.l[2] & 0xffff));
dropPos -= peer->getBounds().getPosition();
const auto displays = Desktop::getInstance().getDisplays();
const auto logicalPos = displays.physicalToLogical (Point<int> ((int) clientMsg.data.l[2] >> 16,
(int) clientMsg.data.l[2] & 0xffff));
const auto dropPos = ScalingHelpers::screenPosToLocalPos (peer->getComponent(), logicalPos.toFloat()).roundToInt();
const auto& atoms = getAtoms();


Loading…
Cancel
Save