Files
SpotiFLAC-Mobile/lib/widgets/audio_quality_badges.dart
2026-04-29 18:33:44 +07:00

135 lines
3.4 KiB
Dart

import 'package:flutter/material.dart';
class AudioQualityBadge extends StatelessWidget {
final String label;
final ColorScheme colorScheme;
const AudioQualityBadge({
super.key,
required this.label,
required this.colorScheme,
});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1),
decoration: BoxDecoration(
color: colorScheme.primaryContainer.withValues(alpha: 0.6),
borderRadius: BorderRadius.circular(4),
),
child: Text(
label,
style: TextStyle(
fontSize: 9,
fontWeight: FontWeight.w600,
color: colorScheme.onPrimaryContainer,
height: 1.3,
),
),
);
}
}
class DolbyAtmosBadge extends StatelessWidget {
final ColorScheme colorScheme;
const DolbyAtmosBadge({super.key, required this.colorScheme});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1),
decoration: BoxDecoration(
color: colorScheme.tertiaryContainer.withValues(alpha: 0.6),
borderRadius: BorderRadius.circular(4),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
CustomPaint(
size: const Size(14, 10),
painter: DolbyLogoPainter(color: colorScheme.onTertiaryContainer),
),
const SizedBox(width: 3),
Text(
'Atmos',
style: TextStyle(
fontSize: 9,
fontWeight: FontWeight.w600,
color: colorScheme.onTertiaryContainer,
height: 1.3,
),
),
],
),
);
}
}
class DolbyLogoPainter extends CustomPainter {
final Color color;
DolbyLogoPainter({required this.color});
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = color
..style = PaintingStyle.fill;
final h = size.height;
final w = size.width;
final cy = h / 2;
final leftPath = Path()
..moveTo(w * 0.08, 0)
..lineTo(w * 0.08, h)
..lineTo(w * 0.20, h)
..arcToPoint(
Offset(w * 0.20, 0),
radius: Radius.elliptical(w * 0.25, cy),
clockwise: false,
)
..close();
canvas.drawPath(leftPath, paint);
final rightPath = Path()
..moveTo(w * 0.92, 0)
..lineTo(w * 0.92, h)
..lineTo(w * 0.80, h)
..arcToPoint(
Offset(w * 0.80, 0),
radius: Radius.elliptical(w * 0.25, cy),
clockwise: true,
)
..close();
canvas.drawPath(rightPath, paint);
}
@override
bool shouldRepaint(DolbyLogoPainter oldDelegate) =>
color != oldDelegate.color;
}
/// Convenience builder: returns a list of quality badge widgets for a track.
/// Pass the result into a Row using spread operator.
List<Widget> buildQualityBadges({
required String? audioQuality,
required String? audioModes,
required ColorScheme colorScheme,
}) {
final badges = <Widget>[];
if (audioQuality != null && audioQuality.isNotEmpty) {
badges.add(const SizedBox(width: 6));
badges.add(
AudioQualityBadge(label: audioQuality, colorScheme: colorScheme),
);
}
if (audioModes != null && audioModes.contains('DOLBY_ATMOS')) {
badges.add(const SizedBox(width: 4));
badges.add(DolbyAtmosBadge(colorScheme: colorScheme));
}
return badges;
}