Merge branch 'develop' of https://github.com/DonutWare/Fladder into develop

This commit is contained in:
PartyDonut 2025-02-28 10:07:55 +01:00
commit 48b1e4a6fb
6 changed files with 76 additions and 15 deletions

View file

@ -21,7 +21,7 @@
<div align="center"> <div align="center">
[![Build](https://github.com/DonutWare/Fladder/actions/workflows/build.yml/badge.svg?branch=develop)](https://github.com/DonutWare/Fladder/actions/workflows/build.yml) [![Build](https://github.com/DonutWare/Fladder/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/DonutWare/Fladder/actions/workflows/build.yml)
[![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/DonutWare/fladder/total)](https://github.com/DonutWare/Fladder/releases/latest) [![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/DonutWare/fladder/total)](https://github.com/DonutWare/Fladder/releases/latest)
[![GitHub Release](https://img.shields.io/github/v/release/DonutWare/fladder?display_name=tag)](https://github.com/DonutWare/Fladder/releases/latest) [![GitHub Release](https://img.shields.io/github/v/release/DonutWare/fladder?display_name=tag)](https://github.com/DonutWare/Fladder/releases/latest)
[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-%23FE5196?logo=conventionalcommits&logoColor=white)](https://conventionalcommits.org) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-%23FE5196?logo=conventionalcommits&logoColor=white)](https://conventionalcommits.org)

View file

@ -142,7 +142,7 @@ class _SimpleVideoPlayerState extends ConsumerState<SimpleVideoPlayer> with Wind
Positioned.fill( Positioned.fill(
child: FladderImage( child: FladderImage(
image: widget.video.thumbnail?.primary, image: widget.video.thumbnail?.primary,
enableBlur: true, disableBlur: true,
fit: BoxFit.contain, fit: BoxFit.contain,
), ),
), ),

View file

@ -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;
}
}

View file

@ -24,7 +24,7 @@ class MediaHeader extends ConsumerWidget {
alignment: Alignment.center, alignment: Alignment.center,
child: SelectableText( child: SelectableText(
name, name,
textAlign: TextAlign.center, textAlign: TextAlign.start,
style: Theme.of(context).textTheme.headlineLarge?.copyWith( style: Theme.of(context).textTheme.headlineLarge?.copyWith(
fontSize: 55, fontSize: 55,
), ),
@ -47,7 +47,7 @@ class MediaHeader extends ConsumerWidget {
logo != null logo != null
? FladderImage( ? FladderImage(
image: logo, image: logo,
enableBlur: true, disableBlur: true,
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
imageErrorBuilder: (context, object, stack) => textWidget, imageErrorBuilder: (context, object, stack) => textWidget,
placeHolder: const SizedBox(height: 0), placeHolder: const SizedBox(height: 0),

View file

@ -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/settings/video_player_settings_provider.dart';
import 'package:fladder/providers/video_player_provider.dart'; import 'package:fladder/providers/video_player_provider.dart';
import 'package:fladder/screens/shared/default_title_bar.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_playback_information.dart';
import 'package:fladder/screens/video_player/components/video_player_controls_extras.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'; import 'package:fladder/screens/video_player/components/video_player_options_sheet.dart';
@ -245,7 +246,8 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 12), padding: const EdgeInsets.symmetric(horizontal: 12),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
IconButton( IconButton(
onPressed: () => minimizePlayer(context), onPressed: () => minimizePlayer(context),
@ -255,12 +257,20 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
), ),
), ),
const SizedBox(width: 16), const SizedBox(width: 16),
Expanded( if (currentItem != null)
child: Text( Expanded(
currentItem?.title ?? "", child: ConstrainedBox(
style: Theme.of(context).textTheme.titleLarge, 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) if (AdaptiveLayout.of(context).inputDevice == InputDevice.touch)
Tooltip( Tooltip(
message: context.localized.stop, message: context.localized.stop,
@ -380,7 +390,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
child: IconButton( child: IconButton(
onPressed: () => closePlayer(), icon: const Icon(IconsaxOutline.close_square))), onPressed: () => closePlayer(), icon: const Icon(IconsaxOutline.close_square))),
const Spacer(), const Spacer(),
if (AdaptiveLayout.viewSizeOf(context) >= ViewSize.desktop && if (AdaptiveLayout.viewSizeOf(context) >= ViewSize.tablet &&
ref.read(videoPlayerProvider).hasPlayer) ...{ ref.read(videoPlayerProvider).hasPlayer) ...{
if (bitRateOptions?.isNotEmpty == true) if (bitRateOptions?.isNotEmpty == true)
Tooltip( Tooltip(
@ -390,6 +400,9 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
icon: const Icon(IconsaxOutline.speedometer), icon: const Icon(IconsaxOutline.speedometer),
), ),
), ),
},
if (AdaptiveLayout.of(context).inputDevice == InputDevice.pointer &&
AdaptiveLayout.viewSizeOf(context) > ViewSize.phone) ...[
Listener( Listener(
onPointerSignal: (event) { onPointerSignal: (event) {
if (event is PointerScrollEvent) { if (event is PointerScrollEvent) {
@ -405,7 +418,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
), ),
), ),
const FullScreenButton(), const FullScreenButton(),
} ]
].addInBetween(const SizedBox(width: 8)), ].addInBetween(const SizedBox(width: 8)),
), ),
), ),

View file

@ -14,7 +14,7 @@ class FladderImage extends ConsumerWidget {
final Widget? placeHolder; final Widget? placeHolder;
final BoxFit fit; final BoxFit fit;
final AlignmentGeometry? alignment; final AlignmentGeometry? alignment;
final bool enableBlur; final bool disableBlur;
final bool blurOnly; final bool blurOnly;
const FladderImage({ const FladderImage({
required this.image, required this.image,
@ -23,7 +23,7 @@ class FladderImage extends ConsumerWidget {
this.placeHolder, this.placeHolder,
this.fit = BoxFit.cover, this.fit = BoxFit.cover,
this.alignment, this.alignment,
this.enableBlur = false, this.disableBlur = false,
this.blurOnly = false, this.blurOnly = false,
super.key, super.key,
}); });
@ -39,7 +39,7 @@ class FladderImage extends ConsumerWidget {
key: Key(newImage.key), key: Key(newImage.key),
fit: StackFit.expand, fit: StackFit.expand,
children: [ children: [
if (useBluredPlaceHolder && !enableBlur && newImage.hash.isNotEmpty && !enableBlur) if (!disableBlur && useBluredPlaceHolder && newImage.hash.isNotEmpty)
Image( Image(
fit: fit, fit: fit,
excludeFromSemantics: true, excludeFromSemantics: true,