1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Android: Refactor mouse handling to avoid repeated code

This commit is contained in:
reuk 2025-05-22 21:19:33 +01:00
parent 1741f6df29
commit 4ec935c709
No known key found for this signature in database
2 changed files with 889 additions and 859 deletions

View file

@ -189,10 +189,51 @@ public final class ComponentPeerView extends ViewGroup
private final Paint paint = new Paint();
//==============================================================================
private native void handleMouseDown (long host, int index, float x, float y, long time);
private native void handleMouseDrag (long host, int index, float x, float y, long time);
private native void handleMouseUp (long host, int index, float x, float y, long time);
private native void handleAccessibilityHover (long host, int action, float x, float y, long time);
private static native void handleMouseDown (long host, int index, float x, float y, long time);
private static native void handleMouseDrag (long host, int index, float x, float y, long time);
private static native void handleMouseUp (long host, int index, float x, float y, long time);
private static native void handleAccessibilityHover (long host, int action, float x, float y, long time);
@FunctionalInterface
private interface MouseHandler
{
void handle (long host, int index, float x, float y, long time);
}
void handleMultiPointerEvent (MotionEvent event, MouseHandler callback)
{
long time = event.getEventTime();
callback.handle (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);
int n = event.getPointerCount();
if (n > 1)
{
int point[] = new int[2];
getLocationOnScreen (point);
for (int i = 1; i < n; ++i)
callback.handle (host, event.getPointerId (i), event.getX (i) + point[0], event.getY (i) + point[1], time);
}
}
void handleSecondaryPointerEvent (MotionEvent event, MouseHandler callback)
{
long time = event.getEventTime();
int i = event.getActionIndex();
if (i == 0)
{
callback.handle (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);
}
else
{
int point[] = new int[2];
getLocationOnScreen (point);
callback.handle (host, event.getPointerId (i), event.getX (i) + point[0], event.getY (i) + point[1], time);
}
}
@Override
public boolean onTouchEvent (MotionEvent event)
@ -214,76 +255,20 @@ public final class ComponentPeerView extends ViewGroup
return true;
case MotionEvent.ACTION_CANCEL:
{
handleMouseUp (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);
int n = event.getPointerCount();
if (n > 1)
{
int point[] = new int[2];
getLocationOnScreen (point);
for (int i = 1; i < n; ++i)
handleMouseUp (host, event.getPointerId (i), event.getX (i) + point[0], event.getY (i) + point[1], time);
}
handleMultiPointerEvent (event, ComponentPeerView::handleMouseUp);
return true;
}
case MotionEvent.ACTION_MOVE:
{
handleMouseDrag (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);
int n = event.getPointerCount();
if (n > 1)
{
int point[] = new int[2];
getLocationOnScreen (point);
for (int i = 1; i < n; ++i)
handleMouseDrag (host, event.getPointerId (i), event.getX (i) + point[0], event.getY (i) + point[1], time);
}
handleMultiPointerEvent (event, ComponentPeerView::handleMouseDrag);
return true;
}
case MotionEvent.ACTION_POINTER_UP:
{
int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
if (i == 0)
{
handleMouseUp (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);
}
else
{
int point[] = new int[2];
getLocationOnScreen (point);
handleMouseUp (host, event.getPointerId (i), event.getX (i) + point[0], event.getY (i) + point[1], time);
}
handleSecondaryPointerEvent (event, ComponentPeerView::handleMouseUp);
return true;
}
case MotionEvent.ACTION_POINTER_DOWN:
{
int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
if (i == 0)
{
handleMouseDown (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);
}
else
{
int point[] = new int[2];
getLocationOnScreen (point);
handleMouseDown (host, event.getPointerId (i), event.getX (i) + point[0], event.getY (i) + point[1], time);
}
handleSecondaryPointerEvent (event, ComponentPeerView::handleMouseDown);
return true;
}
default:
break;

File diff suppressed because it is too large Load diff