@@ -7,44 +7,56 @@ import { useCanvasManager } from 'features/controlLayers/contexts/CanvasManagerP
7
7
import { useEntityIdentifierContext } from 'features/controlLayers/contexts/EntityIdentifierContext' ;
8
8
import {
9
9
rasterLayerAdjustmentsCancel ,
10
+ rasterLayerAdjustmentsCollapsedToggled ,
11
+ rasterLayerAdjustmentsEnabledToggled ,
12
+ rasterLayerAdjustmentsModeChanged ,
10
13
rasterLayerAdjustmentsReset ,
11
14
rasterLayerAdjustmentsSet ,
12
15
} from 'features/controlLayers/store/canvasSlice' ;
13
16
import { selectCanvasSlice , selectEntity } from 'features/controlLayers/store/selectors' ;
14
- import { makeDefaultRasterLayerAdjustments } from 'features/controlLayers/store/util' ;
15
17
import React , { memo , useCallback , useMemo } from 'react' ;
16
18
import { useTranslation } from 'react-i18next' ;
17
19
import { PiArrowCounterClockwiseBold , PiCaretDownBold , PiCheckBold , PiTrashBold } from 'react-icons/pi' ;
18
20
19
21
export const RasterLayerAdjustmentsPanel = memo ( ( ) => {
22
+ const { t } = useTranslation ( ) ;
20
23
const dispatch = useAppDispatch ( ) ;
21
24
const entityIdentifier = useEntityIdentifierContext < 'raster_layer' > ( ) ;
22
25
const canvasManager = useCanvasManager ( ) ;
23
- const selectAdjustments = useMemo ( ( ) => {
24
- return createSelector ( selectCanvasSlice , ( canvas ) => selectEntity ( canvas , entityIdentifier ) ?. adjustments ) ;
26
+
27
+ const selectHasAdjustments = useMemo ( ( ) => {
28
+ return createSelector ( selectCanvasSlice , ( canvas ) => Boolean ( selectEntity ( canvas , entityIdentifier ) ?. adjustments ) ) ;
25
29
} , [ entityIdentifier ] ) ;
26
30
27
- const adjustments = useAppSelector ( selectAdjustments ) ;
28
- const { t } = useTranslation ( ) ;
31
+ const hasAdjustments = useAppSelector ( selectHasAdjustments ) ;
29
32
30
- const hasAdjustments = Boolean ( adjustments ) ;
31
- const enabled = Boolean ( adjustments ?. enabled ) ;
32
- const collapsed = Boolean ( adjustments ?. collapsed ) ;
33
- const mode = adjustments ?. mode ?? 'simple' ;
34
-
35
- const onToggleEnabled = useCallback (
36
- ( e : React . ChangeEvent < HTMLInputElement > ) => {
37
- const v = e . target . checked ;
38
- const current = adjustments ?? makeDefaultRasterLayerAdjustments ( mode ) ;
39
- dispatch (
40
- rasterLayerAdjustmentsSet ( {
41
- entityIdentifier,
42
- adjustments : { ...current , enabled : v } ,
43
- } )
44
- ) ;
45
- } ,
46
- [ dispatch , entityIdentifier , adjustments , mode ]
47
- ) ;
33
+ const selectMode = useMemo ( ( ) => {
34
+ return createSelector (
35
+ selectCanvasSlice ,
36
+ ( canvas ) => selectEntity ( canvas , entityIdentifier ) ?. adjustments ?. mode ?? 'simple'
37
+ ) ;
38
+ } , [ entityIdentifier ] ) ;
39
+ const mode = useAppSelector ( selectMode ) ;
40
+
41
+ const selectEnabled = useMemo ( ( ) => {
42
+ return createSelector (
43
+ selectCanvasSlice ,
44
+ ( canvas ) => selectEntity ( canvas , entityIdentifier ) ?. adjustments ?. enabled ?? false
45
+ ) ;
46
+ } , [ entityIdentifier ] ) ;
47
+ const enabled = useAppSelector ( selectEnabled ) ;
48
+
49
+ const selectCollapsed = useMemo ( ( ) => {
50
+ return createSelector (
51
+ selectCanvasSlice ,
52
+ ( canvas ) => selectEntity ( canvas , entityIdentifier ) ?. adjustments ?. collapsed ?? false
53
+ ) ;
54
+ } , [ entityIdentifier ] ) ;
55
+ const collapsed = useAppSelector ( selectCollapsed ) ;
56
+
57
+ const onToggleEnabled = useCallback ( ( ) => {
58
+ dispatch ( rasterLayerAdjustmentsEnabledToggled ( { entityIdentifier } ) ) ;
59
+ } , [ dispatch , entityIdentifier ] ) ;
48
60
49
61
const onReset = useCallback ( ( ) => {
50
62
// Reset values to defaults but keep adjustments present; preserve enabled/collapsed/mode
@@ -57,34 +69,18 @@ export const RasterLayerAdjustmentsPanel = memo(() => {
57
69
} , [ dispatch , entityIdentifier ] ) ;
58
70
59
71
const onToggleCollapsed = useCallback ( ( ) => {
60
- const current = adjustments ?? makeDefaultRasterLayerAdjustments ( mode ) ;
61
- dispatch (
62
- rasterLayerAdjustmentsSet ( {
63
- entityIdentifier,
64
- adjustments : { ...current , collapsed : ! collapsed } ,
65
- } )
66
- ) ;
67
- } , [ dispatch , entityIdentifier , collapsed , adjustments , mode ] ) ;
68
-
69
- const onSetMode = useCallback (
70
- ( nextMode : 'simple' | 'curves' ) => {
71
- if ( nextMode === mode ) {
72
- return ;
73
- }
74
- const current = adjustments ?? makeDefaultRasterLayerAdjustments ( nextMode ) ;
75
- dispatch (
76
- rasterLayerAdjustmentsSet ( {
77
- entityIdentifier,
78
- adjustments : { ...current , mode : nextMode } ,
79
- } )
80
- ) ;
81
- } ,
82
- [ dispatch , entityIdentifier , adjustments , mode ]
72
+ dispatch ( rasterLayerAdjustmentsCollapsedToggled ( { entityIdentifier } ) ) ;
73
+ } , [ dispatch , entityIdentifier ] ) ;
74
+
75
+ const onClickModeSimple = useCallback (
76
+ ( ) => dispatch ( rasterLayerAdjustmentsModeChanged ( { entityIdentifier, mode : 'simple' } ) ) ,
77
+ [ dispatch , entityIdentifier ]
83
78
) ;
84
79
85
- // Memoized click handlers to avoid inline arrow functions in JSX
86
- const onClickModeSimple = useCallback ( ( ) => onSetMode ( 'simple' ) , [ onSetMode ] ) ;
87
- const onClickModeCurves = useCallback ( ( ) => onSetMode ( 'curves' ) , [ onSetMode ] ) ;
80
+ const onClickModeCurves = useCallback (
81
+ ( ) => dispatch ( rasterLayerAdjustmentsModeChanged ( { entityIdentifier, mode : 'curves' } ) ) ,
82
+ [ dispatch , entityIdentifier ]
83
+ ) ;
88
84
89
85
const onFinish = useCallback ( async ( ) => {
90
86
// Bake current visual into layer pixels, then clear adjustments
@@ -137,7 +133,7 @@ export const RasterLayerAdjustmentsPanel = memo(() => {
137
133
aria-label = { t ( 'controlLayers.adjustments.cancel' ) }
138
134
size = "md"
139
135
onClick = { onCancel }
140
- isDisabled = { ! adjustments }
136
+ isDisabled = { ! hasAdjustments }
141
137
colorScheme = "red"
142
138
icon = { < PiTrashBold /> }
143
139
variant = "ghost"
@@ -146,15 +142,15 @@ export const RasterLayerAdjustmentsPanel = memo(() => {
146
142
aria-label = { t ( 'controlLayers.adjustments.reset' ) }
147
143
size = "md"
148
144
onClick = { onReset }
149
- isDisabled = { ! adjustments }
145
+ isDisabled = { ! hasAdjustments }
150
146
icon = { < PiArrowCounterClockwiseBold /> }
151
147
variant = "ghost"
152
148
/>
153
149
< IconButton
154
150
aria-label = { t ( 'controlLayers.adjustments.finish' ) }
155
151
size = "md"
156
152
onClick = { onFinish }
157
- isDisabled = { ! adjustments }
153
+ isDisabled = { ! hasAdjustments }
158
154
colorScheme = "green"
159
155
icon = { < PiCheckBold /> }
160
156
variant = "ghost"
0 commit comments