flutter_desktop: remote rxbool of fullscreen
Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
parent
5df850e7de
commit
b28fa19dfe
@ -6,6 +6,7 @@ import 'package:flutter_hbb/consts.dart';
|
|||||||
import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart';
|
import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/desktop_setting_page.dart';
|
import 'package:flutter_hbb/desktop/pages/desktop_setting_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
|
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
|
||||||
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
@ -62,8 +63,6 @@ class _DesktopTabPageState extends State<DesktopTabPage> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
RxBool fullscreen = false.obs;
|
|
||||||
Get.put(fullscreen, tag: 'fullscreen');
|
|
||||||
final tabWidget = Container(
|
final tabWidget = Container(
|
||||||
child: Overlay(initialEntries: [
|
child: Overlay(initialEntries: [
|
||||||
OverlayEntry(builder: (context) {
|
OverlayEntry(builder: (context) {
|
||||||
@ -84,9 +83,7 @@ class _DesktopTabPageState extends State<DesktopTabPage> {
|
|||||||
);
|
);
|
||||||
return Platform.isMacOS
|
return Platform.isMacOS
|
||||||
? tabWidget
|
? tabWidget
|
||||||
: Obx(() => DragToResizeArea(
|
: DragToResizeArea(
|
||||||
resizeEdgeSize:
|
resizeEdgeSize: stateGlobal.resizeEdgeSize, child: tabWidget);
|
||||||
fullscreen.value ? kFullScreenEdgeSize : kWindowEdgeSize,
|
|
||||||
child: tabWidget));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
|
|||||||
|
|
||||||
rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
|
rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
|
||||||
print(
|
print(
|
||||||
"[FileTransfer] call ${call.method} with args ${call.arguments} from window ${fromWindowId} to ${windowId()}");
|
"[FileTransfer] call ${call.method} with args ${call.arguments} from window $fromWindowId to ${windowId()}");
|
||||||
// for simplify, just replace connectionId
|
// for simplify, just replace connectionId
|
||||||
if (call.method == "new_file_transfer") {
|
if (call.method == "new_file_transfer") {
|
||||||
final args = jsonDecode(call.arguments);
|
final args = jsonDecode(call.arguments);
|
||||||
@ -86,11 +86,7 @@ class _FileManagerTabPageState extends State<FileManagerTabPage> {
|
|||||||
);
|
);
|
||||||
return Platform.isMacOS
|
return Platform.isMacOS
|
||||||
? tabWidget
|
? tabWidget
|
||||||
: SubWindowDragToResizeArea(
|
: SubWindowDragToResizeArea(child: tabWidget);
|
||||||
resizeEdgeSize: kWindowEdgeSize,
|
|
||||||
windowId: windowId(),
|
|
||||||
child: tabWidget,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onRemoveId(String id) {
|
void onRemoveId(String id) {
|
||||||
|
@ -50,7 +50,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
|||||||
|
|
||||||
rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
|
rustDeskWinManager.setMethodHandler((call, fromWindowId) async {
|
||||||
debugPrint(
|
debugPrint(
|
||||||
"call ${call.method} with args ${call.arguments} from window ${fromWindowId}");
|
"call ${call.method} with args ${call.arguments} from window $fromWindowId");
|
||||||
// for simplify, just replace connectionId
|
// for simplify, just replace connectionId
|
||||||
if (call.method == "new_port_forward") {
|
if (call.method == "new_port_forward") {
|
||||||
final args = jsonDecode(call.arguments);
|
final args = jsonDecode(call.arguments);
|
||||||
@ -97,11 +97,7 @@ class _PortForwardTabPageState extends State<PortForwardTabPage> {
|
|||||||
);
|
);
|
||||||
return Platform.isMacOS
|
return Platform.isMacOS
|
||||||
? tabWidget
|
? tabWidget
|
||||||
: SubWindowDragToResizeArea(
|
: SubWindowDragToResizeArea(child: tabWidget);
|
||||||
resizeEdgeSize: kWindowEdgeSize,
|
|
||||||
windowId: windowId(),
|
|
||||||
child: tabWidget,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onRemoveId(String id) {
|
void onRemoveId(String id) {
|
||||||
|
@ -28,15 +28,9 @@ class RemotePage extends StatefulWidget {
|
|||||||
const RemotePage({
|
const RemotePage({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.windowId,
|
|
||||||
required this.tabBarHeight,
|
|
||||||
required this.windowBorderWidth,
|
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final String id;
|
final String id;
|
||||||
final int windowId;
|
|
||||||
final double tabBarHeight;
|
|
||||||
final double windowBorderWidth;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<RemotePage> createState() => _RemotePageState();
|
State<RemotePage> createState() => _RemotePageState();
|
||||||
@ -58,11 +52,6 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
|
|
||||||
late FFI _ffi;
|
late FFI _ffi;
|
||||||
|
|
||||||
void _updateTabBarHeight() {
|
|
||||||
_ffi.canvasModel.tabBarHeight = widget.tabBarHeight;
|
|
||||||
_ffi.canvasModel.windowBorderWidth = widget.windowBorderWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _initStates(String id) {
|
void _initStates(String id) {
|
||||||
PrivacyModeState.init(id);
|
PrivacyModeState.init(id);
|
||||||
BlockInputState.init(id);
|
BlockInputState.init(id);
|
||||||
@ -91,7 +80,6 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
|
|
||||||
_ffi = FFI();
|
_ffi = FFI();
|
||||||
|
|
||||||
_updateTabBarHeight();
|
|
||||||
Get.put(_ffi, tag: widget.id);
|
Get.put(_ffi, tag: widget.id);
|
||||||
_ffi.start(widget.id);
|
_ffi.start(widget.id);
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
@ -164,7 +152,6 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
super.build(context);
|
super.build(context);
|
||||||
_updateTabBarHeight();
|
|
||||||
return WillPopScope(
|
return WillPopScope(
|
||||||
onWillPop: () async {
|
onWillPop: () async {
|
||||||
clientClose(_ffi.dialogManager);
|
clientClose(_ffi.dialogManager);
|
||||||
@ -241,7 +228,6 @@ class _RemotePageState extends State<RemotePage>
|
|||||||
paints.add(QualityMonitor(_ffi.qualityMonitorModel));
|
paints.add(QualityMonitor(_ffi.qualityMonitorModel));
|
||||||
paints.add(RemoteMenubar(
|
paints.add(RemoteMenubar(
|
||||||
id: widget.id,
|
id: widget.id,
|
||||||
windowId: widget.windowId,
|
|
||||||
ffi: _ffi,
|
ffi: _ffi,
|
||||||
onEnterOrLeaveImageSetter: (func) => _onEnterOrLeaveImage4Menubar = func,
|
onEnterOrLeaveImageSetter: (func) => _onEnterOrLeaveImage4Menubar = func,
|
||||||
onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Menubar = null,
|
onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Menubar = null,
|
||||||
|
@ -34,24 +34,20 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
|
|
||||||
_ConnectionTabPageState(Map<String, dynamic> params) {
|
_ConnectionTabPageState(Map<String, dynamic> params) {
|
||||||
RemoteCountState.init();
|
RemoteCountState.init();
|
||||||
final RxBool fullscreen = Get.find(tag: 'fullscreen');
|
|
||||||
final peerId = params['id'];
|
final peerId = params['id'];
|
||||||
if (peerId != null) {
|
if (peerId != null) {
|
||||||
ConnectionTypeState.init(peerId);
|
ConnectionTypeState.init(peerId);
|
||||||
tabController.add(TabInfo(
|
tabController.add(TabInfo(
|
||||||
key: peerId,
|
key: peerId,
|
||||||
label: peerId,
|
label: peerId,
|
||||||
selectedIcon: selectedIcon,
|
selectedIcon: selectedIcon,
|
||||||
unselectedIcon: unselectedIcon,
|
unselectedIcon: unselectedIcon,
|
||||||
onTabCloseButton: () => tabController.closeBy(peerId),
|
onTabCloseButton: () => tabController.closeBy(peerId),
|
||||||
page: Obx(() => RemotePage(
|
page: RemotePage(
|
||||||
key: ValueKey(peerId),
|
key: ValueKey(peerId),
|
||||||
id: peerId,
|
id: peerId,
|
||||||
windowId: windowId(),
|
),
|
||||||
tabBarHeight:
|
));
|
||||||
fullscreen.isTrue ? 0 : kDesktopRemoteTabBarHeight,
|
|
||||||
windowBorderWidth: fullscreen.isTrue ? 0 : kWindowBorderWidth,
|
|
||||||
))));
|
|
||||||
_update_remote_count();
|
_update_remote_count();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -66,7 +62,6 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
print(
|
print(
|
||||||
"call ${call.method} with args ${call.arguments} from window $fromWindowId");
|
"call ${call.method} with args ${call.arguments} from window $fromWindowId");
|
||||||
|
|
||||||
final RxBool fullscreen = Get.find(tag: 'fullscreen');
|
|
||||||
// for simplify, just replace connectionId
|
// for simplify, just replace connectionId
|
||||||
if (call.method == "new_remote_desktop") {
|
if (call.method == "new_remote_desktop") {
|
||||||
final args = jsonDecode(call.arguments);
|
final args = jsonDecode(call.arguments);
|
||||||
@ -75,22 +70,13 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
window_on_top(windowId());
|
window_on_top(windowId());
|
||||||
ConnectionTypeState.init(id);
|
ConnectionTypeState.init(id);
|
||||||
tabController.add(TabInfo(
|
tabController.add(TabInfo(
|
||||||
key: id,
|
key: id,
|
||||||
label: id,
|
label: id,
|
||||||
selectedIcon: selectedIcon,
|
selectedIcon: selectedIcon,
|
||||||
unselectedIcon: unselectedIcon,
|
unselectedIcon: unselectedIcon,
|
||||||
onTabCloseButton: () => tabController.closeBy(id),
|
onTabCloseButton: () => tabController.closeBy(id),
|
||||||
page: ObxValue<RxBool>(
|
page: RemotePage(key: ValueKey(id), id: id),
|
||||||
(fullscreen) => RemotePage(
|
));
|
||||||
id: id,
|
|
||||||
windowId: windowId(),
|
|
||||||
tabBarHeight:
|
|
||||||
fullscreen.isTrue ? 0 : kDesktopRemoteTabBarHeight,
|
|
||||||
windowBorderWidth: fullscreen.isTrue ? 0 : kWindowBorderWidth,
|
|
||||||
),
|
|
||||||
fullscreen,
|
|
||||||
key: ValueKey(id),
|
|
||||||
)));
|
|
||||||
} else if (call.method == "onDestroy") {
|
} else if (call.method == "onDestroy") {
|
||||||
tabController.clear();
|
tabController.clear();
|
||||||
} else if (call.method == kWindowActionRebuild) {
|
} else if (call.method == kWindowActionRebuild) {
|
||||||
@ -105,7 +91,6 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final RxBool fullscreen = Get.find(tag: 'fullscreen');
|
|
||||||
final tabWidget = Container(
|
final tabWidget = Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
@ -113,61 +98,52 @@ class _ConnectionTabPageState extends State<ConnectionTabPage> {
|
|||||||
width: kWindowBorderWidth)),
|
width: kWindowBorderWidth)),
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
backgroundColor: Theme.of(context).backgroundColor,
|
backgroundColor: Theme.of(context).backgroundColor,
|
||||||
body: Obx(() => DesktopTab(
|
body: DesktopTab(
|
||||||
controller: tabController,
|
controller: tabController,
|
||||||
showTabBar: fullscreen.isFalse,
|
onWindowCloseButton: handleWindowCloseButton,
|
||||||
onWindowCloseButton: handleWindowCloseButton,
|
tail: const AddButton().paddingOnly(left: 10),
|
||||||
tail: const AddButton().paddingOnly(left: 10),
|
pageViewBuilder: (pageView) => pageView,
|
||||||
pageViewBuilder: (pageView) {
|
tabBuilder: (key, icon, label, themeConf) => Obx(() {
|
||||||
WindowController.fromWindowId(windowId())
|
final connectionType = ConnectionTypeState.find(key);
|
||||||
.setFullscreen(fullscreen.isTrue);
|
if (!connectionType.isValid()) {
|
||||||
return pageView;
|
return Row(
|
||||||
},
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
tabBuilder: (key, icon, label, themeConf) => Obx(() {
|
children: [
|
||||||
final connectionType = ConnectionTypeState.find(key);
|
icon,
|
||||||
if (!connectionType.isValid()) {
|
label,
|
||||||
return Row(
|
],
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
);
|
||||||
children: [
|
} else {
|
||||||
icon,
|
final msgDirect = translate(
|
||||||
label,
|
connectionType.direct.value == ConnectionType.strDirect
|
||||||
],
|
? 'Direct Connection'
|
||||||
);
|
: 'Relay Connection');
|
||||||
} else {
|
final msgSecure = translate(
|
||||||
final msgDirect = translate(
|
connectionType.secure.value == ConnectionType.strSecure
|
||||||
connectionType.direct.value == ConnectionType.strDirect
|
? 'Secure Connection'
|
||||||
? 'Direct Connection'
|
: 'Insecure Connection');
|
||||||
: 'Relay Connection');
|
return Row(
|
||||||
final msgSecure = translate(
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
connectionType.secure.value == ConnectionType.strSecure
|
children: [
|
||||||
? 'Secure Connection'
|
icon,
|
||||||
: 'Insecure Connection');
|
Tooltip(
|
||||||
return Row(
|
message: '$msgDirect\n$msgSecure',
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
child: SvgPicture.asset(
|
||||||
children: [
|
'assets/${connectionType.secure.value}${connectionType.direct.value}.svg',
|
||||||
icon,
|
width: themeConf.iconSize,
|
||||||
Tooltip(
|
height: themeConf.iconSize,
|
||||||
message: '$msgDirect\n$msgSecure',
|
).paddingOnly(right: 5),
|
||||||
child: SvgPicture.asset(
|
),
|
||||||
'assets/${connectionType.secure.value}${connectionType.direct.value}.svg',
|
label,
|
||||||
width: themeConf.iconSize,
|
],
|
||||||
height: themeConf.iconSize,
|
);
|
||||||
).paddingOnly(right: 5),
|
}
|
||||||
),
|
}),
|
||||||
label,
|
)),
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
))),
|
|
||||||
);
|
);
|
||||||
return Platform.isMacOS
|
return Platform.isMacOS
|
||||||
? tabWidget
|
? tabWidget
|
||||||
: Obx(() => SubWindowDragToResizeArea(
|
: SubWindowDragToResizeArea(child: tabWidget);
|
||||||
resizeEdgeSize:
|
|
||||||
fullscreen.value ? kFullScreenEdgeSize : kWindowEdgeSize,
|
|
||||||
windowId: windowId(),
|
|
||||||
child: tabWidget));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onRemoveId(String id) {
|
void onRemoveId(String id) {
|
||||||
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_hbb/common.dart';
|
import 'package:flutter_hbb/common.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/remote_tab_page.dart';
|
import 'package:flutter_hbb/desktop/pages/remote_tab_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/widgets/refresh_wrapper.dart';
|
import 'package:flutter_hbb/desktop/widgets/refresh_wrapper.dart';
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
/// multi-tab desktop remote screen
|
/// multi-tab desktop remote screen
|
||||||
@ -13,8 +12,6 @@ class DesktopRemoteScreen extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
RxBool fullscreen = false.obs;
|
|
||||||
Get.put(fullscreen, tag: 'fullscreen');
|
|
||||||
return MultiProvider(
|
return MultiProvider(
|
||||||
providers: [
|
providers: [
|
||||||
ChangeNotifierProvider.value(value: gFFI.ffiModel),
|
ChangeNotifierProvider.value(value: gFFI.ffiModel),
|
||||||
|
@ -6,6 +6,7 @@ import 'dart:ui' as ui;
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_hbb/models/chat_model.dart';
|
import 'package:flutter_hbb/models/chat_model.dart';
|
||||||
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:rxdart/rxdart.dart' as rxdart;
|
import 'package:rxdart/rxdart.dart' as rxdart;
|
||||||
@ -29,7 +30,6 @@ class _MenubarTheme {
|
|||||||
|
|
||||||
class RemoteMenubar extends StatefulWidget {
|
class RemoteMenubar extends StatefulWidget {
|
||||||
final String id;
|
final String id;
|
||||||
final int windowId;
|
|
||||||
final FFI ffi;
|
final FFI ffi;
|
||||||
final Function(Function(bool)) onEnterOrLeaveImageSetter;
|
final Function(Function(bool)) onEnterOrLeaveImageSetter;
|
||||||
final Function() onEnterOrLeaveImageCleaner;
|
final Function() onEnterOrLeaveImageCleaner;
|
||||||
@ -37,7 +37,6 @@ class RemoteMenubar extends StatefulWidget {
|
|||||||
const RemoteMenubar({
|
const RemoteMenubar({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.windowId,
|
|
||||||
required this.ffi,
|
required this.ffi,
|
||||||
required this.onEnterOrLeaveImageSetter,
|
required this.onEnterOrLeaveImageSetter,
|
||||||
required this.onEnterOrLeaveImageCleaner,
|
required this.onEnterOrLeaveImageCleaner,
|
||||||
@ -55,9 +54,12 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
bool _isCursorOverImage = false;
|
bool _isCursorOverImage = false;
|
||||||
window_size.Screen? _screen;
|
window_size.Screen? _screen;
|
||||||
|
|
||||||
bool get isFullscreen => Get.find<RxBool>(tag: 'fullscreen').isTrue;
|
int get windowId => stateGlobal.windowId;
|
||||||
|
|
||||||
|
bool get isFullscreen => stateGlobal.fullscreen;
|
||||||
void _setFullscreen(bool v) {
|
void _setFullscreen(bool v) {
|
||||||
Get.find<RxBool>(tag: 'fullscreen').value = v;
|
stateGlobal.setFullscreen(v);
|
||||||
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -213,7 +215,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
_setFullscreen(!isFullscreen);
|
_setFullscreen(!isFullscreen);
|
||||||
},
|
},
|
||||||
icon: Obx(() => isFullscreen
|
icon: isFullscreen
|
||||||
? const Icon(
|
? const Icon(
|
||||||
Icons.fullscreen_exit,
|
Icons.fullscreen_exit,
|
||||||
color: _MenubarTheme.commonColor,
|
color: _MenubarTheme.commonColor,
|
||||||
@ -221,7 +223,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
: const Icon(
|
: const Icon(
|
||||||
Icons.fullscreen,
|
Icons.fullscreen,
|
||||||
color: _MenubarTheme.commonColor,
|
color: _MenubarTheme.commonColor,
|
||||||
)),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -920,8 +922,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
_setFullscreen(false);
|
_setFullscreen(false);
|
||||||
double scale = _screen!.scaleFactor;
|
double scale = _screen!.scaleFactor;
|
||||||
final wndRect =
|
final wndRect =
|
||||||
await WindowController.fromWindowId(widget.windowId)
|
await WindowController.fromWindowId(windowId).getFrame();
|
||||||
.getFrame();
|
|
||||||
final mediaSize = MediaQueryData.fromWindow(ui.window).size;
|
final mediaSize = MediaQueryData.fromWindow(ui.window).size;
|
||||||
// On windows, wndRect is equal to GetWindowRect and mediaSize is equal to GetClientRect.
|
// On windows, wndRect is equal to GetWindowRect and mediaSize is equal to GetClientRect.
|
||||||
// https://stackoverflow.com/a/7561083
|
// https://stackoverflow.com/a/7561083
|
||||||
@ -944,8 +945,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
double top = wndRect.top + (wndRect.height - height) / 2;
|
double top = wndRect.top + (wndRect.height - height) / 2;
|
||||||
|
|
||||||
Rect frameRect = _screen!.frame;
|
Rect frameRect = _screen!.frame;
|
||||||
final RxBool fullscreen = Get.find(tag: 'fullscreen');
|
if (!isFullscreen) {
|
||||||
if (fullscreen.isFalse) {
|
|
||||||
frameRect = _screen!.visibleFrame;
|
frameRect = _screen!.visibleFrame;
|
||||||
}
|
}
|
||||||
if (left < frameRect.left) {
|
if (left < frameRect.left) {
|
||||||
@ -960,7 +960,7 @@ class _RemoteMenubarState extends State<RemoteMenubar> {
|
|||||||
if ((top + height) > frameRect.bottom) {
|
if ((top + height) > frameRect.bottom) {
|
||||||
top = frameRect.bottom - height;
|
top = frameRect.bottom - height;
|
||||||
}
|
}
|
||||||
await WindowController.fromWindowId(widget.windowId)
|
await WindowController.fromWindowId(windowId)
|
||||||
.setFrame(Rect.fromLTWH(left, top, width, height));
|
.setFrame(Rect.fromLTWH(left, top, width, height));
|
||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
|
@ -8,7 +8,9 @@ import 'package:flutter/material.dart' hide TabBarTheme;
|
|||||||
import 'package:flutter_hbb/common.dart';
|
import 'package:flutter_hbb/common.dart';
|
||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
import 'package:flutter_hbb/main.dart';
|
import 'package:flutter_hbb/main.dart';
|
||||||
|
import 'package:flutter_hbb/common/shared_state.dart';
|
||||||
import 'package:flutter_hbb/models/platform_model.dart';
|
import 'package:flutter_hbb/models/platform_model.dart';
|
||||||
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:get/get_rx/src/rx_workers/utils/debouncer.dart';
|
import 'package:get/get_rx/src/rx_workers/utils/debouncer.dart';
|
||||||
import 'package:scroll_pos/scroll_pos.dart';
|
import 'package:scroll_pos/scroll_pos.dart';
|
||||||
@ -179,7 +181,6 @@ typedef LabelGetter = Rx<String> Function(String key);
|
|||||||
int _lastClickTime = DateTime.now().millisecondsSinceEpoch;
|
int _lastClickTime = DateTime.now().millisecondsSinceEpoch;
|
||||||
|
|
||||||
class DesktopTab extends StatelessWidget {
|
class DesktopTab extends StatelessWidget {
|
||||||
final bool showTabBar;
|
|
||||||
final bool showLogo;
|
final bool showLogo;
|
||||||
final bool showTitle;
|
final bool showTitle;
|
||||||
final bool showMinimize;
|
final bool showMinimize;
|
||||||
@ -206,7 +207,6 @@ class DesktopTab extends StatelessWidget {
|
|||||||
DesktopTab({
|
DesktopTab({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.controller,
|
required this.controller,
|
||||||
this.showTabBar = true,
|
|
||||||
this.showLogo = true,
|
this.showLogo = true,
|
||||||
this.showTitle = true,
|
this.showTitle = true,
|
||||||
this.showMinimize = true,
|
this.showMinimize = true,
|
||||||
@ -229,8 +229,8 @@ class DesktopTab extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Column(children: [
|
return Column(children: [
|
||||||
Offstage(
|
Obx(() => Offstage(
|
||||||
offstage: !showTabBar,
|
offstage: !stateGlobal.showTabBar.isTrue,
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
height: _kTabBarHeight,
|
height: _kTabBarHeight,
|
||||||
child: Column(
|
child: Column(
|
||||||
@ -245,7 +245,7 @@ class DesktopTab extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)),
|
))),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: pageViewBuilder != null
|
child: pageViewBuilder != null
|
||||||
? pageViewBuilder!(_buildPageView())
|
? pageViewBuilder!(_buildPageView())
|
||||||
|
@ -3,6 +3,7 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart';
|
import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/server_page.dart';
|
import 'package:flutter_hbb/desktop/pages/server_page.dart';
|
||||||
import 'package:flutter_hbb/desktop/pages/install_page.dart';
|
import 'package:flutter_hbb/desktop/pages/install_page.dart';
|
||||||
@ -15,7 +16,6 @@ import 'package:flutter_localizations/flutter_localizations.dart';
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:uni_links_desktop/uni_links_desktop.dart';
|
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
// import 'package:window_manager/window_manager.dart';
|
// import 'package:window_manager/window_manager.dart';
|
||||||
@ -41,11 +41,14 @@ Future<void> main(List<String> args) async {
|
|||||||
// main window
|
// main window
|
||||||
if (args.isNotEmpty && args.first == 'multi_window') {
|
if (args.isNotEmpty && args.first == 'multi_window') {
|
||||||
windowId = int.parse(args[1]);
|
windowId = int.parse(args[1]);
|
||||||
|
stateGlobal.setWindowId(windowId!);
|
||||||
WindowController.fromWindowId(windowId!).showTitleBar(false);
|
WindowController.fromWindowId(windowId!).showTitleBar(false);
|
||||||
final argument = args[2].isEmpty
|
final argument = args[2].isEmpty
|
||||||
? <String, dynamic>{}
|
? <String, dynamic>{}
|
||||||
: jsonDecode(args[2]) as Map<String, dynamic>;
|
: jsonDecode(args[2]) as Map<String, dynamic>;
|
||||||
int type = argument['type'] ?? -1;
|
int type = argument['type'] ?? -1;
|
||||||
|
// to-do: No need to parse window id ?
|
||||||
|
// Because stateGlobal.windowId is a global value.
|
||||||
argument['windowId'] = windowId;
|
argument['windowId'] = windowId;
|
||||||
WindowType wType = type.windowType;
|
WindowType wType = type.windowType;
|
||||||
switch (wType) {
|
switch (wType) {
|
||||||
|
@ -10,6 +10,7 @@ import '../../models/model.dart';
|
|||||||
import '../../models/platform_model.dart';
|
import '../../models/platform_model.dart';
|
||||||
import '../common.dart';
|
import '../common.dart';
|
||||||
import '../consts.dart';
|
import '../consts.dart';
|
||||||
|
import './state_model.dart';
|
||||||
import 'dart:ui' as ui;
|
import 'dart:ui' as ui;
|
||||||
|
|
||||||
/// Mouse button enum.
|
/// Mouse button enum.
|
||||||
@ -321,9 +322,7 @@ class InputModel {
|
|||||||
double x = evt['x'];
|
double x = evt['x'];
|
||||||
double y = max(0.0, evt['y']);
|
double y = max(0.0, evt['y']);
|
||||||
if (isDesktop) {
|
if (isDesktop) {
|
||||||
final RxBool fullscreen = Get.find(tag: 'fullscreen');
|
y = y - stateGlobal.tabBarHeight;
|
||||||
final tabBarHeight = fullscreen.isTrue ? 0 : kDesktopRemoteTabBarHeight;
|
|
||||||
y = y - tabBarHeight;
|
|
||||||
}
|
}
|
||||||
final canvasModel = parent.target!.canvasModel;
|
final canvasModel = parent.target!.canvasModel;
|
||||||
final ffiModel = parent.target!.ffiModel;
|
final ffiModel = parent.target!.ffiModel;
|
||||||
|
@ -14,6 +14,7 @@ import 'package:flutter_hbb/models/chat_model.dart';
|
|||||||
import 'package:flutter_hbb/models/file_model.dart';
|
import 'package:flutter_hbb/models/file_model.dart';
|
||||||
import 'package:flutter_hbb/models/server_model.dart';
|
import 'package:flutter_hbb/models/server_model.dart';
|
||||||
import 'package:flutter_hbb/models/user_model.dart';
|
import 'package:flutter_hbb/models/user_model.dart';
|
||||||
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:tuple/tuple.dart';
|
import 'package:tuple/tuple.dart';
|
||||||
@ -483,9 +484,9 @@ class CanvasModel with ChangeNotifier {
|
|||||||
// image scale
|
// image scale
|
||||||
double _scale = 1.0;
|
double _scale = 1.0;
|
||||||
// the tabbar over the image
|
// the tabbar over the image
|
||||||
double tabBarHeight = 0.0;
|
// double tabBarHeight = 0.0;
|
||||||
// the window border's width
|
// the window border's width
|
||||||
double windowBorderWidth = 0.0;
|
// double windowBorderWidth = 0.0;
|
||||||
// remote id
|
// remote id
|
||||||
String id = '';
|
String id = '';
|
||||||
// scroll offset x percent
|
// scroll offset x percent
|
||||||
@ -571,6 +572,9 @@ class CanvasModel with ChangeNotifier {
|
|||||||
return parent.target?.ffiModel.display.height ?? defaultHeight;
|
return parent.target?.ffiModel.display.height ?? defaultHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double get windowBorderWidth => stateGlobal.windowBorderWidth;
|
||||||
|
double get tabBarHeight => stateGlobal.tabBarHeight;
|
||||||
|
|
||||||
Size get size {
|
Size get size {
|
||||||
final size = MediaQueryData.fromWindow(ui.window).size;
|
final size = MediaQueryData.fromWindow(ui.window).size;
|
||||||
return Size(size.width - windowBorderWidth * 2,
|
return Size(size.width - windowBorderWidth * 2,
|
||||||
|
33
flutter/lib/models/state_model.dart
Normal file
33
flutter/lib/models/state_model.dart
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
import '../consts.dart';
|
||||||
|
|
||||||
|
class StateGlobal {
|
||||||
|
int _windowId = -1;
|
||||||
|
bool _fullscreen = false;
|
||||||
|
final RxBool _showTabBar = true.obs;
|
||||||
|
|
||||||
|
int get windowId => _windowId;
|
||||||
|
bool get fullscreen => _fullscreen;
|
||||||
|
double get tabBarHeight => fullscreen ? 0 : kDesktopRemoteTabBarHeight;
|
||||||
|
double get windowBorderWidth => fullscreen ? 0 : kWindowBorderWidth;
|
||||||
|
RxBool get showTabBar => _showTabBar;
|
||||||
|
double get resizeEdgeSize =>
|
||||||
|
fullscreen ? kFullScreenEdgeSize : kWindowEdgeSize;
|
||||||
|
|
||||||
|
setWindowId(int id) => _windowId = id;
|
||||||
|
setFullscreen(bool v) {
|
||||||
|
if (_fullscreen != v) {
|
||||||
|
_fullscreen = v;
|
||||||
|
_showTabBar.value = !_fullscreen;
|
||||||
|
WindowController.fromWindowId(windowId).setFullscreen(_fullscreen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StateGlobal._();
|
||||||
|
|
||||||
|
static final StateGlobal instance = StateGlobal._();
|
||||||
|
}
|
||||||
|
|
||||||
|
final stateGlobal = StateGlobal.instance;
|
Loading…
x
Reference in New Issue
Block a user