86 lines
2.9 KiB
Dart
86 lines
2.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:finamp/l10n/app_localizations.dart';
|
|
import 'package:get_it/get_it.dart';
|
|
|
|
import '../../models/jellyfin_models.dart';
|
|
import '../../services/jellyfin_api_helper.dart';
|
|
import '../../services/generate_subtitle.dart';
|
|
import '../album_image.dart';
|
|
|
|
/// ListTile content for AlbumItem. You probably shouldn't use this widget
|
|
/// directly, use AlbumItem instead.
|
|
class AlbumItemListTile extends StatelessWidget {
|
|
const AlbumItemListTile({
|
|
Key? key,
|
|
required this.item,
|
|
this.parentType,
|
|
this.onTap,
|
|
}) : super(key: key);
|
|
|
|
final BaseItemDto item;
|
|
final String? parentType;
|
|
final void Function()? onTap;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final jellyfinApiHelper = GetIt.instance<JellyfinApiHelper>();
|
|
final subtitle = generateSubtitle(item, parentType, context);
|
|
final colorScheme = Theme.of(context).colorScheme;
|
|
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 5),
|
|
child: Material(
|
|
color: colorScheme.surfaceVariant.withOpacity(0.42),
|
|
borderRadius: BorderRadius.circular(22),
|
|
clipBehavior: Clip.antiAlias,
|
|
child: DecoratedBox(
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(22),
|
|
border: Border.all(
|
|
color: colorScheme.outlineVariant.withOpacity(0.24),
|
|
),
|
|
),
|
|
child: ListTile(
|
|
// This widget is used on the add to playlist screen, so we allow a
|
|
// custom onTap to be passed as an argument.
|
|
onTap: onTap,
|
|
contentPadding: const EdgeInsets.symmetric(
|
|
horizontal: 12,
|
|
vertical: 8,
|
|
),
|
|
leading: SizedBox.square(
|
|
dimension: 62,
|
|
child: ClipRRect(
|
|
borderRadius: BorderRadius.circular(18),
|
|
child: AlbumImage(item: item),
|
|
),
|
|
),
|
|
title: Text(
|
|
item.name ?? AppLocalizations.of(context)!.unknownName,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: Theme.of(context).textTheme.titleMedium?.copyWith(
|
|
fontWeight: FontWeight.w800,
|
|
color: colorScheme.onSurface,
|
|
),
|
|
),
|
|
subtitle: subtitle == null
|
|
? null
|
|
: Text(
|
|
subtitle,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: TextStyle(color: colorScheme.onSurfaceVariant),
|
|
),
|
|
trailing: jellyfinApiHelper.selectedMixAlbumIds.contains(item.id)
|
|
? Icon(Icons.explore_rounded, color: colorScheme.primary)
|
|
: Icon(
|
|
Icons.chevron_right_rounded,
|
|
color: colorScheme.onSurfaceVariant,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|