Skip to content

Commit f1e3598

Browse files
committed
feat: Implement text hint for the playback controller context menu
1 parent a073fd5 commit f1e3598

File tree

3 files changed

+75
-19
lines changed

3 files changed

+75
-19
lines changed

lib/config/navigation.dart

+5-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ final List<NavigationItem> navigationItems = [
9494
'Settings',
9595
'/settings',
9696
shortcuts: [
97-
LogicalKeySet(LogicalKeyboardKey.alt, LogicalKeyboardKey.keyT)
97+
LogicalKeySet(
98+
LogicalKeyboardKey.control,
99+
LogicalKeyboardKey.alt,
100+
LogicalKeyboardKey.keyS,
101+
)
98102
],
99103
children: [
100104
NavigationItem('Library', '/settings/library'),

lib/widgets/playback_controller/constants/controller_items.dart

+62-12
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import 'package:flutter/services.dart';
2-
import 'package:player/utils/api/play_next.dart';
32
import 'package:provider/provider.dart';
43
import 'package:fluent_ui/fluent_ui.dart';
54
import 'package:material_symbols_icons/symbols.dart';
65

6+
import '../../../utils/api/play_play.dart';
77
import '../../../utils/api/play_mode.dart';
8+
import '../../../utils/api/play_next.dart';
89
import '../../../utils/api/play_pause.dart';
9-
import '../../../utils/api/play_play.dart';
1010
import '../../../utils/api/play_previous.dart';
1111
import '../../../utils/dialogs/play_queue_dialog.dart';
1212
import '../../../widgets/playback_controller/fullscreen_button.dart';
@@ -74,7 +74,13 @@ var controllerItems = [
7474

7575
return MenuFlyoutItem(
7676
leading: const Icon(Symbols.skip_previous),
77-
text: const Text('Previous'),
77+
text: const Row(
78+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
79+
children: [
80+
Text('Previous'),
81+
ShortcutText('Ctrl+←'),
82+
],
83+
),
7884
onPressed: notReady
7985
? null
8086
: () {
@@ -123,9 +129,10 @@ var controllerItems = [
123129
leading: status?.state == "Playing"
124130
? const Icon(Symbols.pause)
125131
: const Icon(Symbols.play_arrow),
126-
text: status?.state == "Playing"
127-
? const Text('Pause')
128-
: const Text('Play'),
132+
text: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
133+
status?.state == "Playing" ? const Text('Pause') : const Text('Play'),
134+
const ShortcutText('Ctrl+P'),
135+
]),
129136
onPressed: notReady
130137
? null
131138
: () {
@@ -163,7 +170,13 @@ var controllerItems = [
163170

164171
return MenuFlyoutItem(
165172
leading: const Icon(Symbols.skip_next),
166-
text: const Text('Next'),
173+
text: const Row(
174+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
175+
children: [
176+
Text('Next'),
177+
ShortcutText('Ctrl+→'),
178+
],
179+
),
167180
onPressed: notReady
168181
? null
169182
: () {
@@ -284,7 +297,13 @@ var controllerItems = [
284297
flyoutEntryBuilder: (context) {
285298
return MenuFlyoutItem(
286299
leading: const Icon(Symbols.list_alt),
287-
text: const Text('Playlist'),
300+
text: const Row(
301+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
302+
children: [
303+
Text('Playlist'),
304+
ShortcutText('Ctrl+Q'),
305+
],
306+
),
288307
onPressed: () {
289308
Flyout.of(context).close();
290309
showPlayQueueDialog(context);
@@ -313,13 +332,21 @@ var controllerItems = [
313332
icon: Symbols.photo,
314333
title: "Cover Wall",
315334
subtitle: "Display cover art for a unique ambience",
316-
shortcuts: [],
317-
onShortcut: (context) {},
335+
shortcuts: [LogicalKeySet(LogicalKeyboardKey.alt, LogicalKeyboardKey.keyN)],
336+
onShortcut: (context) {
337+
showCoverArtWall(context);
338+
},
318339
controllerButtonBuilder: (context) => const CoverWallButton(),
319340
flyoutEntryBuilder: (context) {
320341
return MenuFlyoutItem(
321342
leading: const Icon(Symbols.photo),
322-
text: const Text('Cover Wall'),
343+
text: const Row(
344+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
345+
children: [
346+
Text('Cover Wall'),
347+
ShortcutText('Alt+N'),
348+
],
349+
),
323350
onPressed: () {
324351
Flyout.of(context).close();
325352
showCoverArtWall(context);
@@ -348,7 +375,13 @@ var controllerItems = [
348375
leading: fullScreen.isFullScreen
349376
? const Icon(Symbols.fullscreen_exit)
350377
: const Icon(Symbols.fullscreen),
351-
text: const Text('Fullscreen'),
378+
text: const Row(
379+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
380+
children: [
381+
Text('Fullscreen'),
382+
ShortcutText('F11'),
383+
],
384+
),
352385
onPressed: () {
353386
Flyout.of(context).close();
354387
fullScreen.setFullScreen(!fullScreen.isFullScreen);
@@ -357,3 +390,20 @@ var controllerItems = [
357390
},
358391
),
359392
];
393+
394+
class ShortcutText extends StatelessWidget {
395+
const ShortcutText(this.text, {super.key});
396+
397+
final String text;
398+
399+
@override
400+
Widget build(BuildContext context) {
401+
final theme = FluentTheme.of(context);
402+
return Text(
403+
text,
404+
style: theme.typography.caption?.apply(
405+
color: theme.activeColor.withAlpha(80),
406+
),
407+
);
408+
}
409+
}

lib/widgets/playback_controller/playback_controller.dart

+8-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:material_symbols_icons/symbols.dart';
66
import '../../widgets/playback_controller/now_playing.dart';
77
import '../../widgets/playback_controller/cover_art_page_progress_bar.dart';
88
import '../../widgets/playback_controller/constants/controller_items.dart';
9-
import '../../providers/status.dart';
109
import '../../providers/playback_controller.dart';
1110
import '../../providers/responsive_providers.dart';
1211

@@ -117,11 +116,14 @@ class _ControllerButtonsState extends State<ControllerButtons> {
117116
onPressed: () {
118117
menuController.showFlyout(
119118
builder: (context) {
120-
return MenuFlyout(
121-
items: [
122-
for (var entry in hiddenEntries)
123-
entry.flyoutEntryBuilder(context),
124-
],
119+
return Container(
120+
constraints: const BoxConstraints(maxWidth: 200),
121+
child: MenuFlyout(
122+
items: [
123+
for (var entry in hiddenEntries)
124+
entry.flyoutEntryBuilder(context),
125+
],
126+
),
125127
);
126128
},
127129
);

0 commit comments

Comments
 (0)