Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ui: redesign followups 9 #5460

Merged
merged 11 commits into from
Jan 10, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ import { addSessionRetrievalErrorEventListener } from './listeners/socketio/sock
import { addSocketSubscribedEventListener as addSocketSubscribedListener } from './listeners/socketio/socketSubscribed';
import { addSocketUnsubscribedEventListener as addSocketUnsubscribedListener } from './listeners/socketio/socketUnsubscribed';
import { addStagingAreaImageSavedListener } from './listeners/stagingAreaImageSaved';
import { addTabChangedListener } from './listeners/tabChanged';
import { addUpdateAllNodesRequestedListener } from './listeners/updateAllNodesRequested';
import { addUpscaleRequestedListener } from './listeners/upscaleRequested';
import { addWorkflowLoadRequestedListener } from './listeners/workflowLoadRequested';
Expand Down Expand Up @@ -196,8 +195,5 @@ addFirstListImagesListener();
// Ad-hoc upscale workflwo
addUpscaleRequestedListener();

// Tab Change
addTabChangedListener();

// Dynamic prompts
addDynamicPromptsListener();
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { $logger } from 'app/logging/logger';
import { canvasMerged } from 'features/canvas/store/actions';
import { $canvasBaseLayer } from 'features/canvas/store/canvasNanostore';
import { setMergedCanvas } from 'features/canvas/store/canvasSlice';
import { getFullBaseLayerBlob } from 'features/canvas/util/getFullBaseLayerBlob';
import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider';
import { addToast } from 'features/system/store/systemSlice';
import { t } from 'i18next';
import { imagesApi } from 'services/api/endpoints/images';
Expand Down Expand Up @@ -30,7 +30,7 @@ export const addCanvasMergedListener = () => {
return;
}

const canvasBaseLayer = getCanvasBaseLayer();
const canvasBaseLayer = $canvasBaseLayer.get();

if (!canvasBaseLayer) {
moduleLog.error('Problem getting canvas base layer');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ export const addModelSelectedListener = () => {
const newModel = result.data;

const { base_model } = newModel;
const didBaseModelChange =
state.generation.model?.base_model !== base_model;

if (state.generation.model?.base_model !== base_model) {
if (didBaseModelChange) {
// we may need to reset some incompatible submodels
let modelsCleared = 0;

Expand Down Expand Up @@ -81,7 +83,7 @@ export const addModelSelectedListener = () => {
}
}

dispatch(modelChanged(newModel));
dispatch(modelChanged(newModel, state.generation.model));
},
});
};
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export const addModelsLoadedListener = () => {
return;
}

