diff --git a/frontend/appflowy_flutter/lib/core/config/kv_keys.dart b/frontend/appflowy_flutter/lib/core/config/kv_keys.dart index e6a21910ea..6e0e389654 100644 --- a/frontend/appflowy_flutter/lib/core/config/kv_keys.dart +++ b/frontend/appflowy_flutter/lib/core/config/kv_keys.dart @@ -19,6 +19,12 @@ class KVKeys { /// {'height': 600.0, 'width': 800.0} static const String windowSize = 'windowSize'; + /// The key for saving the window position + /// + /// The value is a json string with the following format: + /// {'dx': 10.0, 'dy': 10.0} + static const String windowPosition = 'windowPosition'; + static const String kDocumentAppearanceFontSize = 'kDocumentAppearanceFontSize'; static const String kDocumentAppearanceFontFamily = diff --git a/frontend/appflowy_flutter/lib/core/helpers/target_platform.dart b/frontend/appflowy_flutter/lib/core/helpers/target_platform.dart index 5b5419dfd9..ba50353a6e 100644 --- a/frontend/appflowy_flutter/lib/core/helpers/target_platform.dart +++ b/frontend/appflowy_flutter/lib/core/helpers/target_platform.dart @@ -1,11 +1,12 @@ -import 'package:flutter/foundation.dart' show TargetPlatform; +import 'package:flutter/foundation.dart' show TargetPlatform, kIsWeb; extension TargetPlatformHelper on TargetPlatform { /// Convenience function to check if the app is running on a desktop computer. /// /// Easily check if on desktop by checking `defaultTargetPlatform.isDesktop`. bool get isDesktop => - this == TargetPlatform.linux || - this == TargetPlatform.macOS || - this == TargetPlatform.windows; + !kIsWeb && + (this == TargetPlatform.linux || + this == TargetPlatform.macOS || + this == TargetPlatform.windows); } diff --git a/frontend/appflowy_flutter/lib/startup/tasks/app_window_size_manager.dart b/frontend/appflowy_flutter/lib/startup/tasks/app_window_size_manager.dart index 59c3cb4e59..7c5a701767 100644 --- a/frontend/appflowy_flutter/lib/startup/tasks/app_window_size_manager.dart +++ b/frontend/appflowy_flutter/lib/startup/tasks/app_window_size_manager.dart @@ -13,7 +13,10 @@ class WindowSizeManager { static const width = 'width'; static const height = 'height'; - Future saveSize(Size size) async { + static const String dx = 'dx'; + static const String dy = 'dy'; + + Future setSize(Size size) async { final windowSize = { height: max(size.height, minWindowHeight), width: max(size.width, minWindowWidth), @@ -33,4 +36,25 @@ class WindowSizeManager { ); return Size(size[width]!, size[height]!); } + + Future setPosition(Offset offset) async { + await getIt().set( + KVKeys.windowPosition, + jsonEncode({ + dx: offset.dx, + dy: offset.dy, + }), + ); + } + + Future getPosition() async { + final position = await getIt().get(KVKeys.windowPosition); + return position.fold( + (l) => null, + (r) { + final offset = json.decode(r); + return Offset(offset[dx], offset[dy]); + }, + ); + } } diff --git a/frontend/appflowy_flutter/lib/startup/tasks/windows.dart b/frontend/appflowy_flutter/lib/startup/tasks/windows.dart index e3fa0a189b..3e3307dc0f 100644 --- a/frontend/appflowy_flutter/lib/startup/tasks/windows.dart +++ b/frontend/appflowy_flutter/lib/startup/tasks/windows.dart @@ -40,12 +40,35 @@ class InitAppWindowTask extends LaunchTask with WindowListener { windowManager.waitUntilReadyToShow(windowOptions, () async { await windowManager.show(); await windowManager.focus(); + + final position = await WindowSizeManager().getPosition(); + if (position != null) { + await windowManager.setPosition(position); + } }); } @override Future onWindowResize() async { + super.onWindowResize(); + final currentWindowSize = await windowManager.getSize(); - WindowSizeManager().saveSize(currentWindowSize); + WindowSizeManager().setSize(currentWindowSize); + } + + @override + void onWindowMaximize() async { + super.onWindowMaximize(); + + final currentWindowSize = await windowManager.getSize(); + WindowSizeManager().setSize(currentWindowSize); + } + + @override + void onWindowMoved() async { + super.onWindowMoved(); + + final position = await windowManager.getPosition(); + WindowSizeManager().setPosition(position); } }