瀏覽代碼

feat: Implement window size settings saving (#2648)

This commit addresses the feature request to save the window size settings.
The application will now remember the user's preferred window size, allowing
for a more personalized and seamless user experience.

Fixes: #2544

Co-authored-by: Akarsh Jain <[email protected]>
Lucas.Xu 2 年之前
父節點
當前提交
dac4bd88e0

+ 6 - 0
frontend/appflowy_flutter/lib/core/config/kv_keys.dart

@@ -12,4 +12,10 @@ class KVKeys {
   /// - local
   /// - supabase
   static const String loginType = '$prefix.login_type';
+
+  /// The key for saving the window size
+  ///
+  /// The value is a json string with the following format:
+  ///   {'height': 600.0, 'width': 800.0}
+  static const String windowSize = 'windowSize';
 }

+ 36 - 0
frontend/appflowy_flutter/lib/startup/tasks/app_window_size_manager.dart

@@ -0,0 +1,36 @@
+import 'dart:convert';
+import 'dart:math';
+import 'dart:ui';
+
+import 'package:appflowy/core/config/kv.dart';
+import 'package:appflowy/core/config/kv_keys.dart';
+import 'package:appflowy/startup/startup.dart';
+
+class WindowSizeManager {
+  static const double minWindowHeight = 400.0;
+  static const double minWindowWidth = 600.0;
+
+  Future<void> saveSize(Size size) async {
+    final windowSize = {
+      'height': max(size.height, minWindowHeight),
+      'width': max(size.width, minWindowWidth),
+    };
+
+    await getIt<KeyValueStorage>().set(
+      KVKeys.windowSize,
+      jsonEncode(windowSize),
+    );
+  }
+
+  Future<Size> getSize() async {
+    const defaultWindowSize = '{"height": 600.0, "width": 800.0}';
+    final windowSize = await getIt<KeyValueStorage>().get(KVKeys.windowSize);
+    final size = json.decode(
+      windowSize.fold(
+        (l) => defaultWindowSize,
+        (r) => r,
+      ),
+    );
+    return Size(size['width']!, size['height']!);
+  }
+}

+ 19 - 3
frontend/appflowy_flutter/lib/startup/tasks/windows.dart

@@ -2,10 +2,12 @@ import 'dart:ui';
 
 import 'package:appflowy/core/helpers/helpers.dart';
 import 'package:appflowy/startup/startup.dart';
+import 'package:appflowy/startup/tasks/app_window_size_manager.dart';
 import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
 import 'package:window_manager/window_manager.dart';
 
-class InitAppWindowTask extends LaunchTask {
+class InitAppWindowTask extends LaunchTask with WindowListener {
   const InitAppWindowTask({
     this.minimumSize = const Size(800, 600),
     this.title = 'AppFlowy',
@@ -22,9 +24,17 @@ class InitAppWindowTask extends LaunchTask {
     }
 
     await windowManager.ensureInitialized();
+    windowManager.addListener(this);
 
-    WindowOptions windowOptions = WindowOptions(
-      minimumSize: minimumSize,
+    final windowSize = await WindowSizeManager().getSize();
+
+    final windowOptions = WindowOptions(
+      size: windowSize,
+      minimumSize: const Size(
+        WindowSizeManager.minWindowWidth,
+        WindowSizeManager.minWindowHeight,
+      ),
+      center: true,
       title: title,
     );
 
@@ -33,4 +43,10 @@ class InitAppWindowTask extends LaunchTask {
       await windowManager.focus();
     });
   }
+
+  @override
+  Future<void> onWindowResize() async {
+    final currentWindowSize = await windowManager.getSize();
+    WindowSizeManager().saveSize(currentWindowSize);
+  }
 }