From 42294b027a81d433869600d0e84cbb250f723def Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Wed, 13 Jul 2022 19:22:58 +0600 Subject: [PATCH] Fixed no Settings icon on larger displays Window size persistance support --- lib/components/Home/Home.dart | 4 +- lib/components/Home/Sidebar.dart | 7 ++-- lib/main.dart | 64 ++++++++++++++++++++++++++++---- lib/models/LocalStorageKeys.dart | 2 + pubspec.lock | 2 +- 5 files changed, 66 insertions(+), 13 deletions(-) diff --git a/lib/components/Home/Home.dart b/lib/components/Home/Home.dart index 09ed26f9..1fb3e138 100644 --- a/lib/components/Home/Home.dart +++ b/lib/components/Home/Home.dart @@ -47,8 +47,8 @@ class Home extends HookConsumerWidget { md: 80, lg: 256, sm: 0, - xl: 0, - xxl: 0, + xl: 256, + xxl: 256, ); final _selectedIndex = useState(0); _onSelectedIndexChanged(int index) => _selectedIndex.value = index; diff --git a/lib/components/Home/Sidebar.dart b/lib/components/Home/Sidebar.dart index 9a638e56..243f0d88 100644 --- a/lib/components/Home/Sidebar.dart +++ b/lib/components/Home/Sidebar.dart @@ -37,7 +37,6 @@ class Sidebar extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final breakpoints = useBreakpoints(); - if (breakpoints.isSm) return Container(); final extended = useState(false); final meSnapshot = ref.watch(currentUserQuery); final auth = ref.watch(authProvider); @@ -46,8 +45,8 @@ class Sidebar extends HookConsumerWidget { md: 80, lg: 256, sm: 0, - xl: 0, - xxl: 0, + xl: 256, + xxl: 256, ); useEffect(() { @@ -60,6 +59,8 @@ class Sidebar extends HookConsumerWidget { return null; }); + if (breakpoints.isSm) return Container(); + return SafeArea( child: Material( color: Theme.of(context).navigationRailTheme.backgroundColor, diff --git a/lib/main.dart b/lib/main.dart index e6b47da2..ffc8f322 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:audio_service/audio_service.dart'; import 'package:bitsdojo_window/bitsdojo_window.dart'; import 'package:flutter/material.dart'; @@ -5,8 +7,10 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:spotube/entities/CacheTrack.dart'; import 'package:spotube/models/GoRouteDeclarations.dart'; +import 'package:spotube/models/LocalStorageKeys.dart'; import 'package:spotube/models/Logger.dart'; import 'package:spotube/provider/AudioPlayer.dart'; import 'package:spotube/provider/Playback.dart'; @@ -23,13 +27,20 @@ void main() async { Hive.registerAdapter(CacheTrackEngagementAdapter()); if (kIsDesktop) { WidgetsFlutterBinding.ensureInitialized(); - // final client = DBusClient.session(); - // await client.registerObject(Media_Player()); - doWhenWindowReady(() { + doWhenWindowReady(() async { + final localStorage = await SharedPreferences.getInstance(); + final rawSize = localStorage.getString(LocalStorageKeys.windowSizeInfo); + final savedSize = rawSize != null ? json.decode(rawSize) : null; + final double? height = savedSize?["height"]; + final double? width = savedSize?["width"]; appWindow.minSize = const Size(359, 700); appWindow.alignment = Alignment.center; appWindow.title = "Spotube"; - appWindow.maximize(); + if (height != null && width != null && height >= 700 && width >= 359) { + appWindow.size = Size(width, height); + } else { + appWindow.maximize(); + } appWindow.show(); }); } @@ -71,13 +82,52 @@ void main() async { )); } -class Spotube extends HookConsumerWidget { +class Spotube extends StatefulHookConsumerWidget { + const Spotube({Key? key}) : super(key: key); + + @override + _SpotubeState createState() => _SpotubeState(); +} + +class _SpotubeState extends ConsumerState with WidgetsBindingObserver { final GoRouter _router = createGoRouter(); final logger = getLogger(Spotube); + SharedPreferences? localStorage; + + Size? prevSize; - Spotube({Key? key}) : super(key: key); @override - Widget build(BuildContext context, ref) { + void initState() { + super.initState(); + SharedPreferences.getInstance().then(((value) => localStorage = value)); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeMetrics() { + super.didChangeMetrics(); + if (localStorage == null || + (prevSize?.width == appWindow.size.width && + prevSize?.height == appWindow.size.height) || + kIsMobile) return; + localStorage!.setString( + LocalStorageKeys.windowSizeInfo, + jsonEncode({ + 'width': appWindow.size.width, + 'height': appWindow.size.height, + }), + ); + prevSize = appWindow.size; + } + + @override + Widget build(BuildContext context) { final themeMode = ref.watch(userPreferencesProvider.select((s) => s.themeMode)); final accentMaterialColor = diff --git a/lib/models/LocalStorageKeys.dart b/lib/models/LocalStorageKeys.dart index 43e3b012..bca13322 100644 --- a/lib/models/LocalStorageKeys.dart +++ b/lib/models/LocalStorageKeys.dart @@ -16,4 +16,6 @@ abstract class LocalStorageKeys { static String playPauseHotKey = "play_pause_hot_key"; static String volume = "volume"; + + static String windowSizeInfo = "window_size_info"; } diff --git a/pubspec.lock b/pubspec.lock index c3ec6182..ac89d545 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -390,7 +390,7 @@ packages: name: flutter_hooks url: "https://pub.dartlang.org" source: hosted - version: "0.18.4" + version: "0.18.5+1" flutter_launcher_icons: dependency: "direct dev" description: