Merge pull request #3634 from fufesou/refact/better_mouse_hover
Refact/better mouse hover
This commit is contained in:
commit
189b6f8de8
@ -308,6 +308,10 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void leaveView(PointerExitEvent evt) {
|
void leaveView(PointerExitEvent evt) {
|
||||||
|
if (_ffi.ffiModel.keyboard()) {
|
||||||
|
_ffi.inputModel.tryMoveEdgeOnExit(evt.position);
|
||||||
|
}
|
||||||
|
|
||||||
_cursorOverImage.value = false;
|
_cursorOverImage.value = false;
|
||||||
_firstEnterImage.value = false;
|
_firstEnterImage.value = false;
|
||||||
if (_onEnterOrLeaveImage4Menubar != null) {
|
if (_onEnterOrLeaveImage4Menubar != null) {
|
||||||
@ -329,8 +333,8 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
PointerExitEventListener? onExit,
|
PointerExitEventListener? onExit,
|
||||||
) {
|
) {
|
||||||
return RawPointerMouseRegion(
|
return RawPointerMouseRegion(
|
||||||
onEnter: enterView,
|
onEnter: onEnter,
|
||||||
onExit: leaveView,
|
onExit: onExit,
|
||||||
onPointerDown: (event) {
|
onPointerDown: (event) {
|
||||||
// A double check for blur status.
|
// A double check for blur status.
|
||||||
// Note: If there's an `onPointerDown` event is triggered, `_isWindowBlur` is expected being false.
|
// Note: If there's an `onPointerDown` event is triggered, `_isWindowBlur` is expected being false.
|
||||||
|
@ -419,7 +419,50 @@ class InputModel {
|
|||||||
'type': _kMouseEventMove,
|
'type': _kMouseEventMove,
|
||||||
});
|
});
|
||||||
|
|
||||||
void handleMouse(Map<String, dynamic> evt) {
|
void tryMoveEdgeOnExit(Offset pos) => handleMouse(
|
||||||
|
{
|
||||||
|
'x': pos.dx,
|
||||||
|
'y': pos.dy,
|
||||||
|
'buttons': 0,
|
||||||
|
'type': _kMouseEventMove,
|
||||||
|
},
|
||||||
|
onExit: true,
|
||||||
|
);
|
||||||
|
|
||||||
|
int trySetNearestRange(int v, int min, int max, int n) {
|
||||||
|
if (v < min && v >= min - n) {
|
||||||
|
v = min;
|
||||||
|
}
|
||||||
|
if (v > max && v <= max + n) {
|
||||||
|
v = max;
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
Offset setNearestEdge(double x, double y, Display d) {
|
||||||
|
double left = x - d.x;
|
||||||
|
double right = d.x + d.width - 1 - x;
|
||||||
|
double top = y - d.y;
|
||||||
|
double bottom = d.y + d.height - 1 - y;
|
||||||
|
if (left < right && left < top && left < bottom) {
|
||||||
|
x = d.x;
|
||||||
|
}
|
||||||
|
if (right < left && right < top && right < bottom) {
|
||||||
|
x = d.x + d.width - 1;
|
||||||
|
}
|
||||||
|
if (top < left && top < right && top < bottom) {
|
||||||
|
y = d.y;
|
||||||
|
}
|
||||||
|
if (bottom < left && bottom < right && bottom < top) {
|
||||||
|
y = d.y + d.height - 1;
|
||||||
|
}
|
||||||
|
return Offset(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleMouse(
|
||||||
|
Map<String, dynamic> evt, {
|
||||||
|
bool onExit = false,
|
||||||
|
}) {
|
||||||
double x = evt['x'];
|
double x = evt['x'];
|
||||||
double y = max(0.0, evt['y']);
|
double y = max(0.0, evt['y']);
|
||||||
final cursorModel = parent.target!.cursorModel;
|
final cursorModel = parent.target!.cursorModel;
|
||||||
@ -501,6 +544,13 @@ class InputModel {
|
|||||||
}
|
}
|
||||||
x += d.x;
|
x += d.x;
|
||||||
y += d.y;
|
y += d.y;
|
||||||
|
|
||||||
|
if (onExit) {
|
||||||
|
final pos = setNearestEdge(x, y, d);
|
||||||
|
x = pos.dx;
|
||||||
|
y = pos.dy;
|
||||||
|
}
|
||||||
|
|
||||||
var evtX = 0;
|
var evtX = 0;
|
||||||
var evtY = 0;
|
var evtY = 0;
|
||||||
try {
|
try {
|
||||||
@ -512,10 +562,13 @@ class InputModel {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (evtX < d.x ||
|
int minX = d.x.toInt();
|
||||||
evtY < d.y ||
|
int maxX = (d.x + d.width).toInt() - 1;
|
||||||
evtX > (d.x + d.width) ||
|
int minY = d.y.toInt();
|
||||||
evtY > (d.y + d.height)) {
|
int maxY = (d.y + d.height).toInt() - 1;
|
||||||
|
evtX = trySetNearestRange(evtX, minX, maxX, 5);
|
||||||
|
evtY = trySetNearestRange(evtY, minY, maxY, 5);
|
||||||
|
if (evtX < minX || evtY < minY || evtX > maxX || evtY > maxY) {
|
||||||
// If left mouse up, no early return.
|
// If left mouse up, no early return.
|
||||||
if (evt['buttons'] != kPrimaryMouseButton || type != 'up') {
|
if (evt['buttons'] != kPrimaryMouseButton || type != 'up') {
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user