port_forward_tab_page.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import 'dart:convert';
  2. import 'package:desktop_multi_window/desktop_multi_window.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_hbb/common.dart';
  5. import 'package:flutter_hbb/consts.dart';
  6. import 'package:flutter_hbb/models/state_model.dart';
  7. import 'package:flutter_hbb/desktop/pages/port_forward_page.dart';
  8. import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
  9. import 'package:flutter_hbb/utils/multi_window_manager.dart';
  10. import 'package:get/get.dart';
  11. class PortForwardTabPage extends StatefulWidget {
  12. final Map<String, dynamic> params;
  13. const PortForwardTabPage({Key? key, required this.params}) : super(key: key);
  14. @override
  15. State<PortForwardTabPage> createState() => _PortForwardTabPageState(params);
  16. }
  17. class _PortForwardTabPageState extends State<PortForwardTabPage> {
  18. late final DesktopTabController tabController;
  19. late final bool isRDP;
  20. static const IconData selectedIcon = Icons.forward_sharp;
  21. static const IconData unselectedIcon = Icons.forward_outlined;
  22. _PortForwardTabPageState(Map<String, dynamic> params) {
  23. isRDP = params['isRDP'];
  24. tabController =
  25. Get.put(DesktopTabController(tabType: DesktopTabType.portForward));
  26. tabController.onSelected = (id) {
  27. WindowController.fromWindowId(windowId())
  28. .setTitle(getWindowNameWithId(id));
  29. };
  30. tabController.onRemoved = (_, id) => onRemoveId(id);
  31. tabController.add(TabInfo(
  32. key: params['id'],
  33. label: params['id'],
  34. selectedIcon: selectedIcon,
  35. unselectedIcon: unselectedIcon,
  36. page: PortForwardPage(
  37. key: ValueKey(params['id']),
  38. id: params['id'],
  39. password: params['password'],
  40. isSharedPassword: params['isSharedPassword'],
  41. tabController: tabController,
  42. isRDP: isRDP,
  43. forceRelay: params['forceRelay'],
  44. connToken: params['connToken'],
  45. )));
  46. }
  47. @override
  48. void initState() {
  49. super.initState();
  50. rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
  51. debugPrint(
  52. "[Port Forward] call ${call.method} with args ${call.arguments} from window $fromWindowId");
  53. // for simplify, just replace connectionId
  54. if (call.method == kWindowEventNewPortForward) {
  55. final args = jsonDecode(call.arguments);
  56. final id = args['id'];
  57. final isRDP = args['isRDP'];
  58. windowOnTop(windowId());
  59. if (tabController.state.value.tabs.indexWhere((e) => e.key == id) >=
  60. 0) {
  61. debugPrint("port forward $id exists");
  62. return;
  63. }
  64. tabController.add(TabInfo(
  65. key: id,
  66. label: id,
  67. selectedIcon: selectedIcon,
  68. unselectedIcon: unselectedIcon,
  69. page: PortForwardPage(
  70. key: ValueKey(args['id']),
  71. id: id,
  72. password: args['password'],
  73. isSharedPassword: args['isSharedPassword'],
  74. isRDP: isRDP,
  75. tabController: tabController,
  76. forceRelay: args['forceRelay'],
  77. connToken: args['connToken'],
  78. )));
  79. } else if (call.method == "onDestroy") {
  80. tabController.clear();
  81. } else if (call.method == kWindowActionRebuild) {
  82. reloadCurrentWindow();
  83. }
  84. });
  85. Future.delayed(Duration.zero, () {
  86. restoreWindowPosition(WindowType.PortForward, windowId: windowId());
  87. });
  88. }
  89. @override
  90. Widget build(BuildContext context) {
  91. final child = Scaffold(
  92. backgroundColor: Theme.of(context).colorScheme.background,
  93. body: DesktopTab(
  94. controller: tabController,
  95. onWindowCloseButton: () async {
  96. tabController.clear();
  97. return true;
  98. },
  99. tail: AddButton(),
  100. selectedBorderColor: MyTheme.accent,
  101. labelGetter: DesktopTab.tablabelGetter,
  102. ),
  103. );
  104. final tabWidget = isLinux
  105. ? buildVirtualWindowFrame(
  106. context,
  107. Scaffold(
  108. backgroundColor: Theme.of(context).colorScheme.background,
  109. body: child),
  110. )
  111. : Container(
  112. decoration: BoxDecoration(
  113. border: Border.all(color: MyTheme.color(context).border!)),
  114. child: child,
  115. );
  116. return isMacOS || kUseCompatibleUiMode
  117. ? tabWidget
  118. : Obx(
  119. () => SubWindowDragToResizeArea(
  120. child: tabWidget,
  121. resizeEdgeSize: stateGlobal.resizeEdgeSize.value,
  122. enableResizeEdges: subWindowManagerEnableResizeEdges,
  123. windowId: stateGlobal.windowId,
  124. ),
  125. );
  126. }
  127. void onRemoveId(String id) {
  128. if (tabController.state.value.tabs.isEmpty) {
  129. WindowController.fromWindowId(windowId()).close();
  130. }
  131. }
  132. int windowId() {
  133. return widget.params["windowId"];
  134. }
  135. }