diff --git a/lib/screens/photo_viewer/simple_video_player.dart b/lib/screens/photo_viewer/simple_video_player.dart index f1d217c..f31ccda 100644 --- a/lib/screens/photo_viewer/simple_video_player.dart +++ b/lib/screens/photo_viewer/simple_video_player.dart @@ -142,7 +142,7 @@ class _SimpleVideoPlayerState extends ConsumerState with Wind Positioned.fill( child: FladderImage( image: widget.video.thumbnail?.primary, - enableBlur: true, + disableBlur: true, fit: BoxFit.contain, ), ), diff --git a/lib/screens/shared/media/components/item_logo.dart b/lib/screens/shared/media/components/item_logo.dart new file mode 100644 index 0000000..fd9fdcd --- /dev/null +++ b/lib/screens/shared/media/components/item_logo.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; + +import 'package:fladder/models/item_base_model.dart'; +import 'package:fladder/util/fladder_image.dart'; + +class ItemLogo extends StatelessWidget { + final ItemBaseModel item; + final Alignment imageAlignment; + final TextStyle? textStyle; + const ItemLogo({ + required this.item, + this.imageAlignment = Alignment.bottomCenter, + this.textStyle, + super.key, + }); + + @override + Widget build(BuildContext context) { + final logo = item.getPosters?.logo; + final textWidget = Container( + height: 512, + alignment: imageAlignment, + child: Text( + item.parentBaseModel.name, + textAlign: TextAlign.start, + maxLines: 3, + overflow: TextOverflow.fade, + style: textStyle ?? + Theme.of(context).textTheme.headlineLarge?.copyWith( + fontSize: 55, + ), + ), + ); + return logo != null + ? ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 500, maxHeight: 500), + child: FladderImage( + image: logo, + disableBlur: true, + alignment: imageAlignment, + imageErrorBuilder: (context, object, stack) => textWidget, + placeHolder: const SizedBox(height: 0), + fit: BoxFit.contain, + ), + ) + : textWidget; + } +} diff --git a/lib/screens/shared/media/components/media_header.dart b/lib/screens/shared/media/components/media_header.dart index 4562fbe..cc1c79c 100644 --- a/lib/screens/shared/media/components/media_header.dart +++ b/lib/screens/shared/media/components/media_header.dart @@ -24,7 +24,7 @@ class MediaHeader extends ConsumerWidget { alignment: Alignment.center, child: SelectableText( name, - textAlign: TextAlign.center, + textAlign: TextAlign.start, style: Theme.of(context).textTheme.headlineLarge?.copyWith( fontSize: 55, ), @@ -47,7 +47,7 @@ class MediaHeader extends ConsumerWidget { logo != null ? FladderImage( image: logo, - enableBlur: true, + disableBlur: true, alignment: Alignment.bottomCenter, imageErrorBuilder: (context, object, stack) => textWidget, placeHolder: const SizedBox(height: 0), diff --git a/lib/screens/video_player/video_player_controls.dart b/lib/screens/video_player/video_player_controls.dart index 6d46afa..1b23d2e 100644 --- a/lib/screens/video_player/video_player_controls.dart +++ b/lib/screens/video_player/video_player_controls.dart @@ -17,6 +17,7 @@ import 'package:fladder/providers/settings/client_settings_provider.dart'; import 'package:fladder/providers/settings/video_player_settings_provider.dart'; import 'package:fladder/providers/video_player_provider.dart'; import 'package:fladder/screens/shared/default_title_bar.dart'; +import 'package:fladder/screens/shared/media/components/item_logo.dart'; import 'package:fladder/screens/video_player/components/video_playback_information.dart'; import 'package:fladder/screens/video_player/components/video_player_controls_extras.dart'; import 'package:fladder/screens/video_player/components/video_player_options_sheet.dart'; @@ -245,7 +246,8 @@ class _DesktopControlsState extends ConsumerState { Padding( padding: const EdgeInsets.symmetric(horizontal: 12), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, children: [ IconButton( onPressed: () => minimizePlayer(context), @@ -255,12 +257,20 @@ class _DesktopControlsState extends ConsumerState { ), ), const SizedBox(width: 16), - Expanded( - child: Text( - currentItem?.title ?? "", - style: Theme.of(context).textTheme.titleLarge, + if (currentItem != null) + Expanded( + child: ConstrainedBox( + constraints: BoxConstraints( + maxHeight: 150.clamp(50, MediaQuery.sizeOf(context).height * 0.25).toDouble(), + ), + child: ItemLogo( + item: currentItem, + imageAlignment: Alignment.topLeft, + textStyle: Theme.of(context).textTheme.headlineLarge, + ), + ), ), - ), + const SizedBox(width: 16), if (AdaptiveLayout.of(context).inputDevice == InputDevice.touch) Tooltip( message: context.localized.stop, @@ -380,7 +390,7 @@ class _DesktopControlsState extends ConsumerState { child: IconButton( onPressed: () => closePlayer(), icon: const Icon(IconsaxOutline.close_square))), const Spacer(), - if (AdaptiveLayout.viewSizeOf(context) >= ViewSize.desktop && + if (AdaptiveLayout.viewSizeOf(context) >= ViewSize.tablet && ref.read(videoPlayerProvider).hasPlayer) ...{ if (bitRateOptions?.isNotEmpty == true) Tooltip( @@ -390,6 +400,9 @@ class _DesktopControlsState extends ConsumerState { icon: const Icon(IconsaxOutline.speedometer), ), ), + }, + if (AdaptiveLayout.of(context).inputDevice == InputDevice.pointer && + AdaptiveLayout.viewSizeOf(context) > ViewSize.phone) ...[ Listener( onPointerSignal: (event) { if (event is PointerScrollEvent) { @@ -405,7 +418,7 @@ class _DesktopControlsState extends ConsumerState { ), ), const FullScreenButton(), - } + ] ].addInBetween(const SizedBox(width: 8)), ), ), diff --git a/lib/util/fladder_image.dart b/lib/util/fladder_image.dart index 8571749..28ae8a5 100644 --- a/lib/util/fladder_image.dart +++ b/lib/util/fladder_image.dart @@ -14,7 +14,7 @@ class FladderImage extends ConsumerWidget { final Widget? placeHolder; final BoxFit fit; final AlignmentGeometry? alignment; - final bool enableBlur; + final bool disableBlur; final bool blurOnly; const FladderImage({ required this.image, @@ -23,7 +23,7 @@ class FladderImage extends ConsumerWidget { this.placeHolder, this.fit = BoxFit.cover, this.alignment, - this.enableBlur = false, + this.disableBlur = false, this.blurOnly = false, super.key, }); @@ -39,7 +39,7 @@ class FladderImage extends ConsumerWidget { key: Key(newImage.key), fit: StackFit.expand, children: [ - if (useBluredPlaceHolder && !enableBlur && newImage.hash.isNotEmpty && !enableBlur) + if (!disableBlur && useBluredPlaceHolder && newImage.hash.isNotEmpty) Image( fit: fit, excludeFromSemantics: true,