feat: exit tray item

This commit is contained in:
cialloo
2024-07-26 20:45:44 +08:00
committed by Cialloo
parent b86e704d45
commit e7f6275f8f
3 changed files with 88 additions and 71 deletions

View File

@@ -3,6 +3,7 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
import 'package:winui_n2n/edge_state.dart'; import 'package:winui_n2n/edge_state.dart';
import 'package:winui_n2n/globals.dart';
import 'package:winui_n2n/home_page.dart'; import 'package:winui_n2n/home_page.dart';
import 'package:winui_n2n/shared_pref_singleton.dart'; import 'package:winui_n2n/shared_pref_singleton.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@@ -32,82 +33,84 @@ class _ApplicationExitControlState extends State<ApplicationExitControl> {
} }
Future<AppExitResponse> _handleExitRequest() async { Future<AppExitResponse> _handleExitRequest() async {
if (SharedPrefSingleton().minimizeOnQuit == null) { if (!forceExit) {
final exitApp = await showDialog<bool?>( if (SharedPrefSingleton().minimizeOnQuit == null) {
context: context, final exitApp = await showDialog<bool?>(
builder: (context) { context: context,
bool minimize = false; builder: (context) {
return AlertDialog( bool minimize = false;
title: Text(AppLocalizations.of(context)!.exitAlert), return AlertDialog(
actions: <Widget>[ title: Text(AppLocalizations.of(context)!.exitAlert),
Row( actions: <Widget>[
mainAxisAlignment: MainAxisAlignment.spaceBetween, Row(
children: [ mainAxisAlignment: MainAxisAlignment.spaceBetween,
Row( children: [
children: [ Row(
StatefulBuilder(builder: children: [
(BuildContext context, StateSetter setState) { StatefulBuilder(builder:
return Checkbox( (BuildContext context, StateSetter setState) {
value: minimize, return Checkbox(
onChanged: (bool? value) { value: minimize,
SharedPrefSingleton() onChanged: (bool? value) {
.setMinimizeOrNot(value ?? false) SharedPrefSingleton()
.then( .setMinimizeOrNot(value ?? false)
(_) { .then(
setState( (_) {
() { setState(
minimize = value ?? false; () {
}, minimize = value ?? false;
); },
}, );
); },
);
},
);
}),
Text(AppLocalizations.of(context)!.alwaysMinimize),
],
),
Row(
children: [
TextButton(
onPressed: () {
Navigator.pop(context, false);
windowManager.hide();
}, },
); child: Text(AppLocalizations.of(context)!.minimize),
}), ),
Text(AppLocalizations.of(context)!.alwaysMinimize), TextButton(
], onPressed: () {
), Navigator.pop(context, true);
Row( },
children: [ child: Text(AppLocalizations.of(context)!.exit),
TextButton( ),
onPressed: () { ],
Navigator.pop(context, false); ),
windowManager.hide(); ],
}, ),
child: Text(AppLocalizations.of(context)!.minimize), ],
), );
TextButton( },
onPressed: () { );
Navigator.pop(context, true);
},
child: Text(AppLocalizations.of(context)!.exit),
),
],
),
],
),
],
);
},
);
if (exitApp == null || exitApp == false) { if (exitApp == null || exitApp == false) {
return AppExitResponse.cancel;
}
}
if (SharedPrefSingleton().minimizeOnQuit == true) {
windowManager.hide();
return AppExitResponse.cancel; return AppExitResponse.cancel;
} }
}
if (SharedPrefSingleton().minimizeOnQuit == true) { if (EdgeState.instance.isRunning && EdgeState.instance.process != null) {
windowManager.hide(); if (EdgeState.instance.process!.kill()) {
return AppExitResponse.cancel; EdgeState.instance.isRunning = false;
} EdgeState.instance.process = null;
} else {
if (EdgeState.instance.isRunning && EdgeState.instance.process != null) { // TODO: Handle abnormal close.
if (EdgeState.instance.process!.kill()) { return AppExitResponse.cancel;
EdgeState.instance.isRunning = false; }
EdgeState.instance.process = null;
} else {
// TODO: Handle abnormal close.
return AppExitResponse.cancel;
} }
} }

View File

@@ -2,3 +2,5 @@ import 'package:flutter/material.dart';
final GlobalKey<ScaffoldMessengerState> snackbarKey = final GlobalKey<ScaffoldMessengerState> snackbarKey =
GlobalKey<ScaffoldMessengerState>(); GlobalKey<ScaffoldMessengerState>();
bool forceExit = false;

View File

@@ -1,7 +1,11 @@
import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
import 'package:winui_n2n/control_page.dart'; import 'package:winui_n2n/control_page.dart';
import 'package:winui_n2n/about_page.dart'; import 'package:winui_n2n/about_page.dart';
import 'package:winui_n2n/globals.dart';
import 'package:winui_n2n/logger_page.dart'; import 'package:winui_n2n/logger_page.dart';
import 'package:winui_n2n/main.dart'; import 'package:winui_n2n/main.dart';
import 'package:winui_n2n/setting_page.dart'; import 'package:winui_n2n/setting_page.dart';
@@ -57,6 +61,14 @@ class _HomePageState extends State<HomePage> with TrayListener {
windowManager.show(); windowManager.show();
}, },
), ),
MenuItem(
key: 'exit_app',
label: AppLocalizations.of(context)!.exit,
onClick: (menuItem) {
forceExit = true;
ServicesBinding.instance.exitApplication(AppExitType.required);
},
)
], ],
); );
trayManager.setContextMenu(menu); trayManager.setContextMenu(menu);