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