Merge branch 'dev' into feat/connect

This commit is contained in:
Kingkor Roy Tirtho 2024-03-28 22:59:20 +06:00
commit a4854fca53

View File

@ -52,6 +52,9 @@ class PlayerQueue extends HookConsumerWidget {
@override
Widget build(BuildContext context, ref) {
final mediaQuery = MediaQuery.of(context);
final playlistNotifier = ref.watch(ProxyPlaylistNotifier.notifier);
final playlist = ref.watch(ProxyPlaylistNotifier.provider);
final controller = useAutoScrollController();
final searchText = useState('');
@ -105,7 +108,8 @@ class PlayerQueue extends HookConsumerWidget {
return const NotFound(vertical: true);
}
return LayoutBuilder(builder: (context, constrains) {
return LayoutBuilder(
builder: (context, constrains) {
return ClipRRect(
borderRadius: borderRadius,
clipBehavior: Clip.hardEdge,
@ -132,10 +136,15 @@ class PlayerQueue extends HookConsumerWidget {
searchText.value = '';
}
},
child: Column(
children: [
child: InterScrollbar(
controller: controller,
child: CustomScrollView(
controller: controller,
slivers: [
if (!floating)
Container(
SliverToBoxAdapter(
child: Center(
child: Container(
height: 5,
width: 100,
margin: const EdgeInsets.only(bottom: 5, top: 2),
@ -144,23 +153,40 @@ class PlayerQueue extends HookConsumerWidget {
borderRadius: BorderRadius.circular(20),
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (constrains.mdAndUp || !isSearching.value) ...[
const SizedBox(width: 10),
Text(
context.l10n.tracks_in_queue(tracks.length),
),
),
SliverAppBar(
floating: true,
pinned: false,
snap: false,
backgroundColor: Colors.transparent,
elevation: 0,
automaticallyImplyLeading: !isSearching.value,
title: BackdropFilter(
filter: ImageFilter.blur(
sigmaX: 10,
sigmaY: 10,
),
child: SizedBox(
height: kToolbarHeight,
child: mediaQuery.mdAndUp || !isSearching.value
? Align(
alignment: Alignment.centerLeft,
child: Text(
context.l10n
.tracks_in_queue(tracks.length),
style: TextStyle(
color: headlineColor,
fontWeight: FontWeight.bold,
fontSize: 18,
),
),
const Spacer(),
],
if (constrains.mdAndUp || isSearching.value)
)
: null,
),
),
actions: [
if (mediaQuery.mdAndUp || isSearching.value)
TextField(
onChanged: (value) {
searchText.value = value;
@ -168,7 +194,7 @@ class PlayerQueue extends HookConsumerWidget {
decoration: InputDecoration(
hintText: context.l10n.search,
isDense: true,
prefixIcon: constrains.smAndDown
prefixIcon: mediaQuery.smAndDown
? IconButton(
icon: const Icon(
Icons.arrow_back_ios_new_outlined,
@ -185,8 +211,8 @@ class PlayerQueue extends HookConsumerWidget {
: const Icon(SpotubeIcons.filter),
constraints: BoxConstraints(
maxHeight: 40,
maxWidth: constrains.smAndDown
? constrains.maxWidth - 40
maxWidth: mediaQuery.smAndDown
? mediaQuery.size.width - 40
: 300,
),
),
@ -198,12 +224,12 @@ class PlayerQueue extends HookConsumerWidget {
isSearching.value = !isSearching.value;
},
),
if (constrains.mdAndUp || !isSearching.value) ...[
if (mediaQuery.mdAndUp || !isSearching.value) ...[
const SizedBox(width: 10),
FilledButton(
style: FilledButton.styleFrom(
backgroundColor:
theme.scaffoldBackgroundColor.withOpacity(0.5),
backgroundColor: theme.scaffoldBackgroundColor
.withOpacity(0.5),
foregroundColor:
theme.textTheme.headlineSmall?.color,
),
@ -215,7 +241,7 @@ class PlayerQueue extends HookConsumerWidget {
],
),
onPressed: () {
onStop();
playlistNotifier.stop();
Navigator.of(context).pop();
},
),
@ -223,17 +249,12 @@ class PlayerQueue extends HookConsumerWidget {
],
],
),
const SizedBox(height: 10),
if (!isSearching.value && searchText.value.isEmpty)
Flexible(
child: ReorderableListView.builder(
const SliverGap(10),
SliverReorderableList(
onReorder: (oldIndex, newIndex) {
onReorder(oldIndex, newIndex);
playlistNotifier.moveTrack(oldIndex, newIndex);
},
scrollController: controller,
itemCount: tracks.length + 1,
shrinkWrap: true,
buildDefaultDragHandles: false,
itemCount: filteredTracks.length,
onReorderStart: (index) {
HapticFeedback.selectionClick();
},
@ -241,37 +262,34 @@ class PlayerQueue extends HookConsumerWidget {
HapticFeedback.selectionClick();
},
itemBuilder: (context, i) {
if (i == tracks.length) {
final track = filteredTracks.elementAt(i);
return AutoScrollTag(
index: i,
controller: controller,
key: const ValueKey('end'),
child: const Gap(100),
);
}
final track = tracks.elementAt(i);
return AutoScrollTag(
key: ValueKey(i),
key: ValueKey<int>(i),
controller: controller,
index: i,
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 8.0),
child: Material(
color: Colors.transparent,
child: TrackTile(
playlist: playlist,
index: i,
track: track,
playlist: playlist,
onTap: () async {
if (playlist.activeTrack?.id == track.id) {
return;
}
onJump(track);
await playlistNotifier.jumpToTrack(track);
},
leadingActions: [
ReorderableDragStartListener(
if (!isSearching.value &&
searchText.value.isEmpty)
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: ReorderableDragStartListener(
index: i,
child: const Icon(SpotubeIcons.dragHandle),
child: const Icon(
SpotubeIcons.dragHandle,
),
),
),
],
),
@ -279,45 +297,15 @@ class PlayerQueue extends HookConsumerWidget {
);
},
),
)
else
Flexible(
child: InterScrollbar(
controller: controller,
child: ListView.builder(
controller: controller,
itemCount: filteredTracks.length + 1,
itemBuilder: (context, i) {
if (i == filteredTracks.length) {
return const Gap(100);
}
final track = filteredTracks.elementAt(i);
return Padding(
padding:
const EdgeInsets.symmetric(horizontal: 8.0),
child: TrackTile(
index: i,
playlist: playlist,
track: track,
onTap: () async {
if (playlist.activeTrack?.id == track.id) {
return;
}
onJump(track);
},
),
);
},
),
),
),
const SliverGap(100),
],
),
),
),
),
),
);
},
);
});
}
}