mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-06 20:10:12 +02:00
add configuration to revert to single-select ItemGrid behavior
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user