fix saving frame, maximized

Signed-off-by: dignow <linlong1265@gmail.com>
This commit is contained in:
dignow 2023-08-11 12:01:57 +08:00
parent e2fdd69524
commit 26cd24d92f

View File

@ -1394,14 +1394,26 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
late Offset position; late Offset position;
late Size sz; late Size sz;
late bool isMaximized; late bool isMaximized;
setFrameIfMaximized() {
if (isMaximized) {
final pos = bind.getLocalFlutterOption(k: kWindowPrefix + type.name);
var lpos = LastWindowPosition.loadFromString(pos);
position = Offset(
lpos?.offsetWidth ?? position.dx, lpos?.offsetHeight ?? position.dy);
sz = Size(lpos?.width ?? sz.width, lpos?.height ?? sz.height);
}
}
switch (type) { switch (type) {
case WindowType.Main: case WindowType.Main:
isMaximized = await windowManager.isMaximized();
position = await windowManager.getPosition(); position = await windowManager.getPosition();
sz = await windowManager.getSize(); sz = await windowManager.getSize();
isMaximized = await windowManager.isMaximized(); setFrameIfMaximized();
break; break;
default: default:
final wc = WindowController.fromWindowId(windowId!); final wc = WindowController.fromWindowId(windowId!);
isMaximized = await wc.isMaximized();
final Rect frame; final Rect frame;
try { try {
frame = await wc.getFrame(); frame = await wc.getFrame();
@ -1411,7 +1423,7 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
} }
position = frame.topLeft; position = frame.topLeft;
sz = frame.size; sz = frame.size;
isMaximized = await wc.isMaximized(); setFrameIfMaximized();
break; break;
} }
if (Platform.isWindows) { if (Platform.isWindows) {
@ -1429,24 +1441,43 @@ Future<void> saveWindowPosition(WindowType type, {int? windowId}) async {
final pos = LastWindowPosition( final pos = LastWindowPosition(
sz.width, sz.height, position.dx, position.dy, isMaximized); sz.width, sz.height, position.dx, position.dy, isMaximized);
debugPrint( debugPrint(
"Saving frame: $windowId: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}"); "Saving frame: $windowId: ${pos.width}/${pos.height}, offset:${pos.offsetWidth}/${pos.offsetHeight}, isMaximized:${pos.isMaximized}");
await bind.setLocalFlutterOption( await bind.setLocalFlutterOption(
k: kWindowPrefix + type.name, v: pos.toString()); k: kWindowPrefix + type.name, v: pos.toString());
if (type == WindowType.RemoteDesktop && windowId != null) { if (type == WindowType.RemoteDesktop && windowId != null) {
await _saveSessionWindowPosition(type, windowId, pos); await _saveSessionWindowPosition(type, windowId, isMaximized, pos);
} }
} }
Future _saveSessionWindowPosition( Future _saveSessionWindowPosition(WindowType windowType, int windowId,
WindowType windowType, int windowId, LastWindowPosition pos) async { bool isMaximized, LastWindowPosition pos) async {
final remoteList = await DesktopMultiWindow.invokeMethod( final remoteList = await DesktopMultiWindow.invokeMethod(
windowId, kWindowEventGetRemoteList, null); windowId, kWindowEventGetRemoteList, null);
getPeerPos(String peerId) {
if (isMaximized) {
final peerPos = bind.mainGetPeerFlutterOptionSync(
id: peerId, k: kWindowPrefix + windowType.name);
var lpos = LastWindowPosition.loadFromString(peerPos);
return LastWindowPosition(
lpos?.width ?? pos.offsetWidth,
lpos?.height ?? pos.offsetHeight,
lpos?.offsetWidth ?? pos.offsetWidth,
lpos?.offsetHeight ?? pos.offsetHeight,
isMaximized)
.toString();
} else {
return pos.toString();
}
}
if (remoteList != null) { if (remoteList != null) {
for (final peerId in remoteList.split(',')) { for (final peerId in remoteList.split(',')) {
bind.mainSetPeerFlutterOptionSync( bind.mainSetPeerFlutterOptionSync(
id: peerId, k: kWindowPrefix + windowType.name, v: pos.toString()); id: peerId,
k: kWindowPrefix + windowType.name,
v: getPeerPos(peerId));
} }
} }
} }
@ -1529,7 +1560,7 @@ Future<Offset?> _adjustRestoreMainWindowOffset(
if ((left + minWidth) > frameRight! || if ((left + minWidth) > frameRight! ||
(top + minWidth) > frameBottom! || (top + minWidth) > frameBottom! ||
(left + width - minWidth) < frameLeft || (left + width - minWidth) < frameLeft ||
(top - minWidth) < frameTop!) { top < frameTop!) {
return null; return null;
} else { } else {
return Offset(left, top); return Offset(left, top);
@ -1586,34 +1617,7 @@ Future<bool> restoreWindowPosition(WindowType type,
} }
} }
switch (type) { final size = await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
case WindowType.Main:
if (lpos.isMaximized == true) {
await windowManager.maximize();
} else {
final size =
await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
final offset = await _adjustRestoreMainWindowOffset(
lpos.offsetWidth,
lpos.offsetHeight,
size.width,
size.height,
);
await windowManager.setSize(size);
if (offset == null) {
await windowManager.center();
} else {
await windowManager.setPosition(offset);
}
}
return true;
default:
final wc = WindowController.fromWindowId(windowId!);
if (lpos.isMaximized == true) {
await wc.maximize();
} else {
final size =
await _adjustRestoreMainWindowSize(lpos.width, lpos.height);
final offset = await _adjustRestoreMainWindowOffset( final offset = await _adjustRestoreMainWindowOffset(
lpos.offsetWidth, lpos.offsetWidth,
lpos.offsetHeight, lpos.offsetHeight,
@ -1622,6 +1626,27 @@ Future<bool> restoreWindowPosition(WindowType type,
); );
debugPrint( debugPrint(
"restore lpos: ${size.width}/${size.height}, offset:${offset?.dx}/${offset?.dy}"); "restore lpos: ${size.width}/${size.height}, offset:${offset?.dx}/${offset?.dy}");
switch (type) {
case WindowType.Main:
restorePos() async {
if (offset == null) {
await windowManager.center();
} else {
await windowManager.setPosition(offset);
}
}
if (lpos.isMaximized == true) {
await restorePos();
await windowManager.maximize();
} else {
await windowManager.setSize(size);
await restorePos();
}
return true;
default:
final wc = WindowController.fromWindowId(windowId!);
restoreFrame() async {
if (offset == null) { if (offset == null) {
await wc.center(); await wc.center();
} else { } else {
@ -1630,6 +1655,12 @@ Future<bool> restoreWindowPosition(WindowType type,
await wc.setFrame(frame); await wc.setFrame(frame);
} }
} }
if (lpos.isMaximized == true) {
await restoreFrame();
await wc.maximize();
} else {
await restoreFrame();
}
break; break;
} }
return false; return false;