fix: mobile cursor focus (#9803)
Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
		
							parent
							
								
									44fa83d080
								
							
						
					
					
						commit
						040253b319
					
				@ -139,8 +139,7 @@ class _RemotePageState extends State<RemotePage> with WidgetsBindingObserver {
 | 
				
			|||||||
    _timerDidChangeMetrics = Timer(Duration(milliseconds: 100), () async {
 | 
					    _timerDidChangeMetrics = Timer(Duration(milliseconds: 100), () async {
 | 
				
			||||||
      // We need this comparation because poping up the floating action will also trigger `didChangeMetrics()`.
 | 
					      // We need this comparation because poping up the floating action will also trigger `didChangeMetrics()`.
 | 
				
			||||||
      if (newBottom != _viewInsetsBottom) {
 | 
					      if (newBottom != _viewInsetsBottom) {
 | 
				
			||||||
        await gFFI.canvasModel.updateViewStyle(refreshMousePos: false);
 | 
					        gFFI.canvasModel.mobileFocusCanvasCursor();
 | 
				
			||||||
        gFFI.canvasModel.moveToCenterCursor();
 | 
					 | 
				
			||||||
        _viewInsetsBottom = newBottom;
 | 
					        _viewInsetsBottom = newBottom;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
				
			|||||||
@ -1420,6 +1420,8 @@ class CanvasModel with ChangeNotifier {
 | 
				
			|||||||
  ScrollStyle _scrollStyle = ScrollStyle.scrollauto;
 | 
					  ScrollStyle _scrollStyle = ScrollStyle.scrollauto;
 | 
				
			||||||
  ViewStyle _lastViewStyle = ViewStyle.defaultViewStyle();
 | 
					  ViewStyle _lastViewStyle = ViewStyle.defaultViewStyle();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Timer? _timerMobileFocusCanvasCursor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  final ScrollController _horizontal = ScrollController();
 | 
					  final ScrollController _horizontal = ScrollController();
 | 
				
			||||||
  final ScrollController _vertical = ScrollController();
 | 
					  final ScrollController _vertical = ScrollController();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1482,7 +1484,7 @@ class CanvasModel with ChangeNotifier {
 | 
				
			|||||||
    return max(bottom - MediaQueryData.fromView(ui.window).padding.top, 0);
 | 
					    return max(bottom - MediaQueryData.fromView(ui.window).padding.top, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  updateViewStyle({refreshMousePos = true}) async {
 | 
					  updateViewStyle({refreshMousePos = true, notify = true}) async {
 | 
				
			||||||
    final style = await bind.sessionGetViewStyle(sessionId: sessionId);
 | 
					    final style = await bind.sessionGetViewStyle(sessionId: sessionId);
 | 
				
			||||||
    if (style == null) {
 | 
					    if (style == null) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
@ -1514,7 +1516,9 @@ class CanvasModel with ChangeNotifier {
 | 
				
			|||||||
    _x = (size.width - displayWidth * _scale) / 2;
 | 
					    _x = (size.width - displayWidth * _scale) / 2;
 | 
				
			||||||
    _y = (size.height - displayHeight * _scale) / 2;
 | 
					    _y = (size.height - displayHeight * _scale) / 2;
 | 
				
			||||||
    _imageOverflow.value = _x < 0 || y < 0;
 | 
					    _imageOverflow.value = _x < 0 || y < 0;
 | 
				
			||||||
 | 
					    if (notify) {
 | 
				
			||||||
      notifyListeners();
 | 
					      notifyListeners();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (refreshMousePos) {
 | 
					    if (refreshMousePos) {
 | 
				
			||||||
      parent.target?.inputModel.refreshMousePos();
 | 
					      parent.target?.inputModel.refreshMousePos();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -1681,6 +1685,7 @@ class CanvasModel with ChangeNotifier {
 | 
				
			|||||||
    _y = 0;
 | 
					    _y = 0;
 | 
				
			||||||
    _scale = 1.0;
 | 
					    _scale = 1.0;
 | 
				
			||||||
    _lastViewStyle = ViewStyle.defaultViewStyle();
 | 
					    _lastViewStyle = ViewStyle.defaultViewStyle();
 | 
				
			||||||
 | 
					    _timerMobileFocusCanvasCursor?.cancel();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  updateScrollPercent() {
 | 
					  updateScrollPercent() {
 | 
				
			||||||
@ -1699,9 +1704,20 @@ class CanvasModel with ChangeNotifier {
 | 
				
			|||||||
    setScrollPercent(percentX, percentY);
 | 
					    setScrollPercent(percentX, percentY);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void mobileFocusCanvasCursor() {
 | 
				
			||||||
 | 
					    _timerMobileFocusCanvasCursor?.cancel();
 | 
				
			||||||
 | 
					    _timerMobileFocusCanvasCursor =
 | 
				
			||||||
 | 
					        Timer(Duration(milliseconds: 100), () async {
 | 
				
			||||||
 | 
					      await updateViewStyle(refreshMousePos: false, notify: false);
 | 
				
			||||||
 | 
					      _moveToCenterCursor();
 | 
				
			||||||
 | 
					      parent.target?.cursorModel.ensureCursorInVisibleRect();
 | 
				
			||||||
 | 
					      notifyListeners();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // mobile only
 | 
					  // mobile only
 | 
				
			||||||
  // Move the canvas to make the cursor visible(center) on the screen.
 | 
					  // Move the canvas to make the cursor visible(center) on the screen.
 | 
				
			||||||
  void moveToCenterCursor() {
 | 
					  void _moveToCenterCursor() {
 | 
				
			||||||
    Rect? imageRect = parent.target?.ffiModel.rect;
 | 
					    Rect? imageRect = parent.target?.ffiModel.rect;
 | 
				
			||||||
    if (imageRect == null) {
 | 
					    if (imageRect == null) {
 | 
				
			||||||
      // unreachable
 | 
					      // unreachable
 | 
				
			||||||
@ -1724,7 +1740,6 @@ class CanvasModel with ChangeNotifier {
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // _size.height > (imageRect.bottom - imageRect.top) * _scale, , we should not change _y
 | 
					      // _size.height > (imageRect.bottom - imageRect.top) * _scale, , we should not change _y
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    notifyListeners();
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1933,11 +1948,7 @@ class CursorModel with ChangeNotifier {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    if (isMobile) {
 | 
					    if (isMobile) {
 | 
				
			||||||
      if (r != null || _lastIsBlocked) {
 | 
					      if (r != null || _lastIsBlocked) {
 | 
				
			||||||
        () async {
 | 
					        parent.target?.canvasModel.mobileFocusCanvasCursor();
 | 
				
			||||||
          await parent.target?.canvasModel
 | 
					 | 
				
			||||||
              .updateViewStyle(refreshMousePos: false);
 | 
					 | 
				
			||||||
          parent.target?.canvasModel.moveToCenterCursor();
 | 
					 | 
				
			||||||
        }();
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -1991,7 +2002,7 @@ class CursorModel with ChangeNotifier {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Offset getCanvasOffsetToCenterCursor() {
 | 
					  Offset getCanvasOffsetToCenterCursor() {
 | 
				
			||||||
    // cursor should be in the center of the visible rect
 | 
					    // Cursor should be at the center of the visible rect.
 | 
				
			||||||
    // _x = rect.left + rect.width / 2
 | 
					    // _x = rect.left + rect.width / 2
 | 
				
			||||||
    // _y = rect.right + rect.height / 2
 | 
					    // _y = rect.right + rect.height / 2
 | 
				
			||||||
    // See `getVisibleRect()`
 | 
					    // See `getVisibleRect()`
 | 
				
			||||||
@ -2004,6 +2015,17 @@ class CursorModel with ChangeNotifier {
 | 
				
			|||||||
    return Offset(xoffset, yoffset);
 | 
					    return Offset(xoffset, yoffset);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void ensureCursorInVisibleRect() {
 | 
				
			||||||
 | 
					    final ensureVisibleValue = 50.0;
 | 
				
			||||||
 | 
					    final r = getVisibleRect();
 | 
				
			||||||
 | 
					    final minX = r.left;
 | 
				
			||||||
 | 
					    final maxX = max(r.right - ensureVisibleValue, r.left);
 | 
				
			||||||
 | 
					    final minY = r.top;
 | 
				
			||||||
 | 
					    final maxY = max(r.bottom - ensureVisibleValue, minY);
 | 
				
			||||||
 | 
					    _x = min(max(_x, minX), maxX);
 | 
				
			||||||
 | 
					    _y = min(max(_y, minY), maxY);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  get scale => parent.target?.canvasModel.scale ?? 1.0;
 | 
					  get scale => parent.target?.canvasModel.scale ?? 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // mobile Soft keyboard, block touch event from the KeyHelpTools
 | 
					  // mobile Soft keyboard, block touch event from the KeyHelpTools
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user