chore: Lots of bug fixes and navigation improvements

This commit is contained in:
PartyDonut 2025-09-01 20:21:36 +02:00
parent 9bb5e81812
commit 92d5391b93
35 changed files with 513 additions and 455 deletions

View file

@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/settings/home_settings_model.dart';
import 'package:fladder/providers/settings/home_settings_provider.dart';
import 'package:fladder/screens/home_screen.dart';
import 'package:fladder/util/adaptive_layout/adaptive_layout_model.dart';
import 'package:fladder/util/debug_banner.dart';
import 'package:fladder/util/localization_helper.dart';
@ -81,9 +82,9 @@ class AdaptiveLayout extends InheritedWidget {
return result!.data.posterDefaults;
}
static ScrollController scrollOf(BuildContext context) {
static ScrollController scrollOf(BuildContext context, HomeTabs tab) {
final AdaptiveLayout? result = maybeOf(context);
return result!.data.controller;
return result?.data.controller[tab] ?? ScrollController();
}
static EdgeInsets adaptivePadding(BuildContext context, {double horizontalPadding = 16}) {
@ -130,7 +131,10 @@ class _AdaptiveLayoutBuilderState extends ConsumerState<AdaptiveLayoutBuilder> {
late ViewSize viewSize = ViewSize.tablet;
late LayoutMode layoutMode = LayoutMode.single;
late TargetPlatform currentPlatform = defaultTargetPlatform;
late ScrollController controller = ScrollController();
final Map<HomeTabs, ScrollController> scrollControllers = {
for (var item in HomeTabs.values) item: ScrollController(),
};
@override
void didChangeDependencies() {
@ -177,11 +181,7 @@ class _AdaptiveLayoutBuilderState extends ConsumerState<AdaptiveLayoutBuilder> {
final selectedLayoutMode = selectAvailableOrSmaller<LayoutMode>(layoutMode, acceptedLayouts, LayoutMode.values);
final input = (isDesktop || kIsWeb) ? InputDevice.pointer : InputDevice.touch;
final posterDefaults = switch (selectedViewSize) {
ViewSize.phone => const PosterDefaults(size: 300, ratio: 0.55),
ViewSize.tablet => const PosterDefaults(size: 350, ratio: 0.55),
ViewSize.desktop => const PosterDefaults(size: 400, ratio: 0.55),
};
final posterDefaults = const PosterDefaults(size: 350, ratio: 0.55);
final currentLayout = widget.adaptiveLayout ??
AdaptiveLayoutModel(
@ -191,7 +191,7 @@ class _AdaptiveLayoutBuilderState extends ConsumerState<AdaptiveLayoutBuilder> {
platform: currentPlatform,
isDesktop: isDesktop,
sideBarWidth: 0,
controller: controller,
controller: scrollControllers,
posterDefaults: posterDefaults,
);
@ -207,7 +207,7 @@ class _AdaptiveLayoutBuilderState extends ConsumerState<AdaptiveLayoutBuilder> {
inputDevice: input,
platform: currentPlatform,
isDesktop: isDesktop,
controller: controller,
controller: scrollControllers,
posterDefaults: posterDefaults,
),
child: Builder(

View file

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:fladder/screens/home_screen.dart';
import 'package:fladder/util/adaptive_layout/adaptive_layout.dart';
import 'package:fladder/util/poster_defaults.dart';
@ -46,7 +47,7 @@ class AdaptiveLayoutModel {
final TargetPlatform platform;
final bool isDesktop;
final PosterDefaults posterDefaults;
final ScrollController controller;
final Map<HomeTabs, ScrollController> controller;
final double sideBarWidth;
const AdaptiveLayoutModel({
@ -67,7 +68,7 @@ class AdaptiveLayoutModel {
TargetPlatform? platform,
bool? isDesktop,
PosterDefaults? posterDefaults,
ScrollController? controller,
Map<HomeTabs, ScrollController>? controller,
double? sideBarWidth,
}) {
return AdaptiveLayoutModel(

View file

@ -36,6 +36,7 @@ class FladderImage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final useBluredPlaceHolder = ref.watch(clientSettingsProvider.select((value) => value.blurPlaceHolders));
final newImage = image;
final imageProvider = image?.imageProvider;
if (newImage == null) {
return placeHolder ?? Container();
} else {
@ -44,13 +45,15 @@ class FladderImage extends ConsumerWidget {
fit: stackFit,
children: [
if (!disableBlur && useBluredPlaceHolder && newImage.hash.isNotEmpty || blurOnly)
BlurHash(
hash: newImage.hash,
optimizationMode: BlurHashOptimizationMode.approximation,
color: Colors.transparent,
imageFit: blurFit ?? fit,
Image(
image: BlurHashImage(
newImage.hash,
decodingHeight: 24,
decodingWidth: 24,
),
fit: blurFit ?? fit,
),
if (!blurOnly)
if (!blurOnly && imageProvider != null)
FadeInImage(
placeholder: MemoryImage(kTransparentImage),
fit: fit,
@ -58,7 +61,7 @@ class FladderImage extends ConsumerWidget {
excludeFromSemantics: true,
alignment: alignment ?? Alignment.center,
imageErrorBuilder: imageErrorBuilder,
image: newImage.imageProvider,
image: imageProvider,
)
],
);

View file

@ -8,7 +8,6 @@ import 'package:fladder/models/book_model.dart';
import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/models/items/episode_model.dart';
import 'package:fladder/models/items/item_shared_models.dart';
import 'package:fladder/models/items/photos_model.dart';
import 'package:fladder/providers/sync_provider.dart';
import 'package:fladder/providers/user_provider.dart';
import 'package:fladder/screens/collections/add_to_collection.dart';
@ -142,7 +141,7 @@ extension ItemBaseModelExtensions on ItemBaseModel {
else if (!exclude.contains(ItemActions.showAlbum) && galleryItem)
ItemActionButton(
icon: Icon(FladderItemType.photoAlbum.icon),
action: () => (this as PhotoModel).navigateToAlbum(context),
action: () => parentBaseModel.navigateTo(context),
label: Text(context.localized.showAlbum),
),
if (!exclude.contains(ItemActions.playFromStart))

View file

@ -171,7 +171,7 @@ extension PhotoAlbumExtension on PhotoAlbumModel? {
return;
}
await context.navigateTo(PhotoViewerRoute(
await context.pushRoute(PhotoViewerRoute(
items: photos.toList(),
));