Refact/mobile remove adjust 4 soft keyabord (#9787)
* refact: remove adjust for soft keyboard Signed-off-by: fufesou <linlong1266@gmail.com> * mobile, do not set the view style after scale end Signed-off-by: fufesou <linlong1266@gmail.com> --------- Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
parent
0b8cccd8be
commit
697dd87383
@ -336,7 +336,8 @@ class _RawTouchGestureDetectorRegionState
|
|||||||
} else {
|
} else {
|
||||||
// mobile
|
// mobile
|
||||||
_scale = 1;
|
_scale = 1;
|
||||||
bind.sessionSetViewStyle(sessionId: sessionId, value: "");
|
// No idea why we need to set the view style to "" here.
|
||||||
|
// bind.sessionSetViewStyle(sessionId: sessionId, value: "");
|
||||||
}
|
}
|
||||||
inputModel.sendMouse('up', MouseButtons.left);
|
inputModel.sendMouse('up', MouseButtons.left);
|
||||||
}
|
}
|
||||||
|
@ -37,13 +37,15 @@ class RemotePage extends StatefulWidget {
|
|||||||
State<RemotePage> createState() => _RemotePageState(id);
|
State<RemotePage> createState() => _RemotePageState(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
class _RemotePageState extends State<RemotePage> {
|
class _RemotePageState extends State<RemotePage> with WidgetsBindingObserver {
|
||||||
Timer? _timer;
|
Timer? _timer;
|
||||||
bool _showBar = !isWebDesktop;
|
bool _showBar = !isWebDesktop;
|
||||||
bool _showGestureHelp = false;
|
bool _showGestureHelp = false;
|
||||||
String _value = '';
|
String _value = '';
|
||||||
Orientation? _currentOrientation;
|
Orientation? _currentOrientation;
|
||||||
|
|
||||||
|
Timer? _timerDidChangeMetrics;
|
||||||
|
|
||||||
final _blockableOverlayState = BlockableOverlayState();
|
final _blockableOverlayState = BlockableOverlayState();
|
||||||
|
|
||||||
final keyboardVisibilityController = KeyboardVisibilityController();
|
final keyboardVisibilityController = KeyboardVisibilityController();
|
||||||
@ -100,10 +102,12 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
if (isAndroid) {
|
if (isAndroid) {
|
||||||
_textController.addListener(textAndroidListener);
|
_textController.addListener(textAndroidListener);
|
||||||
}
|
}
|
||||||
|
WidgetsBinding.instance.addObserver(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> dispose() async {
|
Future<void> dispose() async {
|
||||||
|
WidgetsBinding.instance.removeObserver(this);
|
||||||
// https://github.com/flutter/flutter/issues/64935
|
// https://github.com/flutter/flutter/issues/64935
|
||||||
super.dispose();
|
super.dispose();
|
||||||
gFFI.dialogManager.hideMobileActionsOverlay(store: false);
|
gFFI.dialogManager.hideMobileActionsOverlay(store: false);
|
||||||
@ -115,6 +119,7 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
_physicalFocusNode.dispose();
|
_physicalFocusNode.dispose();
|
||||||
await gFFI.close();
|
await gFFI.close();
|
||||||
_timer?.cancel();
|
_timer?.cancel();
|
||||||
|
_timerDidChangeMetrics?.cancel();
|
||||||
gFFI.dialogManager.dismissAll();
|
gFFI.dialogManager.dismissAll();
|
||||||
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
||||||
overlays: SystemUiOverlay.values);
|
overlays: SystemUiOverlay.values);
|
||||||
@ -132,6 +137,14 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didChangeMetrics() {
|
||||||
|
_timerDidChangeMetrics?.cancel();
|
||||||
|
_timerDidChangeMetrics = Timer(Duration(milliseconds: 100), () {
|
||||||
|
gFFI.canvasModel.updateViewStyle(refreshMousePos: false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// This listener is used to handle the composing region changes for Android soft keyboard input.
|
// This listener is used to handle the composing region changes for Android soft keyboard input.
|
||||||
void textAndroidListener() {
|
void textAndroidListener() {
|
||||||
if (_lastComposingChangeValid) {
|
if (_lastComposingChangeValid) {
|
||||||
@ -968,11 +981,9 @@ class ImagePaint extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final m = Provider.of<ImageModel>(context);
|
final m = Provider.of<ImageModel>(context);
|
||||||
final c = Provider.of<CanvasModel>(context);
|
final c = Provider.of<CanvasModel>(context);
|
||||||
final adjust = gFFI.cursorModel.adjustForKeyboard();
|
|
||||||
var s = c.scale;
|
var s = c.scale;
|
||||||
return CustomPaint(
|
return CustomPaint(
|
||||||
painter: ImagePainter(
|
painter: ImagePainter(image: m.image, x: c.x / s, y: c.y / s, scale: s),
|
||||||
image: m.image, x: c.x / s, y: (c.y - adjust) / s, scale: s),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -986,7 +997,6 @@ class CursorPaint extends StatelessWidget {
|
|||||||
final m = Provider.of<CursorModel>(context);
|
final m = Provider.of<CursorModel>(context);
|
||||||
final c = Provider.of<CanvasModel>(context);
|
final c = Provider.of<CanvasModel>(context);
|
||||||
final ffiModel = Provider.of<FfiModel>(context);
|
final ffiModel = Provider.of<FfiModel>(context);
|
||||||
final adjust = gFFI.cursorModel.adjustForKeyboard();
|
|
||||||
final s = c.scale;
|
final s = c.scale;
|
||||||
double hotx = m.hotx;
|
double hotx = m.hotx;
|
||||||
double hoty = m.hoty;
|
double hoty = m.hoty;
|
||||||
@ -1022,7 +1032,7 @@ class CursorPaint extends StatelessWidget {
|
|||||||
painter: ImagePainter(
|
painter: ImagePainter(
|
||||||
image: image,
|
image: image,
|
||||||
x: (m.x - hotx) * factor + c.x / s2,
|
x: (m.x - hotx) * factor + c.x / s2,
|
||||||
y: (m.y - hoty) * factor + (c.y - adjust) / s2,
|
y: (m.y - hoty) * factor + c.y / s2,
|
||||||
scale: s2),
|
scale: s2),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1466,10 +1466,14 @@ class CanvasModel with ChangeNotifier {
|
|||||||
|
|
||||||
updateViewStyle({refreshMousePos = true}) async {
|
updateViewStyle({refreshMousePos = true}) async {
|
||||||
Size getSize() {
|
Size getSize() {
|
||||||
final size = MediaQueryData.fromWindow(ui.window).size;
|
final mediaData = MediaQueryData.fromView(ui.window);
|
||||||
|
final size = mediaData.size;
|
||||||
// If minimized, w or h may be negative here.
|
// If minimized, w or h may be negative here.
|
||||||
double w = size.width - leftToEdge - rightToEdge;
|
double w = size.width - leftToEdge - rightToEdge;
|
||||||
double h = size.height - topToEdge - bottomToEdge;
|
double h = size.height - topToEdge - bottomToEdge;
|
||||||
|
if (isMobile) {
|
||||||
|
h -= (mediaData.padding.top + mediaData.viewInsets.bottom);
|
||||||
|
}
|
||||||
return Size(w < 0 ? 0 : w, h < 0 ? 0 : h);
|
return Size(w < 0 ? 0 : w, h < 0 ? 0 : h);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1643,13 +1647,9 @@ class CanvasModel with ChangeNotifier {
|
|||||||
// (focalPoint.dx - _x_1) / s1 + displayOriginX = (focalPoint.dx - _x_2) / s2 + displayOriginX
|
// (focalPoint.dx - _x_1) / s1 + displayOriginX = (focalPoint.dx - _x_2) / s2 + displayOriginX
|
||||||
// _x_2 = focalPoint.dx - (focalPoint.dx - _x_1) / s1 * s2
|
// _x_2 = focalPoint.dx - (focalPoint.dx - _x_1) / s1 * s2
|
||||||
_x = focalPoint.dx - (focalPoint.dx - _x) / s * _scale;
|
_x = focalPoint.dx - (focalPoint.dx - _x) / s * _scale;
|
||||||
final adjustForKeyboard =
|
// (focalPoint.dy - _y_1) / s1 + displayOriginY = (focalPoint.dy - _y_2) / s2 + displayOriginY
|
||||||
parent.target?.cursorModel.adjustForKeyboard() ?? 0.0;
|
// _y_2 = focalPoint.dy - (focalPoint.dy - _y_1) / s1 * s2
|
||||||
// (focalPoint.dy - _y_1 + adjust) / s1 + displayOriginY = (focalPoint.dy - _y_2 + adjust) / s2 + displayOriginY
|
_y = focalPoint.dy - (focalPoint.dy - _y) / s * _scale;
|
||||||
// _y_2 = focalPoint.dy + adjust - (focalPoint.dy - _y_1 + adjust) / s1 * s2
|
|
||||||
_y = focalPoint.dy +
|
|
||||||
adjustForKeyboard -
|
|
||||||
(focalPoint.dy - _y + adjustForKeyboard) / s * _scale;
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1883,7 +1883,6 @@ class CursorModel with ChangeNotifier {
|
|||||||
// `lastIsBlocked` is only used in common/widgets/remote_input.dart -> _RawTouchGestureDetectorRegionState -> onDoubleTap()
|
// `lastIsBlocked` is only used in common/widgets/remote_input.dart -> _RawTouchGestureDetectorRegionState -> onDoubleTap()
|
||||||
// Because onDoubleTap() doesn't have the `event` parameter, we can't get the touch event's position.
|
// Because onDoubleTap() doesn't have the `event` parameter, we can't get the touch event's position.
|
||||||
bool _lastIsBlocked = false;
|
bool _lastIsBlocked = false;
|
||||||
double _yForKeyboardAdjust = 0;
|
|
||||||
|
|
||||||
keyHelpToolsVisibilityChanged(Rect? r) {
|
keyHelpToolsVisibilityChanged(Rect? r) {
|
||||||
_keyHelpToolsRect = r;
|
_keyHelpToolsRect = r;
|
||||||
@ -1895,7 +1894,6 @@ class CursorModel with ChangeNotifier {
|
|||||||
// `lastIsBlocked` will be set when the cursor is moving or touch somewhere else.
|
// `lastIsBlocked` will be set when the cursor is moving or touch somewhere else.
|
||||||
_lastIsBlocked = true;
|
_lastIsBlocked = true;
|
||||||
}
|
}
|
||||||
_yForKeyboardAdjust = _y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get lastIsBlocked => _lastIsBlocked;
|
get lastIsBlocked => _lastIsBlocked;
|
||||||
@ -1947,19 +1945,6 @@ class CursorModel with ChangeNotifier {
|
|||||||
get keyboardHeight => MediaQueryData.fromWindow(ui.window).viewInsets.bottom;
|
get keyboardHeight => MediaQueryData.fromWindow(ui.window).viewInsets.bottom;
|
||||||
get scale => parent.target?.canvasModel.scale ?? 1.0;
|
get scale => parent.target?.canvasModel.scale ?? 1.0;
|
||||||
|
|
||||||
double adjustForKeyboard() {
|
|
||||||
if (keyboardHeight < 100) {
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
final m = MediaQueryData.fromWindow(ui.window);
|
|
||||||
final size = m.size;
|
|
||||||
final thresh = (size.height - keyboardHeight) / 2;
|
|
||||||
final h = (_yForKeyboardAdjust - getVisibleRect().top) *
|
|
||||||
scale; // local physical display height
|
|
||||||
return h - thresh;
|
|
||||||
}
|
|
||||||
|
|
||||||
// mobile Soft keyboard, block touch event from the KeyHelpTools
|
// mobile Soft keyboard, block touch event from the KeyHelpTools
|
||||||
shouldBlock(double x, double y) {
|
shouldBlock(double x, double y) {
|
||||||
if (!(parent.target?.ffiModel.touchMode ?? false)) {
|
if (!(parent.target?.ffiModel.touchMode ?? false)) {
|
||||||
@ -1980,16 +1965,16 @@ class CursorModel with ChangeNotifier {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_lastIsBlocked = false;
|
_lastIsBlocked = false;
|
||||||
moveLocal(x, y, adjust: adjustForKeyboard());
|
moveLocal(x, y);
|
||||||
parent.target?.inputModel.moveMouse(_x, _y);
|
parent.target?.inputModel.moveMouse(_x, _y);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
moveLocal(double x, double y, {double adjust = 0}) {
|
moveLocal(double x, double y) {
|
||||||
final xoffset = parent.target?.canvasModel.x ?? 0;
|
final xoffset = parent.target?.canvasModel.x ?? 0;
|
||||||
final yoffset = parent.target?.canvasModel.y ?? 0;
|
final yoffset = parent.target?.canvasModel.y ?? 0;
|
||||||
_x = (x - xoffset) / scale + _displayOriginX;
|
_x = (x - xoffset) / scale + _displayOriginX;
|
||||||
_y = (y - yoffset + adjust) / scale + _displayOriginY;
|
_y = (y - yoffset) / scale + _displayOriginY;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user