tray.dart 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import 'dart:io';
  2. import 'package:get/get.dart';
  3. import 'package:naiyouwl/app/bean/proxie.dart';
  4. import 'package:naiyouwl/app/common/SharedPreferencesUtil.dart';
  5. import 'package:naiyouwl/app/controller/controllers.dart';
  6. import 'package:naiyouwl/app/data/model/NodeMode.dart';
  7. import 'package:naiyouwl/app/utils/utils.dart';
  8. import 'package:tray_manager/tray_manager.dart';
  9. import 'package:url_launcher/url_launcher.dart';
  10. import 'package:window_manager/window_manager.dart';
  11. class TrayController extends GetxController with TrayListener {
  12. late Menu trayMenu;
  13. var disabledTun = false.obs;
  14. var show = false.obs;
  15. var isSHow = false;
  16. var isShowConsole = false.obs;
  17. Future<void> initTray() async {
  18. await trayManager.setIcon('assets/images/logo/logo.ico');
  19. // await trayManager.setTitle('jsq');
  20. var tun = await SharedPreferencesUtil().getString("tun");
  21. if(tun == null){
  22. disabledTun.value == false;
  23. } else {
  24. disabledTun.value = tun == "true" ? true : false;
  25. if(tun == "true" ){
  26. await controllers.global.TunProxySwitch(disabledTun.value);
  27. }
  28. }
  29. updateTray();
  30. trayManager.addListener(this);
  31. }
  32. Future<void> updateTray() async {
  33. final visible = await windowManager.isVisible();
  34. if(Platform.isWindows){
  35. isSHow = true;
  36. }
  37. final disabled = controllers.global.connectStatus.value == false;
  38. var disabledSerivce = controllers.global.connectStatus.value;
  39. if(Platform.isWindows){
  40. //disabledTun.value = true;
  41. }
  42. var serivceName = controllers.cc_service.installStatus.value == true? 'setting_service_uninstall'.tr : 'setting_service_install'.tr,
  43. trayMenu = Menu(items: [
  44. MenuItem.checkbox(label: 'tray_show'.tr, checked: visible, onClick: handleClickShow),
  45. MenuItem.separator(),
  46. // MenuItem.submenu(
  47. // label: 'proxie_group_title'.tr,
  48. // disabled: disabled,
  49. // submenu: Menu(
  50. // items: controllers.global.nodeModes.map((it) =>
  51. // MenuItem.checkbox(
  52. // label: it.name,
  53. // checked: it.id == nodeId.value,
  54. // onClicked: () {
  55. // handleClickProxieItem(it)
  56. // },
  57. // )
  58. // ).toList(),
  59. // ),
  60. // ),
  61. MenuItem.submenu(
  62. label: 'proxie_group_title'.tr,
  63. disabled: false,
  64. submenu: Menu(
  65. items: controllers.global.nodeModes.map((it) =>
  66. MenuItem.checkbox(
  67. label: it.name,
  68. checked: it.id == controllers.global.nodeId.value,
  69. onClick: (m) => handleClickProxieItem(it, m),
  70. )
  71. ).toList(),
  72. ),
  73. ),
  74. // MenuItem(
  75. // label: 'tray_restart_clash_core'.tr,
  76. // disabled: !controllers.service.isCanOperationCore,
  77. // onClick: handleClickRestartClashCore,
  78. // ),
  79. MenuItem.checkbox(
  80. label: 'setting_set_as_system_proxy'.tr,
  81. checked: controllers.global.systemProxy.value,
  82. disabled: false, //disabled || controllers.global.systemProxySwitchIng.value
  83. onClick: handleClickSetAsSystemProxy,
  84. ),
  85. MenuItem.checkbox(
  86. label: 'route_tun_title'.tr,
  87. checked: disabledTun.value,
  88. disabled: Platform.isWindows ? false : disabledSerivce,
  89. onClick: handleClickSetAsTunProxy,
  90. ),
  91. MenuItem.checkbox(
  92. label: serivceName,
  93. checked: controllers.cc_service.installStatus.value,
  94. disabled: disabledSerivce,
  95. onClick: handleClickServiceModeSwitch,
  96. ),
  97. MenuItem.submenu(
  98. label: 'tray_copy_command_line_proxy'.tr,
  99. disabled: disabled,
  100. submenu: Menu(items: [
  101. MenuItem(label: 'bash', onClick: handleClickCopyCommandLineProxy),
  102. MenuItem(label: 'cmd', onClick: handleClickCopyCommandLineProxy),
  103. MenuItem(label: 'powershell', onClick: handleClickCopyCommandLineProxy),
  104. ])),
  105. MenuItem.separator(),
  106. MenuItem(label: '服务端口:${controllers.config.servicePort.value}', disabled: true,),
  107. isSHow == true ? MenuItem(label: "显示控制台", onClick: handleClickConsoleShow,checked: isShowConsole.value)
  108. : MenuItem(disabled: true,label: "显示控制台", onClick: handleClickConsoleShow),
  109. MenuItem(label: 'tray_exit'.tr, onClick: handleClickExit),
  110. ]);
  111. await trayManager.setContextMenu(trayMenu);
  112. }
  113. @override
  114. void onTrayIconMouseDown() async {
  115. await controllers.window.showWindow();
  116. }
  117. @override
  118. void onTrayIconRightMouseDown() async {
  119. show.value = true;
  120. await updateTray();
  121. await trayManager.popUpContextMenu();
  122. show.value = false;
  123. }
  124. Future<void> handleClickConsoleShow(MenuItem menuItem) async {
  125. isSHow = true;
  126. if (menuItem.checked == true) {
  127. isShowConsole.value = false;
  128. controllers.global.hideConsole();
  129. } else {
  130. isShowConsole.value = true;
  131. controllers.global.showConsole();
  132. }
  133. }
  134. Future<void> handleClickShow(MenuItem menuItem) async {
  135. show.value = false;
  136. if (menuItem.checked == true) {
  137. await controllers.window.hideWindow();
  138. } else {
  139. await controllers.window.showWindow();
  140. }
  141. }
  142. Future<void> handleClickProxieItem(NodeMode proxie, MenuItem menuItem) async {
  143. controllers.global.selectNode(proxie);
  144. await controllers.global.swift(proxie.name ?? "");
  145. }
  146. // Future<void> handleClickProxieItem(ProxieProxiesItem proxie, MenuItem menuItem) async {
  147. // await controllers.global.handleSetProxieGroup(proxie, menuItem.label!);
  148. // }
  149. Future<void> handleClickSetAsSystemProxy(MenuItem menuItem) async {
  150. await controllers.global.systemProxySwitch(menuItem.checked != true);
  151. }
  152. Future<void> handleClickSetAsTunProxy(MenuItem menuItem) async {
  153. disabledTun.value = menuItem.checked != true;
  154. await SharedPreferencesUtil().setString("tun", disabledTun.value == true ? "true": "false");
  155. await controllers.global.TunProxySwitch(menuItem.checked != true);
  156. }
  157. Future<void> handleClickCopyCommandLineProxy(MenuItem menuItem) async {
  158. final title = menuItem.label!;
  159. final proxyConfig = controllers.core.proxyConfig;
  160. await copyCommandLineProxy(title, http: proxyConfig.http, https: proxyConfig.https);
  161. }
  162. Future<void> handleClickAbout(MenuItem menuItem) async {
  163. //await launchUrl(Uri.parse('https://github.com/csj8520/clash_for_flutter'));
  164. }
  165. Future<void> handleClickExit(MenuItem menuItem) async {
  166. await controllers.global.handleExit();
  167. }
  168. Future<void> handleClickRestartClashCore(MenuItem menuItem) async {
  169. controllers.global.allowStatusUpdate = true;
  170. await controllers.service.reloadClashCore();
  171. }
  172. Future<void> handleClickServiceModeSwitch(MenuItem menuItem) async {
  173. await controllers.cc_service.serviceModeSwitch(menuItem.checked != true);
  174. }
  175. @override
  176. void dispose() {
  177. trayManager.removeListener(this);
  178. super.dispose();
  179. }
  180. }