impl option remote modification

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages
2022-08-30 16:50:25 +08:00
parent 839be76b8f
commit 38abd27384
9 changed files with 109 additions and 33 deletions

View File

@@ -1,4 +1,5 @@
import 'dart:io';
import 'dart:async';
import 'dart:math';
import 'package:desktop_multi_window/desktop_multi_window.dart';
@@ -6,6 +7,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hbb/common.dart';
import 'package:flutter_hbb/consts.dart';
import 'package:flutter_hbb/main.dart';
import 'package:flutter_hbb/models/platform_model.dart';
import 'package:get/get.dart';
import 'package:scroll_pos/scroll_pos.dart';
import 'package:window_manager/window_manager.dart';
@@ -34,6 +36,15 @@ class TabInfo {
required this.page});
}
enum DesktopTabType {
main,
cm,
remoteScreen,
fileTransfer,
portForward,
rdp,
}
class DesktopTabState {
final List<TabInfo> tabs = [];
final ScrollPosController scrollController =
@@ -143,6 +154,7 @@ typedef LabelGetter = Rx<String> Function(String key);
class DesktopTab extends StatelessWidget {
final Function(String)? onTabClose;
final TarBarTheme theme;
final DesktopTabType tabType;
final bool isMainWindow;
final bool showTabBar;
final bool showLogo;
@@ -161,7 +173,7 @@ class DesktopTab extends StatelessWidget {
const DesktopTab({
required this.controller,
required this.isMainWindow,
required this.tabType,
this.theme = const TarBarTheme.light(),
this.onTabClose,
this.showTabBar = true,
@@ -175,7 +187,8 @@ class DesktopTab extends StatelessWidget {
this.onClose,
this.tabBuilder,
this.labelGetter,
});
}) : isMainWindow =
tabType == DesktopTabType.main || tabType == DesktopTabType.cm;
@override
Widget build(BuildContext context) {
@@ -204,11 +217,48 @@ class DesktopTab extends StatelessWidget {
]);
}
Widget _buildBlock({required Widget child}) {
if (tabType != DesktopTabType.main) {
return child;
}
var block = false.obs;
return Obx(() => MouseRegion(
onEnter: (_) async {
if (!option2bool(
'allow-remote-config-modification',
await bind.mainGetOption(
key: 'allow-remote-config-modification'))) {
var time0 = DateTime.now().millisecondsSinceEpoch;
await bind.mainCheckMouseTime();
Timer(const Duration(milliseconds: 120), () async {
var d = time0 - await bind.mainGetMouseTime();
if (d < 120) {
block.value = true;
}
});
}
},
onExit: (_) => block.value = false,
child: Stack(
children: [
child,
Offstage(
offstage: !block.value,
child: Container(
color: Colors.black.withOpacity(0.5),
)),
],
),
));
}
Widget _buildPageView() {
return Obx(() => PageView(
controller: state.value.pageController,
children:
state.value.tabs.map((tab) => tab.page).toList(growable: false)));
return _buildBlock(
child: Obx(() => PageView(
controller: state.value.pageController,
children: state.value.tabs
.map((tab) => tab.page)
.toList(growable: false))));
}
Widget _buildBar() {