mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-14 23:20:25 +02:00
feat: improve extension metadata UI
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user