✨ Able to adjust lyrics mode and player default mode
This commit is contained in:
@@ -12,16 +12,38 @@ enum ImportMode {
|
||||
final String displayName;
|
||||
}
|
||||
|
||||
enum DefaultPlayerScreen {
|
||||
cover('Cover'),
|
||||
lyrics('Lyrics'),
|
||||
queue('Queue');
|
||||
|
||||
const DefaultPlayerScreen(this.displayName);
|
||||
final String displayName;
|
||||
}
|
||||
|
||||
enum LyricsMode {
|
||||
curved('Curved'),
|
||||
flat('Flat'),
|
||||
auto('Auto');
|
||||
|
||||
const LyricsMode(this.displayName);
|
||||
final String displayName;
|
||||
}
|
||||
|
||||
class SettingsState {
|
||||
final ImportMode importMode;
|
||||
final bool autoScan;
|
||||
final bool watchForChanges;
|
||||
final DefaultPlayerScreen defaultPlayerScreen;
|
||||
final LyricsMode lyricsMode;
|
||||
final Set<String> supportedFormats;
|
||||
|
||||
const SettingsState({
|
||||
this.importMode = ImportMode.mixed,
|
||||
this.autoScan = true,
|
||||
this.watchForChanges = true,
|
||||
this.defaultPlayerScreen = DefaultPlayerScreen.cover,
|
||||
this.lyricsMode = LyricsMode.auto,
|
||||
this.supportedFormats = const {
|
||||
'.mp3',
|
||||
'.flac',
|
||||
@@ -38,12 +60,16 @@ class SettingsState {
|
||||
ImportMode? importMode,
|
||||
bool? autoScan,
|
||||
bool? watchForChanges,
|
||||
DefaultPlayerScreen? defaultPlayerScreen,
|
||||
LyricsMode? lyricsMode,
|
||||
Set<String>? supportedFormats,
|
||||
}) {
|
||||
return SettingsState(
|
||||
importMode: importMode ?? this.importMode,
|
||||
autoScan: autoScan ?? this.autoScan,
|
||||
watchForChanges: watchForChanges ?? this.watchForChanges,
|
||||
defaultPlayerScreen: defaultPlayerScreen ?? this.defaultPlayerScreen,
|
||||
lyricsMode: lyricsMode ?? this.lyricsMode,
|
||||
supportedFormats: supportedFormats ?? this.supportedFormats,
|
||||
);
|
||||
}
|
||||
@@ -54,6 +80,8 @@ class SettingsNotifier extends _$SettingsNotifier {
|
||||
static const String _importModeKey = 'import_mode';
|
||||
static const String _autoScanKey = 'auto_scan';
|
||||
static const String _watchForChangesKey = 'watch_for_changes';
|
||||
static const String _defaultPlayerScreenKey = 'default_player_screen';
|
||||
static const String _lyricsModeKey = 'lyrics_mode';
|
||||
|
||||
@override
|
||||
Future<SettingsState> build() async {
|
||||
@@ -65,10 +93,20 @@ class SettingsNotifier extends _$SettingsNotifier {
|
||||
final autoScan = prefs.getBool(_autoScanKey) ?? true;
|
||||
final watchForChanges = prefs.getBool(_watchForChangesKey) ?? true;
|
||||
|
||||
final defaultPlayerScreenIndex = prefs.getInt(_defaultPlayerScreenKey) ?? 0;
|
||||
final defaultPlayerScreen =
|
||||
DefaultPlayerScreen.values[defaultPlayerScreenIndex];
|
||||
|
||||
final lyricsModeIndex =
|
||||
prefs.getInt(_lyricsModeKey) ?? 2; // Auto is default
|
||||
final lyricsMode = LyricsMode.values[lyricsModeIndex];
|
||||
|
||||
return SettingsState(
|
||||
importMode: importMode,
|
||||
autoScan: autoScan,
|
||||
watchForChanges: watchForChanges,
|
||||
defaultPlayerScreen: defaultPlayerScreen,
|
||||
lyricsMode: lyricsMode,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -98,6 +136,26 @@ class SettingsNotifier extends _$SettingsNotifier {
|
||||
state = AsyncValue.data(state.value!.copyWith(watchForChanges: enabled));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setDefaultPlayerScreen(DefaultPlayerScreen screen) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setInt(_defaultPlayerScreenKey, screen.index);
|
||||
|
||||
if (state.hasValue) {
|
||||
state = AsyncValue.data(
|
||||
state.value!.copyWith(defaultPlayerScreen: screen),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setLyricsMode(LyricsMode mode) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setInt(_lyricsModeKey, mode.index);
|
||||
|
||||
if (state.hasValue) {
|
||||
state = AsyncValue.data(state.value!.copyWith(lyricsMode: mode));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Convenience providers for specific settings
|
||||
@@ -154,3 +212,39 @@ class WatchForChangesNotifier extends _$WatchForChangesNotifier {
|
||||
await ref.read(settingsProvider.notifier).setWatchForChanges(enabled);
|
||||
}
|
||||
}
|
||||
|
||||
@riverpod
|
||||
class DefaultPlayerScreenNotifier extends _$DefaultPlayerScreenNotifier {
|
||||
@override
|
||||
DefaultPlayerScreen build() {
|
||||
return ref
|
||||
.watch(settingsProvider)
|
||||
.when(
|
||||
data: (settings) => settings.defaultPlayerScreen,
|
||||
loading: () => DefaultPlayerScreen.cover,
|
||||
error: (_, _) => DefaultPlayerScreen.cover,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> update(DefaultPlayerScreen screen) async {
|
||||
await ref.read(settingsProvider.notifier).setDefaultPlayerScreen(screen);
|
||||
}
|
||||
}
|
||||
|
||||
@riverpod
|
||||
class LyricsModeNotifier extends _$LyricsModeNotifier {
|
||||
@override
|
||||
LyricsMode build() {
|
||||
return ref
|
||||
.watch(settingsProvider)
|
||||
.when(
|
||||
data: (settings) => settings.lyricsMode,
|
||||
loading: () => LyricsMode.auto,
|
||||
error: (_, _) => LyricsMode.auto,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> update(LyricsMode mode) async {
|
||||
await ref.read(settingsProvider.notifier).setLyricsMode(mode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ final class SettingsNotifierProvider
|
||||
SettingsNotifier create() => SettingsNotifier();
|
||||
}
|
||||
|
||||
String _$settingsNotifierHash() => r'6dc43c0f1d6ee7b7744dae2a8557b758574473d2';
|
||||
String _$settingsNotifierHash() => r'4099dd1aa3dfc971c0761f314d196f3bc97315e7';
|
||||
|
||||
abstract class _$SettingsNotifier extends $AsyncNotifier<SettingsState> {
|
||||
FutureOr<SettingsState> build();
|
||||
@@ -214,3 +214,113 @@ abstract class _$WatchForChangesNotifier extends $Notifier<bool> {
|
||||
element.handleValue(ref, created);
|
||||
}
|
||||
}
|
||||
|
||||
@ProviderFor(DefaultPlayerScreenNotifier)
|
||||
const defaultPlayerScreenProvider = DefaultPlayerScreenNotifierProvider._();
|
||||
|
||||
final class DefaultPlayerScreenNotifierProvider
|
||||
extends
|
||||
$NotifierProvider<DefaultPlayerScreenNotifier, DefaultPlayerScreen> {
|
||||
const DefaultPlayerScreenNotifierProvider._()
|
||||
: super(
|
||||
from: null,
|
||||
argument: null,
|
||||
retry: null,
|
||||
name: r'defaultPlayerScreenProvider',
|
||||
isAutoDispose: true,
|
||||
dependencies: null,
|
||||
$allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@override
|
||||
String debugGetCreateSourceHash() => _$defaultPlayerScreenNotifierHash();
|
||||
|
||||
@$internal
|
||||
@override
|
||||
DefaultPlayerScreenNotifier create() => DefaultPlayerScreenNotifier();
|
||||
|
||||
/// {@macro riverpod.override_with_value}
|
||||
Override overrideWithValue(DefaultPlayerScreen value) {
|
||||
return $ProviderOverride(
|
||||
origin: this,
|
||||
providerOverride: $SyncValueProvider<DefaultPlayerScreen>(value),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$defaultPlayerScreenNotifierHash() =>
|
||||
r'cddfe0510ec38b3d5800901bd018728ca2567d54';
|
||||
|
||||
abstract class _$DefaultPlayerScreenNotifier
|
||||
extends $Notifier<DefaultPlayerScreen> {
|
||||
DefaultPlayerScreen build();
|
||||
@$mustCallSuper
|
||||
@override
|
||||
void runBuild() {
|
||||
final created = build();
|
||||
final ref = this.ref as $Ref<DefaultPlayerScreen, DefaultPlayerScreen>;
|
||||
final element =
|
||||
ref.element
|
||||
as $ClassProviderElement<
|
||||
AnyNotifier<DefaultPlayerScreen, DefaultPlayerScreen>,
|
||||
DefaultPlayerScreen,
|
||||
Object?,
|
||||
Object?
|
||||
>;
|
||||
element.handleValue(ref, created);
|
||||
}
|
||||
}
|
||||
|
||||
@ProviderFor(LyricsModeNotifier)
|
||||
const lyricsModeProvider = LyricsModeNotifierProvider._();
|
||||
|
||||
final class LyricsModeNotifierProvider
|
||||
extends $NotifierProvider<LyricsModeNotifier, LyricsMode> {
|
||||
const LyricsModeNotifierProvider._()
|
||||
: super(
|
||||
from: null,
|
||||
argument: null,
|
||||
retry: null,
|
||||
name: r'lyricsModeProvider',
|
||||
isAutoDispose: true,
|
||||
dependencies: null,
|
||||
$allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@override
|
||||
String debugGetCreateSourceHash() => _$lyricsModeNotifierHash();
|
||||
|
||||
@$internal
|
||||
@override
|
||||
LyricsModeNotifier create() => LyricsModeNotifier();
|
||||
|
||||
/// {@macro riverpod.override_with_value}
|
||||
Override overrideWithValue(LyricsMode value) {
|
||||
return $ProviderOverride(
|
||||
origin: this,
|
||||
providerOverride: $SyncValueProvider<LyricsMode>(value),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$lyricsModeNotifierHash() =>
|
||||
r'b3f77739bfab6bb7551cb31bebfef5c8b6dcb423';
|
||||
|
||||
abstract class _$LyricsModeNotifier extends $Notifier<LyricsMode> {
|
||||
LyricsMode build();
|
||||
@$mustCallSuper
|
||||
@override
|
||||
void runBuild() {
|
||||
final created = build();
|
||||
final ref = this.ref as $Ref<LyricsMode, LyricsMode>;
|
||||
final element =
|
||||
ref.element
|
||||
as $ClassProviderElement<
|
||||
AnyNotifier<LyricsMode, LyricsMode>,
|
||||
LyricsMode,
|
||||
Object?,
|
||||
Object?
|
||||
>;
|
||||
element.handleValue(ref, created);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user