From fecb77e3449c0d4d48fbe445cfc4e882d45da97a Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Sun, 30 Apr 2023 23:39:42 +1000 Subject: [PATCH] feat(ui): `dndkit` --> `rnd` for draggable --- invokeai/frontend/web/package.json | 3 +- .../components/ProgressImagePreview.tsx | 243 +++++++++--------- .../features/ui/store/uiPersistDenylist.ts | 2 +- .../web/src/features/ui/store/uiSlice.ts | 23 +- .../web/src/features/ui/store/uiTypes.ts | 16 +- invokeai/frontend/web/yarn.lock | 70 ++--- 6 files changed, 194 insertions(+), 163 deletions(-) diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json index 0d41e06897..d9e4f0af5c 100644 --- a/invokeai/frontend/web/package.json +++ b/invokeai/frontend/web/package.json @@ -61,8 +61,6 @@ "@chakra-ui/styled-system": "^2.9.0", "@chakra-ui/theme-tools": "^2.0.16", "@dagrejs/graphlib": "^2.1.12", - "@dnd-kit/core": "^6.0.8", - "@dnd-kit/modifiers": "^6.0.1", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@fontsource/inter": "^4.5.15", @@ -90,6 +88,7 @@ "react-konva": "^18.2.7", "react-konva-utils": "^1.0.4", "react-redux": "^8.0.5", + "react-rnd": "^10.4.1", "react-transition-group": "^4.4.5", "react-use": "^17.4.0", "react-zoom-pan-pinch": "^3.0.7", diff --git a/invokeai/frontend/web/src/features/parameters/components/ProgressImagePreview.tsx b/invokeai/frontend/web/src/features/parameters/components/ProgressImagePreview.tsx index 085a52c4b0..90106ba81f 100644 --- a/invokeai/frontend/web/src/features/parameters/components/ProgressImagePreview.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/ProgressImagePreview.tsx @@ -1,25 +1,28 @@ -import { Box, Flex, Icon, Image, Text } from '@chakra-ui/react'; -import { useDraggable } from '@dnd-kit/core'; +import { Flex, Icon, Image, Text } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { systemSelector } from 'features/system/store/systemSelectors'; import { memo, useCallback } from 'react'; -import { CSS } from '@dnd-kit/utilities'; -import { FaEye, FaImage, FaStopwatch } from 'react-icons/fa'; +import { FaImage, FaStopwatch } from 'react-icons/fa'; import { uiSelector } from 'features/ui/store/uiSelectors'; -import { Resizable } from 're-resizable'; import IAIIconButton from 'common/components/IAIIconButton'; import { CloseIcon } from '@chakra-ui/icons'; import { useTranslation } from 'react-i18next'; -import { shouldShowProgressImagesToggled } from 'features/ui/store/uiSlice'; +import { + floatingProgressImageMoved, + floatingProgressImageResized, + shouldShowProgressImagesToggled, +} from 'features/ui/store/uiSlice'; +import { Rnd } from 'react-rnd'; +import { Rect } from 'features/ui/store/uiTypes'; const selector = createSelector([systemSelector, uiSelector], (system, ui) => { const { progressImage } = system; - const { floatingProgressImageCoordinates, shouldShowProgressImages } = ui; + const { floatingProgressImageRect, shouldShowProgressImages } = ui; return { progressImage, - coords: floatingProgressImageCoordinates, + floatingProgressImageRect, shouldShowProgressImages, }; }); @@ -27,135 +30,137 @@ const selector = createSelector([systemSelector, uiSelector], (system, ui) => { const ProgressImagePreview = () => { const dispatch = useAppDispatch(); - const { progressImage, coords, shouldShowProgressImages } = + const { progressImage, floatingProgressImageRect, shouldShowProgressImages } = useAppSelector(selector); const { t } = useTranslation(); - const { attributes, listeners, setNodeRef, transform } = useDraggable({ - id: 'progress-image', - }); - const toggleProgressImages = useCallback(() => { dispatch(shouldShowProgressImagesToggled()); }, [dispatch]); - const transformStyles = transform - ? { - transform: CSS.Translate.toString(transform), - } - : {}; - return shouldShowProgressImages ? ( - { + dispatch(floatingProgressImageMoved({ x: d.x, y: d.y })); + }} + onResizeStop={(e, direction, ref, delta, position) => { + const newRect: Partial = {}; + + console.log(ref.style.width, ref.style.height, position.x, position.y); + + if (ref.style.width) { + newRect.width = ref.style.width; + } + if (ref.style.height) { + newRect.height = ref.style.height; + } + if (position.x) { + newRect.x = position.x; + } + if (position.x) { + newRect.y = position.y; + } + + dispatch(floatingProgressImageResized(newRect)); }} > - - + - - + Progress Images + + + } + variant="ghost" + /> + + {progressImage ? ( + + - - - - Progress Images - - - } - variant="ghost" - /> - - {progressImage ? ( - - - - ) : ( - - - - )} - - - - - + /> + + ) : ( + + + + )} + + ) : ( `ui.${denylistItem}` diff --git a/invokeai/frontend/web/src/features/ui/store/uiSlice.ts b/invokeai/frontend/web/src/features/ui/store/uiSlice.ts index 86ce8c2a12..b3395b98c9 100644 --- a/invokeai/frontend/web/src/features/ui/store/uiSlice.ts +++ b/invokeai/frontend/web/src/features/ui/store/uiSlice.ts @@ -2,8 +2,7 @@ import type { PayloadAction } from '@reduxjs/toolkit'; import { createSlice } from '@reduxjs/toolkit'; import { setActiveTabReducer } from './extraReducers'; import { InvokeTabName, tabMap } from './tabMap'; -import { AddNewModelType, UIState } from './uiTypes'; -import { Coordinates } from '@dnd-kit/core/dist/types'; +import { AddNewModelType, Coordinates, Rect, UIState } from './uiTypes'; const initialUIState: UIState = { activeTab: 0, @@ -22,7 +21,7 @@ const initialUIState: UIState = { openLinearAccordionItems: [], openGenerateAccordionItems: [], openUnifiedCanvasAccordionItems: [], - floatingProgressImageCoordinates: { x: 0, y: 0 }, + floatingProgressImageRect: { x: 0, y: 0, width: 0, height: 0 }, shouldShowProgressImages: false, }; @@ -109,10 +108,19 @@ export const uiSlice = createSlice({ } }, floatingProgressImageMoved: (state, action: PayloadAction) => { - const { x, y } = state.floatingProgressImageCoordinates; - const { x: _x, y: _y } = action.payload; - - state.floatingProgressImageCoordinates = { x: x + _x, y: y + _y }; + state.floatingProgressImageRect = { + ...state.floatingProgressImageRect, + ...action.payload, + }; + }, + floatingProgressImageResized: ( + state, + action: PayloadAction> + ) => { + state.floatingProgressImageRect = { + ...state.floatingProgressImageRect, + ...action.payload, + }; }, shouldShowProgressImagesToggled: (state) => { state.shouldShowProgressImages = !state.shouldShowProgressImages; @@ -141,6 +149,7 @@ export const { toggleGalleryPanel, openAccordionItemsChanged, floatingProgressImageMoved, + floatingProgressImageResized, shouldShowProgressImagesToggled, } = uiSlice.actions; diff --git a/invokeai/frontend/web/src/features/ui/store/uiTypes.ts b/invokeai/frontend/web/src/features/ui/store/uiTypes.ts index 3a7c3057c5..a1abc6d097 100644 --- a/invokeai/frontend/web/src/features/ui/store/uiTypes.ts +++ b/invokeai/frontend/web/src/features/ui/store/uiTypes.ts @@ -1,7 +1,17 @@ -import { Coordinates } from '@dnd-kit/core/dist/types'; - export type AddNewModelType = 'ckpt' | 'diffusers' | null; +export type Coordinates = { + x: number; + y: number; +}; + +export type Dimensions = { + width: number | string; + height: number | string; +}; + +export type Rect = Coordinates & Dimensions; + export interface UIState { activeTab: number; currentTheme: string; @@ -19,6 +29,6 @@ export interface UIState { openLinearAccordionItems: number[]; openGenerateAccordionItems: number[]; openUnifiedCanvasAccordionItems: number[]; - floatingProgressImageCoordinates: Coordinates; + floatingProgressImageRect: Rect; shouldShowProgressImages: boolean; } diff --git a/invokeai/frontend/web/yarn.lock b/invokeai/frontend/web/yarn.lock index f7f9af51ef..b60071ab65 100644 --- a/invokeai/frontend/web/yarn.lock +++ b/invokeai/frontend/web/yarn.lock @@ -937,37 +937,6 @@ gonzales-pe "^4.3.0" node-source-walk "^5.0.1" -"@dnd-kit/accessibility@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@dnd-kit/accessibility/-/accessibility-3.0.1.tgz#3ccbefdfca595b0a23a5dc57d3de96bc6935641c" - integrity sha512-HXRrwS9YUYQO9lFRc/49uO/VICbM+O+ZRpFDe9Pd1rwVv2PCNkRiTZRdxrDgng/UkvdC3Re9r2vwPpXXrWeFzg== - dependencies: - tslib "^2.0.0" - -"@dnd-kit/core@^6.0.8": - version "6.0.8" - resolved "https://registry.yarnpkg.com/@dnd-kit/core/-/core-6.0.8.tgz#040ae13fea9787ee078e5f0361f3b49b07f3f005" - integrity sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA== - dependencies: - "@dnd-kit/accessibility" "^3.0.0" - "@dnd-kit/utilities" "^3.2.1" - tslib "^2.0.0" - -"@dnd-kit/modifiers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@dnd-kit/modifiers/-/modifiers-6.0.1.tgz#9e39b25fd6e323659604cc74488fe044d33188c8" - integrity sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A== - dependencies: - "@dnd-kit/utilities" "^3.2.1" - tslib "^2.0.0" - -"@dnd-kit/utilities@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@dnd-kit/utilities/-/utilities-3.2.1.tgz#53f9e2016fd2506ec49e404c289392cfff30332a" - integrity sha512-OOXqISfvBw/1REtkSK2N3Fi2EQiLMlWUlqnOK/UpOISqBZPWpE6TqL+jcPtMOkE8TqYGiURvRdPSI9hltNUjEA== - dependencies: - tslib "^2.0.0" - "@emotion/babel-plugin@^11.10.8": version "11.10.8" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.8.tgz#bae325c902937665d00684038fd5294223ef9e1d" @@ -2615,6 +2584,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + code-block-writer@^12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-12.0.0.tgz#4dd58946eb4234105aff7f0035977b2afdc2a770" @@ -3556,6 +3530,11 @@ fast-loops@^1.1.3: resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== +fast-memoize@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" + integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== + fast-printf@^1.6.9: version "1.6.9" resolved "https://registry.yarnpkg.com/fast-printf/-/fast-printf-1.6.9.tgz#212f56570d2dc8ccdd057ee93d50dd414d07d676" @@ -5424,6 +5403,13 @@ rc@1.2.8, rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +re-resizable@6.9.6: + version "6.9.6" + resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.6.tgz#b95d37e3821481b56ddfb1e12862940a791e827d" + integrity sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ== + dependencies: + fast-memoize "^2.5.1" + re-resizable@^6.9.9: version "6.9.9" resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.9.tgz#99e8b31c67a62115dc9c5394b7e55892265be216" @@ -5449,6 +5435,14 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-draggable@4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.5.tgz#9e37fe7ce1a4cf843030f521a0a4cc41886d7e7c" + integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g== + dependencies: + clsx "^1.1.1" + prop-types "^15.8.1" + react-dropzone@^14.2.3: version "14.2.3" resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-14.2.3.tgz#0acab68308fda2d54d1273a1e626264e13d4e84b" @@ -5565,6 +5559,15 @@ react-remove-scroll@^2.5.5: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-rnd@^10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/react-rnd/-/react-rnd-10.4.1.tgz#9e1c3f244895d7862ef03be98b2a620848c3fba1" + integrity sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q== + dependencies: + re-resizable "6.9.6" + react-draggable "4.4.5" + tslib "2.3.1" + react-style-singleton@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" @@ -6432,6 +6435,11 @@ tsconfig-paths@^4.0.0: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tslib@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"