add configuration to revert to single-select ItemGrid behavior

This commit is contained in:
jeffvli
2026-01-28 20:14:05 -08:00
parent 9532601efe
commit 78aebd7c5d
20 changed files with 100 additions and 7 deletions
+2
View File
@@ -922,6 +922,8 @@
"showLyricsInSidebar": "show lyrics in player sidebar", "showLyricsInSidebar": "show lyrics in player sidebar",
"showRatings_description": "controls if the star ratings feature shows up in the interface", "showRatings_description": "controls if the star ratings feature shows up in the interface",
"showRatings": "show star ratings", "showRatings": "show star ratings",
"enableGridMultiSelect": "enable grid multi-select",
"enableGridMultiSelect_description": "when enabled, allows selecting multiple items in grid views. when disabled, clicking grid item images will navigate to the item page",
"showVisualizerInSidebar_description": "a panel will be added to the player sidebar that displays the visualizer", "showVisualizerInSidebar_description": "a panel will be added to the player sidebar that displays the visualizer",
"showVisualizerInSidebar": "show visualizer in player sidebar", "showVisualizerInSidebar": "show visualizer in player sidebar",
"combinedLyricsAndVisualizer_description": "combine lyrics and visualizer into the same panel", "combinedLyricsAndVisualizer_description": "combine lyrics and visualizer into the same panel",
@@ -118,9 +118,9 @@ const CarouselItem = ({ album }: CarouselItemProps) => {
containerClassName={styles.albumImageContainer} containerClassName={styles.albumImageContainer}
enableDebounce={false} enableDebounce={false}
enableViewport={false} enableViewport={false}
fetchPriority="high"
id={album.imageId} id={album.imageId}
itemType={LibraryItem.ALBUM} itemType={LibraryItem.ALBUM}
fetchPriority="high"
type="itemCard" type="itemCard"
/> />
<div className={styles.playButtonOverlay}> <div className={styles.playButtonOverlay}>
@@ -35,6 +35,7 @@
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
pointer-events: none;
content: ''; content: '';
background-color: rgb(0 0 0); background-color: rgb(0 0 0);
opacity: 0; opacity: 0;
@@ -57,6 +57,7 @@ export interface ItemCardProps {
enableDrag?: boolean; enableDrag?: boolean;
enableExpansion?: boolean; enableExpansion?: boolean;
enableNavigation?: boolean; enableNavigation?: boolean;
imageAsLink?: boolean;
internalState?: ItemListStateActions; internalState?: ItemListStateActions;
isRound?: boolean; isRound?: boolean;
itemType: LibraryItem; itemType: LibraryItem;
@@ -71,6 +72,7 @@ export const ItemCard = ({
enableDrag, enableDrag,
enableExpansion, enableExpansion,
enableNavigation = true, enableNavigation = true,
imageAsLink,
internalState, internalState,
isRound, isRound,
itemType, itemType,
@@ -91,6 +93,7 @@ export const ItemCard = ({
enableDrag={enableDrag} enableDrag={enableDrag}
enableExpansion={enableExpansion} enableExpansion={enableExpansion}
enableNavigation={enableNavigation} enableNavigation={enableNavigation}
imageAsLink={imageAsLink}
imageUrl={imageUrl} imageUrl={imageUrl}
internalState={internalState} internalState={internalState}
isRound={isRound} isRound={isRound}
@@ -108,6 +111,7 @@ export const ItemCard = ({
enableDrag={enableDrag} enableDrag={enableDrag}
enableExpansion={enableExpansion} enableExpansion={enableExpansion}
enableNavigation={enableNavigation} enableNavigation={enableNavigation}
imageAsLink={imageAsLink}
imageUrl={imageUrl} imageUrl={imageUrl}
internalState={internalState} internalState={internalState}
isRound={isRound} isRound={isRound}
@@ -126,6 +130,7 @@ export const ItemCard = ({
enableDrag={enableDrag} enableDrag={enableDrag}
enableExpansion={enableExpansion} enableExpansion={enableExpansion}
enableNavigation={enableNavigation} enableNavigation={enableNavigation}
imageAsLink={imageAsLink}
imageUrl={imageUrl} imageUrl={imageUrl}
internalState={internalState} internalState={internalState}
isRound={isRound} isRound={isRound}
@@ -142,6 +147,7 @@ export interface ItemCardDerivativeProps extends Omit<ItemCardProps, 'type'> {
controls?: ItemControls; controls?: ItemControls;
enableExpansion?: boolean; enableExpansion?: boolean;
enableNavigation?: boolean; enableNavigation?: boolean;
imageAsLink?: boolean;
imageUrl: string | undefined; imageUrl: string | undefined;
internalState?: ItemListStateActions; internalState?: ItemListStateActions;
rows: DataRow[]; rows: DataRow[];
@@ -154,6 +160,7 @@ const CompactItemCard = ({
enableDrag, enableDrag,
enableExpansion, enableExpansion,
enableNavigation, enableNavigation,
imageAsLink,
internalState, internalState,
isRound, isRound,
itemType, itemType,
@@ -381,7 +388,7 @@ const CompactItemCard = ({
})} })}
ref={ref} ref={ref}
> >
{enableNavigation && navigationPath && !internalState ? ( {enableNavigation && navigationPath && (imageAsLink ?? !internalState) ? (
<Link <Link
className={imageContainerClassName} className={imageContainerClassName}
draggable={false} draggable={false}
@@ -442,6 +449,7 @@ const DefaultItemCard = ({
data, data,
enableExpansion, enableExpansion,
enableNavigation, enableNavigation,
imageAsLink,
internalState, internalState,
isRound, isRound,
itemType, itemType,
@@ -583,7 +591,7 @@ const DefaultItemCard = ({
[styles.selected]: isSelected, [styles.selected]: isSelected,
})} })}
> >
{enableNavigation && navigationPath && !internalState ? ( {enableNavigation && navigationPath && (imageAsLink ?? !internalState) ? (
<Link <Link
className={imageContainerClassName} className={imageContainerClassName}
draggable={false} draggable={false}
@@ -660,6 +668,7 @@ const PosterItemCard = ({
enableDrag, enableDrag,
enableExpansion, enableExpansion,
enableNavigation, enableNavigation,
imageAsLink,
internalState, internalState,
isRound, isRound,
itemType, itemType,
@@ -869,7 +878,7 @@ const PosterItemCard = ({
})} })}
ref={ref} ref={ref}
> >
{enableNavigation && navigationPath && !internalState ? ( {enableNavigation && navigationPath && (imageAsLink ?? !internalState) ? (
<Link <Link
className={imageContainerClassName} className={imageContainerClassName}
draggable={false} draggable={false}
@@ -56,6 +56,7 @@ interface VirtualizedGridListProps {
dataVersion?: number; dataVersion?: number;
enableDrag?: boolean; enableDrag?: boolean;
enableExpansion: boolean; enableExpansion: boolean;
enableMultiSelect: boolean;
enableSelection: boolean; enableSelection: boolean;
gap: 'lg' | 'md' | 'sm' | 'xl' | 'xs'; gap: 'lg' | 'md' | 'sm' | 'xl' | 'xs';
getItem?: (index: number) => ItemCardProps['data']; getItem?: (index: number) => ItemCardProps['data'];
@@ -86,6 +87,7 @@ const VirtualizedGridList = React.memo(
dataVersion, dataVersion,
enableDrag, enableDrag,
enableExpansion, enableExpansion,
enableMultiSelect,
enableSelection, enableSelection,
gap, gap,
getItem, getItem,
@@ -116,6 +118,7 @@ const VirtualizedGridList = React.memo(
dataVersion, dataVersion,
enableDrag, enableDrag,
enableExpansion, enableExpansion,
enableMultiSelect,
enableSelection, enableSelection,
gap, gap,
getItem, getItem,
@@ -135,6 +138,7 @@ const VirtualizedGridList = React.memo(
dataVersion, dataVersion,
enableDrag, enableDrag,
enableExpansion, enableExpansion,
enableMultiSelect,
enableSelection, enableSelection,
gap, gap,
internalState, internalState,
@@ -313,6 +317,7 @@ export interface GridItemProps {
dataVersion?: number; dataVersion?: number;
enableDrag?: boolean; enableDrag?: boolean;
enableExpansion?: boolean; enableExpansion?: boolean;
enableMultiSelect: boolean;
enableSelection?: boolean; enableSelection?: boolean;
gap: 'lg' | 'md' | 'sm' | 'xl' | 'xs'; gap: 'lg' | 'md' | 'sm' | 'xl' | 'xs';
getItem?: (index: number) => ItemCardProps['data']; getItem?: (index: number) => ItemCardProps['data'];
@@ -335,6 +340,7 @@ export interface ItemGridListProps {
enableDrag?: boolean; enableDrag?: boolean;
enableEntranceAnimation?: boolean; enableEntranceAnimation?: boolean;
enableExpansion?: boolean; enableExpansion?: boolean;
enableMultiSelect?: boolean;
enableSelection?: boolean; enableSelection?: boolean;
enableSelectionDialog?: boolean; enableSelectionDialog?: boolean;
gap?: 'lg' | 'md' | 'sm' | 'xl' | 'xs'; gap?: 'lg' | 'md' | 'sm' | 'xl' | 'xs';
@@ -364,6 +370,7 @@ const BaseItemGridList = ({
enableDrag = true, enableDrag = true,
enableEntranceAnimation = true, enableEntranceAnimation = true,
enableExpansion = false, enableExpansion = false,
enableMultiSelect = false,
enableSelection = true, enableSelection = true,
gap = 'sm', gap = 'sm',
getItem, getItem,
@@ -798,6 +805,7 @@ const BaseItemGridList = ({
dataVersion={dataVersion} dataVersion={dataVersion}
enableDrag={enableDrag} enableDrag={enableDrag}
enableExpansion={enableExpansion} enableExpansion={enableExpansion}
enableMultiSelect={enableMultiSelect}
enableSelection={enableSelection} enableSelection={enableSelection}
gap={gap} gap={gap}
getItem={resolvedGetItem} getItem={resolvedGetItem}
@@ -828,8 +836,18 @@ const BaseItemGridList = ({
const ListComponent = memo((props: ListChildComponentProps<GridItemProps>) => { const ListComponent = memo((props: ListChildComponentProps<GridItemProps>) => {
const { index, style } = props; const { index, style } = props;
const { columns, controls, enableDrag, gap, getItem, itemCount, itemType, rows, size } = const {
props.data; columns,
controls,
enableDrag,
enableMultiSelect,
gap,
getItem,
itemCount,
itemType,
rows,
size,
} = props.data;
const items: ReactNode[] = []; const items: ReactNode[] = [];
const startIndex = index * columns; const startIndex = index * columns;
@@ -857,6 +875,7 @@ const ListComponent = memo((props: ListChildComponentProps<GridItemProps>) => {
data={item} data={item}
enableDrag={enableDrag} enableDrag={enableDrag}
enableExpansion={props.data.enableExpansion} enableExpansion={props.data.enableExpansion}
imageAsLink={!enableMultiSelect}
internalState={props.data.internalState} internalState={props.data.internalState}
itemType={itemType} itemType={itemType}
rows={rows} rows={rows}
@@ -7,6 +7,7 @@ import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpe
import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list'; import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { albumQueries } from '/@/renderer/features/albums/api/album-api'; import { albumQueries } from '/@/renderer/features/albums/api/album-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
AlbumListQuery, AlbumListQuery,
AlbumListSort, AlbumListSort,
@@ -52,12 +53,14 @@ export const AlbumListInfiniteGrid = ({
}); });
const rows = useGridRows(LibraryItem.ALBUM, ItemListKey.ALBUM, size); const rows = useGridRows(LibraryItem.ALBUM, ItemListKey.ALBUM, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemGridList <ItemGridList
data={loadedItems} data={loadedItems}
dataVersion={dataVersion} dataVersion={dataVersion}
enableExpansion enableExpansion
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
getItem={getItem} getItem={getItem}
getItemIndex={getItemIndex} getItemIndex={getItemIndex}
@@ -9,6 +9,7 @@ import { ItemListWithPagination } from '/@/renderer/components/item-list/item-li
import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination'; import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { albumQueries } from '/@/renderer/features/albums/api/album-api'; import { albumQueries } from '/@/renderer/features/albums/api/album-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
AlbumListQuery, AlbumListQuery,
AlbumListSort, AlbumListSort,
@@ -56,6 +57,7 @@ export const AlbumListPaginatedGrid = ({
}); });
const rows = useGridRows(LibraryItem.ALBUM, ItemListKey.ALBUM, size); const rows = useGridRows(LibraryItem.ALBUM, ItemListKey.ALBUM, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemListWithPagination <ItemListWithPagination
@@ -69,6 +71,7 @@ export const AlbumListPaginatedGrid = ({
currentPage={currentPage} currentPage={currentPage}
data={data || []} data={data || []}
enableExpansion enableExpansion
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
initialTop={{ initialTop={{
to: scrollOffset ?? 0, to: scrollOffset ?? 0,
@@ -7,6 +7,7 @@ import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpe
import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list'; import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { artistsQueries } from '/@/renderer/features/artists/api/artists-api'; import { artistsQueries } from '/@/renderer/features/artists/api/artists-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
AlbumArtistListQuery, AlbumArtistListQuery,
AlbumArtistListSort, AlbumArtistListSort,
@@ -53,11 +54,13 @@ export const AlbumArtistListInfiniteGrid = ({
}); });
const rows = useGridRows(LibraryItem.ALBUM_ARTIST, ItemListKey.ALBUM_ARTIST, size); const rows = useGridRows(LibraryItem.ALBUM_ARTIST, ItemListKey.ALBUM_ARTIST, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemGridList <ItemGridList
data={loadedItems} data={loadedItems}
dataVersion={dataVersion} dataVersion={dataVersion}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
getItem={getItem} getItem={getItem}
getItemIndex={getItemIndex} getItemIndex={getItemIndex}
@@ -9,6 +9,7 @@ import { ItemListWithPagination } from '/@/renderer/components/item-list/item-li
import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination'; import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { artistsQueries } from '/@/renderer/features/artists/api/artists-api'; import { artistsQueries } from '/@/renderer/features/artists/api/artists-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
AlbumArtistListQuery, AlbumArtistListQuery,
AlbumArtistListSort, AlbumArtistListSort,
@@ -57,6 +58,7 @@ export const AlbumArtistListPaginatedGrid = ({
}); });
const rows = useGridRows(LibraryItem.ALBUM_ARTIST, ItemListKey.ALBUM_ARTIST, size); const rows = useGridRows(LibraryItem.ALBUM_ARTIST, ItemListKey.ALBUM_ARTIST, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemListWithPagination <ItemListWithPagination
@@ -69,6 +71,7 @@ export const AlbumArtistListPaginatedGrid = ({
<ItemGridList <ItemGridList
currentPage={currentPage} currentPage={currentPage}
data={data || []} data={data || []}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
initialTop={{ initialTop={{
to: scrollOffset ?? 0, to: scrollOffset ?? 0,
@@ -7,6 +7,7 @@ import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpe
import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list'; import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { artistsQueries } from '/@/renderer/features/artists/api/artists-api'; import { artistsQueries } from '/@/renderer/features/artists/api/artists-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
ArtistListQuery, ArtistListQuery,
ArtistListSort, ArtistListSort,
@@ -52,11 +53,13 @@ export const ArtistListInfiniteGrid = ({
}); });
const rows = useGridRows(LibraryItem.ARTIST, ItemListKey.ARTIST, size); const rows = useGridRows(LibraryItem.ARTIST, ItemListKey.ARTIST, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemGridList <ItemGridList
data={loadedItems} data={loadedItems}
dataVersion={dataVersion} dataVersion={dataVersion}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
getItem={getItem} getItem={getItem}
getItemIndex={getItemIndex} getItemIndex={getItemIndex}
@@ -9,6 +9,7 @@ import { ItemListWithPagination } from '/@/renderer/components/item-list/item-li
import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination'; import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { artistsQueries } from '/@/renderer/features/artists/api/artists-api'; import { artistsQueries } from '/@/renderer/features/artists/api/artists-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
ArtistListQuery, ArtistListQuery,
ArtistListSort, ArtistListSort,
@@ -56,6 +57,7 @@ export const ArtistListPaginatedGrid = ({
}); });
const rows = useGridRows(LibraryItem.ARTIST, ItemListKey.ARTIST, size); const rows = useGridRows(LibraryItem.ARTIST, ItemListKey.ARTIST, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemListWithPagination <ItemListWithPagination
@@ -68,6 +70,7 @@ export const ArtistListPaginatedGrid = ({
<ItemGridList <ItemGridList
currentPage={currentPage} currentPage={currentPage}
data={data || []} data={data || []}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
initialTop={{ initialTop={{
to: scrollOffset ?? 0, to: scrollOffset ?? 0,
@@ -7,6 +7,7 @@ import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpe
import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list'; import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { genresQueries } from '/@/renderer/features/genres/api/genres-api'; import { genresQueries } from '/@/renderer/features/genres/api/genres-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
GenreListQuery, GenreListQuery,
GenreListSort, GenreListSort,
@@ -52,11 +53,13 @@ export const GenreListInfiniteGrid = ({
}); });
const rows = useGridRows(LibraryItem.GENRE, ItemListKey.GENRE, size); const rows = useGridRows(LibraryItem.GENRE, ItemListKey.GENRE, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemGridList <ItemGridList
data={loadedItems} data={loadedItems}
dataVersion={dataVersion} dataVersion={dataVersion}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
getItem={getItem} getItem={getItem}
getItemIndex={getItemIndex} getItemIndex={getItemIndex}
@@ -9,6 +9,7 @@ import { ItemListWithPagination } from '/@/renderer/components/item-list/item-li
import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination'; import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { genresQueries } from '/@/renderer/features/genres/api/genres-api'; import { genresQueries } from '/@/renderer/features/genres/api/genres-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
GenreListQuery, GenreListQuery,
GenreListSort, GenreListSort,
@@ -56,6 +57,7 @@ export const GenreListPaginatedGrid = ({
}); });
const rows = useGridRows(LibraryItem.GENRE, ItemListKey.GENRE, size); const rows = useGridRows(LibraryItem.GENRE, ItemListKey.GENRE, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemListWithPagination <ItemListWithPagination
@@ -68,6 +70,7 @@ export const GenreListPaginatedGrid = ({
<ItemGridList <ItemGridList
currentPage={currentPage} currentPage={currentPage}
data={data || []} data={data || []}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
initialTop={{ initialTop={{
to: scrollOffset ?? 0, to: scrollOffset ?? 0,
@@ -9,7 +9,7 @@ import { useListContext } from '/@/renderer/context/list-context';
import { usePlaylistSongListFilters } from '/@/renderer/features/playlists/hooks/use-playlist-song-list-filters'; import { usePlaylistSongListFilters } from '/@/renderer/features/playlists/hooks/use-playlist-song-list-filters';
import { useSearchTermFilter } from '/@/renderer/features/shared/hooks/use-search-term-filter'; import { useSearchTermFilter } from '/@/renderer/features/shared/hooks/use-search-term-filter';
import { searchLibraryItems } from '/@/renderer/features/shared/utils'; import { searchLibraryItems } from '/@/renderer/features/shared/utils';
import { useListSettings } from '/@/renderer/store'; import { useGeneralSettings, useListSettings } from '/@/renderer/store';
import { sortSongList } from '/@/shared/api/utils'; import { sortSongList } from '/@/shared/api/utils';
import { import {
LibraryItem, LibraryItem,
@@ -56,10 +56,12 @@ export const PlaylistDetailSongListGrid = forwardRef<any, PlaylistDetailSongList
ItemListKey.PLAYLIST_SONG, ItemListKey.PLAYLIST_SONG,
gridProps.size, gridProps.size,
); );
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemGridList <ItemGridList
data={songData} data={songData}
enableMultiSelect={enableGridMultiSelect}
gap={gridProps.itemGap} gap={gridProps.itemGap}
initialTop={{ initialTop={{
to: scrollOffset ?? 0, to: scrollOffset ?? 0,
@@ -7,6 +7,7 @@ import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpe
import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list'; import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { playlistsQueries } from '/@/renderer/features/playlists/api/playlists-api'; import { playlistsQueries } from '/@/renderer/features/playlists/api/playlists-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
LibraryItem, LibraryItem,
PlaylistListQuery, PlaylistListQuery,
@@ -52,11 +53,13 @@ export const PlaylistListInfiniteGrid = ({
}); });
const rows = useGridRows(LibraryItem.PLAYLIST, ItemListKey.PLAYLIST, size); const rows = useGridRows(LibraryItem.PLAYLIST, ItemListKey.PLAYLIST, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemGridList <ItemGridList
data={loadedItems} data={loadedItems}
dataVersion={dataVersion} dataVersion={dataVersion}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
getItem={getItem} getItem={getItem}
getItemIndex={getItemIndex} getItemIndex={getItemIndex}
@@ -9,6 +9,7 @@ import { ItemListWithPagination } from '/@/renderer/components/item-list/item-li
import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination'; import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { playlistsQueries } from '/@/renderer/features/playlists/api/playlists-api'; import { playlistsQueries } from '/@/renderer/features/playlists/api/playlists-api';
import { useGeneralSettings } from '/@/renderer/store';
import { import {
LibraryItem, LibraryItem,
PlaylistListQuery, PlaylistListQuery,
@@ -56,6 +57,7 @@ export const PlaylistListPaginatedGrid = ({
}); });
const rows = useGridRows(LibraryItem.PLAYLIST, ItemListKey.PLAYLIST, size); const rows = useGridRows(LibraryItem.PLAYLIST, ItemListKey.PLAYLIST, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemListWithPagination <ItemListWithPagination
@@ -68,6 +70,7 @@ export const PlaylistListPaginatedGrid = ({
<ItemGridList <ItemGridList
currentPage={currentPage} currentPage={currentPage}
data={data || []} data={data || []}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
initialTop={{ initialTop={{
to: scrollOffset ?? 0, to: scrollOffset ?? 0,
@@ -621,6 +621,28 @@ export const ApplicationSettings = memo(() => {
isHidden: false, isHidden: false,
title: t('setting.showRatings', { postProcess: 'sentenceCase' }), title: t('setting.showRatings', { postProcess: 'sentenceCase' }),
}, },
{
control: (
<Switch
aria-label={t('setting.enableGridMultiSelect', { postProcess: 'sentenceCase' })}
defaultChecked={settings.enableGridMultiSelect}
onChange={(e) =>
setSettings({
general: {
...settings,
enableGridMultiSelect: e.currentTarget.checked,
},
})
}
/>
),
description: t('setting.enableGridMultiSelect', {
context: 'description',
postProcess: 'sentenceCase',
}),
isHidden: false,
title: t('setting.enableGridMultiSelect', { postProcess: 'sentenceCase' }),
},
{ {
control: ( control: (
<Switch <Switch
@@ -7,6 +7,7 @@ import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpe
import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list'; import { ItemGridList } from '/@/renderer/components/item-list/item-grid-list/item-grid-list';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { songsQueries } from '/@/renderer/features/songs/api/songs-api'; import { songsQueries } from '/@/renderer/features/songs/api/songs-api';
import { useGeneralSettings } from '/@/renderer/store';
import { LibraryItem, SongListQuery, SongListSort, SortOrder } from '/@/shared/types/domain-types'; import { LibraryItem, SongListQuery, SongListSort, SortOrder } from '/@/shared/types/domain-types';
import { ItemListKey } from '/@/shared/types/types'; import { ItemListKey } from '/@/shared/types/types';
@@ -47,11 +48,13 @@ export const SongListInfiniteGrid = ({
}); });
const rows = useGridRows(LibraryItem.SONG, ItemListKey.SONG, size); const rows = useGridRows(LibraryItem.SONG, ItemListKey.SONG, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemGridList <ItemGridList
data={loadedItems} data={loadedItems}
dataVersion={dataVersion} dataVersion={dataVersion}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
getItem={getItem} getItem={getItem}
getItemIndex={getItemIndex} getItemIndex={getItemIndex}
@@ -8,6 +8,7 @@ import { ItemListWithPagination } from '/@/renderer/components/item-list/item-li
import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination'; import { useItemListPagination } from '/@/renderer/components/item-list/item-list-pagination/use-item-list-pagination';
import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types'; import { ItemListGridComponentProps } from '/@/renderer/components/item-list/types';
import { songsQueries } from '/@/renderer/features/songs/api/songs-api'; import { songsQueries } from '/@/renderer/features/songs/api/songs-api';
import { useGeneralSettings } from '/@/renderer/store';
import { LibraryItem, SongListQuery, SongListSort, SortOrder } from '/@/shared/types/domain-types'; import { LibraryItem, SongListQuery, SongListSort, SortOrder } from '/@/shared/types/domain-types';
import { ItemListKey } from '/@/shared/types/types'; import { ItemListKey } from '/@/shared/types/types';
@@ -45,6 +46,7 @@ export const SongListPaginatedGrid = ({
}); });
const rows = useGridRows(LibraryItem.SONG, ItemListKey.SONG, size); const rows = useGridRows(LibraryItem.SONG, ItemListKey.SONG, size);
const { enableGridMultiSelect } = useGeneralSettings();
return ( return (
<ItemListWithPagination <ItemListWithPagination
@@ -57,6 +59,7 @@ export const SongListPaginatedGrid = ({
<ItemGridList <ItemGridList
currentPage={currentPage} currentPage={currentPage}
data={data || []} data={data || []}
enableMultiSelect={enableGridMultiSelect}
gap={gap} gap={gap}
itemsPerRow={itemsPerRow} itemsPerRow={itemsPerRow}
itemType={LibraryItem.SONG} itemType={LibraryItem.SONG}
+2
View File
@@ -409,6 +409,7 @@ export const GeneralSettingsSchema = z.object({
buttonSize: z.number(), buttonSize: z.number(),
combinedLyricsAndVisualizer: z.boolean(), combinedLyricsAndVisualizer: z.boolean(),
disabledContextMenu: z.record(z.string(), z.boolean()), disabledContextMenu: z.record(z.string(), z.boolean()),
enableGridMultiSelect: z.boolean(),
externalLinks: z.boolean(), externalLinks: z.boolean(),
followCurrentSong: z.boolean(), followCurrentSong: z.boolean(),
followSystemTheme: z.boolean(), followSystemTheme: z.boolean(),
@@ -965,6 +966,7 @@ const initialState: SettingsState = {
buttonSize: 15, buttonSize: 15,
combinedLyricsAndVisualizer: false, combinedLyricsAndVisualizer: false,
disabledContextMenu: {}, disabledContextMenu: {},
enableGridMultiSelect: false,
externalLinks: true, externalLinks: true,
followCurrentSong: true, followCurrentSong: true,
followSystemTheme: false, followSystemTheme: false,