From 9e1cef141b35651d93148fc65fb14b91b57f6a63 Mon Sep 17 00:00:00 2001 From: cialloo Date: Thu, 25 Jul 2024 22:39:39 +0800 Subject: [PATCH] feat: exit alert --- lib/application_exit_control.dart | 65 +++++++++++++++++++++++++++++++ lib/l10n/app_en.arb | 6 ++- lib/l10n/app_zh.arb | 6 ++- lib/shared_pref_singleton.dart | 4 ++ 4 files changed, 79 insertions(+), 2 deletions(-) diff --git a/lib/application_exit_control.dart b/lib/application_exit_control.dart index d5e453b..0574e5a 100644 --- a/lib/application_exit_control.dart +++ b/lib/application_exit_control.dart @@ -1,8 +1,11 @@ import 'dart:ui'; import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:window_manager/window_manager.dart'; import 'package:winui_n2n/edge_state.dart'; import 'package:winui_n2n/home_page.dart'; +import 'package:winui_n2n/shared_pref_singleton.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; class ApplicationExitControl extends StatefulWidget { const ApplicationExitControl({super.key}); @@ -29,6 +32,68 @@ class _ApplicationExitControlState extends State { } Future _handleExitRequest() async { + if (SharedPrefSingleton().minimizeOnQuit == null) { + showDialog( + context: context, + builder: (context) { + bool minimize = false; + return AlertDialog( + title: Text(AppLocalizations.of(context)!.exitAlert), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + StatefulBuilder(builder: + (BuildContext context, StateSetter setState) { + return Checkbox( + value: minimize, + onChanged: (bool? value) { + SharedPrefSingleton() + .setMinimizeOrNot(value ?? false) + .then( + (_) { + setState( + () { + minimize = value ?? false; + }, + ); + }, + ); + }, + ); + }), + Text(AppLocalizations.of(context)!.alwaysMinimize), + ], + ), + Row( + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + windowManager.hide(); + }, + child: Text(AppLocalizations.of(context)!.minimize), + ), + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text(AppLocalizations.of(context)!.exit), + ), + ], + ), + ], + ), + ], + ); + }, + ); + + return AppExitResponse.cancel; + } + if (EdgeState.instance.isRunning && EdgeState.instance.process != null) { if (EdgeState.instance.process!.kill()) { EdgeState.instance.isRunning = false; diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a1056ff..aa24a13 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -24,5 +24,9 @@ "successfullyConnected": "Connected", "macOrIpAlreadyInUse": "MAC or IP address already in use or not released yet by supernode", "otherReasonFail": "Connect fail", - "clearLog": "Clear log" + "clearLog": "Clear log", + "exitAlert": "Do you want to exit or minimize?", + "alwaysMinimize": "Always minimize", + "minimize": "Minimize", + "exit": "Exit" } \ No newline at end of file diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index b85485e..c321ab1 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -24,5 +24,9 @@ "successfullyConnected": "已连接", "macOrIpAlreadyInUse": "MAC或IP地址已被占用或者未被中转服务器释放", "otherReasonFail": "连接失败", - "clearLog": "清除日志" + "clearLog": "清除日志", + "exitAlert": "退出或者最小化程序?", + "alwaysMinimize": "总是最小化", + "minimize": "最小化", + "exit": "退出" } \ No newline at end of file diff --git a/lib/shared_pref_singleton.dart b/lib/shared_pref_singleton.dart index 9e07401..00139c5 100644 --- a/lib/shared_pref_singleton.dart +++ b/lib/shared_pref_singleton.dart @@ -19,4 +19,8 @@ class SharedPrefSingleton { Future setSavedConnection(String config) => _pref.setString('saved_connection', config); String get savedConnection => _pref.getString('saved_connection') ?? '[]'; + + Future setMinimizeOrNot(bool min) => + _pref.setBool('minimize_on_quit', min); + bool? get minimizeOnQuit => _pref.getBool('minimize_on_quit'); }