add close confirmation dialog

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages 2022-09-01 12:07:05 +08:00
parent 06541be459
commit 39a1545e94
2 changed files with 67 additions and 26 deletions

View File

@ -49,11 +49,13 @@ class _DesktopServerPageState extends State<DesktopServerPage>
child: Consumer<ServerModel>( child: Consumer<ServerModel>(
builder: (context, serverModel, child) => Container( builder: (context, serverModel, child) => Container(
decoration: BoxDecoration( decoration: BoxDecoration(
border: border: Border.all(color: MyTheme.color(context).border!)),
Border.all(color: MyTheme.color(context).border!)),
child: Scaffold( child: Scaffold(
backgroundColor: MyTheme.color(context).bg, backgroundColor: MyTheme.color(context).bg,
body: Center( body: Overlay(initialEntries: [
OverlayEntry(builder: (context) {
gFFI.dialogManager.setOverlayState(Overlay.of(context));
return Center(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
@ -61,9 +63,10 @@ class _DesktopServerPageState extends State<DesktopServerPage>
SizedBox.fromSize(size: Size(0, 15.0)), SizedBox.fromSize(size: Size(0, 15.0)),
], ],
), ),
), );
), })
))); ]),
))));
} }
@override @override
@ -109,7 +112,8 @@ class ConnectionManagerState extends State<ConnectionManager> {
theme: isDarkTheme() ? TarBarTheme.dark() : TarBarTheme.light(), theme: isDarkTheme() ? TarBarTheme.dark() : TarBarTheme.light(),
showTitle: false, showTitle: false,
showMaximize: false, showMaximize: false,
showMinimize: false, showMinimize: true,
showClose: true,
controller: serverModel.tabController, controller: serverModel.tabController,
tabType: DesktopTabType.cm, tabType: DesktopTabType.cm,
pageViewBuilder: (pageView) => Row(children: [ pageViewBuilder: (pageView) => Row(children: [

View File

@ -314,6 +314,8 @@ class DesktopTab extends StatelessWidget {
Offstage(offstage: tail == null, child: tail), Offstage(offstage: tail == null, child: tail),
WindowActionPanel( WindowActionPanel(
mainTab: isMainWindow, mainTab: isMainWindow,
tabType: tabType,
state: state,
theme: theme, theme: theme,
showMinimize: showMinimize, showMinimize: showMinimize,
showMaximize: showMaximize, showMaximize: showMaximize,
@ -327,6 +329,8 @@ class DesktopTab extends StatelessWidget {
class WindowActionPanel extends StatelessWidget { class WindowActionPanel extends StatelessWidget {
final bool mainTab; final bool mainTab;
final DesktopTabType tabType;
final Rx<DesktopTabState> state;
final TarBarTheme theme; final TarBarTheme theme;
final bool showMinimize; final bool showMinimize;
@ -337,6 +341,8 @@ class WindowActionPanel extends StatelessWidget {
const WindowActionPanel( const WindowActionPanel(
{Key? key, {Key? key,
required this.mainTab, required this.mainTab,
required this.tabType,
required this.state,
required this.theme, required this.theme,
this.showMinimize = true, this.showMinimize = true,
this.showMaximize = true, this.showMaximize = true,
@ -411,7 +417,8 @@ class WindowActionPanel extends StatelessWidget {
message: 'Close', message: 'Close',
icon: IconFont.close, icon: IconFont.close,
theme: theme, theme: theme,
onTap: () { onTap: () async {
action() {
if (mainTab) { if (mainTab) {
windowManager.close(); windowManager.close();
} else { } else {
@ -421,12 +428,42 @@ class WindowActionPanel extends StatelessWidget {
}); });
} }
onClose?.call(); onClose?.call();
}
if (tabType != DesktopTabType.main &&
state.value.tabs.length > 1) {
closeConfirmDialog(action);
} else {
action();
}
}, },
is_close: true, is_close: true,
)), )),
], ],
); );
} }
closeConfirmDialog(Function() callback) async {
final res = await gFFI.dialogManager
.show<bool>((setState, close) => CustomAlertDialog(
title: Row(children: [
Icon(Icons.warning_amber_sharp,
color: Colors.redAccent, size: 28),
SizedBox(width: 10),
Text(translate("Warning")),
]),
content: Text(translate("Disconnect all devices?")),
actions: [
TextButton(
onPressed: () => close(), child: Text(translate("Cancel"))),
ElevatedButton(
onPressed: () => close(true), child: Text(translate("OK"))),
],
));
if (res == true) {
callback();
}
}
} }
// ignore: must_be_immutable // ignore: must_be_immutable