add showToast & dialog clickMaskDismiss
This commit is contained in:
parent
f9a2047ec5
commit
da4c218ea3
@ -136,7 +136,6 @@ class OverlayDialogManager {
|
|||||||
BackButtonInterceptor.removeByName(tag);
|
BackButtonInterceptor.removeByName(tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO clickMaskDismiss
|
|
||||||
Future<T?> show<T>(DialogBuilder builder,
|
Future<T?> show<T>(DialogBuilder builder,
|
||||||
{bool clickMaskDismiss = false,
|
{bool clickMaskDismiss = false,
|
||||||
bool backDismiss = false,
|
bool backDismiss = false,
|
||||||
@ -168,10 +167,22 @@ class OverlayDialogManager {
|
|||||||
BackButtonInterceptor.removeByName(_tag);
|
BackButtonInterceptor.removeByName(_tag);
|
||||||
};
|
};
|
||||||
dialog.entry = OverlayEntry(builder: (_) {
|
dialog.entry = OverlayEntry(builder: (_) {
|
||||||
return Container(
|
bool innerClicked = false;
|
||||||
color: Colors.transparent,
|
return Listener(
|
||||||
child: StatefulBuilder(
|
onPointerUp: (_) {
|
||||||
builder: (_, setState) => builder(setState, close)));
|
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!);
|
overlayState.insert(dialog.entry!);
|
||||||
BackButtonInterceptor.add((stopDefaultButtonEvent, routeInfo) {
|
BackButtonInterceptor.add((stopDefaultButtonEvent, routeInfo) {
|
||||||
@ -184,7 +195,9 @@ class OverlayDialogManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void showLoading(String text,
|
void showLoading(String text,
|
||||||
{bool clickMaskDismiss = false, bool cancelToClose = false}) {
|
{bool clickMaskDismiss = false,
|
||||||
|
bool showCancel = true,
|
||||||
|
VoidCallback? onCancel}) {
|
||||||
show((setState, close) => CustomAlertDialog(
|
show((setState, close) => CustomAlertDialog(
|
||||||
content: Container(
|
content: Container(
|
||||||
color: MyTheme.white,
|
color: MyTheme.white,
|
||||||
@ -200,21 +213,52 @@ class OverlayDialogManager {
|
|||||||
child: Text(translate(text),
|
child: Text(translate(text),
|
||||||
style: TextStyle(fontSize: 15))),
|
style: TextStyle(fontSize: 15))),
|
||||||
SizedBox(height: 20),
|
SizedBox(height: 20),
|
||||||
Center(
|
Offstage(
|
||||||
child: TextButton(
|
offstage: !showCancel,
|
||||||
style: flatButtonStyle,
|
child: Center(
|
||||||
onPressed: () {
|
child: TextButton(
|
||||||
dismissAll();
|
style: flatButtonStyle,
|
||||||
if (cancelToClose) backToHomePage();
|
onPressed: () {
|
||||||
},
|
dismissAll();
|
||||||
child: Text(translate('Cancel'),
|
if (onCancel != null) {
|
||||||
style: TextStyle(color: MyTheme.accent))))
|
onCancel();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text(translate('Cancel'),
|
||||||
|
style: TextStyle(color: MyTheme.accent)))))
|
||||||
]))));
|
]))));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void showToast(String text) {
|
void showToast(String text, {Duration timeout = const Duration(seconds: 2)}) {
|
||||||
// TODO
|
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 {
|
class CustomAlertDialog extends StatelessWidget {
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart' hide MenuItem;
|
import 'package:flutter/material.dart' hide MenuItem;
|
||||||
@ -120,7 +119,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
|||||||
onDoubleTap: () {
|
onDoubleTap: () {
|
||||||
Clipboard.setData(
|
Clipboard.setData(
|
||||||
ClipboardData(text: model.serverId.text));
|
ClipboardData(text: model.serverId.text));
|
||||||
gFFI.dialogManager.showToast(translate("Copied"));
|
showToast(translate("Copied"));
|
||||||
},
|
},
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
controller: model.serverId,
|
controller: model.serverId,
|
||||||
@ -257,7 +256,7 @@ class _DesktopHomePageState extends State<DesktopHomePage>
|
|||||||
kUsePermanentPassword) {
|
kUsePermanentPassword) {
|
||||||
Clipboard.setData(
|
Clipboard.setData(
|
||||||
ClipboardData(text: model.serverPasswd.text));
|
ClipboardData(text: model.serverPasswd.text));
|
||||||
gFFI.dialogManager.showToast(translate("Copied"));
|
showToast(translate("Copied"));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
|
@ -62,7 +62,7 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
||||||
_ffi.dialogManager
|
_ffi.dialogManager
|
||||||
.showLoading(translate('Connecting...'), cancelToClose: true);
|
.showLoading(translate('Connecting...'), onCancel: backToHomePage);
|
||||||
_interval =
|
_interval =
|
||||||
Timer.periodic(Duration(milliseconds: 30), (timer) => interval());
|
Timer.periodic(Duration(milliseconds: 30), (timer) => interval());
|
||||||
});
|
});
|
||||||
|
@ -29,7 +29,7 @@ class _FileManagerPageState extends State<FileManagerPage> {
|
|||||||
gFFI.connect(widget.id, isFileTransfer: true);
|
gFFI.connect(widget.id, isFileTransfer: true);
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
gFFI.dialogManager
|
gFFI.dialogManager
|
||||||
.showLoading(translate('Connecting...'), cancelToClose: true);
|
.showLoading(translate('Connecting...'), onCancel: backToHomePage);
|
||||||
});
|
});
|
||||||
gFFI.ffiModel.updateEventListener(widget.id);
|
gFFI.ffiModel.updateEventListener(widget.id);
|
||||||
Wakelock.enable();
|
Wakelock.enable();
|
||||||
|
@ -51,7 +51,7 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
||||||
gFFI.dialogManager
|
gFFI.dialogManager
|
||||||
.showLoading(translate('Connecting...'), cancelToClose: true);
|
.showLoading(translate('Connecting...'), onCancel: backToHomePage);
|
||||||
_interval =
|
_interval =
|
||||||
Timer.periodic(Duration(milliseconds: 30), (timer) => interval());
|
Timer.periodic(Duration(milliseconds: 30), (timer) => interval());
|
||||||
});
|
});
|
||||||
|
@ -63,7 +63,7 @@ class _ScanPageState extends State<ScanPage> {
|
|||||||
var result = reader.decode(bitmap);
|
var result = reader.decode(bitmap);
|
||||||
showServerSettingFromQr(result.text);
|
showServerSettingFromQr(result.text);
|
||||||
} catch (e) {
|
} 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) {
|
void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) {
|
||||||
if (!p) {
|
if (!p) {
|
||||||
gFFI.dialogManager.showToast('No permisssion');
|
showToast('No permission');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ class _ScanPageState extends State<ScanPage> {
|
|||||||
backToHomePage();
|
backToHomePage();
|
||||||
await controller?.pauseCamera();
|
await controller?.pauseCamera();
|
||||||
if (!data.startsWith('config=')) {
|
if (!data.startsWith('config=')) {
|
||||||
gFFI.dialogManager.showToast('Invalid QR code');
|
showToast('Invalid QR code');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@ -147,7 +147,7 @@ class _ScanPageState extends State<ScanPage> {
|
|||||||
showServerSettingsWithValue(host, '', key, api, gFFI.dialogManager);
|
showServerSettingsWithValue(host, '', key, api, gFFI.dialogManager);
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} 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));
|
body: json.encode(body));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
dialogManager.showToast('Failed to access $url');
|
showToast('Failed to access $url');
|
||||||
}
|
}
|
||||||
resetToken();
|
resetToken();
|
||||||
}
|
}
|
||||||
|
@ -8,15 +8,12 @@ void clientClose(OverlayDialogManager dialogManager) {
|
|||||||
msgBox('', 'Close', 'Are you sure to close the connection?', dialogManager);
|
msgBox('', 'Close', 'Are you sure to close the connection?', dialogManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SEC1 = Duration(seconds: 1);
|
void showSuccess() {
|
||||||
void showSuccess({Duration duration = SEC1}) {
|
showToast(translate("Successful"));
|
||||||
// TODO
|
|
||||||
// showToast(translate("Successful"), duration: SEC1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void showError({Duration duration = SEC1}) {
|
void showError() {
|
||||||
// TODO
|
showToast(translate("Error"));
|
||||||
// showToast(translate("Error"), duration: SEC1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPermanentPasswordDialog(OverlayDialogManager dialogManager) async {
|
void setPermanentPasswordDialog(OverlayDialogManager dialogManager) async {
|
||||||
@ -174,7 +171,7 @@ void enterPasswordDialog(String id, OverlayDialogManager dialogManager) async {
|
|||||||
gFFI.login(id, text, remember);
|
gFFI.login(id, text, remember);
|
||||||
close();
|
close();
|
||||||
dialogManager.showLoading(translate('Logging in...'),
|
dialogManager.showLoading(translate('Logging in...'),
|
||||||
cancelToClose: true);
|
onCancel: backToHomePage);
|
||||||
},
|
},
|
||||||
child: Text(translate('OK')),
|
child: Text(translate('OK')),
|
||||||
),
|
),
|
||||||
|
@ -287,7 +287,7 @@ class FfiModel with ChangeNotifier {
|
|||||||
bind.sessionReconnect(id: id);
|
bind.sessionReconnect(id: id);
|
||||||
clearPermissions();
|
clearPermissions();
|
||||||
dialogManager.showLoading(translate('Connecting...'),
|
dialogManager.showLoading(translate('Connecting...'),
|
||||||
cancelToClose: true);
|
onCancel: backToHomePage);
|
||||||
});
|
});
|
||||||
_reconnects *= 2;
|
_reconnects *= 2;
|
||||||
} else {
|
} else {
|
||||||
@ -335,7 +335,7 @@ class FfiModel with ChangeNotifier {
|
|||||||
if (displays.length > 0) {
|
if (displays.length > 0) {
|
||||||
parent.target?.dialogManager.showLoading(
|
parent.target?.dialogManager.showLoading(
|
||||||
translate('Connected, waiting for image...'),
|
translate('Connected, waiting for image...'),
|
||||||
cancelToClose: true);
|
onCancel: backToHomePage);
|
||||||
_waitForImage = true;
|
_waitForImage = true;
|
||||||
_reconnects = 1;
|
_reconnects = 1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user