import { Button, ButtonGroup, Flex, Icon, IconButton, Kbd, ListItem, Tooltip, UnorderedList, } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { selectComparisonFit, selectComparisonMode } from 'features/gallery/store/gallerySelectors'; import { comparedImagesSwapped, comparisonFitChanged, comparisonModeChanged, comparisonModeCycled, imageToCompareChanged, } from 'features/gallery/store/gallerySlice'; import { useRegisteredHotkeys } from 'features/system/components/HotkeysModal/useHotkeyData'; import { memo, useCallback } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { Trans, useTranslation } from 'react-i18next'; import { PiArrowsLeftRightBold, PiArrowsOutBold, PiQuestion } from 'react-icons/pi'; export const CompareToolbar = memo(() => { const { t } = useTranslation(); const dispatch = useAppDispatch(); const comparisonMode = useAppSelector(selectComparisonMode); const comparisonFit = useAppSelector(selectComparisonFit); const setComparisonModeSlider = useCallback(() => { dispatch(comparisonModeChanged('slider')); }, [dispatch]); const setComparisonModeSideBySide = useCallback(() => { dispatch(comparisonModeChanged('side-by-side')); }, [dispatch]); const setComparisonModeHover = useCallback(() => { dispatch(comparisonModeChanged('hover')); }, [dispatch]); const swapImages = useCallback(() => { dispatch(comparedImagesSwapped()); }, [dispatch]); useRegisteredHotkeys({ id: 'swapImages', category: 'viewer', callback: swapImages, dependencies: [swapImages], }); const toggleComparisonFit = useCallback(() => { dispatch(comparisonFitChanged(comparisonFit === 'contain' ? 'fill' : 'contain')); }, [dispatch, comparisonFit]); const exitCompare = useCallback(() => { dispatch(imageToCompareChanged(null)); }, [dispatch]); useHotkeys('esc', exitCompare, [exitCompare]); const nextMode = useCallback(() => { dispatch(comparisonModeCycled()); }, [dispatch]); useRegisteredHotkeys({ id: 'nextComparisonMode', category: 'viewer', callback: nextMode, dependencies: [nextMode] }); return ( } aria-label={`${t('gallery.swapImages')} (C)`} tooltip={`${t('gallery.swapImages')} (C)`} onClick={swapImages} variant="link" alignSelf="stretch" /> {comparisonMode !== 'side-by-side' && ( } /> )} }> ); }); CompareToolbar.displayName = 'CompareToolbar'; const CompareHelp = () => { return ( }}> }}> }}> }}> ); };