From d2b4a81029e9cb619eeba7f50a29d9fd612012c1 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Tue, 5 Apr 2022 19:07:14 +0600 Subject: [PATCH] Settings & PlayerControls adjusted for ultrawide/4k screens --- lib/components/Player/Player.dart | 2 +- lib/components/Player/PlayerControls.dart | 2 +- lib/components/Settings.dart | 479 +++++++++++----------- lib/main.dart | 1 + lib/provider/UserPreferences.dart | 1 + 5 files changed, 249 insertions(+), 236 deletions(-) diff --git a/lib/components/Player/Player.dart b/lib/components/Player/Player.dart index 957a1dab..bcee9c82 100644 --- a/lib/components/Player/Player.dart +++ b/lib/components/Player/Player.dart @@ -131,7 +131,7 @@ class Player extends HookConsumerWidget { children: [ Expanded(child: PlayerTrackDetails(albumArt: albumArt)), // controls - Expanded( + Flexible( flex: 3, child: PlayerControls(), ), diff --git a/lib/components/Player/PlayerControls.dart b/lib/components/Player/PlayerControls.dart index cb9a8d2f..a65947fd 100644 --- a/lib/components/Player/PlayerControls.dart +++ b/lib/components/Player/PlayerControls.dart @@ -43,7 +43,7 @@ class PlayerControls extends HookConsumerWidget { final duration = _duration.value ?? Duration.zero; return Container( - constraints: const BoxConstraints(maxWidth: 700), + constraints: const BoxConstraints(maxWidth: 600), child: Column( children: [ StreamBuilder( diff --git a/lib/components/Settings.dart b/lib/components/Settings.dart index 5f7609b3..49a00b1e 100644 --- a/lib/components/Settings.dart +++ b/lib/components/Settings.dart @@ -42,245 +42,256 @@ class Settings extends HookConsumerWidget { style: Theme.of(context).textTheme.headline5, ), ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Row( - children: [ - Expanded( - flex: 2, - child: Text( - "Genius Access Token", - style: Theme.of(context).textTheme.subtitle1, - ), - ), - Expanded( - flex: 1, - child: TextField( - controller: geniusTokenController, - decoration: InputDecoration( - hintText: preferences.geniusAccessToken, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: ElevatedButton( - onPressed: geniusAccessToken.value != null - ? () async { - SharedPreferences localStorage = - await SharedPreferences.getInstance(); - if (geniusAccessToken.value != null && - geniusAccessToken.value!.isNotEmpty) { - preferences.setGeniusAccessToken( - geniusAccessToken.value!, - ); - localStorage.setString( - LocalStorageKeys.geniusAccessToken, - geniusAccessToken.value!); - } - - geniusAccessToken.value = null; - geniusTokenController.text = ""; - } - : null, - child: const Text("Save"), - ), - ) - ], - ), - const SizedBox(height: 10), - if (!Platform.isAndroid && !Platform.isIOS) ...[ - SettingsHotKeyTile( - title: "Next track global shortcut", - currentHotKey: preferences.nextTrackHotKey, - onHotKeyRecorded: (value) { - preferences.setNextTrackHotKey(value); - }, - ), - SettingsHotKeyTile( - title: "Prev track global shortcut", - currentHotKey: preferences.prevTrackHotKey, - onHotKeyRecorded: (value) { - preferences.setPrevTrackHotKey(value); - }, - ), - SettingsHotKeyTile( - title: "Play/Pause global shortcut", - currentHotKey: preferences.playPauseHotKey, - onHotKeyRecorded: (value) { - preferences.setPlayPauseHotKey(value); - }, - ), - ], - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text("Theme"), - DropdownButton( - value: preferences.themeMode, - items: const [ - DropdownMenuItem( - child: Text( - "Dark", - ), - value: ThemeMode.dark, - ), - DropdownMenuItem( - child: Text( - "Light", - ), - value: ThemeMode.light, - ), - DropdownMenuItem( - child: Text("System"), - value: ThemeMode.system, - ), - ], - onChanged: (value) { - if (value != null) { - preferences.setThemeMode(value); - } - }, - ) - ], - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text("Market Place (Recommendation Country)"), - DropdownButton( - value: preferences.recommendationMarket, - items: spotifyMarkets - .map((country) => (DropdownMenuItem( - child: Text(country), - value: country, - ))) - .toList(), - onChanged: (value) { - if (value == null) return; - preferences.setRecommendationMarket(value as String); - }, - ), - ], - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text("Download lyrics along with the Track"), - Switch.adaptive( - value: preferences.saveTrackLyrics, - onChanged: (state) { - preferences.setSaveTrackLyrics(state); - }, - ), - ], - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Expanded( - flex: 2, - child: Text( - "Format of the YouTube Search term (Case sensitive)"), - ), - Expanded( - flex: 1, - child: TextField( - controller: ytSearchFormatController, - ), - ), - ], - ), - const SizedBox(height: 10), - if (auth.isAnonymous) - Wrap( - spacing: 20, - runSpacing: 20, - alignment: WrapAlignment.spaceBetween, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - const Text("Login with your Spotify account"), - ElevatedButton( - child: Text("Connect with Spotify".toUpperCase()), - onPressed: () { - GoRouter.of(context).push("/login"); - }, - style: ButtonStyle( - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25.0), - ), - ), - ), - ) - ], - ), - if (auth.isLoggedIn) - Builder(builder: (context) { - Auth auth = ref.watch(authProvider); - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + body: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + child: Container( + constraints: const BoxConstraints(maxWidth: 1366), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( children: [ - const Text("Log out of this account"), - ElevatedButton( - child: const Text("Logout"), - style: ButtonStyle( - backgroundColor: - MaterialStateProperty.all(Colors.red), - ), - onPressed: () async { - SharedPreferences localStorage = - await SharedPreferences.getInstance(); - await localStorage.clear(); - auth.logout(); - GoRouter.of(context).pop(); - }, + Row( + children: [ + Expanded( + flex: 2, + child: Text( + "Genius Access Token", + style: Theme.of(context).textTheme.subtitle1, + ), + ), + Expanded( + flex: 1, + child: TextField( + controller: geniusTokenController, + decoration: InputDecoration( + hintText: preferences.geniusAccessToken, + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: ElevatedButton( + onPressed: geniusAccessToken.value != null + ? () async { + SharedPreferences localStorage = + await SharedPreferences.getInstance(); + if (geniusAccessToken.value != null && + geniusAccessToken.value!.isNotEmpty) { + preferences.setGeniusAccessToken( + geniusAccessToken.value!, + ); + localStorage.setString( + LocalStorageKeys.geniusAccessToken, + geniusAccessToken.value!); + } + + geniusAccessToken.value = null; + geniusTokenController.text = ""; + } + : null, + child: const Text("Save"), + ), + ) + ], ), + const SizedBox(height: 10), + if (!Platform.isAndroid && !Platform.isIOS) ...[ + SettingsHotKeyTile( + title: "Next track global shortcut", + currentHotKey: preferences.nextTrackHotKey, + onHotKeyRecorded: (value) { + preferences.setNextTrackHotKey(value); + }, + ), + SettingsHotKeyTile( + title: "Prev track global shortcut", + currentHotKey: preferences.prevTrackHotKey, + onHotKeyRecorded: (value) { + preferences.setPrevTrackHotKey(value); + }, + ), + SettingsHotKeyTile( + title: "Play/Pause global shortcut", + currentHotKey: preferences.playPauseHotKey, + onHotKeyRecorded: (value) { + preferences.setPlayPauseHotKey(value); + }, + ), + ], + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text("Theme"), + DropdownButton( + value: preferences.themeMode, + items: const [ + DropdownMenuItem( + child: Text( + "Dark", + ), + value: ThemeMode.dark, + ), + DropdownMenuItem( + child: Text( + "Light", + ), + value: ThemeMode.light, + ), + DropdownMenuItem( + child: Text("System"), + value: ThemeMode.system, + ), + ], + onChanged: (value) { + if (value != null) { + preferences.setThemeMode(value); + } + }, + ) + ], + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text("Market Place (Recommendation Country)"), + DropdownButton( + value: preferences.recommendationMarket, + items: spotifyMarkets + .map((country) => (DropdownMenuItem( + child: Text(country), + value: country, + ))) + .toList(), + onChanged: (value) { + if (value == null) return; + preferences + .setRecommendationMarket(value as String); + }, + ), + ], + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text("Download lyrics along with the Track"), + Switch.adaptive( + value: preferences.saveTrackLyrics, + onChanged: (state) { + preferences.setSaveTrackLyrics(state); + }, + ), + ], + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Expanded( + flex: 2, + child: Text( + "Format of the YouTube Search term (Case sensitive)"), + ), + Expanded( + flex: 1, + child: TextField( + controller: ytSearchFormatController, + ), + ), + ], + ), + const SizedBox(height: 10), + if (auth.isAnonymous) + Wrap( + spacing: 20, + runSpacing: 20, + alignment: WrapAlignment.spaceBetween, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + const Text("Login with your Spotify account"), + ElevatedButton( + child: Text("Connect with Spotify".toUpperCase()), + onPressed: () { + GoRouter.of(context).push("/login"); + }, + style: ButtonStyle( + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(25.0), + ), + ), + ), + ) + ], + ), + if (auth.isLoggedIn) + Builder(builder: (context) { + Auth auth = ref.watch(authProvider); + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text("Log out of this account"), + ElevatedButton( + child: const Text("Logout"), + style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.red), + ), + onPressed: () async { + SharedPreferences localStorage = + await SharedPreferences.getInstance(); + await localStorage.clear(); + auth.logout(); + GoRouter.of(context).pop(); + }, + ), + ], + ); + }), + const SizedBox(height: 40), + const Text("Spotube v2.0.0"), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + Text("Author: "), + Hyperlink( + "Kingkor Roy Tirtho", + "https://github.com/KRTirtho", + ), + ], + ), + const SizedBox(height: 20), + Wrap( + alignment: WrapAlignment.center, + children: const [ + Hyperlink( + "💚 Sponsor/Donate 💚", + "https://opencollective.com/spotube", + ), + Text(" • "), + Hyperlink( + "BSD-4-Clause LICENSE", + "https://github.com/KRTirtho/spotube/blob/master/LICENSE", + ), + Text(" • "), + Hyperlink( + "Bug Report", + "https://github.com/KRTirtho/spotube/issues/new?assignees=&labels=bug&template=bug_report.md&title=", + ), + ], + ), + const SizedBox(height: 10), + const Text("© Spotube 2022. All rights reserved") ], - ); - }), - const SizedBox(height: 40), - const Text("Spotube v2.0.0"), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: const [ - Text("Author: "), - Hyperlink( - "Kingkor Roy Tirtho", - "https://github.com/KRTirtho", ), - ], + ), ), - const SizedBox(height: 20), - Wrap( - alignment: WrapAlignment.center, - children: const [ - Hyperlink( - "💚 Sponsor/Donate 💚", - "https://opencollective.com/spotube", - ), - Text(" • "), - Hyperlink( - "BSD-4-Clause LICENSE", - "https://github.com/KRTirtho/spotube/blob/master/LICENSE", - ), - Text(" • "), - Hyperlink( - "Bug Report", - "https://github.com/KRTirtho/spotube/issues/new?assignees=&labels=bug&template=bug_report.md&title=", - ), - ], - ), - const SizedBox(height: 10), - const Text("© Spotube 2022. All rights reserved") - ], - ), + ), + ], ), ), ); diff --git a/lib/main.dart b/lib/main.dart index bc63f96a..2c31410b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -29,6 +29,7 @@ void main() async { appWindow.size = const Size(900, 700); appWindow.alignment = Alignment.center; appWindow.maximize(); + appWindow.title = "Spotube"; appWindow.show(); }); } diff --git a/lib/provider/UserPreferences.dart b/lib/provider/UserPreferences.dart index d9e67a17..3836115c 100644 --- a/lib/provider/UserPreferences.dart +++ b/lib/provider/UserPreferences.dart @@ -118,6 +118,7 @@ class UserPreferences extends ChangeNotifier { void setRecommendationMarket(String country) { recommendationMarket = country; localStorage?.setString(LocalStorageKeys.recommendationMarket, country); + notifyListeners(); } void setGeniusAccessToken(String token) {