mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-09 15:38:13 -07:00
Merge branch 'develop' of https://github.com/DonutWare/Fladder into develop
This commit is contained in:
commit
48b1e4a6fb
6 changed files with 76 additions and 15 deletions
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[](https://github.com/DonutWare/Fladder/actions/workflows/build.yml)
|
[](https://github.com/DonutWare/Fladder/actions/workflows/build.yml)
|
||||||
[](https://github.com/DonutWare/Fladder/releases/latest)
|
[](https://github.com/DonutWare/Fladder/releases/latest)
|
||||||
[](https://github.com/DonutWare/Fladder/releases/latest)
|
[](https://github.com/DonutWare/Fladder/releases/latest)
|
||||||
[](https://conventionalcommits.org)
|
[](https://conventionalcommits.org)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
48
lib/screens/shared/media/components/item_logo.dart
Normal file
48
lib/screens/shared/media/components/item_logo.dart
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue