@@ -6,6 +6,7 @@ import { h } from 'preact'; // eslint-disable-line @typescript-eslint/no-unused-
6
6
import type * as Hooks from 'preact/hooks' ;
7
7
import { DOCUMENT , WINDOW } from '../../constants' ;
8
8
import CropCornerFactory from './CropCorner' ;
9
+ import CropIconFactory from './CropIcon' ;
9
10
import PenIconFactory from './PenIcon' ;
10
11
import { createScreenshotInputStyles } from './ScreenshotInput.css' ;
11
12
import { useTakeScreenshotFactory } from './useTakeScreenshot' ;
@@ -75,6 +76,7 @@ export function ScreenshotEditorFactory({
75
76
const useTakeScreenshot = useTakeScreenshotFactory ( { hooks } ) ;
76
77
const CropCorner = CropCornerFactory ( { h } ) ;
77
78
const PenIcon = PenIconFactory ( { h } ) ;
79
+ const CropIcon = CropIconFactory ( { h } ) ;
78
80
79
81
return function ScreenshotEditor ( { onError } : Props ) : VNode {
80
82
const styles = hooks . useMemo ( ( ) => ( { __html : createScreenshotInputStyles ( options . styleNonce ) . innerText } ) , [ ] ) ;
@@ -86,6 +88,7 @@ export function ScreenshotEditorFactory({
86
88
const [ croppingRect , setCroppingRect ] = hooks . useState < Box > ( { startX : 0 , startY : 0 , endX : 0 , endY : 0 } ) ;
87
89
const [ confirmCrop , setConfirmCrop ] = hooks . useState ( false ) ;
88
90
const [ isResizing , setIsResizing ] = hooks . useState ( false ) ;
91
+ const [ isCropping , setIsCropping ] = hooks . useState ( true ) ;
89
92
const [ isAnnotating , setIsAnnotating ] = hooks . useState ( false ) ;
90
93
91
94
hooks . useEffect ( ( ) => {
@@ -142,6 +145,10 @@ export function ScreenshotEditorFactory({
142
145
const croppingBox = constructRect ( croppingRect ) ;
143
146
ctx . clearRect ( 0 , 0 , imageDimensions . width , imageDimensions . height ) ;
144
147
148
+ if ( ! isCropping ) {
149
+ return ;
150
+ }
151
+
145
152
// draw gray overlay around the selection
146
153
ctx . fillStyle = 'rgba(0, 0, 0, 0.5)' ;
147
154
ctx . fillRect ( 0 , 0 , imageDimensions . width , imageDimensions . height ) ;
@@ -154,7 +161,7 @@ export function ScreenshotEditorFactory({
154
161
ctx . strokeStyle = '#000000' ;
155
162
ctx . lineWidth = 1 ;
156
163
ctx . strokeRect ( croppingBox . x + 3 , croppingBox . y + 3 , croppingBox . width - 6 , croppingBox . height - 6 ) ;
157
- } , [ croppingRect ] ) ;
164
+ } , [ croppingRect , isCropping ] ) ;
158
165
159
166
function onGrabButton ( e : Event , corner : string ) : void {
160
167
setIsAnnotating ( false ) ;
@@ -398,102 +405,115 @@ export function ScreenshotEditorFactory({
398
405
return (
399
406
< div class = "editor" >
400
407
< style nonce = { options . styleNonce } dangerouslySetInnerHTML = { styles } />
401
- { options . _experiments . annotations && (
402
- < div class = "editor__tool-container" >
403
- < button
404
- class = "editor__pen-tool"
405
- style = { {
406
- background : isAnnotating
407
- ? 'var(--button-primary-background, var(--accent-background))'
408
- : 'var(--button-background, var(--background))' ,
409
- color : isAnnotating
410
- ? 'var(--button-primary-foreground, var(--accent-foreground))'
411
- : 'var(--button-foreground, var(--foreground))' ,
412
- } }
413
- onClick = { e => {
414
- e . preventDefault ( ) ;
415
- setIsAnnotating ( ! isAnnotating ) ;
416
- } }
408
+ < div class = "editor__image-container" >
409
+ < div class = "editor__canvas-container" ref = { canvasContainerRef } >
410
+ < div
411
+ class = { `editor__crop-container ${ isAnnotating ? 'editor__crop-container--inactive' : '' }
412
+ ${ confirmCrop ? 'editor__crop-container--move' : '' } ` }
413
+ ref = { cropContainerRef }
417
414
>
418
- < PenIcon />
419
- </ button >
420
- </ div >
421
- ) }
422
- < div class = "editor__canvas-container" ref = { canvasContainerRef } >
423
- < div class = "editor__crop-container" style = { { zIndex : isAnnotating ? 1 : 2 } } ref = { cropContainerRef } >
415
+ < canvas onMouseDown = { onDragStart } ref = { croppingRef } > </ canvas >
416
+ { isCropping && (
417
+ < div >
418
+ < CropCorner
419
+ left = { croppingRect . startX - CROP_BUTTON_BORDER }
420
+ top = { croppingRect . startY - CROP_BUTTON_BORDER }
421
+ onGrabButton = { onGrabButton }
422
+ corner = "top-left"
423
+ > </ CropCorner >
424
+ < CropCorner
425
+ left = { croppingRect . endX - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER }
426
+ top = { croppingRect . startY - CROP_BUTTON_BORDER }
427
+ onGrabButton = { onGrabButton }
428
+ corner = "top-right"
429
+ > </ CropCorner >
430
+ < CropCorner
431
+ left = { croppingRect . startX - CROP_BUTTON_BORDER }
432
+ top = { croppingRect . endY - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER }
433
+ onGrabButton = { onGrabButton }
434
+ corner = "bottom-left"
435
+ > </ CropCorner >
436
+ < CropCorner
437
+ left = { croppingRect . endX - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER }
438
+ top = { croppingRect . endY - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER }
439
+ onGrabButton = { onGrabButton }
440
+ corner = "bottom-right"
441
+ > </ CropCorner >
442
+ </ div >
443
+ ) }
444
+ { isCropping && (
445
+ < div
446
+ style = { {
447
+ left : Math . max ( 0 , croppingRect . endX - 191 ) ,
448
+ top : Math . max ( 0 , croppingRect . endY + 8 ) ,
449
+ } }
450
+ class = { `editor__crop-btn-group ${ confirmCrop ? 'editor__crop-btn-group--active' : '' } ` }
451
+ >
452
+ < button
453
+ onClick = { e => {
454
+ e . preventDefault ( ) ;
455
+ if ( croppingRef . current ) {
456
+ setCroppingRect ( {
457
+ startX : 0 ,
458
+ startY : 0 ,
459
+ endX : croppingRef . current . width / DPI ,
460
+ endY : croppingRef . current . height / DPI ,
461
+ } ) ;
462
+ }
463
+ setConfirmCrop ( false ) ;
464
+ } }
465
+ class = "btn btn--default"
466
+ >
467
+ { options . cancelButtonLabel }
468
+ </ button >
469
+ < button
470
+ onClick = { e => {
471
+ e . preventDefault ( ) ;
472
+ applyCrop ( ) ;
473
+ setConfirmCrop ( false ) ;
474
+ } }
475
+ class = "btn btn--primary"
476
+ >
477
+ { options . confirmButtonLabel }
478
+ </ button >
479
+ </ div >
480
+ ) }
481
+ </ div >
424
482
< canvas
425
- onMouseDown = { onDragStart }
426
- style = { { cursor : confirmCrop ? 'move' : 'auto' } }
427
- ref = { croppingRef }
483
+ class = { `editor__annotation ${ isAnnotating ? 'editor__annotation--active' : '' } ` }
484
+ onMouseDown = { onAnnotateStart }
485
+ ref = { annotatingRef }
428
486
> </ canvas >
429
- < CropCorner
430
- left = { croppingRect . startX - CROP_BUTTON_BORDER }
431
- top = { croppingRect . startY - CROP_BUTTON_BORDER }
432
- onGrabButton = { onGrabButton }
433
- corner = "top-left"
434
- > </ CropCorner >
435
- < CropCorner
436
- left = { croppingRect . endX - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER }
437
- top = { croppingRect . startY - CROP_BUTTON_BORDER }
438
- onGrabButton = { onGrabButton }
439
- corner = "top-right"
440
- > </ CropCorner >
441
- < CropCorner
442
- left = { croppingRect . startX - CROP_BUTTON_BORDER }
443
- top = { croppingRect . endY - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER }
444
- onGrabButton = { onGrabButton }
445
- corner = "bottom-left"
446
- > </ CropCorner >
447
- < CropCorner
448
- left = { croppingRect . endX - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER }
449
- top = { croppingRect . endY - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER }
450
- onGrabButton = { onGrabButton }
451
- corner = "bottom-right"
452
- > </ CropCorner >
453
- < div
454
- style = { {
455
- left : Math . max ( 0 , croppingRect . endX - 191 ) ,
456
- top : Math . max ( 0 , croppingRect . endY + 8 ) ,
457
- display : confirmCrop ? 'flex' : 'none' ,
458
- } }
459
- class = "editor__crop-btn-group"
460
- >
487
+ </ div >
488
+ </ div >
489
+ { options . _experiments . annotations && (
490
+ < div class = "editor__tool-container" >
491
+ < div />
492
+ < div class = "editor__tool-bar" >
461
493
< button
494
+ class = { `editor__tool ${ isCropping ? 'editor__tool--active' : '' } ` }
462
495
onClick = { e => {
463
496
e . preventDefault ( ) ;
464
- if ( croppingRef . current ) {
465
- setCroppingRect ( {
466
- startX : 0 ,
467
- startY : 0 ,
468
- endX : croppingRef . current . width / DPI ,
469
- endY : croppingRef . current . height / DPI ,
470
- } ) ;
471
- }
472
- setConfirmCrop ( false ) ;
497
+ setIsCropping ( ! isCropping ) ;
498
+ setIsAnnotating ( false ) ;
473
499
} }
474
- class = "btn btn--default"
475
500
>
476
- { options . cancelButtonLabel }
501
+ < CropIcon />
477
502
</ button >
478
503
< button
504
+ class = { `editor__tool ${ isAnnotating ? 'editor__tool--active' : '' } ` }
479
505
onClick = { e => {
480
506
e . preventDefault ( ) ;
481
- applyCrop ( ) ;
482
- setConfirmCrop ( false ) ;
507
+ setIsAnnotating ( ! isAnnotating ) ;
508
+ setIsCropping ( false ) ;
483
509
} }
484
- class = "btn btn--primary"
485
510
>
486
- { options . confirmButtonLabel }
511
+ < PenIcon />
487
512
</ button >
488
513
</ div >
514
+ < div />
489
515
</ div >
490
- < canvas
491
- class = "editor__annotation"
492
- onMouseDown = { onAnnotateStart }
493
- style = { { zIndex : isAnnotating ? '2' : '1' } }
494
- ref = { annotatingRef }
495
- > </ canvas >
496
- </ div >
516
+ ) }
497
517
</ div >
498
518
) ;
499
519
} ;
0 commit comments