add ability to configure double click behavior

This commit is contained in:
Kendall Garner 2024-08-19 21:56:55 -07:00
parent 94edda1856
commit 88741a8616
No known key found for this signature in database
GPG key ID: 18D2767419676C87
4 changed files with 36 additions and 2 deletions

View file

@ -472,6 +472,8 @@
"discordRichPresence_description": "enable playback status in {{discord}} rich presence. Image keys are: {{icon}}, {{playing}}, and {{paused}} ",
"discordUpdateInterval": "{{discord}} rich presence update interval",
"discordUpdateInterval_description": "the time in seconds between each update (minimum 15 seconds)",
"doubleClickBehavior": "queue all tracks when double clicking",
"doubleClickBehavior_description": "if true, all matching tracks (e.g. album, playlist, search) will be queued. otherwise, only queue the track clicked",
"enableRemote": "enable remote control server",
"enableRemote_description": "enables the remote control server to allow other devices to control the application",
"externalLinks": "show external links",

View file

@ -1,7 +1,7 @@
import { useCallback, useRef } from 'react';
import { useQueryClient } from '@tanstack/react-query';
import { useCurrentServer, usePlayerControls, usePlayerStore } from '/@/renderer/store';
import { usePlaybackType } from '/@/renderer/store/settings.store';
import { useGeneralSettings, usePlaybackType } from '/@/renderer/store/settings.store';
import { PlayQueueAddOptions, Play, PlaybackType } from '/@/renderer/types';
import { toast } from '/@/renderer/components/toast/index';
import isElectron from 'is-electron';
@ -65,6 +65,8 @@ export const useHandlePlayQueueAdd = () => {
const { play } = usePlayerControls();
const timeoutIds = useRef<Record<string, ReturnType<typeof setTimeout>> | null>({});
const { doubleClickQueueAll } = useGeneralSettings();
const handlePlayQueueAdd = useCallback(
async (options: PlayQueueAddOptions) => {
if (!server) return toast.error({ message: 'No server selected', type: 'error' });
@ -121,6 +123,12 @@ export const useHandlePlayQueueAdd = () => {
} else if (itemType === LibraryItem.SONG) {
if (id?.length === 1) {
songList = await getSongById({ id: id?.[0], queryClient, server });
} else if (!doubleClickQueueAll && initialSongId) {
songList = await getSongById({
id: initialSongId,
queryClient,
server,
});
} else {
songList = await getSongsByQuery({ query, queryClient, server });
}
@ -195,7 +203,7 @@ export const useHandlePlayQueueAdd = () => {
return null;
},
[play, playbackType, queryClient, server, t],
[doubleClickQueueAll, play, playbackType, queryClient, server, t],
);
return handlePlayQueueAdd;

View file

@ -233,6 +233,28 @@ export const ControlSettings = () => {
isHidden: false,
title: t('setting.playButtonBehavior', { postProcess: 'sentenceCase' }),
},
{
control: (
<Switch
aria-label="Whether double clicking a track should queue all matching songs"
defaultChecked={settings.doubleClickQueueAll}
onChange={(e) =>
setSettings({
general: {
...settings,
doubleClickQueueAll: e.currentTarget.checked,
},
})
}
/>
),
description: t('setting.doubleClickBehavior', {
context: 'description',
postProcess: 'sentenceCase',
}),
isHidden: false,
title: t('setting.doubleClickBehavior', { postProcess: 'sentenceCase' }),
},
{
control: (
<Select

View file

@ -195,6 +195,7 @@ export interface SettingsState {
albumArtRes?: number | null;
buttonSize: number;
defaultFullPlaylist: boolean;
doubleClickQueueAll: boolean;
externalLinks: boolean;
followSystemTheme: boolean;
genreTarget: GenreTarget;
@ -318,6 +319,7 @@ const initialState: SettingsState = {
albumArtRes: undefined,
buttonSize: 20,
defaultFullPlaylist: true,
doubleClickQueueAll: true,
externalLinks: true,
followSystemTheme: false,
genreTarget: GenreTarget.TRACK,