feat: hero section toggle
This commit is contained in:
@@ -5,6 +5,7 @@ class SettingsProvider extends ChangeNotifier {
|
||||
late SettingsService _settingsService;
|
||||
LibraryDensity _libraryDensity = LibraryDensity.normal;
|
||||
bool _useSeasonPoster = false;
|
||||
bool _showHeroSection = true;
|
||||
|
||||
SettingsProvider() {
|
||||
_initializeSettings();
|
||||
@@ -14,11 +15,13 @@ class SettingsProvider extends ChangeNotifier {
|
||||
_settingsService = await SettingsService.getInstance();
|
||||
_libraryDensity = _settingsService.getLibraryDensity();
|
||||
_useSeasonPoster = _settingsService.getUseSeasonPoster();
|
||||
_showHeroSection = _settingsService.getShowHeroSection();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
LibraryDensity get libraryDensity => _libraryDensity;
|
||||
bool get useSeasonPoster => _useSeasonPoster;
|
||||
bool get showHeroSection => _showHeroSection;
|
||||
|
||||
Future<void> setLibraryDensity(LibraryDensity density) async {
|
||||
if (_libraryDensity != density) {
|
||||
@@ -36,6 +39,14 @@ class SettingsProvider extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setShowHeroSection(bool value) async {
|
||||
if (_showHeroSection != value) {
|
||||
_showHeroSection = value;
|
||||
await _settingsService.setShowHeroSection(value);
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
String get libraryDensityDisplayName {
|
||||
switch (_libraryDensity) {
|
||||
case LibraryDensity.compact:
|
||||
|
||||
@@ -16,6 +16,7 @@ import 'profile_switch_screen.dart';
|
||||
import 'server_selection_screen.dart';
|
||||
import 'hub_detail_screen.dart';
|
||||
import '../providers/user_profile_provider.dart';
|
||||
import '../providers/settings_provider.dart';
|
||||
import '../mixins/refreshable.dart';
|
||||
import '../mixins/item_updatable.dart';
|
||||
import '../utils/app_logger.dart';
|
||||
@@ -559,7 +560,14 @@ class _DiscoverScreenState extends State<DiscoverScreen>
|
||||
),
|
||||
if (!_isLoading && _errorMessage == null) ...[
|
||||
// Hero Section (Continue Watching)
|
||||
if (_onDeck.isNotEmpty) _buildHeroSection(),
|
||||
Consumer<SettingsProvider>(
|
||||
builder: (context, settingsProvider, child) {
|
||||
if (_onDeck.isNotEmpty && settingsProvider.showHeroSection) {
|
||||
return _buildHeroSection();
|
||||
}
|
||||
return const SliverToBoxAdapter(child: SizedBox.shrink());
|
||||
},
|
||||
),
|
||||
|
||||
// On Deck / Continue Watching
|
||||
if (_onDeck.isNotEmpty) ...[
|
||||
|
||||
@@ -53,7 +53,6 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_isLoading) {
|
||||
@@ -141,6 +140,21 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||
);
|
||||
},
|
||||
),
|
||||
Consumer<SettingsProvider>(
|
||||
builder: (context, settingsProvider, child) {
|
||||
return SwitchListTile(
|
||||
secondary: const Icon(Icons.featured_play_list),
|
||||
title: const Text('Show Hero Section'),
|
||||
subtitle: const Text(
|
||||
'Display featured content carousel on home screen',
|
||||
),
|
||||
value: settingsProvider.showHeroSection,
|
||||
onChanged: (value) async {
|
||||
await settingsProvider.setShowHeroSection(value);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
@@ -280,10 +294,9 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Text(
|
||||
'Updates',
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium
|
||||
?.copyWith(fontWeight: FontWeight.bold),
|
||||
style: Theme.of(
|
||||
context,
|
||||
).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
ListTile(
|
||||
@@ -291,9 +304,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||
hasUpdate ? Icons.system_update : Icons.check_circle,
|
||||
color: hasUpdate ? Colors.orange : null,
|
||||
),
|
||||
title: Text(
|
||||
hasUpdate ? 'Update Available' : 'Check for Updates',
|
||||
),
|
||||
title: Text(hasUpdate ? 'Update Available' : 'Check for Updates'),
|
||||
subtitle: hasUpdate
|
||||
? Text('Version ${_updateInfo!['latestVersion']} is available')
|
||||
: const Text('Check for the latest version on GitHub'),
|
||||
|
||||
@@ -21,6 +21,7 @@ class SettingsService {
|
||||
static const String _keySeekTimeSmall = 'seek_time_small';
|
||||
static const String _keySeekTimeLarge = 'seek_time_large';
|
||||
static const String _keyMediaVersionPreferences = 'media_version_preferences';
|
||||
static const String _keyShowHeroSection = 'show_hero_section';
|
||||
|
||||
static SettingsService? _instance;
|
||||
late SharedPreferences _prefs;
|
||||
@@ -117,7 +118,18 @@ class SettingsService {
|
||||
}
|
||||
|
||||
bool getUseSeasonPoster() {
|
||||
return _prefs.getBool(_keyUseSeasonPoster) ?? false; // Default: false (use series poster)
|
||||
return _prefs.getBool(_keyUseSeasonPoster) ??
|
||||
false; // Default: false (use series poster)
|
||||
}
|
||||
|
||||
// Show Hero Section
|
||||
Future<void> setShowHeroSection(bool enabled) async {
|
||||
await _prefs.setBool(_keyShowHeroSection, enabled);
|
||||
}
|
||||
|
||||
bool getShowHeroSection() {
|
||||
return _prefs.getBool(_keyShowHeroSection) ??
|
||||
true; // Default: true (show hero section)
|
||||
}
|
||||
|
||||
// Seek Time Small (in seconds)
|
||||
@@ -593,7 +605,10 @@ class SettingsService {
|
||||
/// Save media version preference for a series
|
||||
/// [seriesRatingKey] is the grandparentRatingKey for TV series, or ratingKey for movies
|
||||
/// [mediaIndex] is the index of the selected media version
|
||||
Future<void> setMediaVersionPreference(String seriesRatingKey, int mediaIndex) async {
|
||||
Future<void> setMediaVersionPreference(
|
||||
String seriesRatingKey,
|
||||
int mediaIndex,
|
||||
) async {
|
||||
final preferences = _getMediaVersionPreferences();
|
||||
preferences[seriesRatingKey] = mediaIndex;
|
||||
|
||||
@@ -643,6 +658,7 @@ class SettingsService {
|
||||
_prefs.remove(_keyPreferredAudioCodec),
|
||||
_prefs.remove(_keyLibraryDensity),
|
||||
_prefs.remove(_keyUseSeasonPoster),
|
||||
_prefs.remove(_keyShowHeroSection),
|
||||
_prefs.remove(_keySeekTimeSmall),
|
||||
_prefs.remove(_keySeekTimeLarge),
|
||||
_prefs.remove(_keyMediaVersionPreferences),
|
||||
|
||||
Reference in New Issue
Block a user