@@ -4,19 +4,38 @@ import { createSelector } from '@reduxjs/toolkit';
4
4
import { logger } from 'app/logging/logger' ;
5
5
import { createMemoizedSelector } from 'app/store/createMemoizedSelector' ;
6
6
import { useAppDispatch , useAppSelector } from 'app/store/storeHooks' ;
7
- import { useMouseEvents } from 'features/controlLayers/hooks/mouseEventHooks' ;
8
7
import {
8
+ $brushSize ,
9
+ $brushSpacingPx ,
10
+ $isDrawing ,
11
+ $lastAddedPoint ,
9
12
$lastCursorPos ,
10
13
$lastMouseDownPos ,
14
+ $selectedLayerId ,
15
+ $selectedLayerType ,
16
+ $shouldInvertBrushSizeScrollDirection ,
11
17
$tool ,
18
+ BRUSH_SPACING_PCT ,
19
+ brushSizeChanged ,
12
20
isRegionalGuidanceLayer ,
13
21
layerBboxChanged ,
14
22
layerTranslated ,
23
+ MAX_BRUSH_SPACING_PX ,
24
+ MIN_BRUSH_SPACING_PX ,
25
+ rgLayerLineAdded ,
26
+ rgLayerPointsAdded ,
27
+ rgLayerRectAdded ,
15
28
selectControlLayersSlice ,
16
29
} from 'features/controlLayers/store/controlLayersSlice' ;
17
- import { debouncedRenderers , renderers as normalRenderers } from 'features/controlLayers/util/renderers' ;
30
+ import type { AddLineArg , AddPointToLineArg , AddRectArg } from 'features/controlLayers/store/types' ;
31
+ import {
32
+ debouncedRenderers ,
33
+ renderers as normalRenderers ,
34
+ setStageEventHandlers ,
35
+ } from 'features/controlLayers/util/renderers' ;
18
36
import Konva from 'konva' ;
19
37
import type { IRect } from 'konva/lib/types' ;
38
+ import { clamp } from 'lodash-es' ;
20
39
import { memo , useCallback , useLayoutEffect , useMemo , useState } from 'react' ;
21
40
import { getImageDTO } from 'services/api/endpoints/images' ;
22
41
import { useDevicePixelRatio } from 'use-device-pixel-ratio' ;
@@ -48,7 +67,6 @@ const useStageRenderer = (
48
67
const dispatch = useAppDispatch ( ) ;
49
68
const state = useAppSelector ( ( s ) => s . controlLayers . present ) ;
50
69
const tool = useStore ( $tool ) ;
51
- const mouseEventHandlers = useMouseEvents ( ) ;
52
70
const lastCursorPos = useStore ( $lastCursorPos ) ;
53
71
const lastMouseDownPos = useStore ( $lastMouseDownPos ) ;
54
72
const selectedLayerIdColor = useAppSelector ( selectSelectedLayerColor ) ;
@@ -57,6 +75,26 @@ const useStageRenderer = (
57
75
const layerCount = useMemo ( ( ) => state . layers . length , [ state . layers ] ) ;
58
76
const renderers = useMemo ( ( ) => ( asPreview ? debouncedRenderers : normalRenderers ) , [ asPreview ] ) ;
59
77
const dpr = useDevicePixelRatio ( { round : false } ) ;
78
+ const shouldInvertBrushSizeScrollDirection = useAppSelector ( ( s ) => s . canvas . shouldInvertBrushSizeScrollDirection ) ;
79
+ const brushSpacingPx = useMemo (
80
+ ( ) => clamp ( state . brushSize / BRUSH_SPACING_PCT , MIN_BRUSH_SPACING_PX , MAX_BRUSH_SPACING_PX ) ,
81
+ [ state . brushSize ]
82
+ ) ;
83
+
84
+ useLayoutEffect ( ( ) => {
85
+ $brushSize . set ( state . brushSize ) ;
86
+ $brushSpacingPx . set ( brushSpacingPx ) ;
87
+ $selectedLayerId . set ( state . selectedLayerId ) ;
88
+ $selectedLayerType . set ( selectedLayerType ) ;
89
+ $shouldInvertBrushSizeScrollDirection . set ( shouldInvertBrushSizeScrollDirection ) ;
90
+ } , [
91
+ brushSpacingPx ,
92
+ selectedLayerIdColor ,
93
+ selectedLayerType ,
94
+ shouldInvertBrushSizeScrollDirection ,
95
+ state . brushSize ,
96
+ state . selectedLayerId ,
97
+ ] ) ;
60
98
61
99
const onLayerPosChanged = useCallback (
62
100
( layerId : string , x : number , y : number ) => {
@@ -72,6 +110,31 @@ const useStageRenderer = (
72
110
[ dispatch ]
73
111
) ;
74
112
113
+ const onRGLayerLineAdded = useCallback (
114
+ ( arg : AddLineArg ) => {
115
+ dispatch ( rgLayerLineAdded ( arg ) ) ;
116
+ } ,
117
+ [ dispatch ]
118
+ ) ;
119
+ const onRGLayerPointAddedToLine = useCallback (
120
+ ( arg : AddPointToLineArg ) => {
121
+ dispatch ( rgLayerPointsAdded ( arg ) ) ;
122
+ } ,
123
+ [ dispatch ]
124
+ ) ;
125
+ const onRGLayerRectAdded = useCallback (
126
+ ( arg : AddRectArg ) => {
127
+ dispatch ( rgLayerRectAdded ( arg ) ) ;
128
+ } ,
129
+ [ dispatch ]
130
+ ) ;
131
+ const onBrushSizeChanged = useCallback (
132
+ ( size : number ) => {
133
+ dispatch ( brushSizeChanged ( size ) ) ;
134
+ } ,
135
+ [ dispatch ]
136
+ ) ;
137
+
75
138
useLayoutEffect ( ( ) => {
76
139
log . trace ( 'Initializing stage' ) ;
77
140
if ( ! container ) {
@@ -89,21 +152,29 @@ const useStageRenderer = (
89
152
if ( asPreview ) {
90
153
return ;
91
154
}
92
- stage . on ( 'mousedown' , mouseEventHandlers . onMouseDown ) ;
93
- stage . on ( 'mouseup' , mouseEventHandlers . onMouseUp ) ;
94
- stage . on ( 'mousemove' , mouseEventHandlers . onMouseMove ) ;
95
- stage . on ( 'mouseleave' , mouseEventHandlers . onMouseLeave ) ;
96
- stage . on ( 'wheel' , mouseEventHandlers . onMouseWheel ) ;
155
+ const cleanup = setStageEventHandlers ( {
156
+ stage,
157
+ $tool,
158
+ $isDrawing,
159
+ $lastMouseDownPos,
160
+ $lastCursorPos,
161
+ $lastAddedPoint,
162
+ $brushSize,
163
+ $brushSpacingPx,
164
+ $selectedLayerId,
165
+ $selectedLayerType,
166
+ $shouldInvertBrushSizeScrollDirection,
167
+ onRGLayerLineAdded,
168
+ onRGLayerPointAddedToLine,
169
+ onRGLayerRectAdded,
170
+ onBrushSizeChanged,
171
+ } ) ;
97
172
98
173
return ( ) => {
99
- log . trace ( 'Cleaning up stage listeners' ) ;
100
- stage . off ( 'mousedown' , mouseEventHandlers . onMouseDown ) ;
101
- stage . off ( 'mouseup' , mouseEventHandlers . onMouseUp ) ;
102
- stage . off ( 'mousemove' , mouseEventHandlers . onMouseMove ) ;
103
- stage . off ( 'mouseleave' , mouseEventHandlers . onMouseLeave ) ;
104
- stage . off ( 'wheel' , mouseEventHandlers . onMouseWheel ) ;
174
+ log . trace ( 'Removing stage listeners' ) ;
175
+ cleanup ( ) ;
105
176
} ;
106
- } , [ stage , asPreview , mouseEventHandlers ] ) ;
177
+ } , [ asPreview , onBrushSizeChanged , onRGLayerLineAdded , onRGLayerPointAddedToLine , onRGLayerRectAdded , stage ] ) ;
107
178
108
179
useLayoutEffect ( ( ) => {
109
180
log . trace ( 'Updating stage dimensions' ) ;
0 commit comments