mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
up button support in gallery navigation
This commit is contained in:
parent
ee5ec023f4
commit
eba668956d
@ -46,6 +46,7 @@ const CurrentImagePreview = () => {
|
|||||||
handleLoadMoreImages,
|
handleLoadMoreImages,
|
||||||
areMoreImagesAvailable,
|
areMoreImagesAvailable,
|
||||||
isFetching,
|
isFetching,
|
||||||
|
handleTopImage
|
||||||
} = useNextPrevImage();
|
} = useNextPrevImage();
|
||||||
|
|
||||||
useHotkeys(
|
useHotkeys(
|
||||||
@ -76,6 +77,14 @@ const CurrentImagePreview = () => {
|
|||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useHotkeys(
|
||||||
|
'up',
|
||||||
|
() => {
|
||||||
|
handleTopImage();
|
||||||
|
},
|
||||||
|
[handleTopImage]
|
||||||
|
);
|
||||||
|
|
||||||
const { currentData: imageDTO } = useGetImageDTOQuery(imageName ?? skipToken);
|
const { currentData: imageDTO } = useGetImageDTOQuery(imageName ?? skipToken);
|
||||||
|
|
||||||
const draggableData = useMemo<TypesafeDraggableData | undefined>(() => {
|
const draggableData = useMemo<TypesafeDraggableData | undefined>(() => {
|
||||||
|
@ -136,7 +136,7 @@ const GalleryImage = (props: HoverableImageProps) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box w="full" h="full" data-testid={`image-${imageDTO.image_name}`}>
|
<Box w="full" h="full" className='gallerygrid-image' data-testid={`image-${imageDTO.image_name}`}>
|
||||||
<Flex
|
<Flex
|
||||||
ref={imageContainerRef}
|
ref={imageContainerRef}
|
||||||
userSelect="none"
|
userSelect="none"
|
||||||
|
@ -142,7 +142,7 @@ const GalleryImageGrid = () => {
|
|||||||
if (isSuccess && currentData) {
|
if (isSuccess && currentData) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Box ref={rootRef} data-overlayscrollbars="" h="100%">
|
<Box ref={rootRef} data-overlayscrollbars="" h="100%" id='gallery-grid'>
|
||||||
<VirtuosoGrid
|
<VirtuosoGrid
|
||||||
style={virtuosoStyles}
|
style={virtuosoStyles}
|
||||||
data={currentData.ids}
|
data={currentData.ids}
|
||||||
|
@ -46,6 +46,7 @@ export const nextPrevImageButtonsSelector = createMemoizedSelector(
|
|||||||
const lastSelectedImage =
|
const lastSelectedImage =
|
||||||
state.gallery.selection[state.gallery.selection.length - 1];
|
state.gallery.selection[state.gallery.selection.length - 1];
|
||||||
|
|
||||||
|
|
||||||
const isFetching = status === 'pending';
|
const isFetching = status === 'pending';
|
||||||
|
|
||||||
if (!data || !lastSelectedImage || totalsData?.total === 0) {
|
if (!data || !lastSelectedImage || totalsData?.total === 0) {
|
||||||
@ -68,11 +69,20 @@ export const nextPrevImageButtonsSelector = createMemoizedSelector(
|
|||||||
const currentImageIndex = images.findIndex(
|
const currentImageIndex = images.findIndex(
|
||||||
(i) => i.image_name === lastSelectedImage.image_name
|
(i) => i.image_name === lastSelectedImage.image_name
|
||||||
);
|
);
|
||||||
|
const widthOfGalleryImage = Object.values(document.getElementsByClassName("gallerygrid-image"))[0]?.clientWidth
|
||||||
|
const widthOfGalleryGrid = document.getElementById("gallery-grid")?.clientWidth
|
||||||
|
|
||||||
|
|
||||||
|
const imagesPerRow = Math.floor((widthOfGalleryGrid ?? 0) / (widthOfGalleryImage ?? 1))
|
||||||
|
|
||||||
|
|
||||||
const nextImageIndex = clamp(currentImageIndex + 1, 0, images.length - 1);
|
const nextImageIndex = clamp(currentImageIndex + 1, 0, images.length - 1);
|
||||||
const prevImageIndex = clamp(currentImageIndex - 1, 0, images.length - 1);
|
const prevImageIndex = clamp(currentImageIndex - 1, 0, images.length - 1);
|
||||||
|
const topImageIndex = clamp(currentImageIndex - imagesPerRow,0, images.length - 1)
|
||||||
|
|
||||||
const nextImageId = images[nextImageIndex]?.image_name;
|
const nextImageId = images[nextImageIndex]?.image_name;
|
||||||
const prevImageId = images[prevImageIndex]?.image_name;
|
const prevImageId = images[prevImageIndex]?.image_name;
|
||||||
|
const topImageId = images[topImageIndex]?.image_name
|
||||||
|
|
||||||
const nextImage = nextImageId
|
const nextImage = nextImageId
|
||||||
? imagesSelectors.selectById(data, nextImageId)
|
? imagesSelectors.selectById(data, nextImageId)
|
||||||
@ -80,6 +90,9 @@ export const nextPrevImageButtonsSelector = createMemoizedSelector(
|
|||||||
const prevImage = prevImageId
|
const prevImage = prevImageId
|
||||||
? imagesSelectors.selectById(data, prevImageId)
|
? imagesSelectors.selectById(data, prevImageId)
|
||||||
: undefined;
|
: undefined;
|
||||||
|
const topImage = topImageId
|
||||||
|
? selectors.selectById(data, topImageId)
|
||||||
|
: undefined;
|
||||||
|
|
||||||
const imagesLength = images.length;
|
const imagesLength = images.length;
|
||||||
|
|
||||||
@ -93,6 +106,8 @@ export const nextPrevImageButtonsSelector = createMemoizedSelector(
|
|||||||
nextImageIndex,
|
nextImageIndex,
|
||||||
prevImageIndex,
|
prevImageIndex,
|
||||||
queryArgs,
|
queryArgs,
|
||||||
|
topImageIndex,
|
||||||
|
topImage
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -110,6 +125,8 @@ export const useNextPrevImage = () => {
|
|||||||
queryArgs,
|
queryArgs,
|
||||||
loadedImagesCount,
|
loadedImagesCount,
|
||||||
currentImageIndex,
|
currentImageIndex,
|
||||||
|
topImageIndex,
|
||||||
|
topImage
|
||||||
} = useAppSelector(nextPrevImageButtonsSelector);
|
} = useAppSelector(nextPrevImageButtonsSelector);
|
||||||
|
|
||||||
const handlePrevImage = useCallback(() => {
|
const handlePrevImage = useCallback(() => {
|
||||||
@ -152,6 +169,27 @@ export const useNextPrevImage = () => {
|
|||||||
}
|
}
|
||||||
}, [dispatch, nextImage, nextImageIndex]);
|
}, [dispatch, nextImage, nextImageIndex]);
|
||||||
|
|
||||||
|
const handleTopImage = useCallback(() => {
|
||||||
|
topImage && dispatch(imageSelected(topImage));
|
||||||
|
const range = $useNextPrevImageState.get().virtuosoRangeRef?.current;
|
||||||
|
const virtuoso = $useNextPrevImageState.get().virtuosoRef?.current;
|
||||||
|
|
||||||
|
if (!range || !virtuoso) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
topImageIndex !== undefined &&
|
||||||
|
(topImageIndex < range.startIndex || topImageIndex > range.endIndex)
|
||||||
|
) {
|
||||||
|
virtuoso.scrollToIndex({
|
||||||
|
index: topImageIndex,
|
||||||
|
behavior: 'smooth',
|
||||||
|
align: getScrollToIndexAlign(topImageIndex, range),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},[dispatch, topImage, topImageIndex])
|
||||||
|
|
||||||
const [listImages] = useLazyListImagesQuery();
|
const [listImages] = useLazyListImagesQuery();
|
||||||
|
|
||||||
const handleLoadMoreImages = useCallback(() => {
|
const handleLoadMoreImages = useCallback(() => {
|
||||||
@ -170,5 +208,6 @@ export const useNextPrevImage = () => {
|
|||||||
areMoreImagesAvailable,
|
areMoreImagesAvailable,
|
||||||
handleLoadMoreImages,
|
handleLoadMoreImages,
|
||||||
isFetching,
|
isFetching,
|
||||||
|
handleTopImage
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user