@@ -6,6 +6,7 @@ import React, {
6
6
useState
7
7
} from 'react'
8
8
import { render } from 'react-dom'
9
+ import Pressure from 'pressure'
9
10
import { useSvgDrawing } from '../'
10
11
11
12
const getRandomInt = ( max : number ) : number =>
@@ -33,35 +34,120 @@ const Example = () => {
33
34
width : 500 ,
34
35
height : 500
35
36
} )
36
-
37
+ const [ randomPen , switchRandom ] = useState < boolean > ( false )
37
38
const [ xml , setXml ] = useState ( '' )
39
+ const [ penMode , setPenMode ] = useState < string > ( 'normal' )
40
+ const [ penWidth , setPenWidth ] = useState < number > ( 5 )
41
+ const [ penThinnerWidth , setPenThinnerWidth ] = useState < number > ( 0 )
38
42
const handleColor = useCallback ( ( ) => {
39
43
changePenColor ( getRandomColor ( ) )
40
44
} , [ changePenColor ] )
41
45
42
46
const handlePenWidth = useCallback (
43
47
( e : React . ChangeEvent < HTMLInputElement > ) => {
48
+ setPenWidth ( Number ( e . target . value ) )
44
49
changePenWidth ( Number ( e . target . value ) )
45
50
} ,
46
51
[ changePenWidth ]
47
52
)
48
53
const handleChangeXML = useCallback ( ( ) => {
49
54
setXml ( getSvgXML ( ) )
50
55
} , [ getSvgXML ] )
56
+ const handleChangeMode = useCallback (
57
+ ( e : React . ChangeEvent < HTMLInputElement > ) => {
58
+ setPenMode ( e . target . value )
59
+ } ,
60
+ [ ]
61
+ )
62
+ const handleUpdatePenConfig = useCallback (
63
+ ( e : any ) => {
64
+ if ( penMode === 'rainbow' ) {
65
+ changePenColor ( getRandomColor ( ) )
66
+ return
67
+ }
68
+ if ( penMode === 'random' ) {
69
+ changePenWidth ( getRandomInt ( 50 ) + 5 )
70
+ return
71
+ }
72
+ if ( penMode == 'thinner' ) {
73
+ changePenWidth ( penThinnerWidth )
74
+ }
75
+ if ( penMode === 'normal' ) {
76
+ changePenWidth ( penWidth )
77
+ }
78
+ } ,
79
+ [ penMode , penWidth , changePenWidth , changePenColor , penThinnerWidth ]
80
+ )
81
+ // TODO: Fix Can not switch normal pen.
82
+ const pressureChange = useCallback (
83
+ ( force : any , event : any ) => {
84
+ setPenThinnerWidth ( 30 - Math . floor ( force * 40 ) )
85
+ } ,
86
+ [ setPenThinnerWidth ]
87
+ )
88
+
89
+ // Pressure -> https://github.com/stuyam/pressure
90
+ useEffect ( ( ) => {
91
+ if ( ! divRef . current ) return
92
+ Pressure . set ( divRef . current , {
93
+ change : pressureChange
94
+ } )
95
+ } , [ divRef , pressureChange ] )
51
96
return (
52
97
< Fragment >
53
- < div >
54
- pen width
55
- < input
56
- type = "range"
57
- defaultValue = "5"
58
- min = { 1 }
59
- max = { 50 }
60
- onChange = { handlePenWidth }
61
- />
62
- </ div >
63
- < button onClick = { undo } > Undo</ button >
64
- < button onClick = { handleColor } > Change Color</ button >
98
+ < fieldset >
99
+ < label >
100
+ < input
101
+ type = "checkbox"
102
+ checked = { penMode === 'normal' }
103
+ value = "normal"
104
+ onChange = { handleChangeMode }
105
+ />
106
+ Normal pen.
107
+ </ label >
108
+ < label >
109
+ < input
110
+ type = "checkbox"
111
+ checked = { penMode === 'thinner' }
112
+ value = "thinner"
113
+ onChange = { handleChangeMode }
114
+ />
115
+ Pen becoming thinner.
116
+ </ label >
117
+ < label >
118
+ < input
119
+ type = "checkbox"
120
+ checked = { penMode === 'random' }
121
+ value = "random"
122
+ onChange = { handleChangeMode }
123
+ />
124
+ Pen becoming Random Width.
125
+ </ label >
126
+ < label >
127
+ < input
128
+ type = "checkbox"
129
+ checked = { penMode === 'rainbow' }
130
+ value = "rainbow"
131
+ onChange = { handleChangeMode }
132
+ />
133
+ Rainbow pen.
134
+ </ label >
135
+ { [ 'normal' , 'rainbow' ] . includes ( penMode ) && (
136
+ < div >
137
+ pen width
138
+ < input
139
+ type = "range"
140
+ value = { penWidth }
141
+ min = { 1 }
142
+ max = { 50 }
143
+ onChange = { handlePenWidth }
144
+ />
145
+ </ div >
146
+ ) }
147
+ { penMode !== 'rainbow' && (
148
+ < button onClick = { handleColor } > Change Color</ button >
149
+ ) }
150
+ </ fieldset >
65
151
< div
66
152
style = { {
67
153
display : 'flex' ,
@@ -75,9 +161,12 @@ const Example = () => {
75
161
border : '1px solid #eee' ,
76
162
margin : 'auto'
77
163
} }
164
+ onMouseMove = { handleUpdatePenConfig }
165
+ onTouchMove = { handleUpdatePenConfig }
78
166
onTouchEnd = { handleChangeXML }
79
167
onMouseLeave = { handleChangeXML }
80
168
/>
169
+ < button onClick = { undo } > Undo</ button >
81
170
< button onClick = { drawingClear } > Clear</ button >
82
171
< button onClick = { download } > Download SVG</ button >
83
172
</ div >
0 commit comments