refactor: streamline settings bindings
This commit is contained in:
@@ -9,7 +9,9 @@ import '../services/shader_asset_loader.dart';
|
||||
///
|
||||
/// Persists the selected shader preset so it is restored across sessions.
|
||||
class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin {
|
||||
late SettingsService _settingsService;
|
||||
SettingsService? _settingsService;
|
||||
ValueNotifier<String>? _savedPresetListenable;
|
||||
ValueNotifier<List<Map<String, dynamic>>>? _customPresetsListenable;
|
||||
|
||||
ShaderPreset _savedPreset = ShaderPreset.none;
|
||||
ShaderPreset _currentPreset = ShaderPreset.none;
|
||||
@@ -21,13 +23,31 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin {
|
||||
}
|
||||
|
||||
Future<void> _initialize() async {
|
||||
_settingsService = await SettingsService.getInstance();
|
||||
final service = await SettingsService.getInstance();
|
||||
if (_settingsService == service && _savedPresetListenable != null && _customPresetsListenable != null) {
|
||||
_syncFromSettings();
|
||||
return;
|
||||
}
|
||||
|
||||
// Load custom presets from storage
|
||||
final customData = _settingsService.read(SettingsService.customShaderPresets);
|
||||
_customPresets = customData.map((json) => ShaderPreset.fromJson(json)).toList();
|
||||
_savedPresetListenable?.removeListener(_onSettingsChanged);
|
||||
_customPresetsListenable?.removeListener(_onSettingsChanged);
|
||||
_settingsService = service;
|
||||
_savedPresetListenable = service.listenable(SettingsService.globalShaderPreset)..addListener(_onSettingsChanged);
|
||||
_customPresetsListenable = service.listenable(SettingsService.customShaderPresets)..addListener(_onSettingsChanged);
|
||||
_syncFromSettings();
|
||||
}
|
||||
|
||||
final presetId = _settingsService.read(SettingsService.globalShaderPreset);
|
||||
void _onSettingsChanged() => _syncFromSettings();
|
||||
|
||||
void _syncFromSettings() {
|
||||
final service = _settingsService;
|
||||
if (service == null) return;
|
||||
|
||||
final customData = service.read(SettingsService.customShaderPresets);
|
||||
final customPresets = customData.map((json) => ShaderPreset.fromJson(json)).toList();
|
||||
_customPresets = customPresets;
|
||||
|
||||
final presetId = service.read(SettingsService.globalShaderPreset);
|
||||
_savedPreset = findPresetById(presetId) ?? ShaderPreset.none;
|
||||
_currentPreset = _savedPreset;
|
||||
|
||||
@@ -35,6 +55,13 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin {
|
||||
safeNotifyListeners();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_savedPresetListenable?.removeListener(_onSettingsChanged);
|
||||
_customPresetsListenable?.removeListener(_onSettingsChanged);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
/// Whether the provider has finished initializing
|
||||
bool get initialized => _initialized;
|
||||
|
||||
@@ -61,10 +88,13 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin {
|
||||
|
||||
/// Apply and persist a shader preset
|
||||
Future<void> setPreset(ShaderPreset preset) async {
|
||||
_savedPreset = preset;
|
||||
_currentPreset = preset;
|
||||
await _settingsService.write(SettingsService.globalShaderPreset, preset.id);
|
||||
safeNotifyListeners();
|
||||
final service = _settingsService ?? await SettingsService.getInstance();
|
||||
await service.write(SettingsService.globalShaderPreset, preset.id);
|
||||
if (_savedPresetListenable == null) {
|
||||
_savedPreset = preset;
|
||||
_currentPreset = preset;
|
||||
safeNotifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
/// Update the current preset without persisting (e.g. toggling off temporarily)
|
||||
@@ -85,12 +115,12 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin {
|
||||
|
||||
_customPresets.add(preset);
|
||||
await _saveCustomPresets();
|
||||
safeNotifyListeners();
|
||||
return preset;
|
||||
}
|
||||
|
||||
/// Delete a custom shader preset and its file.
|
||||
Future<void> deleteCustomShader(ShaderPreset preset) async {
|
||||
final wasActive = _currentPreset.id == preset.id || _savedPreset.id == preset.id;
|
||||
if (preset.fileName != null) {
|
||||
await ShaderAssetLoader.deleteCustomShader(preset.fileName!);
|
||||
}
|
||||
@@ -98,18 +128,15 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin {
|
||||
await _saveCustomPresets();
|
||||
|
||||
// Reset to none if the deleted preset was active
|
||||
if (_currentPreset.id == preset.id || _savedPreset.id == preset.id) {
|
||||
_savedPreset = ShaderPreset.none;
|
||||
_currentPreset = ShaderPreset.none;
|
||||
await _settingsService.write(SettingsService.globalShaderPreset, ShaderPreset.none.id);
|
||||
if (wasActive) {
|
||||
await setPreset(ShaderPreset.none);
|
||||
}
|
||||
|
||||
safeNotifyListeners();
|
||||
}
|
||||
|
||||
Future<void> _saveCustomPresets() async {
|
||||
final service = _settingsService ?? await SettingsService.getInstance();
|
||||
final data = _customPresets.map((p) => p.toJson()).toList();
|
||||
await _settingsService.write(SettingsService.customShaderPresets, data);
|
||||
await service.write(SettingsService.customShaderPresets, data);
|
||||
}
|
||||
|
||||
/// Reset to default (no shaders)
|
||||
|
||||
Reference in New Issue
Block a user