dispatch(modelChanged(result.data));
dispatch(modelChanged(result.data, currentModel));
},
});
startAppListening({
Expand Down Expand Up @@ -149,7 +149,7 @@ export const addModelsLoadedListener = () => {

if (!firstModel) {
// No custom VAEs loaded at all; use the default
dispatch(modelChanged(null));
dispatch(vaeSelected(null));
return;
}

Expand Down Expand Up @@ -227,7 +227,7 @@ export const addModelsLoadedListener = () => {
const log = logger('models');
log.info(
{ models: action.payload.entities },
`ControlNet models loaded (${action.payload.ids.length})`
`T2I Adapter models loaded (${action.payload.ids.length})`
);

selectAllT2IAdapters(getState().controlAdapters).forEach((ca) => {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,27 +1,33 @@
// https://stackoverflow.com/a/73731908
import { useCallback, useEffect, useState } from 'react';

export function useSingleAndDoubleClick(
handleSingleClick: () => void,
handleDoubleClick: () => void,
delay = 250
) {
export type UseSingleAndDoubleClickOptions = {
onSingleClick: () => void;
onDoubleClick: () => void;
latency?: number;
};

export function useSingleAndDoubleClick({
onSingleClick,
onDoubleClick,
latency = 250,
}: UseSingleAndDoubleClickOptions): () => void {
const [click, setClick] = useState(0);

useEffect(() => {
const timer = setTimeout(() => {
if (click === 1) {
handleSingleClick();
onSingleClick();
}
setClick(0);
}, delay);
}, latency);

if (click === 2) {
handleDoubleClick();
onDoubleClick();
}

return () => clearTimeout(timer);
}, [click, handleSingleClick, handleDoubleClick, delay]);
}, [click, onDoubleClick, latency, onSingleClick]);

const onClick = useCallback(() => setClick((prev) => prev + 1), []);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,19 @@ import useCanvasMouseOut from 'features/canvas/hooks/useCanvasMouseOut';
import useCanvasMouseUp from 'features/canvas/hooks/useCanvasMouseUp';
import useCanvasWheel from 'features/canvas/hooks/useCanvasZoom';
import {
$canvasBaseLayer,
$canvasStage,
$isModifyingBoundingBox,
$isMouseOverBoundingBox,
$isMovingStage,
$isTransformingBoundingBox,
$tool,
} from 'features/canvas/store/canvasNanostore';
import { isStagingSelector } from 'features/canvas/store/canvasSelectors';
import {
canvasResized,
selectCanvasSlice,
} from 'features/canvas/store/canvasSlice';
import {
setCanvasBaseLayer,
setCanvasStage,
} from 'features/canvas/util/konvaInstanceProvider';
import type Konva from 'konva';
import type { KonvaEventObject } from 'konva/lib/Node';
import type { Vector2d } from 'konva/lib/types';
Expand Down Expand Up @@ -61,7 +60,6 @@ const IAICanvas = () => {
);
const shouldShowGrid = useAppSelector((s) => s.canvas.shouldShowGrid);
const stageScale = useAppSelector((s) => s.canvas.stageScale);
const tool = useAppSelector((s) => s.canvas.tool);
const shouldShowIntermediates = useAppSelector(
(s) => s.canvas.shouldShowIntermediates
);
Expand All @@ -78,10 +76,11 @@ const IAICanvas = () => {
const isMovingStage = useStore($isMovingStage);
const isTransformingBoundingBox = useStore($isTransformingBoundingBox);
const isMouseOverBoundingBox = useStore($isMouseOverBoundingBox);
const tool = useStore($tool);
useCanvasHotkeys();
const canvasStageRefCallback = useCallback((el: Konva.Stage) => {
setCanvasStage(el as Konva.Stage);
stageRef.current = el;
const canvasStageRefCallback = useCallback((stageElement: Konva.Stage) => {
$canvasStage.set(stageElement);
stageRef.current = stageElement;
}, []);
const stageCursor = useMemo(() => {
if (tool === 'move' || isStaging) {
Expand All @@ -104,10 +103,14 @@ const IAICanvas = () => {
shouldRestrictStrokesToBox,
tool,
]);
const canvasBaseLayerRefCallback = useCallback((el: Konva.Layer) => {
setCanvasBaseLayer(el as Konva.Layer);
canvasBaseLayerRef.current = el;
}, []);

const canvasBaseLayerRefCallback = useCallback(
(layerElement: Konva.Layer) => {
$canvasBaseLayer.set(layerElement);
canvasBaseLayerRef.current = layerElement;
},
[]
);

const lastCursorPositionRef = useRef<Vector2d>({ x: 0, y: 0 });

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
$cursorPosition,
$isMovingBoundingBox,
$isTransformingBoundingBox,
$tool,
} from 'features/canvas/store/canvasNanostore';
import { selectCanvasSlice } from 'features/canvas/store/canvasSlice';
import { rgbaColorToString } from 'features/canvas/util/colorToString';
Expand Down Expand Up @@ -89,7 +90,7 @@ const IAICanvasToolPreview = (props: GroupConfig) => {
const maskColorString = useAppSelector((s) =>
rgbaColorToString({ ...s.canvas.maskColor, a: 0.5 })
);
const tool = useAppSelector((s) => s.canvas.tool);
const tool = useStore($tool);
const layer = useAppSelector((s) => s.canvas.layer);
const dotRadius = useAppSelector((s) => 1.5 / s.canvas.stageScale);
const strokeWidth = useAppSelector((s) => 1.5 / s.canvas.stageScale);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import {
} from 'common/util/roundDownToMultiple';
import {
$isDrawing,
$isMouseOverBoundingBox,
$isMouseOverBoundingBoxOutline,
$isMovingBoundingBox,
$isTransformingBoundingBox,
setIsMouseOverBoundingBox,
setIsMovingBoundingBox,
setIsTransformingBoundingBox,
$tool,
} from 'features/canvas/store/canvasNanostore';
import {
aspectRatioChanged,
Expand All @@ -30,7 +30,7 @@ import type Konva from 'konva';
import type { GroupConfig } from 'konva/lib/Group';
import type { KonvaEventObject } from 'konva/lib/Node';
import type { Vector2d } from 'konva/lib/types';
import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { memo, useCallback, useEffect, useMemo, useRef } from 'react';
import { useHotkeys } from 'react-hotkeys-hook';
import { Group, Rect, Transformer } from 'react-konva';

Expand All @@ -49,18 +49,19 @@ const IAICanvasBoundingBox = (props: IAICanvasBoundingBoxPreviewProps) => {
);
const stageScale = useAppSelector((s) => s.canvas.stageScale);
const shouldSnapToGrid = useAppSelector((s) => s.canvas.shouldSnapToGrid);
const tool = useAppSelector((s) => s.canvas.tool);
const hitStrokeWidth = useAppSelector((s) => 20 / s.canvas.stageScale);
const aspectRatio = useAppSelector((s) => s.canvas.aspectRatio);
const optimalDimension = useAppSelector(selectOptimalDimension);
const transformerRef = useRef<Konva.Transformer>(null);
const shapeRef = useRef<Konva.Rect>(null);
const shift = useStore($shift);
const tool = useStore($tool);
const isDrawing = useStore($isDrawing);
const isMovingBoundingBox = useStore($isMovingBoundingBox);
const isTransformingBoundingBox = useStore($isTransformingBoundingBox);
const [isMouseOverBoundingBoxOutline, setIsMouseOverBoundingBoxOutline] =
useState(false);
const isMouseOverBoundingBoxOutline = useStore(
$isMouseOverBoundingBoxOutline
);

useEffect(() => {
if (!transformerRef.current || !shapeRef.current) {
Expand Down Expand Up @@ -228,43 +229,43 @@ const IAICanvasBoundingBox = (props: IAICanvasBoundingBoxPreviewProps) => {
);

const handleStartedTransforming = useCallback(() => {
setIsTransformingBoundingBox(true);
$isTransformingBoundingBox.set(true);
}, []);

const handleEndedTransforming = useCallback(() => {
setIsTransformingBoundingBox(false);
setIsMovingBoundingBox(false);
setIsMouseOverBoundingBox(false);
setIsMouseOverBoundingBoxOutline(false);
$isTransformingBoundingBox.set(false);
$isMovingBoundingBox.set(false);
$isMouseOverBoundingBox.set(false);
$isMouseOverBoundingBoxOutline.set(false);
}, []);

const handleStartedMoving = useCallback(() => {
setIsMovingBoundingBox(true);
$isMovingBoundingBox.set(true);
}, []);

const handleEndedModifying = useCallback(() => {
setIsTransformingBoundingBox(false);
setIsMovingBoundingBox(false);
setIsMouseOverBoundingBox(false);
setIsMouseOverBoundingBoxOutline(false);
$isTransformingBoundingBox.set(false);
$isMovingBoundingBox.set(false);
$isMouseOverBoundingBox.set(false);
$isMouseOverBoundingBoxOutline.set(false);
}, []);

const handleMouseOver = useCallback(() => {
setIsMouseOverBoundingBoxOutline(true);
$isMouseOverBoundingBoxOutline.set(true);
}, []);

const handleMouseOut = useCallback(() => {
!isTransformingBoundingBox &&
!isMovingBoundingBox &&
setIsMouseOverBoundingBoxOutline(false);
$isMouseOverBoundingBoxOutline.set(false);
}, [isMovingBoundingBox, isTransformingBoundingBox]);

const handleMouseEnterBoundingBox = useCallback(() => {
setIsMouseOverBoundingBox(true);
$isMouseOverBoundingBox.set(true);
}, []);

const handleMouseLeaveBoundingBox = useCallback(() => {
setIsMouseOverBoundingBox(false);
$isMouseOverBoundingBox.set(false);
}, []);

const stroke = useMemo(() => {
Expand Down
Loading