tray.dart 6.4 KB

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