[Bugfix] Alertdialog.adaptive was causing issues.

This commit is contained in:
PartyDonut 2024-10-03 14:14:05 +02:00
parent d362f1a039
commit e0a2c8a3eb
15 changed files with 91 additions and 126 deletions

View file

@ -1,24 +1,36 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:ficonsax/ficonsax.dart'; import 'package:ficonsax/ficonsax.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/boxset_model.dart'; import 'package:fladder/models/boxset_model.dart';
import 'package:fladder/models/item_base_model.dart'; import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/models/items/photos_model.dart'; import 'package:fladder/models/items/photos_model.dart';
import 'package:fladder/models/library_search/library_search_model.dart';
import 'package:fladder/models/library_search/library_search_options.dart'; import 'package:fladder/models/library_search/library_search_options.dart';
import 'package:fladder/models/media_playback_model.dart'; import 'package:fladder/models/media_playback_model.dart';
import 'package:fladder/models/playlist_model.dart'; import 'package:fladder/models/playlist_model.dart';
import 'package:fladder/providers/library_search_provider.dart';
import 'package:fladder/providers/settings/client_settings_provider.dart'; import 'package:fladder/providers/settings/client_settings_provider.dart';
import 'package:fladder/providers/video_player_provider.dart'; import 'package:fladder/providers/video_player_provider.dart';
import 'package:fladder/screens/collections/add_to_collection.dart'; import 'package:fladder/screens/collections/add_to_collection.dart';
import 'package:fladder/screens/library_search/widgets/library_filter_chips.dart';
import 'package:fladder/screens/library_search/widgets/library_sort_dialogue.dart'; import 'package:fladder/screens/library_search/widgets/library_sort_dialogue.dart';
import 'package:fladder/screens/library_search/widgets/library_views.dart';
import 'package:fladder/screens/library_search/widgets/suggestion_search_bar.dart';
import 'package:fladder/screens/playlists/add_to_playlists.dart'; import 'package:fladder/screens/playlists/add_to_playlists.dart';
import 'package:fladder/screens/shared/animated_fade_size.dart'; import 'package:fladder/screens/shared/animated_fade_size.dart';
import 'package:fladder/screens/shared/flat_button.dart'; import 'package:fladder/screens/shared/flat_button.dart';
import 'package:fladder/screens/shared/nested_bottom_appbar.dart'; import 'package:fladder/screens/shared/nested_bottom_appbar.dart';
import 'package:fladder/util/adaptive_layout.dart'; import 'package:fladder/util/adaptive_layout.dart';
import 'package:fladder/util/debouncer.dart';
import 'package:fladder/util/fab_extended_anim.dart'; import 'package:fladder/util/fab_extended_anim.dart';
import 'package:fladder/util/item_base_model/item_base_model_extensions.dart'; import 'package:fladder/util/item_base_model/item_base_model_extensions.dart';
import 'package:fladder/util/list_padding.dart'; import 'package:fladder/util/list_padding.dart';
import 'package:fladder/util/localization_helper.dart'; import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/refresh_state.dart'; import 'package:fladder/util/refresh_state.dart';
import 'package:fladder/util/sliver_list_padding.dart';
import 'package:fladder/widgets/navigation_scaffold/components/floating_player_bar.dart'; import 'package:fladder/widgets/navigation_scaffold/components/floating_player_bar.dart';
import 'package:fladder/widgets/navigation_scaffold/components/settings_user_icon.dart'; import 'package:fladder/widgets/navigation_scaffold/components/settings_user_icon.dart';
import 'package:fladder/widgets/shared/fladder_scrollbar.dart'; import 'package:fladder/widgets/shared/fladder_scrollbar.dart';
@ -27,22 +39,10 @@ import 'package:fladder/widgets/shared/item_actions.dart';
import 'package:fladder/widgets/shared/modal_bottom_sheet.dart'; import 'package:fladder/widgets/shared/modal_bottom_sheet.dart';
import 'package:fladder/widgets/shared/pinch_poster_zoom.dart'; import 'package:fladder/widgets/shared/pinch_poster_zoom.dart';
import 'package:fladder/widgets/shared/poster_size_slider.dart'; import 'package:fladder/widgets/shared/poster_size_slider.dart';
import 'package:fladder/widgets/shared/pull_to_refresh.dart';
import 'package:fladder/widgets/shared/scroll_position.dart'; import 'package:fladder/widgets/shared/scroll_position.dart';
import 'package:fladder/widgets/shared/shapes.dart'; import 'package:fladder/widgets/shared/shapes.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/library_search/library_search_model.dart';
import 'package:fladder/providers/library_search_provider.dart';
import 'package:fladder/screens/library_search/widgets/library_filter_chips.dart';
import 'package:fladder/screens/library_search/widgets/library_views.dart';
import 'package:fladder/screens/library_search/widgets/suggestion_search_bar.dart';
import 'package:fladder/util/debouncer.dart';
import 'package:fladder/util/sliver_list_padding.dart';
import 'package:fladder/widgets/shared/pull_to_refresh.dart';
class LibrarySearchScreen extends ConsumerStatefulWidget { class LibrarySearchScreen extends ConsumerStatefulWidget {
final String? viewModelId; final String? viewModelId;
final bool? favourites; final bool? favourites;
@ -139,8 +139,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
child: Scaffold( child: Scaffold(
extendBody: true, extendBody: true,
extendBodyBehindAppBar: true, extendBodyBehindAppBar: true,
floatingActionButtonLocation: floatingActionButtonLocation: playerState == VideoPlayerState.minimized ? FloatingActionButtonLocation.centerFloat : null,
playerState == VideoPlayerState.minimized ? FloatingActionButtonLocation.centerFloat : null,
floatingActionButton: switch (playerState) { floatingActionButton: switch (playerState) {
VideoPlayerState.minimized => const Padding( VideoPlayerState.minimized => const Padding(
padding: EdgeInsets.symmetric(horizontal: 8), padding: EdgeInsets.symmetric(horizontal: 8),
@ -198,9 +197,8 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
child: MediaQuery.removeViewInsets( child: MediaQuery.removeViewInsets(
context: context, context: context,
child: ClipRRect( child: ClipRRect(
borderRadius: AdaptiveLayout.of(context).layout == LayoutState.desktop borderRadius:
? BorderRadius.circular(15) AdaptiveLayout.of(context).layout == LayoutState.desktop ? BorderRadius.circular(15) : BorderRadius.circular(0),
: BorderRadius.circular(0),
child: FladderScrollbar( child: FladderScrollbar(
visible: AdaptiveLayout.of(context).inputDevice != InputDevice.pointer, visible: AdaptiveLayout.of(context).inputDevice != InputDevice.pointer,
controller: scrollController, controller: scrollController,
@ -208,8 +206,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
refreshKey: refreshKey, refreshKey: refreshKey,
autoFocus: false, autoFocus: false,
contextRefresh: false, contextRefresh: false,
onRefresh: () async => onRefresh: () async => libraryProvider.initRefresh(widget.folderId, widget.viewModelId, widget.favourites),
libraryProvider.initRefresh(widget.folderId, widget.viewModelId, widget.favourites),
refreshOnStart: false, refreshOnStart: false,
child: CustomScrollView( child: CustomScrollView(
physics: const AlwaysScrollableNoImplicitScrollPhysics(), physics: const AlwaysScrollableNoImplicitScrollPhysics(),
@ -231,8 +228,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
actions: [ actions: [
const SizedBox(width: 4), const SizedBox(width: 4),
Builder(builder: (context) { Builder(builder: (context) {
final isFavorite = final isFavorite = librarySearchResults.nestedCurrentItem?.userData.isFavourite == true;
librarySearchResults.nestedCurrentItem?.userData.isFavourite == true;
final itemActions = librarySearchResults.nestedCurrentItem?.generateActions( final itemActions = librarySearchResults.nestedCurrentItem?.generateActions(
context, context,
ref, ref,
@ -264,7 +260,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
action: () { action: () {
showAdaptiveDialog( showAdaptiveDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
content: Consumer( content: Consumer(
builder: (context, ref, child) { builder: (context, ref, child) {
final currentType = ref.watch(libraryViewTypeProvider); final currentType = ref.watch(libraryViewTypeProvider);
@ -280,8 +276,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
(e) => FilledButton.tonal( (e) => FilledButton.tonal(
style: FilledButtonTheme.of(context).style?.copyWith( style: FilledButtonTheme.of(context).style?.copyWith(
padding: const WidgetStatePropertyAll( padding: const WidgetStatePropertyAll(
EdgeInsets.symmetric( EdgeInsets.symmetric(horizontal: 12, vertical: 24)),
horizontal: 12, vertical: 24)),
backgroundColor: WidgetStateProperty.resolveWith( backgroundColor: WidgetStateProperty.resolveWith(
(states) { (states) {
if (e != currentType) { if (e != currentType) {
@ -317,8 +312,8 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
return Card( return Card(
elevation: 0, elevation: 0,
child: Tooltip( child: Tooltip(
message: librarySearchResults.nestedCurrentItem?.type.label(context) ?? message:
context.localized.library(1), librarySearchResults.nestedCurrentItem?.type.label(context) ?? context.localized.library(1),
child: InkWell( child: InkWell(
onTapUp: (details) async { onTapUp: (details) async {
if (AdaptiveLayout.of(context).inputDevice == InputDevice.pointer) { if (AdaptiveLayout.of(context).inputDevice == InputDevice.pointer) {
@ -329,9 +324,8 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
position: RelativeRect.fromLTRB(left, top, 40, 100), position: RelativeRect.fromLTRB(left, top, 40, 100),
items: <PopupMenuEntry>[ items: <PopupMenuEntry>[
PopupMenuItem( PopupMenuItem(
child: Text( child: Text(librarySearchResults.nestedCurrentItem?.type.label(context) ??
librarySearchResults.nestedCurrentItem?.type.label(context) ?? context.localized.library(0))),
context.localized.library(0))),
itemCountWidget.toPopupMenuItem(useIcons: true), itemCountWidget.toPopupMenuItem(useIcons: true),
refreshAction.toPopupMenuItem(useIcons: true), refreshAction.toPopupMenuItem(useIcons: true),
itemViewAction.toPopupMenuItem(useIcons: true), itemViewAction.toPopupMenuItem(useIcons: true),
@ -362,8 +356,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
child: Icon( child: Icon(
isFavorite isFavorite
? librarySearchResults.nestedCurrentItem?.type.selectedicon ? librarySearchResults.nestedCurrentItem?.type.selectedicon
: librarySearchResults.nestedCurrentItem?.type.icon ?? : librarySearchResults.nestedCurrentItem?.type.icon ?? IconsaxOutline.document,
IconsaxOutline.document,
color: isFavorite ? Theme.of(context).colorScheme.primary : null, color: isFavorite ? Theme.of(context).colorScheme.primary : null,
), ),
), ),
@ -440,8 +433,7 @@ class _LibrarySearchScreenState extends ConsumerState<LibrarySearchScreen> {
if (postersList.isNotEmpty) if (postersList.isNotEmpty)
SliverPadding( SliverPadding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: MediaQuery.of(context).padding.left, left: MediaQuery.of(context).padding.left, right: MediaQuery.of(context).padding.right),
right: MediaQuery.of(context).padding.right),
sliver: LibraryViews( sliver: LibraryViews(
key: uniqueKey, key: uniqueKey,
items: postersList, items: postersList,
@ -576,8 +568,7 @@ class _LibrarySearchBottomBar extends ConsumerWidget {
}, },
label: Text(context.localized.removeFromCollection), label: Text(context.localized.removeFromCollection),
icon: Container( icon: Container(
decoration: decoration: BoxDecoration(color: Theme.of(context).colorScheme.onPrimary, borderRadius: BorderRadius.circular(6)),
BoxDecoration(color: Theme.of(context).colorScheme.onPrimary, borderRadius: BorderRadius.circular(6)),
child: const Padding( child: const Padding(
padding: EdgeInsets.all(3.0), padding: EdgeInsets.all(3.0),
child: Icon(IconsaxOutline.save_remove, size: 20), child: Icon(IconsaxOutline.save_remove, size: 20),
@ -629,8 +620,8 @@ class _LibrarySearchBottomBar extends ConsumerWidget {
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
elevation: 0, elevation: 0,
borderRadiusGeometry: BorderRadius.circular(6), borderRadiusGeometry: BorderRadius.circular(6),
onTap: () => scrollController.animateTo(0, onTap: () =>
duration: const Duration(milliseconds: 500), curve: Curves.easeInOutCubic), scrollController.animateTo(0, duration: const Duration(milliseconds: 500), curve: Curves.easeInOutCubic),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primaryContainer, color: Theme.of(context).colorScheme.primaryContainer,
@ -688,9 +679,8 @@ class _LibrarySearchBottomBar extends ConsumerWidget {
AnimatedFadeSize( AnimatedFadeSize(
child: librarySearchResults.selecteMode child: librarySearchResults.selecteMode
? Container( ? Container(
decoration: BoxDecoration( decoration:
color: Theme.of(context).colorScheme.primaryContainer, BoxDecoration(color: Theme.of(context).colorScheme.primaryContainer, borderRadius: BorderRadius.circular(16)),
borderRadius: BorderRadius.circular(16)),
child: Row( child: Row(
children: [ children: [
Tooltip( Tooltip(

View file

@ -71,7 +71,7 @@ List<Widget> libraryFilterChips(
builder: (context) { builder: (context) {
return Consumer( return Consumer(
builder: (context, ref, child) { builder: (context, ref, child) {
return AlertDialog.adaptive( return AlertDialog(
content: SizedBox( content: SizedBox(
width: MediaQuery.of(context).size.width * 0.65, width: MediaQuery.of(context).size.width * 0.65,
child: ListView( child: ListView(

View file

@ -16,7 +16,7 @@ Future<(SortingOptions? sortOptions, SortingOrder? sortingOrder)?> openSortByDia
builder: (context) { builder: (context) {
return StatefulBuilder( return StatefulBuilder(
builder: (context, state) { builder: (context, state) {
return AlertDialog.adaptive( return AlertDialog(
content: SizedBox( content: SizedBox(
width: MediaQuery.of(context).size.width * 0.65, width: MediaQuery.of(context).size.width * 0.65,
child: ListView( child: ListView(

View file

@ -14,7 +14,7 @@ class LoginEditUser extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
return AlertDialog.adaptive( return AlertDialog(
title: Center(child: Text(user.name)), title: Center(child: Text(user.name)),
content: Column( content: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,

View file

@ -39,8 +39,7 @@ class _EditImageContentState extends ConsumerState<EditImageContent> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final posterSize = MediaQuery.sizeOf(context).width / final posterSize = MediaQuery.sizeOf(context).width /
(AdaptiveLayout.poster(context).gridRatio * (AdaptiveLayout.poster(context).gridRatio * ref.watch(clientSettingsProvider.select((value) => value.posterSize)));
ref.watch(clientSettingsProvider.select((value) => value.posterSize)));
final decimal = posterSize - posterSize.toInt(); final decimal = posterSize - posterSize.toInt();
final includeAllImages = ref.watch(editItemProvider.select((value) => value.includeAllImages)); final includeAllImages = ref.watch(editItemProvider.select((value) => value.includeAllImages));
final images = ref.watch(editItemProvider.select((value) => switch (widget.type) { final images = ref.watch(editItemProvider.select((value) => switch (widget.type) {
@ -86,8 +85,7 @@ class _EditImageContentState extends ConsumerState<EditImageContent> {
decoration: BoxDecoration( decoration: BoxDecoration(
color: selected ? Theme.of(context).colorScheme.primary : Colors.transparent, color: selected ? Theme.of(context).colorScheme.primary : Colors.transparent,
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
border: border: Border.all(color: Colors.transparent, width: 4, strokeAlign: BorderSide.strokeAlignInside),
Border.all(color: Colors.transparent, width: 4, strokeAlign: BorderSide.strokeAlignInside),
), ),
child: Card( child: Card(
color: selected ? Theme.of(context).colorScheme.onPrimary : null, color: selected ? Theme.of(context).colorScheme.onPrimary : null,
@ -114,7 +112,7 @@ class _EditImageContentState extends ConsumerState<EditImageContent> {
onPressed: () async { onPressed: () async {
await showDialog( await showDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
title: const Text("Delete image"), title: const Text("Delete image"),
content: const Text("Deleting is permanent are you sure?"), content: const Text("Deleting is permanent are you sure?"),
actions: [ actions: [
@ -232,8 +230,7 @@ class _EditImageContentState extends ConsumerState<EditImageContent> {
children: [...serverImageCards, ...imageCards], children: [...serverImageCards, ...imageCards],
), ),
if (loading) const Center(child: CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round)), if (loading) const Center(child: CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round)),
if (!loading && [...serverImageCards, ...imageCards].isEmpty) if (!loading && [...serverImageCards, ...imageCards].isEmpty) Center(child: Text("No ${widget.type.value}s found"))
Center(child: Text("No ${widget.type.value}s found"))
], ],
), ),
), ),

View file

@ -1,5 +1,12 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:ficonsax/ficonsax.dart'; import 'package:ficonsax/ficonsax.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:fladder/models/settings/home_settings_model.dart'; import 'package:fladder/models/settings/home_settings_model.dart';
import 'package:fladder/providers/settings/client_settings_provider.dart'; import 'package:fladder/providers/settings/client_settings_provider.dart';
import 'package:fladder/providers/settings/home_settings_provider.dart'; import 'package:fladder/providers/settings/home_settings_provider.dart';
@ -22,11 +29,6 @@ import 'package:fladder/util/size_formatting.dart';
import 'package:fladder/util/theme_mode_extension.dart'; import 'package:fladder/util/theme_mode_extension.dart';
import 'package:fladder/widgets/shared/enum_selection.dart'; import 'package:fladder/widgets/shared/enum_selection.dart';
import 'package:fladder/widgets/shared/fladder_slider.dart'; import 'package:fladder/widgets/shared/fladder_slider.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class ClientSettingsPage extends ConsumerStatefulWidget { class ClientSettingsPage extends ConsumerStatefulWidget {
const ClientSettingsPage({super.key}); const ClientSettingsPage({super.key});
@ -36,17 +38,16 @@ class ClientSettingsPage extends ConsumerStatefulWidget {
} }
class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> { class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
late final nextUpDaysEditor = TextEditingController( late final nextUpDaysEditor =
text: ref.read(clientSettingsProvider.select((value) => value.nextUpDateCutoff?.inDays ?? 14)).toString()); TextEditingController(text: ref.read(clientSettingsProvider.select((value) => value.nextUpDateCutoff?.inDays ?? 14)).toString());
late final libraryPageSizeController = TextEditingController( late final libraryPageSizeController =
text: ref.read(clientSettingsProvider.select((value) => value.libraryPageSize))?.toString() ?? ""); TextEditingController(text: ref.read(clientSettingsProvider.select((value) => value.libraryPageSize))?.toString() ?? "");
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final clientSettings = ref.watch(clientSettingsProvider); final clientSettings = ref.watch(clientSettingsProvider);
final showBackground = AdaptiveLayout.of(context).layout != LayoutState.phone && final showBackground = AdaptiveLayout.of(context).layout != LayoutState.phone && AdaptiveLayout.of(context).size != ScreenLayout.single;
AdaptiveLayout.of(context).size != ScreenLayout.single;
final currentFolder = ref.watch(syncProvider.notifier).savePath; final currentFolder = ref.watch(syncProvider.notifier).savePath;
Locale currentLocale = WidgetsBinding.instance.platformDispatcher.locale; Locale currentLocale = WidgetsBinding.instance.platformDispatcher.locale;
@ -65,14 +66,14 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
onTap: currentFolder != null onTap: currentFolder != null
? () async => await showDialog( ? () async => await showDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
title: Text(context.localized.pathEditTitle), title: Text(context.localized.pathEditTitle),
content: Text(context.localized.pathEditDesc), content: Text(context.localized.pathEditDesc),
actions: [ actions: [
ElevatedButton( ElevatedButton(
onPressed: () async { onPressed: () async {
String? selectedDirectory = await FilePicker.platform.getDirectoryPath( String? selectedDirectory = await FilePicker.platform
dialogTitle: context.localized.pathEditSelect, initialDirectory: currentFolder); .getDirectoryPath(dialogTitle: context.localized.pathEditSelect, initialDirectory: currentFolder);
if (selectedDirectory != null) { if (selectedDirectory != null) {
ref.read(clientSettingsProvider.notifier).setSyncPath(selectedDirectory); ref.read(clientSettingsProvider.notifier).setSyncPath(selectedDirectory);
} }
@ -84,8 +85,8 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
), ),
) )
: () async { : () async {
String? selectedDirectory = await FilePicker.platform.getDirectoryPath( String? selectedDirectory = await FilePicker.platform
dialogTitle: context.localized.pathEditSelect, initialDirectory: currentFolder); .getDirectoryPath(dialogTitle: context.localized.pathEditSelect, initialDirectory: currentFolder);
if (selectedDirectory != null) { if (selectedDirectory != null) {
ref.read(clientSettingsProvider.notifier).setSyncPath(selectedDirectory); ref.read(clientSettingsProvider.notifier).setSyncPath(selectedDirectory);
} }
@ -95,7 +96,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
color: Theme.of(context).colorScheme.error, color: Theme.of(context).colorScheme.error,
onPressed: () async => await showDialog( onPressed: () async => await showDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
title: Text(context.localized.pathClearTitle), title: Text(context.localized.pathClearTitle),
content: Text(context.localized.pathEditDesc), content: Text(context.localized.pathEditDesc),
actions: [ actions: [
@ -154,9 +155,9 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
initialValue: clientSettings.timeOut ?? const Duration(), initialValue: clientSettings.timeOut ?? const Duration(),
); );
ref.read(clientSettingsProvider.notifier).setTimeOut(timePicker != null ref
? Duration(minutes: timePicker.inMinutes, seconds: timePicker.inSeconds % 60) .read(clientSettingsProvider.notifier)
: null); .setTimeOut(timePicker != null ? Duration(minutes: timePicker.inMinutes, seconds: timePicker.inSeconds % 60) : null);
}, },
), ),
const Divider(), const Divider(),
@ -175,9 +176,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
(entry) => PopupMenuItem( (entry) => PopupMenuItem(
value: entry, value: entry,
child: Text(entry.label(context)), child: Text(entry.label(context)),
onTap: () => ref onTap: () => ref.read(homeSettingsProvider.notifier).update((context) => context.copyWith(carouselSettings: entry)),
.read(homeSettingsProvider.notifier)
.update((context) => context.copyWith(carouselSettings: entry)),
), ),
) )
.toList(), .toList(),
@ -197,8 +196,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
(entry) => PopupMenuItem( (entry) => PopupMenuItem(
value: entry, value: entry,
child: Text(entry.label(context)), child: Text(entry.label(context)),
onTap: () => onTap: () => ref.read(homeSettingsProvider.notifier).update((context) => context.copyWith(nextUp: entry)),
ref.read(homeSettingsProvider.notifier).update((context) => context.copyWith(nextUp: entry)),
), ),
) )
.toList(), .toList(),
@ -225,9 +223,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
fontWeight: currentLocale.languageCode == entry.languageCode ? FontWeight.bold : null, fontWeight: currentLocale.languageCode == entry.languageCode ? FontWeight.bold : null,
), ),
), ),
onTap: () => ref onTap: () => ref.read(clientSettingsProvider.notifier).update((state) => state.copyWith(selectedLocale: entry)),
.read(clientSettingsProvider.notifier)
.update((state) => state.copyWith(selectedLocale: entry)),
), ),
) )
]; ];
@ -237,8 +233,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
SettingsListTile( SettingsListTile(
label: Text(context.localized.settingsBlurredPlaceholderTitle), label: Text(context.localized.settingsBlurredPlaceholderTitle),
subLabel: Text(context.localized.settingsBlurredPlaceholderDesc), subLabel: Text(context.localized.settingsBlurredPlaceholderDesc),
onTap: () => onTap: () => ref.read(clientSettingsProvider.notifier).setBlurPlaceholders(!clientSettings.blurPlaceHolders),
ref.read(clientSettingsProvider.notifier).setBlurPlaceholders(!clientSettings.blurPlaceHolders),
trailing: Switch( trailing: Switch(
value: clientSettings.blurPlaceHolders, value: clientSettings.blurPlaceHolders,
onChanged: (value) => ref.read(clientSettingsProvider.notifier).setBlurPlaceholders(value), onChanged: (value) => ref.read(clientSettingsProvider.notifier).setBlurPlaceholders(value),
@ -247,8 +242,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
SettingsListTile( SettingsListTile(
label: Text(context.localized.settingsBlurEpisodesTitle), label: Text(context.localized.settingsBlurEpisodesTitle),
subLabel: Text(context.localized.settingsBlurEpisodesDesc), subLabel: Text(context.localized.settingsBlurEpisodesDesc),
onTap: () => onTap: () => ref.read(clientSettingsProvider.notifier).setBlurEpisodes(!clientSettings.blurUpcomingEpisodes),
ref.read(clientSettingsProvider.notifier).setBlurEpisodes(!clientSettings.blurUpcomingEpisodes),
trailing: Switch( trailing: Switch(
value: clientSettings.blurUpcomingEpisodes, value: clientSettings.blurUpcomingEpisodes,
onChanged: (value) => ref.read(clientSettingsProvider.notifier).setBlurEpisodes(value), onChanged: (value) => ref.read(clientSettingsProvider.notifier).setBlurEpisodes(value),
@ -292,9 +286,8 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
)), )),
), ),
SettingsListTile( SettingsListTile(
label: Text(AdaptiveLayout.of(context).isDesktop label: Text(
? context.localized.settingsShowScaleSlider AdaptiveLayout.of(context).isDesktop ? context.localized.settingsShowScaleSlider : context.localized.settingsPosterPinch),
: context.localized.settingsPosterPinch),
onTap: () => ref.read(clientSettingsProvider.notifier).update( onTap: () => ref.read(clientSettingsProvider.notifier).update(
(current) => current.copyWith(pinchPosterZoom: !current.pinchPosterZoom), (current) => current.copyWith(pinchPosterZoom: !current.pinchPosterZoom),
), ),
@ -321,9 +314,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
max: 1.5, max: 1.5,
value: clientSettings.posterSize, value: clientSettings.posterSize,
divisions: 20, divisions: 20,
onChanged: (value) => ref onChanged: (value) => ref.read(clientSettingsProvider.notifier).update((current) => current.copyWith(posterSize: value)),
.read(clientSettingsProvider.notifier)
.update((current) => current.copyWith(posterSize: value)),
), ),
), ),
const Divider(), const Divider(),
@ -337,7 +328,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
context, context,
label: "${context.localized.theme} ${context.localized.mode}", label: "${context.localized.theme} ${context.localized.mode}",
items: ThemeMode.values, items: ThemeMode.values,
itemBuilder: (type) => RadioListTile( itemBuilder: (type) => RadioListTile.adaptive(
value: type, value: type,
title: Text(type?.label(context) ?? context.localized.other), title: Text(type?.label(context) ?? context.localized.other),
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
@ -359,7 +350,7 @@ class _ClientSettingsPageState extends ConsumerState<ClientSettingsPage> {
builder: (context, ref, child) => ListTile( builder: (context, ref, child) => ListTile(
title: Row( title: Row(
children: [ children: [
Checkbox( Checkbox.adaptive(
value: type == ref.watch(clientSettingsProvider.select((value) => value.themeColor)), value: type == ref.watch(clientSettingsProvider.select((value) => value.themeColor)),
onChanged: (value) => ref.read(clientSettingsProvider.notifier).setThemeColor(type), onChanged: (value) => ref.read(clientSettingsProvider.notifier).setThemeColor(type),
), ),

View file

@ -29,7 +29,7 @@ class _QuickConnectDialogState extends ConsumerState<QuickConnectDialog> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final user = ref.watch(userProvider); final user = ref.watch(userProvider);
return AlertDialog.adaptive( return AlertDialog(
title: Text(context.localized.quickConnectTitle), title: Text(context.localized.quickConnectTitle),
scrollable: true, scrollable: true,
content: Column( content: Column(
@ -58,17 +58,14 @@ class _QuickConnectDialogState extends ConsumerState<QuickConnectDialog> {
child: error != null || success != null child: error != null || success != null
? Card( ? Card(
key: Key(context.localized.error), key: Key(context.localized.error),
color: success == null color: success == null ? Theme.of(context).colorScheme.errorContainer : Theme.of(context).colorScheme.surfaceContainer,
? Theme.of(context).colorScheme.errorContainer
: Theme.of(context).colorScheme.surfaceContainer,
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
success ?? error ?? "", success ?? error ?? "",
style: TextStyle( style: TextStyle(
color: success == null color:
? Theme.of(context).colorScheme.onErrorContainer success == null ? Theme.of(context).colorScheme.onErrorContainer : Theme.of(context).colorScheme.onSurface),
: Theme.of(context).colorScheme.onSurface),
), ),
), ),
) )

View file

@ -71,8 +71,7 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
bool containsRoute(CustomRoute route) => widget.location == route.route; bool containsRoute(CustomRoute route) => widget.location == route.route;
Widget _leftPane(BuildContext context) { Widget _leftPane(BuildContext context) {
final quickConnectAvailable = final quickConnectAvailable = ref.watch(userProvider.select((value) => value?.serverConfiguration?.quickConnectAvailable ?? false));
ref.watch(userProvider.select((value) => value?.serverConfiguration?.quickConnectAvailable ?? false));
return SettingsScaffold( return SettingsScaffold(
label: context.localized.settings, label: context.localized.settings,
scrollController: scrollController, scrollController: scrollController,
@ -174,7 +173,7 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
final user = ref.read(userProvider); final user = ref.read(userProvider);
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
title: Text(context.localized.logoutUserPopupTitle(user?.name ?? "")), title: Text(context.localized.logoutUserPopupTitle(user?.name ?? "")),
scrollable: true, scrollable: true,
content: Text( content: Text(
@ -187,10 +186,8 @@ class _SettingsScreenState extends ConsumerState<SettingsScreen> {
), ),
ElevatedButton( ElevatedButton(
style: ElevatedButton.styleFrom().copyWith( style: ElevatedButton.styleFrom().copyWith(
foregroundColor: foregroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer),
WidgetStatePropertyAll(Theme.of(context).colorScheme.onErrorContainer), backgroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.errorContainer),
backgroundColor:
WidgetStatePropertyAll(Theme.of(context).colorScheme.errorContainer),
), ),
onPressed: () async { onPressed: () async {
await ref.read(authProvider.notifier).logOutUser(); await ref.read(authProvider.notifier).logOutUser();

View file

@ -14,7 +14,7 @@ void showAuthOptionsDialogue(
) { ) {
showDialog( showDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
scrollable: true, scrollable: true,
icon: const Icon(IconsaxBold.lock_1), icon: const Icon(IconsaxBold.lock_1),
title: Text(context.localized.appLockTitle(currentUser.name)), title: Text(context.localized.appLockTitle(currentUser.name)),

View file

@ -13,7 +13,7 @@ Future<void> showDefaultAlertDialog(
) { ) {
return showDialog( return showDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
title: Text(title), title: Text(title),
content: content != null ? Text(content) : null, content: content != null ? Text(content) : null,
actions: [ actions: [
@ -47,7 +47,7 @@ Future<void> showDefaultActionDialog(
) { ) {
return showDialog( return showDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
title: Text(title), title: Text(title),
content: content != null ? Text(content) : null, content: content != null ? Text(content) : null,
actions: [ actions: [

View file

@ -35,7 +35,7 @@ class _PassCodeInputState extends ConsumerState<PassCodeInput> {
} }
} }
}, },
child: AlertDialog.adaptive( child: AlertDialog(
scrollable: true, scrollable: true,
content: Column( content: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,

View file

@ -14,12 +14,11 @@ Future<void> showSubtitleControls({
await showDialog( await showDialog(
context: context, context: context,
barrierColor: Colors.black.withOpacity(0.1), barrierColor: Colors.black.withOpacity(0.1),
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
elevation: 0, elevation: 0,
content: ConstrainedBox( content: ConstrainedBox(
constraints: BoxConstraints(minWidth: MediaQuery.sizeOf(context).width * 0.75), constraints: BoxConstraints(minWidth: MediaQuery.sizeOf(context).width * 0.75), child: VideoSubtitleControls(label: label)),
child: VideoSubtitleControls(label: label)),
), ),
); );
return; return;
@ -91,9 +90,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
ElevatedButton( ElevatedButton(
onPressed: subSettings != lastSettings onPressed: subSettings != lastSettings ? () => provider.resetSettings(value: lastSettings) : null,
? () => provider.resetSettings(value: lastSettings)
: null,
child: Text(context.localized.clearChanges), child: Text(context.localized.clearChanges),
), ),
const SizedBox(width: 32), const SizedBox(width: 32),
@ -213,8 +210,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
const Icon(Icons.border_color_rounded), const Icon(Icons.border_color_rounded),
...[Colors.white, Colors.yellow, Colors.black, Colors.grey, Colors.transparent].map( ...[Colors.white, Colors.yellow, Colors.black, Colors.grey, Colors.transparent].map(
(e) => FlatButton( (e) => FlatButton(
onTap: () => onTap: () => provider.setOutlineColor(e == Colors.transparent ? e : e.withOpacity(0.85)),
provider.setOutlineColor(e == Colors.transparent ? e : e.withOpacity(0.85)),
borderRadiusGeometry: BorderRadius.circular(5), borderRadiusGeometry: BorderRadius.circular(5),
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
child: Container( child: Container(
@ -294,8 +290,7 @@ class _VideoSubtitleControlsState extends ConsumerState<VideoSubtitleControls> {
), ),
Text(context.localized.backgroundOpacity), Text(context.localized.backgroundOpacity),
], ],
).addVisiblity( ).addVisiblity(activeKey == null ? controlsHidden : activeKey == const Key('backGroundOpacity')),
activeKey == null ? controlsHidden : activeKey == const Key('backGroundOpacity')),
Column( Column(
children: [ children: [
Row( Row(

View file

@ -10,7 +10,7 @@ Future<void> openOptionDialogue<T>(
return showDialog( return showDialog(
context: context, context: context,
builder: (context) { builder: (context) {
return AlertDialog.adaptive( return AlertDialog(
title: Text(label), title: Text(label),
content: SizedBox( content: SizedBox(
width: MediaQuery.of(context).size.width * 0.65, width: MediaQuery.of(context).size.width * 0.65,

View file

@ -33,7 +33,7 @@ Future<Duration?> showSimpleDurationPicker({
Duration? duration; Duration? duration;
await showDialog( await showDialog(
context: context, context: context,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
title: Text(context.localized.selectTime), title: Text(context.localized.selectTime),
content: SimpleDurationPicker( content: SimpleDurationPicker(
initialValue: initialValue, initialValue: initialValue,
@ -113,10 +113,8 @@ class SimpleDurationPicker extends ConsumerWidget {
final parsedValue = int.parse(value); final parsedValue = int.parse(value);
if (parsedValue >= 60) { if (parsedValue >= 60) {
secondsTextController.text = (parsedValue % 60).toString().padLeft(2, '0'); secondsTextController.text = (parsedValue % 60).toString().padLeft(2, '0');
minuteTextController.text = (int.parse(minuteTextController.text) + parsedValue / 60) minuteTextController.text =
.floor() (int.parse(minuteTextController.text) + parsedValue / 60).floor().toString().padLeft(2, '0');
.toString()
.padLeft(2, '0');
} }
onChanged( onChanged(
Duration( Duration(

View file

@ -11,7 +11,7 @@ Future<Response<dynamic>?> showDeleteDialog(BuildContext context, ItemBaseModel
await showDialog( await showDialog(
context: context, context: context,
barrierDismissible: false, barrierDismissible: false,
builder: (context) => AlertDialog.adaptive( builder: (context) => AlertDialog(
title: Text(context.localized.deleteItem(item.type.label(context))), title: Text(context.localized.deleteItem(item.type.label(context))),
content: Text( content: Text(
context.localized.deleteFileFromSystem(item.name), context.localized.deleteFileFromSystem(item.name),