Merge pull request #1282 from Heap-Hop/flutter_desktop
Add showToast & dialog clickMaskDismiss
This commit is contained in:
		
						commit
						22d346831e
					
				| @ -136,7 +136,6 @@ class OverlayDialogManager { | ||||
|     BackButtonInterceptor.removeByName(tag); | ||||
|   } | ||||
| 
 | ||||
|   // TODO clickMaskDismiss | ||||
|   Future<T?> show<T>(DialogBuilder builder, | ||||
|       {bool clickMaskDismiss = false, | ||||
|       bool backDismiss = false, | ||||
| @ -168,10 +167,22 @@ class OverlayDialogManager { | ||||
|       BackButtonInterceptor.removeByName(_tag); | ||||
|     }; | ||||
|     dialog.entry = OverlayEntry(builder: (_) { | ||||
|       return Container( | ||||
|           color: Colors.transparent, | ||||
|           child: StatefulBuilder( | ||||
|               builder: (_, setState) => builder(setState, close))); | ||||
|       bool innerClicked = false; | ||||
|       return Listener( | ||||
|           onPointerUp: (_) { | ||||
|             if (!innerClicked && clickMaskDismiss) { | ||||
|               close(); | ||||
|             } | ||||
|             innerClicked = false; | ||||
|           }, | ||||
|           child: Container( | ||||
|               color: Colors.black12, | ||||
|               child: StatefulBuilder(builder: (context, setState) { | ||||
|                 return Listener( | ||||
|                   onPointerUp: (_) => innerClicked = true, | ||||
|                   child: builder(setState, close), | ||||
|                 ); | ||||
|               }))); | ||||
|     }); | ||||
|     overlayState.insert(dialog.entry!); | ||||
|     BackButtonInterceptor.add((stopDefaultButtonEvent, routeInfo) { | ||||
| @ -184,7 +195,9 @@ class OverlayDialogManager { | ||||
|   } | ||||
| 
 | ||||
|   void showLoading(String text, | ||||
|       {bool clickMaskDismiss = false, bool cancelToClose = false}) { | ||||
|       {bool clickMaskDismiss = false, | ||||
|       bool showCancel = true, | ||||
|       VoidCallback? onCancel}) { | ||||
|     show((setState, close) => CustomAlertDialog( | ||||
|         content: Container( | ||||
|             color: MyTheme.white, | ||||
| @ -200,21 +213,52 @@ class OverlayDialogManager { | ||||
|                       child: Text(translate(text), | ||||
|                           style: TextStyle(fontSize: 15))), | ||||
|                   SizedBox(height: 20), | ||||
|                   Center( | ||||
|                   Offstage( | ||||
|                       offstage: !showCancel, | ||||
|                       child: Center( | ||||
|                           child: TextButton( | ||||
|                               style: flatButtonStyle, | ||||
|                               onPressed: () { | ||||
|                                 dismissAll(); | ||||
|                             if (cancelToClose) backToHomePage(); | ||||
|                                 if (onCancel != null) { | ||||
|                                   onCancel(); | ||||
|                                 } | ||||
|                               }, | ||||
|                               child: Text(translate('Cancel'), | ||||
|                               style: TextStyle(color: MyTheme.accent)))) | ||||
|                                   style: TextStyle(color: MyTheme.accent))))) | ||||
|                 ])))); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|   void showToast(String text) { | ||||
|     // TODO | ||||
|   } | ||||
| void showToast(String text, {Duration timeout = const Duration(seconds: 2)}) { | ||||
|   final overlayState = globalKey.currentState?.overlay; | ||||
|   if (overlayState == null) return; | ||||
|   final entry = OverlayEntry(builder: (_) { | ||||
|     return IgnorePointer( | ||||
|         child: Align( | ||||
|             alignment: Alignment(0.0, 0.8), | ||||
|             child: Container( | ||||
|               decoration: BoxDecoration( | ||||
|                 color: Colors.black.withOpacity(0.6), | ||||
|                 borderRadius: BorderRadius.all( | ||||
|                   Radius.circular(20), | ||||
|                 ), | ||||
|               ), | ||||
|               padding: EdgeInsets.symmetric(horizontal: 20, vertical: 5), | ||||
|               child: Text( | ||||
|                 text, | ||||
|                 style: TextStyle( | ||||
|                     decoration: TextDecoration.none, | ||||
|                     fontWeight: FontWeight.w300, | ||||
|                     fontSize: 18, | ||||
|                     color: Colors.white), | ||||
|               ), | ||||
|             ))); | ||||
|   }); | ||||
|   overlayState.insert(entry); | ||||
|   Future.delayed(timeout, () { | ||||
|     entry.remove(); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| class CustomAlertDialog extends StatelessWidget { | ||||
|  | ||||
| @ -1,5 +1,4 @@ | ||||
| import 'dart:async'; | ||||
| import 'dart:convert'; | ||||
| import 'dart:io'; | ||||
| 
 | ||||
| import 'package:flutter/material.dart' hide MenuItem; | ||||
| @ -120,7 +119,7 @@ class _DesktopHomePageState extends State<DesktopHomePage> | ||||
|                       onDoubleTap: () { | ||||
|                         Clipboard.setData( | ||||
|                             ClipboardData(text: model.serverId.text)); | ||||
|                         gFFI.dialogManager.showToast(translate("Copied")); | ||||
|                         showToast(translate("Copied")); | ||||
|                       }, | ||||
|                       child: TextFormField( | ||||
|                         controller: model.serverId, | ||||
| @ -257,7 +256,7 @@ class _DesktopHomePageState extends State<DesktopHomePage> | ||||
|                                 kUsePermanentPassword) { | ||||
|                               Clipboard.setData( | ||||
|                                   ClipboardData(text: model.serverPasswd.text)); | ||||
|                               gFFI.dialogManager.showToast(translate("Copied")); | ||||
|                               showToast(translate("Copied")); | ||||
|                             } | ||||
|                           }, | ||||
|                           child: TextFormField( | ||||
|  | ||||
| @ -62,7 +62,7 @@ class _RemotePageState extends State<RemotePage> | ||||
|     WidgetsBinding.instance.addPostFrameCallback((_) { | ||||
|       SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); | ||||
|       _ffi.dialogManager | ||||
|           .showLoading(translate('Connecting...'), cancelToClose: true); | ||||
|           .showLoading(translate('Connecting...'), onCancel: backToHomePage); | ||||
|       _interval = | ||||
|           Timer.periodic(Duration(milliseconds: 30), (timer) => interval()); | ||||
|     }); | ||||
|  | ||||
| @ -29,7 +29,7 @@ class _FileManagerPageState extends State<FileManagerPage> { | ||||
|     gFFI.connect(widget.id, isFileTransfer: true); | ||||
|     WidgetsBinding.instance.addPostFrameCallback((_) { | ||||
|       gFFI.dialogManager | ||||
|           .showLoading(translate('Connecting...'), cancelToClose: true); | ||||
|           .showLoading(translate('Connecting...'), onCancel: backToHomePage); | ||||
|     }); | ||||
|     gFFI.ffiModel.updateEventListener(widget.id); | ||||
|     Wakelock.enable(); | ||||
|  | ||||
| @ -51,7 +51,7 @@ class _RemotePageState extends State<RemotePage> { | ||||
|     WidgetsBinding.instance.addPostFrameCallback((_) { | ||||
|       SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); | ||||
|       gFFI.dialogManager | ||||
|           .showLoading(translate('Connecting...'), cancelToClose: true); | ||||
|           .showLoading(translate('Connecting...'), onCancel: backToHomePage); | ||||
|       _interval = | ||||
|           Timer.periodic(Duration(milliseconds: 30), (timer) => interval()); | ||||
|     }); | ||||
|  | ||||
| @ -63,7 +63,7 @@ class _ScanPageState extends State<ScanPage> { | ||||
|                       var result = reader.decode(bitmap); | ||||
|                       showServerSettingFromQr(result.text); | ||||
|                     } catch (e) { | ||||
|                       gFFI.dialogManager.showToast('No QR code found'); | ||||
|                       showToast('No QR code found'); | ||||
|                     } | ||||
|                   } | ||||
|                 }), | ||||
| @ -121,7 +121,7 @@ class _ScanPageState extends State<ScanPage> { | ||||
| 
 | ||||
|   void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) { | ||||
|     if (!p) { | ||||
|       gFFI.dialogManager.showToast('No permisssion'); | ||||
|       showToast('No permission'); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| @ -135,7 +135,7 @@ class _ScanPageState extends State<ScanPage> { | ||||
|     backToHomePage(); | ||||
|     await controller?.pauseCamera(); | ||||
|     if (!data.startsWith('config=')) { | ||||
|       gFFI.dialogManager.showToast('Invalid QR code'); | ||||
|       showToast('Invalid QR code'); | ||||
|       return; | ||||
|     } | ||||
|     try { | ||||
| @ -147,7 +147,7 @@ class _ScanPageState extends State<ScanPage> { | ||||
|         showServerSettingsWithValue(host, '', key, api, gFFI.dialogManager); | ||||
|       }); | ||||
|     } catch (e) { | ||||
|       gFFI.dialogManager.showToast('Invalid QR code'); | ||||
|       showToast('Invalid QR code'); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -363,7 +363,7 @@ void logout(OverlayDialogManager dialogManager) async { | ||||
|         }, | ||||
|         body: json.encode(body)); | ||||
|   } catch (e) { | ||||
|     dialogManager.showToast('Failed to access $url'); | ||||
|     showToast('Failed to access $url'); | ||||
|   } | ||||
|   resetToken(); | ||||
| } | ||||
|  | ||||
| @ -8,15 +8,12 @@ void clientClose(OverlayDialogManager dialogManager) { | ||||
|   msgBox('', 'Close', 'Are you sure to close the connection?', dialogManager); | ||||
| } | ||||
| 
 | ||||
| const SEC1 = Duration(seconds: 1); | ||||
| void showSuccess({Duration duration = SEC1}) { | ||||
|   // TODO | ||||
|   // showToast(translate("Successful"), duration: SEC1); | ||||
| void showSuccess() { | ||||
|   showToast(translate("Successful")); | ||||
| } | ||||
| 
 | ||||
| void showError({Duration duration = SEC1}) { | ||||
|   // TODO | ||||
|   // showToast(translate("Error"), duration: SEC1); | ||||
| void showError() { | ||||
|   showToast(translate("Error")); | ||||
| } | ||||
| 
 | ||||
| void setPermanentPasswordDialog(OverlayDialogManager dialogManager) async { | ||||
| @ -87,8 +84,10 @@ void setPermanentPasswordDialog(OverlayDialogManager dialogManager) async { | ||||
|                   close(); | ||||
|                   dialogManager.showLoading(translate("Waiting")); | ||||
|                   if (await gFFI.serverModel.setPermanentPassword(p0.text)) { | ||||
|                     dialogManager.dismissAll(); | ||||
|                     showSuccess(); | ||||
|                   } else { | ||||
|                     dialogManager.dismissAll(); | ||||
|                     showError(); | ||||
|                   } | ||||
|                 } | ||||
| @ -174,7 +173,7 @@ void enterPasswordDialog(String id, OverlayDialogManager dialogManager) async { | ||||
|             gFFI.login(id, text, remember); | ||||
|             close(); | ||||
|             dialogManager.showLoading(translate('Logging in...'), | ||||
|                 cancelToClose: true); | ||||
|                 onCancel: backToHomePage); | ||||
|           }, | ||||
|           child: Text(translate('OK')), | ||||
|         ), | ||||
|  | ||||
| @ -287,7 +287,7 @@ class FfiModel with ChangeNotifier { | ||||
|         bind.sessionReconnect(id: id); | ||||
|         clearPermissions(); | ||||
|         dialogManager.showLoading(translate('Connecting...'), | ||||
|             cancelToClose: true); | ||||
|             onCancel: backToHomePage); | ||||
|       }); | ||||
|       _reconnects *= 2; | ||||
|     } else { | ||||
| @ -335,7 +335,7 @@ class FfiModel with ChangeNotifier { | ||||
|       if (displays.length > 0) { | ||||
|         parent.target?.dialogManager.showLoading( | ||||
|             translate('Connected, waiting for image...'), | ||||
|             cancelToClose: true); | ||||
|             onCancel: backToHomePage); | ||||
|         _waitForImage = true; | ||||
|         _reconnects = 1; | ||||
|       } | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user