aboutsummaryrefslogtreecommitdiffstats
path: root/lib/presentation/screens/media/radio_preset_table.dart
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2024-01-03 18:14:12 -0500
committerScott Murray <scott.murray@konsulko.com>2024-01-03 18:23:55 -0500
commit2d395f4431ba4aa5055d02437463588f4d4c8127 (patch)
tree977be67fcfab0edac1e6e03f77af6e7be0dc8931 /lib/presentation/screens/media/radio_preset_table.dart
parent4742fde5c48726357cc8db06d237e9db6c3df608 (diff)
Initial mediaplayer implementation
Notable changes: - Added dart_mpd package as a dependency. - Added MPD client class and associated provider. - Added MPD client configuration to the configuration file for potential usecases where MPD may not be available locally. - Added playlist, play state, art, etc. providers for use in the mediaplayer front end UI. - Reworked MediaPlayer classes to wire up MPD client backend. - Removed volume slider from the bottom of the media pages to make more room for playlist / preset tables, as only being able to show 3 entries in each was not usable in practice. - Reworked media player mocked up position indicator into an actual slider control, and reworked the radio slider styling to match for better UI consistency. - Reworked media player and radio playlist / preset tables to attempt to have them layout at the same location and add an always visible scroll bar. The scroll bars currently have a layout issue with respect to scroll track size that does not seem to have an obvious fix. They are usable for now, and further investigation will be done when time permits. - Wired up play/pause button on the side volume control via a new set of play state and controller providers. Bug-AGL: SPEC-5028, SPEC-5029 Change-Id: I87efecc58b4e185443942eb32ff8148ebcd675c3 Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Diffstat (limited to 'lib/presentation/screens/media/radio_preset_table.dart')
-rw-r--r--lib/presentation/screens/media/radio_preset_table.dart172
1 files changed, 107 insertions, 65 deletions
diff --git a/lib/presentation/screens/media/radio_preset_table.dart b/lib/presentation/screens/media/radio_preset_table.dart
index 816bcb9..97affb8 100644
--- a/lib/presentation/screens/media/radio_preset_table.dart
+++ b/lib/presentation/screens/media/radio_preset_table.dart
@@ -38,6 +38,8 @@ class _RadioPresetTableState extends ConsumerState<RadioPresetTable> {
@override
Widget build(BuildContext context) {
+ final controller = ScrollController();
+
return Material(
color: Colors.transparent,
child: Column(
@@ -72,72 +74,112 @@ class _RadioPresetTableState extends ConsumerState<RadioPresetTable> {
)))
],
),
- SizedBox(
- height: 325,
- child: SingleChildScrollView(
- child: Column(
- children: presets.map((index) {
- return Container(
- height: 100,
- margin: const EdgeInsets.symmetric(vertical: 4),
- decoration: BoxDecoration(
- border: Border(
- left: selectedPreset == index.name
- ? const BorderSide(
- color: Colors.white, width: 4)
- : BorderSide.none),
- gradient: LinearGradient(
- colors: selectedPreset == index.name
- ? [
- AGLDemoColors.neonBlueColor,
- AGLDemoColors.neonBlueColor
- .withOpacity(0.15)
- ]
- : [
- Colors.black,
- Colors.black.withOpacity(0.20)
- ])),
- child: InkWell(
- onTap: () {
- ref
- .read(radioClientProvider)
- .setFrequency(index.frequency);
- setState(() {
- selectedPreset = index.name;
- });
- },
- child: Padding(
- padding: const EdgeInsets.symmetric(
- vertical: 17, horizontal: 24),
- child: Row(
- children: [
- Expanded(
- flex: 6,
- child: AutoSizeText(
- index.name,
- maxLines: 1,
- style: TextStyle(
- color: Colors.white,
- fontSize: 40,
- shadows: [Helpers.dropShadowRegular]),
- )),
- Expanded(
- flex: 4,
- child: Text(
- frequencyToString(index.frequency),
- style: TextStyle(
- color: Colors.white,
- fontSize: 26,
- shadows: [Helpers.dropShadowRegular]),
- ))
- ],
+ Padding(
+ padding: const EdgeInsets.only(right: 12),
+ child: SizedBox(
+ height: 500,
+ child: RawScrollbar(
+ controller: controller,
+ thickness: 32,
+ thumbVisibility: true,
+ radius: const Radius.circular(10),
+ thumbColor: AGLDemoColors.periwinkleColor,
+ minThumbLength: 60,
+ interactive: true,
+ child: ScrollConfiguration(
+ behavior: ScrollConfiguration.of(context).copyWith(
+ scrollbars: false,
+ overscroll: false,
),
- ),
- ),
- );
- }).toList()),
- ),
- ),
+ child: CustomScrollView(
+ controller: controller,
+ physics: const ClampingScrollPhysics(),
+ slivers: <Widget>[
+ SliverList.separated(
+ itemCount: presets.length,
+ itemBuilder: (_, int index) {
+ return Container(
+ height: 92,
+ margin: const EdgeInsets.only(right: 44),
+ decoration: BoxDecoration(
+ border: Border(
+ left: selectedPreset ==
+ presets[index].name
+ ? const BorderSide(
+ color: Colors.white,
+ width: 4)
+ : BorderSide.none),
+ gradient: LinearGradient(
+ colors: selectedPreset ==
+ presets[index].name
+ ? [
+ AGLDemoColors.neonBlueColor,
+ AGLDemoColors.neonBlueColor
+ .withOpacity(0.15)
+ ]
+ : [
+ Colors.black,
+ Colors.black
+ .withOpacity(0.20)
+ ])),
+ child: InkWell(
+ onTap: () {
+ ref
+ .read(radioClientProvider)
+ .setFrequency(
+ presets[index].frequency);
+ setState(() {
+ selectedPreset = presets[index].name;
+ });
+ },
+ child: Padding(
+ padding: const EdgeInsets.symmetric(
+ vertical: 17, horizontal: 24),
+ child: Row(
+ children: [
+ Expanded(
+ flex: 6,
+ child: AutoSizeText(
+ presets[index].name,
+ maxLines: 1,
+ style: TextStyle(
+ color: Colors.white,
+ fontSize: 32,
+ shadows: [
+ Helpers
+ .dropShadowRegular
+ ]),
+ )),
+ Expanded(
+ flex: 4,
+ child: Align(
+ alignment:
+ Alignment.centerRight,
+ child: Text(
+ frequencyToString(
+ presets[index]
+ .frequency),
+ style: TextStyle(
+ color: Colors.white,
+ fontSize: 24,
+ shadows: [
+ Helpers
+ .dropShadowRegular
+ ]),
+ )))
+ ],
+ ),
+ ),
+ ),
+ );
+ },
+ separatorBuilder: (_, __) {
+ return SizedBox(height: 8);
+ },
+ ),
+ ])),
+ ),
+ )),
],
));
}