mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
Merge branch 'main' into lstein/feat/simple-mm2-api
This commit is contained in:
commit
f1e79d5a8f
@ -8,7 +8,7 @@
|
|||||||
<meta http-equiv="Pragma" content="no-cache">
|
<meta http-equiv="Pragma" content="no-cache">
|
||||||
<meta http-equiv="Expires" content="0">
|
<meta http-equiv="Expires" content="0">
|
||||||
<title>Invoke - Community Edition</title>
|
<title>Invoke - Community Edition</title>
|
||||||
<link rel="icon" type="icon" href="assets/images/invoke-favicon.svg" />
|
<link id="invoke-favicon" rel="icon" type="icon" href="assets/images/invoke-favicon.svg" />
|
||||||
<style>
|
<style>
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
@ -23,4 +23,4 @@
|
|||||||
<script type="module" src="/src/main.tsx"></script>
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import type { KnipConfig } from 'knip';
|
import type { KnipConfig } from 'knip';
|
||||||
|
|
||||||
const config: KnipConfig = {
|
const config: KnipConfig = {
|
||||||
|
project: ['src/**/*.{ts,tsx}!'],
|
||||||
ignore: [
|
ignore: [
|
||||||
// This file is only used during debugging
|
// This file is only used during debugging
|
||||||
'src/app/store/middleware/debugLoggerMiddleware.ts',
|
'src/app/store/middleware/debugLoggerMiddleware.ts',
|
||||||
@ -10,6 +11,9 @@ const config: KnipConfig = {
|
|||||||
'src/features/nodes/types/v2/**',
|
'src/features/nodes/types/v2/**',
|
||||||
],
|
],
|
||||||
ignoreBinaries: ['only-allow'],
|
ignoreBinaries: ['only-allow'],
|
||||||
|
paths: {
|
||||||
|
'public/*': ['public/*'],
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default config;
|
export default config;
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
"build": "pnpm run lint && vite build",
|
"build": "pnpm run lint && vite build",
|
||||||
"typegen": "node scripts/typegen.js",
|
"typegen": "node scripts/typegen.js",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"lint:knip": "knip --tags=-@knipignore",
|
"lint:knip": "knip",
|
||||||
"lint:dpdm": "dpdm --no-warning --no-tree --transform --exit-code circular:1 src/main.tsx",
|
"lint:dpdm": "dpdm --no-warning --no-tree --transform --exit-code circular:1 src/main.tsx",
|
||||||
"lint:eslint": "eslint --max-warnings=0 .",
|
"lint:eslint": "eslint --max-warnings=0 .",
|
||||||
"lint:prettier": "prettier --check .",
|
"lint:prettier": "prettier --check .",
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect width="16" height="16" rx="2" fill="#E6FD13"/>
|
||||||
|
<path d="M9.61889 5.45H12.5V3.5H3.5V5.45H6.38111L9.61889 10.55H12.5V12.5H3.5V10.55H6.38111" stroke="black"/>
|
||||||
|
<circle cx="12" cy="4" r="3" fill="#f5480c" stroke="#0d1117" stroke-width="1"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 345 B |
@ -326,7 +326,8 @@
|
|||||||
"drop": "Drop",
|
"drop": "Drop",
|
||||||
"dropOrUpload": "$t(gallery.drop) or Upload",
|
"dropOrUpload": "$t(gallery.drop) or Upload",
|
||||||
"dropToUpload": "$t(gallery.drop) to Upload",
|
"dropToUpload": "$t(gallery.drop) to Upload",
|
||||||
"deleteImage": "Delete Image",
|
"deleteImage_one": "Delete Image",
|
||||||
|
"deleteImage_other": "Delete {{count}} Images",
|
||||||
"deleteImageBin": "Deleted images will be sent to your operating system's Bin.",
|
"deleteImageBin": "Deleted images will be sent to your operating system's Bin.",
|
||||||
"deleteImagePermanent": "Deleted images cannot be restored.",
|
"deleteImagePermanent": "Deleted images cannot be restored.",
|
||||||
"download": "Download",
|
"download": "Download",
|
||||||
|
@ -444,7 +444,8 @@
|
|||||||
"hfTokenInvalidErrorMessage2": "Aggiornalo in ",
|
"hfTokenInvalidErrorMessage2": "Aggiornalo in ",
|
||||||
"main": "Principali",
|
"main": "Principali",
|
||||||
"noModelsInstalledDesc1": "Installa i modelli con",
|
"noModelsInstalledDesc1": "Installa i modelli con",
|
||||||
"ipAdapters": "Adattatori IP"
|
"ipAdapters": "Adattatori IP",
|
||||||
|
"noMatchingModels": "Nessun modello corrispondente"
|
||||||
},
|
},
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"images": "Immagini",
|
"images": "Immagini",
|
||||||
@ -526,7 +527,12 @@
|
|||||||
"aspect": "Aspetto",
|
"aspect": "Aspetto",
|
||||||
"setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (potrebbe essere troppo grande)",
|
"setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (potrebbe essere troppo grande)",
|
||||||
"remixImage": "Remixa l'immagine",
|
"remixImage": "Remixa l'immagine",
|
||||||
"coherenceEdgeSize": "Dim. bordo"
|
"coherenceEdgeSize": "Dim. bordo",
|
||||||
|
"infillMosaicTileWidth": "Larghezza piastrella",
|
||||||
|
"infillMosaicMinColor": "Colore minimo",
|
||||||
|
"infillMosaicMaxColor": "Colore massimo",
|
||||||
|
"infillMosaicTileHeight": "Altezza piastrella",
|
||||||
|
"infillColorValue": "Colore di riempimento"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"models": "Modelli",
|
"models": "Modelli",
|
||||||
@ -620,7 +626,8 @@
|
|||||||
"uploadInitialImage": "Carica l'immagine iniziale",
|
"uploadInitialImage": "Carica l'immagine iniziale",
|
||||||
"problemDownloadingImage": "Impossibile scaricare l'immagine",
|
"problemDownloadingImage": "Impossibile scaricare l'immagine",
|
||||||
"prunedQueue": "Coda ripulita",
|
"prunedQueue": "Coda ripulita",
|
||||||
"modelImportCanceled": "Importazione del modello annullata"
|
"modelImportCanceled": "Importazione del modello annullata",
|
||||||
|
"parameters": "Parametri"
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"feature": {
|
"feature": {
|
||||||
@ -689,7 +696,10 @@
|
|||||||
"coherenceModeBoxBlur": "Sfocatura Box",
|
"coherenceModeBoxBlur": "Sfocatura Box",
|
||||||
"coherenceModeStaged": "Maschera espansa",
|
"coherenceModeStaged": "Maschera espansa",
|
||||||
"invertBrushSizeScrollDirection": "Inverti scorrimento per dimensione pennello",
|
"invertBrushSizeScrollDirection": "Inverti scorrimento per dimensione pennello",
|
||||||
"discardCurrent": "Scarta l'attuale"
|
"discardCurrent": "Scarta l'attuale",
|
||||||
|
"initialFitImageSize": "Adatta dimensione immagine al rilascio",
|
||||||
|
"hideBoundingBox": "Nascondi il rettangolo di selezione",
|
||||||
|
"showBoundingBox": "Mostra il rettangolo di selezione"
|
||||||
},
|
},
|
||||||
"accessibility": {
|
"accessibility": {
|
||||||
"invokeProgressBar": "Barra di avanzamento generazione",
|
"invokeProgressBar": "Barra di avanzamento generazione",
|
||||||
@ -832,7 +842,8 @@
|
|||||||
"editMode": "Modifica nell'editor del flusso di lavoro",
|
"editMode": "Modifica nell'editor del flusso di lavoro",
|
||||||
"resetToDefaultValue": "Ripristina il valore predefinito",
|
"resetToDefaultValue": "Ripristina il valore predefinito",
|
||||||
"noFieldsViewMode": "Questo flusso di lavoro non ha campi selezionati da visualizzare. Visualizza il flusso di lavoro completo per configurare i valori.",
|
"noFieldsViewMode": "Questo flusso di lavoro non ha campi selezionati da visualizzare. Visualizza il flusso di lavoro completo per configurare i valori.",
|
||||||
"edit": "Modifica"
|
"edit": "Modifica",
|
||||||
|
"graph": "Grafico"
|
||||||
},
|
},
|
||||||
"boards": {
|
"boards": {
|
||||||
"autoAddBoard": "Aggiungi automaticamente bacheca",
|
"autoAddBoard": "Aggiungi automaticamente bacheca",
|
||||||
@ -1346,13 +1357,13 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"seamlessTilingXAxis": {
|
"seamlessTilingXAxis": {
|
||||||
"heading": "Asse X di piastrellatura senza cuciture",
|
"heading": "Piastrella senza giunte sull'asse X",
|
||||||
"paragraphs": [
|
"paragraphs": [
|
||||||
"Affianca senza soluzione di continuità un'immagine lungo l'asse orizzontale."
|
"Affianca senza soluzione di continuità un'immagine lungo l'asse orizzontale."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"seamlessTilingYAxis": {
|
"seamlessTilingYAxis": {
|
||||||
"heading": "Asse Y di piastrellatura senza cuciture",
|
"heading": "Piastrella senza giunte sull'asse Y",
|
||||||
"paragraphs": [
|
"paragraphs": [
|
||||||
"Affianca senza soluzione di continuità un'immagine lungo l'asse verticale."
|
"Affianca senza soluzione di continuità un'immagine lungo l'asse verticale."
|
||||||
]
|
]
|
||||||
@ -1476,7 +1487,11 @@
|
|||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
"updated": "Aggiornato",
|
"updated": "Aggiornato",
|
||||||
"projectWorkflows": "Flussi di lavoro del progetto",
|
"projectWorkflows": "Flussi di lavoro del progetto",
|
||||||
"opened": "Aperto"
|
"opened": "Aperto",
|
||||||
|
"convertGraph": "Converti grafico",
|
||||||
|
"loadWorkflow": "$t(common.load) Flusso di lavoro",
|
||||||
|
"autoLayout": "Disposizione automatica",
|
||||||
|
"loadFromGraph": "Carica il flusso di lavoro dal grafico"
|
||||||
},
|
},
|
||||||
"app": {
|
"app": {
|
||||||
"storeNotInitialized": "Il negozio non è inizializzato"
|
"storeNotInitialized": "Il negozio non è inizializzato"
|
||||||
|
@ -448,7 +448,9 @@
|
|||||||
"loraModels": "LoRAs",
|
"loraModels": "LoRAs",
|
||||||
"main": "Основные",
|
"main": "Основные",
|
||||||
"noModelsInstalled": "Нет установленных моделей",
|
"noModelsInstalled": "Нет установленных моделей",
|
||||||
"noModelsInstalledDesc1": "Установите модели с помощью"
|
"noModelsInstalledDesc1": "Установите модели с помощью",
|
||||||
|
"noMatchingModels": "Нет подходящих моделей",
|
||||||
|
"ipAdapters": "IP адаптеры"
|
||||||
},
|
},
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"images": "Изображения",
|
"images": "Изображения",
|
||||||
@ -532,7 +534,12 @@
|
|||||||
"lockAspectRatio": "Заблокировать соотношение",
|
"lockAspectRatio": "Заблокировать соотношение",
|
||||||
"remixImage": "Ремикс изображения",
|
"remixImage": "Ремикс изображения",
|
||||||
"coherenceMinDenoise": "Мин. шумоподавление",
|
"coherenceMinDenoise": "Мин. шумоподавление",
|
||||||
"coherenceEdgeSize": "Размер края"
|
"coherenceEdgeSize": "Размер края",
|
||||||
|
"infillMosaicTileWidth": "Ширина плиток",
|
||||||
|
"infillMosaicTileHeight": "Высота плиток",
|
||||||
|
"infillMosaicMinColor": "Мин цвет",
|
||||||
|
"infillMosaicMaxColor": "Макс цвет",
|
||||||
|
"infillColorValue": "Цвет заливки"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"models": "Модели",
|
"models": "Модели",
|
||||||
@ -626,7 +633,8 @@
|
|||||||
"uploadInitialImage": "Загрузить начальное изображение",
|
"uploadInitialImage": "Загрузить начальное изображение",
|
||||||
"resetInitialImage": "Сбросить начальное изображение",
|
"resetInitialImage": "Сбросить начальное изображение",
|
||||||
"prunedQueue": "Урезанная очередь",
|
"prunedQueue": "Урезанная очередь",
|
||||||
"modelImportCanceled": "Импорт модели отменен"
|
"modelImportCanceled": "Импорт модели отменен",
|
||||||
|
"parameters": "Параметры"
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"feature": {
|
"feature": {
|
||||||
@ -695,7 +703,8 @@
|
|||||||
"coherenceModeGaussianBlur": "Размытие по Гауссу",
|
"coherenceModeGaussianBlur": "Размытие по Гауссу",
|
||||||
"coherenceModeBoxBlur": "коробчатое размытие",
|
"coherenceModeBoxBlur": "коробчатое размытие",
|
||||||
"discardCurrent": "Отбросить текущее",
|
"discardCurrent": "Отбросить текущее",
|
||||||
"invertBrushSizeScrollDirection": "Инвертировать прокрутку для размера кисти"
|
"invertBrushSizeScrollDirection": "Инвертировать прокрутку для размера кисти",
|
||||||
|
"initialFitImageSize": "Подогнать размер изображения при перебросе"
|
||||||
},
|
},
|
||||||
"accessibility": {
|
"accessibility": {
|
||||||
"uploadImage": "Загрузить изображение",
|
"uploadImage": "Загрузить изображение",
|
||||||
@ -921,7 +930,8 @@
|
|||||||
"modelSize": "Размер модели",
|
"modelSize": "Размер модели",
|
||||||
"small": "Маленький",
|
"small": "Маленький",
|
||||||
"body": "Тело",
|
"body": "Тело",
|
||||||
"hands": "Руки"
|
"hands": "Руки",
|
||||||
|
"selectCLIPVisionModel": "Выбрать модель CLIP Vision"
|
||||||
},
|
},
|
||||||
"boards": {
|
"boards": {
|
||||||
"autoAddBoard": "Авто добавление Доски",
|
"autoAddBoard": "Авто добавление Доски",
|
||||||
|
@ -65,7 +65,12 @@
|
|||||||
"nextPage": "下一页",
|
"nextPage": "下一页",
|
||||||
"saveAs": "保存为",
|
"saveAs": "保存为",
|
||||||
"ai": "ai",
|
"ai": "ai",
|
||||||
"or": "或"
|
"or": "或",
|
||||||
|
"aboutDesc": "使用 Invoke 工作?查看:",
|
||||||
|
"add": "添加",
|
||||||
|
"loglevel": "日志级别",
|
||||||
|
"copy": "复制",
|
||||||
|
"localSystem": "本地系统"
|
||||||
},
|
},
|
||||||
"gallery": {
|
"gallery": {
|
||||||
"galleryImageSize": "预览大小",
|
"galleryImageSize": "预览大小",
|
||||||
@ -599,7 +604,8 @@
|
|||||||
"loadMore": "加载更多",
|
"loadMore": "加载更多",
|
||||||
"mode": "模式",
|
"mode": "模式",
|
||||||
"resetUI": "$t(accessibility.reset) UI",
|
"resetUI": "$t(accessibility.reset) UI",
|
||||||
"createIssue": "创建问题"
|
"createIssue": "创建问题",
|
||||||
|
"about": "关于"
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"feature": {
|
"feature": {
|
||||||
@ -1201,7 +1207,16 @@
|
|||||||
"workflows": "工作流",
|
"workflows": "工作流",
|
||||||
"noDescription": "无描述",
|
"noDescription": "无描述",
|
||||||
"uploadWorkflow": "从文件中加载",
|
"uploadWorkflow": "从文件中加载",
|
||||||
"newWorkflowCreated": "已创建新的工作流"
|
"newWorkflowCreated": "已创建新的工作流",
|
||||||
|
"name": "名称",
|
||||||
|
"defaultWorkflows": "默认工作流",
|
||||||
|
"created": "已创建",
|
||||||
|
"ascending": "升序",
|
||||||
|
"descending": "降序",
|
||||||
|
"updated": "已更新",
|
||||||
|
"userWorkflows": "我的工作流",
|
||||||
|
"projectWorkflows": "项目工作流",
|
||||||
|
"opened": "已打开"
|
||||||
},
|
},
|
||||||
"app": {
|
"app": {
|
||||||
"storeNotInitialized": "商店尚未初始化"
|
"storeNotInitialized": "商店尚未初始化"
|
||||||
@ -1219,7 +1234,8 @@
|
|||||||
"title": "生成"
|
"title": "生成"
|
||||||
},
|
},
|
||||||
"advanced": {
|
"advanced": {
|
||||||
"title": "高级"
|
"title": "高级",
|
||||||
|
"options": "$t(accordions.advanced.title) 选项"
|
||||||
},
|
},
|
||||||
"image": {
|
"image": {
|
||||||
"title": "图像"
|
"title": "图像"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { Box, useGlobalModifiersInit } from '@invoke-ai/ui-library';
|
import { Box, useGlobalModifiersInit } from '@invoke-ai/ui-library';
|
||||||
import { useSocketIO } from 'app/hooks/useSocketIO';
|
import { useSocketIO } from 'app/hooks/useSocketIO';
|
||||||
|
import { useSyncQueueStatus } from 'app/hooks/useSyncQueueStatus';
|
||||||
import { useLogger } from 'app/logging/useLogger';
|
import { useLogger } from 'app/logging/useLogger';
|
||||||
import { appStarted } from 'app/store/middleware/listenerMiddleware/listeners/appStarted';
|
import { appStarted } from 'app/store/middleware/listenerMiddleware/listeners/appStarted';
|
||||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
@ -70,6 +71,7 @@ const App = ({ config = DEFAULT_CONFIG, selectedImage }: Props) => {
|
|||||||
}, [dispatch]);
|
}, [dispatch]);
|
||||||
|
|
||||||
useStarterModelsToast();
|
useStarterModelsToast();
|
||||||
|
useSyncQueueStatus();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ErrorBoundary onReset={handleReset} FallbackComponent={AppErrorBoundaryFallback}>
|
<ErrorBoundary onReset={handleReset} FallbackComponent={AppErrorBoundaryFallback}>
|
||||||
|
25
invokeai/frontend/web/src/app/hooks/useSyncQueueStatus.ts
Normal file
25
invokeai/frontend/web/src/app/hooks/useSyncQueueStatus.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import { useEffect } from 'react';
|
||||||
|
import { useGetQueueStatusQuery } from 'services/api/endpoints/queue';
|
||||||
|
|
||||||
|
const baseTitle = document.title;
|
||||||
|
const invokeLogoSVG = 'assets/images/invoke-favicon.svg';
|
||||||
|
const invokeAlertLogoSVG = 'assets/images/invoke-alert-favicon.svg';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This hook synchronizes the queue status with the page's title and favicon.
|
||||||
|
* It should be considered a singleton and only used once in the component tree.
|
||||||
|
*/
|
||||||
|
export const useSyncQueueStatus = () => {
|
||||||
|
const { queueSize } = useGetQueueStatusQuery(undefined, {
|
||||||
|
selectFromResult: (res) => ({
|
||||||
|
queueSize: res.data ? res.data.queue.pending + res.data.queue.in_progress : 0,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
useEffect(() => {
|
||||||
|
document.title = queueSize > 0 ? `(${queueSize}) ${baseTitle}` : baseTitle;
|
||||||
|
const faviconEl = document.getElementById('invoke-favicon');
|
||||||
|
if (faviconEl instanceof HTMLLinkElement) {
|
||||||
|
faviconEl.href = queueSize > 0 ? invokeAlertLogoSVG : invokeLogoSVG;
|
||||||
|
}
|
||||||
|
}, [queueSize]);
|
||||||
|
};
|
@ -1,5 +1,4 @@
|
|||||||
import { Flex, Image, Spinner } from '@invoke-ai/ui-library';
|
import { Flex, Image, Spinner } from '@invoke-ai/ui-library';
|
||||||
/** @knipignore */
|
|
||||||
import InvokeLogoWhite from 'public/assets/images/invoke-symbol-wht-lrg.svg';
|
import InvokeLogoWhite from 'public/assets/images/invoke-symbol-wht-lrg.svg';
|
||||||
import { memo } from 'react';
|
import { memo } from 'react';
|
||||||
|
|
||||||
|
@ -13,13 +13,15 @@ export const DeleteImageButton = memo((props: DeleteImageButtonProps) => {
|
|||||||
const { onClick, isDisabled } = props;
|
const { onClick, isDisabled } = props;
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const isConnected = useAppSelector((s) => s.system.isConnected);
|
const isConnected = useAppSelector((s) => s.system.isConnected);
|
||||||
|
const imageSelectionLength: number = useAppSelector((s) => s.gallery.selection.length);
|
||||||
|
const labelMessage: string = `${t('gallery.deleteImage', { count: imageSelectionLength })} (Del)`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<IconButton
|
<IconButton
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
icon={<PiTrashSimpleBold />}
|
icon={<PiTrashSimpleBold />}
|
||||||
tooltip={`${t('gallery.deleteImage')} (Del)`}
|
tooltip={labelMessage}
|
||||||
aria-label={`${t('gallery.deleteImage')} (Del)`}
|
aria-label={labelMessage}
|
||||||
isDisabled={isDisabled || !isConnected}
|
isDisabled={isDisabled || !isConnected}
|
||||||
colorScheme="error"
|
colorScheme="error"
|
||||||
/>
|
/>
|
||||||
|
@ -80,7 +80,7 @@ const DeleteImageModal = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ConfirmationAlertDialog
|
<ConfirmationAlertDialog
|
||||||
title={t('gallery.deleteImage')}
|
title={t('gallery.deleteImage', { count: imagesToDelete.length })}
|
||||||
isOpen={isModalOpen}
|
isOpen={isModalOpen}
|
||||||
onClose={handleClose}
|
onClose={handleClose}
|
||||||
cancelButtonText={t('boards.cancel')}
|
cancelButtonText={t('boards.cancel')}
|
||||||
|
@ -6,7 +6,6 @@ import type { RemoveFromBoardDropData } from 'features/dnd/types';
|
|||||||
import AutoAddIcon from 'features/gallery/components/Boards/AutoAddIcon';
|
import AutoAddIcon from 'features/gallery/components/Boards/AutoAddIcon';
|
||||||
import BoardContextMenu from 'features/gallery/components/Boards/BoardContextMenu';
|
import BoardContextMenu from 'features/gallery/components/Boards/BoardContextMenu';
|
||||||
import { autoAddBoardIdChanged, boardIdSelected } from 'features/gallery/store/gallerySlice';
|
import { autoAddBoardIdChanged, boardIdSelected } from 'features/gallery/store/gallerySlice';
|
||||||
/** @knipignore */
|
|
||||||
import InvokeLogoSVG from 'public/assets/images/invoke-symbol-wht-lrg.svg';
|
import InvokeLogoSVG from 'public/assets/images/invoke-symbol-wht-lrg.svg';
|
||||||
import { memo, useCallback, useMemo, useState } from 'react';
|
import { memo, useCallback, useMemo, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
@ -51,6 +51,7 @@ const CurrentImageButtons = () => {
|
|||||||
const shouldShowImageDetails = useAppSelector((s) => s.ui.shouldShowImageDetails);
|
const shouldShowImageDetails = useAppSelector((s) => s.ui.shouldShowImageDetails);
|
||||||
const shouldShowProgressInViewer = useAppSelector((s) => s.ui.shouldShowProgressInViewer);
|
const shouldShowProgressInViewer = useAppSelector((s) => s.ui.shouldShowProgressInViewer);
|
||||||
const lastSelectedImage = useAppSelector(selectLastSelectedImage);
|
const lastSelectedImage = useAppSelector(selectLastSelectedImage);
|
||||||
|
const selection = useAppSelector((s) => s.gallery.selection);
|
||||||
const shouldDisableToolbarButtons = useAppSelector(selectShouldDisableToolbarButtons);
|
const shouldDisableToolbarButtons = useAppSelector(selectShouldDisableToolbarButtons);
|
||||||
|
|
||||||
const isUpscalingEnabled = useFeatureStatus('upscaling').isFeatureEnabled;
|
const isUpscalingEnabled = useFeatureStatus('upscaling').isFeatureEnabled;
|
||||||
@ -102,8 +103,8 @@ const CurrentImageButtons = () => {
|
|||||||
if (!imageDTO) {
|
if (!imageDTO) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dispatch(imagesToDeleteSelected([imageDTO]));
|
dispatch(imagesToDeleteSelected(selection));
|
||||||
}, [dispatch, imageDTO]);
|
}, [dispatch, imageDTO, selection]);
|
||||||
|
|
||||||
useHotkeys(
|
useHotkeys(
|
||||||
'Shift+U',
|
'Shift+U',
|
||||||
|
@ -188,7 +188,7 @@ const SingleSelectionMenuItems = (props: SingleSelectionMenuItemsProps) => {
|
|||||||
)}
|
)}
|
||||||
<MenuDivider />
|
<MenuDivider />
|
||||||
<MenuItem color="error.300" icon={<PiTrashSimpleBold />} onClickCapture={handleDelete}>
|
<MenuItem color="error.300" icon={<PiTrashSimpleBold />} onClickCapture={handleDelete}>
|
||||||
{t('gallery.deleteImage')}
|
{t('gallery.deleteImage', { count: 1 })}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
@ -180,7 +180,7 @@ const GalleryImage = (props: HoverableImageProps) => {
|
|||||||
<IAIDndImageIcon
|
<IAIDndImageIcon
|
||||||
onClick={handleDelete}
|
onClick={handleDelete}
|
||||||
icon={<PiTrashSimpleFill size="16px" />}
|
icon={<PiTrashSimpleFill size="16px" />}
|
||||||
tooltip={t('gallery.deleteImage')}
|
tooltip={t('gallery.deleteImage', { count: 1 })}
|
||||||
styleOverrides={imageIconStyleOverrides}
|
styleOverrides={imageIconStyleOverrides}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { Button, Flex, Image, Text } from '@invoke-ai/ui-library';
|
import { Button, Flex, Image, Text } from '@invoke-ai/ui-library';
|
||||||
import { useAppDispatch } from 'app/store/storeHooks';
|
import { useAppDispatch } from 'app/store/storeHooks';
|
||||||
import { workflowModeChanged } from 'features/nodes/store/workflowSlice';
|
import { workflowModeChanged } from 'features/nodes/store/workflowSlice';
|
||||||
/** @knipignore */
|
|
||||||
import InvokeLogoSVG from 'public/assets/images/invoke-symbol-wht-lrg.svg';
|
import InvokeLogoSVG from 'public/assets/images/invoke-symbol-wht-lrg.svg';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
@ -29,6 +29,7 @@ const selector = createMemoizedSelector(
|
|||||||
const { shouldRandomizeSeed, model } = generation;
|
const { shouldRandomizeSeed, model } = generation;
|
||||||
const { hrfEnabled } = hrf;
|
const { hrfEnabled } = hrf;
|
||||||
const badges: string[] = [];
|
const badges: string[] = [];
|
||||||
|
const isSDXL = model?.base === 'sdxl';
|
||||||
|
|
||||||
if (activeTabName === 'unifiedCanvas') {
|
if (activeTabName === 'unifiedCanvas') {
|
||||||
const {
|
const {
|
||||||
@ -53,10 +54,10 @@ const selector = createMemoizedSelector(
|
|||||||
badges.push('Manual Seed');
|
badges.push('Manual Seed');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hrfEnabled) {
|
if (hrfEnabled && !isSDXL) {
|
||||||
badges.push('HiRes Fix');
|
badges.push('HiRes Fix');
|
||||||
}
|
}
|
||||||
return { badges, activeTabName, isSDXL: model?.base === 'sdxl' };
|
return { badges, activeTabName, isSDXL };
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@ import {
|
|||||||
import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent';
|
import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent';
|
||||||
import { discordLink, githubLink, websiteLink } from 'features/system/store/constants';
|
import { discordLink, githubLink, websiteLink } from 'features/system/store/constants';
|
||||||
import { map } from 'lodash-es';
|
import { map } from 'lodash-es';
|
||||||
/** @knipignore */
|
|
||||||
import InvokeLogoYellow from 'public/assets/images/invoke-tag-lrg.svg';
|
import InvokeLogoYellow from 'public/assets/images/invoke-tag-lrg.svg';
|
||||||
import type { ReactElement } from 'react';
|
import type { ReactElement } from 'react';
|
||||||
import { cloneElement, memo, useCallback } from 'react';
|
import { cloneElement, memo, useCallback } from 'react';
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
import { Image, Text, Tooltip } from '@invoke-ai/ui-library';
|
import { Image, Text, Tooltip } from '@invoke-ai/ui-library';
|
||||||
import { useStore } from '@nanostores/react';
|
import { useStore } from '@nanostores/react';
|
||||||
import { $logo } from 'app/store/nanostores/logo';
|
import { $logo } from 'app/store/nanostores/logo';
|
||||||
/** @knipignore */
|
|
||||||
import InvokeLogoYellow from 'public/assets/images/invoke-symbol-ylw-lrg.svg';
|
import InvokeLogoYellow from 'public/assets/images/invoke-symbol-ylw-lrg.svg';
|
||||||
import { memo, useMemo, useRef } from 'react';
|
import { memo, useMemo, useRef } from 'react';
|
||||||
import { useGetAppVersionQuery } from 'services/api/endpoints/appInfo';
|
import { useGetAppVersionQuery } from 'services/api/endpoints/appInfo';
|
||||||
|
@ -33,7 +33,7 @@ classifiers = [
|
|||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
# Core generation dependencies, pinned for reproducible builds.
|
# Core generation dependencies, pinned for reproducible builds.
|
||||||
"accelerate==0.28.0",
|
"accelerate==0.29.2",
|
||||||
"clip_anytorch==2.5.2", # replacing "clip @ https://github.com/openai/CLIP/archive/eaa22acb90a5876642d0507623e859909230a52d.zip",
|
"clip_anytorch==2.5.2", # replacing "clip @ https://github.com/openai/CLIP/archive/eaa22acb90a5876642d0507623e859909230a52d.zip",
|
||||||
"compel==2.0.2",
|
"compel==2.0.2",
|
||||||
"controlnet-aux==0.0.7",
|
"controlnet-aux==0.0.7",
|
||||||
@ -47,16 +47,16 @@ dependencies = [
|
|||||||
"pytorch-lightning==2.1.3",
|
"pytorch-lightning==2.1.3",
|
||||||
"safetensors==0.4.2",
|
"safetensors==0.4.2",
|
||||||
"timm==0.6.13", # needed to override timm latest in controlnet_aux, see https://github.com/isl-org/ZoeDepth/issues/26
|
"timm==0.6.13", # needed to override timm latest in controlnet_aux, see https://github.com/isl-org/ZoeDepth/issues/26
|
||||||
"torch==2.2.1",
|
"torch==2.2.2",
|
||||||
"torchmetrics==0.11.4",
|
"torchmetrics==0.11.4",
|
||||||
"torchsde==0.2.6",
|
"torchsde==0.2.6",
|
||||||
"torchvision==0.17.1",
|
"torchvision==0.17.2",
|
||||||
"transformers==4.39.1",
|
"transformers==4.39.3",
|
||||||
|
|
||||||
# Core application dependencies, pinned for reproducible builds.
|
# Core application dependencies, pinned for reproducible builds.
|
||||||
"fastapi-events==0.11.0",
|
"fastapi-events==0.11.0",
|
||||||
"fastapi==0.110.0",
|
"fastapi==0.110.0",
|
||||||
"huggingface-hub==0.21.4",
|
"huggingface-hub==0.22.2",
|
||||||
"pydantic-settings==2.2.1",
|
"pydantic-settings==2.2.1",
|
||||||
"pydantic==2.6.3",
|
"pydantic==2.6.3",
|
||||||
"python-socketio==5.11.1",
|
"python-socketio==5.11.1",
|
||||||
@ -96,7 +96,7 @@ dependencies = [
|
|||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
"xformers" = [
|
"xformers" = [
|
||||||
# Core generation dependencies, pinned for reproducible builds.
|
# Core generation dependencies, pinned for reproducible builds.
|
||||||
"xformers==0.0.25; sys_platform!='darwin'",
|
"xformers==0.0.25post1; sys_platform!='darwin'",
|
||||||
# Auxiliary dependencies, pinned only if necessary.
|
# Auxiliary dependencies, pinned only if necessary.
|
||||||
"triton; sys_platform=='linux'",
|
"triton; sys_platform=='linux'",
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user