From 39a1545e94af91c39915e73cd33fc2d85af8122b Mon Sep 17 00:00:00 2001 From: 21pages Date: Thu, 1 Sep 2022 12:07:05 +0800 Subject: [PATCH] add close confirmation dialog Signed-off-by: 21pages --- flutter/lib/desktop/pages/server_page.dart | 38 +++++++------ .../lib/desktop/widgets/tabbar_widget.dart | 55 ++++++++++++++++--- 2 files changed, 67 insertions(+), 26 deletions(-) diff --git a/flutter/lib/desktop/pages/server_page.dart b/flutter/lib/desktop/pages/server_page.dart index e7922403b..b4573297a 100644 --- a/flutter/lib/desktop/pages/server_page.dart +++ b/flutter/lib/desktop/pages/server_page.dart @@ -48,22 +48,25 @@ class _DesktopServerPageState extends State ], child: Consumer( builder: (context, serverModel, child) => Container( - decoration: BoxDecoration( - border: - Border.all(color: MyTheme.color(context).border!)), - child: Scaffold( - backgroundColor: MyTheme.color(context).bg, - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded(child: ConnectionManager()), - SizedBox.fromSize(size: Size(0, 15.0)), - ], - ), - ), - ), - ))); + decoration: BoxDecoration( + border: Border.all(color: MyTheme.color(context).border!)), + child: Scaffold( + backgroundColor: MyTheme.color(context).bg, + body: Overlay(initialEntries: [ + OverlayEntry(builder: (context) { + gFFI.dialogManager.setOverlayState(Overlay.of(context)); + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded(child: ConnectionManager()), + SizedBox.fromSize(size: Size(0, 15.0)), + ], + ), + ); + }) + ]), + )))); } @override @@ -109,7 +112,8 @@ class ConnectionManagerState extends State { theme: isDarkTheme() ? TarBarTheme.dark() : TarBarTheme.light(), showTitle: false, showMaximize: false, - showMinimize: false, + showMinimize: true, + showClose: true, controller: serverModel.tabController, tabType: DesktopTabType.cm, pageViewBuilder: (pageView) => Row(children: [ diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 38e724bad..755d6946c 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -314,6 +314,8 @@ class DesktopTab extends StatelessWidget { Offstage(offstage: tail == null, child: tail), WindowActionPanel( mainTab: isMainWindow, + tabType: tabType, + state: state, theme: theme, showMinimize: showMinimize, showMaximize: showMaximize, @@ -327,6 +329,8 @@ class DesktopTab extends StatelessWidget { class WindowActionPanel extends StatelessWidget { final bool mainTab; + final DesktopTabType tabType; + final Rx state; final TarBarTheme theme; final bool showMinimize; @@ -337,6 +341,8 @@ class WindowActionPanel extends StatelessWidget { const WindowActionPanel( {Key? key, required this.mainTab, + required this.tabType, + required this.state, required this.theme, this.showMinimize = true, this.showMaximize = true, @@ -411,22 +417,53 @@ class WindowActionPanel extends StatelessWidget { message: 'Close', icon: IconFont.close, theme: theme, - onTap: () { - if (mainTab) { - windowManager.close(); - } else { - // only hide for multi window, not close - Future.delayed(Duration.zero, () { - WindowController.fromWindowId(windowId!).hide(); - }); + onTap: () async { + action() { + if (mainTab) { + windowManager.close(); + } else { + // only hide for multi window, not close + Future.delayed(Duration.zero, () { + WindowController.fromWindowId(windowId!).hide(); + }); + } + onClose?.call(); + } + + if (tabType != DesktopTabType.main && + state.value.tabs.length > 1) { + closeConfirmDialog(action); + } else { + action(); } - onClose?.call(); }, is_close: true, )), ], ); } + + closeConfirmDialog(Function() callback) async { + final res = await gFFI.dialogManager + .show((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