From a8cddb5b19aeb24013a6562d445f78c0dd81a6cd Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 7 Aug 2023 09:51:05 +0800 Subject: [PATCH] split waiting for image Signed-off-by: 21pages --- flutter/lib/models/model.dart | 74 ++++++++++++++++------------------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index c5870243b..c9bcc0477 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -37,7 +37,8 @@ import 'platform_model.dart'; typedef HandleMsgBox = Function(Map evt, String id); typedef ReconnectHandle = Function(OverlayDialogManager, SessionID, bool); -final _waitForImage = {}; +final _waitForImageDialogShow = {}; +final _waitForFirstImage = {}; final _constSessionId = Uuid().v4obj(); class FfiModel with ChangeNotifier { @@ -424,17 +425,19 @@ class FfiModel with ChangeNotifier { closeConnection(); } - dialogManager.show( - (setState, close, context) => CustomAlertDialog( - title: null, - content: SelectionArea(child: msgboxContent(type, title, text)), - actions: [ - dialogButton("Cancel", onPressed: onClose, isOutline: true) - ], - onCancel: onClose), - tag: '$sessionId-waiting-for-image', - ); - _waitForImage[sessionId] = true; + Future.delayed(Duration.zero, () async { + await dialogManager.show( + (setState, close, context) => CustomAlertDialog( + title: null, + content: SelectionArea(child: msgboxContent(type, title, text)), + actions: [ + dialogButton("Cancel", onPressed: onClose, isOutline: true) + ], + onCancel: onClose), + tag: '$sessionId-waiting-for-image', + ); + _waitForImageDialogShow[sessionId] = true; + }); } _updateSessionWidthHeight(SessionID sessionId) { @@ -500,6 +503,7 @@ class FfiModel with ChangeNotifier { } if (displays.isNotEmpty) { _reconnects = 1; + _waitForFirstImage[sessionId] = true; } Map features = json.decode(evt['features']); _pi.features.privacyMode = features['privacy_mode'] == 1; @@ -644,24 +648,6 @@ class ImageModel with ChangeNotifier { addCallbackOnFirstImage(Function(String) cb) => callbacksOnFirstImage.add(cb); onRgba(Uint8List rgba) { - final waitforImage = _waitForImage[sessionId]; - if (waitforImage == null) { - debugPrint('Exception, peer $id not found for waiting image'); - return; - } - - if (waitforImage == true) { - _waitForImage[sessionId] = false; - parent.target?.dialogManager.dismissAll(); - clearWaitingForImage(parent.target?.dialogManager, sessionId); - - if (isDesktop) { - for (final cb in callbacksOnFirstImage) { - cb(id); - } - } - } - final pid = parent.target?.id; img.decodeImageFromPixels( rgba, @@ -1702,16 +1688,7 @@ class FFI { } } else if (message is EventToUI_Rgba) { if (useTextureRender) { - if (_waitForImage[sessionId] != false) { - _waitForImage[sessionId] = false; - dialogManager.dismissAll(); - for (final cb in imageModel.callbacksOnFirstImage) { - cb(id); - } - await canvasModel.updateViewStyle(); - await canvasModel.updateScrollStyle(); - clearWaitingForImage(dialogManager, sessionId); - } + onEvent2UIRgba(); } else { // Fetch the image buffer from rust codes. final sz = platformFFI.getRgbaSize(sessionId); @@ -1720,6 +1697,7 @@ class FFI { } final rgba = platformFFI.getRgba(sessionId, sz); if (rgba != null) { + onEvent2UIRgba(); imageModel.onRgba(rgba); } } @@ -1730,6 +1708,22 @@ class FFI { this.id = id; } + void onEvent2UIRgba() async { + if (_waitForImageDialogShow[sessionId] == true) { + _waitForImageDialogShow[sessionId] = false; + clearWaitingForImage(dialogManager, sessionId); + } + if (_waitForFirstImage[sessionId] == true) { + _waitForFirstImage[sessionId] = false; + dialogManager.dismissAll(); + await canvasModel.updateViewStyle(); + await canvasModel.updateScrollStyle(); + for (final cb in imageModel.callbacksOnFirstImage) { + cb(id); + } + } + } + /// Login with [password], choose if the client should [remember] it. void login(String osUsername, String osPassword, SessionID sessionId, String password, bool remember) {