mucke/lib/presentation/pages/album_details_page.dart

116 lines
3.4 KiB
Dart
Raw Normal View History

2020-03-28 11:08:43 +01:00
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
2021-05-08 12:05:27 +02:00
import 'package:get_it/get_it.dart';
2020-03-28 11:08:43 +01:00
import '../../domain/entities/album.dart';
import '../../domain/entities/song.dart';
2021-05-08 12:05:27 +02:00
import '../state/album_page_store.dart';
import '../state/audio_store.dart';
2021-04-26 20:46:10 +02:00
import '../theming.dart';
2021-05-09 13:26:07 +02:00
import '../widgets/album_sliver_appbar.dart';
2021-05-08 12:05:27 +02:00
import '../widgets/song_bottom_sheet.dart';
import '../widgets/song_list_tile.dart';
2020-03-28 11:08:43 +01:00
2021-05-08 12:05:27 +02:00
class AlbumDetailsPage extends StatefulWidget {
2021-06-20 13:49:21 +02:00
const AlbumDetailsPage({Key? key, required this.album}) : super(key: key);
2020-03-28 11:08:43 +01:00
final Album album;
2021-05-08 12:05:27 +02:00
@override
_AlbumDetailsPageState createState() => _AlbumDetailsPageState();
}
class _AlbumDetailsPageState extends State<AlbumDetailsPage> {
2021-06-20 13:49:21 +02:00
late AlbumPageStore store;
2021-05-08 12:05:27 +02:00
@override
void initState() {
super.initState();
2021-05-09 13:26:07 +02:00
store = GetIt.I<AlbumPageStore>(param1: widget.album);
2021-05-08 12:05:27 +02:00
}
2021-05-08 23:46:23 +02:00
@override
2021-05-08 12:05:27 +02:00
void dispose() {
store.dispose();
super.dispose();
}
2020-03-28 11:08:43 +01:00
@override
Widget build(BuildContext context) {
2021-05-10 19:19:54 +02:00
final AudioStore audioStore = GetIt.I<AudioStore>();
return Observer(
2021-04-26 20:46:10 +02:00
builder: (BuildContext context) {
2021-06-20 13:49:21 +02:00
final songsByDisc = _songsByDisc(store.albumSongStream.value ?? []);
2021-04-26 20:46:10 +02:00
return CustomScrollView(
slivers: <Widget>[
2021-05-08 23:46:23 +02:00
AlbumSliverAppBar(
album: widget.album,
),
2021-04-26 20:46:10 +02:00
for (int d = 0; d < songsByDisc.length; d++)
SliverList(
delegate: SliverChildListDelegate(
[
if (songsByDisc.length > 1 && d > 0) Container(height: 8.0),
if (songsByDisc.length > 1)
ListTile(
title: Text('Disc ${d + 1}', style: TEXT_HEADER),
leading: const SizedBox(width: 56, child: Icon(Icons.album)),
contentPadding: const EdgeInsets.symmetric(horizontal: 8.0),
),
if (songsByDisc.length > 1)
Padding(
padding: const EdgeInsets.symmetric(
horizontal: HORIZONTAL_PADDING,
),
child: Container(
height: 1.0,
color: Colors.white10,
),
),
for (int s = 0; s < songsByDisc[d].length; s++)
SongListTile(
song: songsByDisc[d][s],
2021-05-08 23:46:23 +02:00
showAlbum: false,
2021-04-26 20:46:10 +02:00
onTap: () => audioStore.playSong(
s + _calcOffset(d, songsByDisc),
2021-06-20 13:49:21 +02:00
store.albumSongStream.value!,
2021-04-26 20:46:10 +02:00
),
2021-05-08 12:05:27 +02:00
onTapMore: () => SongBottomSheet()(songsByDisc[d][s], context),
2021-04-26 20:46:10 +02:00
)
],
),
)
],
);
},
2020-03-28 11:08:43 +01:00
);
}
2020-11-15 16:36:50 +01:00
2021-04-26 20:46:10 +02:00
List<List<Song>> _songsByDisc(List<Song> songs) {
final discs = [<Song>[]];
int currentDisc = 1;
for (final song in songs) {
if (song.discNumber == currentDisc) {
discs.last.add(song);
} else {
discs.add([song]);
currentDisc = song.discNumber;
}
}
return discs;
}
int _calcOffset(int disc, List<List> discs) {
int offset = 0;
for (int i = 0; i < disc; i++) {
offset += discs[i].length;
}
return offset;
}
2020-03-28 11:08:43 +01:00
}