@@ -133,51 +133,46 @@ impl ClickTracker {
133133 } ;
134134
135135 let Some ( record) = record else {
136- * record = Some ( ClickRecord { position, ..Default :: default ( ) } ) ;
136+ * record = Some ( ClickRecord {
137+ down_position : position,
138+ up_position : position,
139+ ..Default :: default ( )
140+ } ) ;
137141 return ClickCount :: Single ;
138142 } ;
139143
140- let prev_time = record. time ;
141- let prev_position = record. position ;
142- let prev_count: ClickCount = record. down_count ;
143-
144144 let now = Instant :: now ( ) ;
145- record. time = now;
146- record. position = position;
145+ let within_time = now. saturating_duration_since ( record. time ) <= MULTICLICK_TIMEOUT ;
147146
148- match state {
149- ElementState :: Pressed if record. down_count == ClickCount :: Triple => {
150- * record = ClickRecord {
151- down_count : ClickCount :: Double ,
152- ..* record
153- } ;
154- return ClickCount :: Double ;
155- }
156- ElementState :: Released if record. up_count == ClickCount :: Triple => {
157- * record = ClickRecord {
158- up_count : ClickCount :: Double ,
159- ..* record
160- } ;
161- return ClickCount :: Double ;
162- }
163- _ => { }
164- }
147+ let ( prev_count, prev_position) = match state {
148+ ElementState :: Pressed => ( record. down_count , record. down_position ) ,
149+ ElementState :: Released => ( record. up_count , record. up_position ) ,
150+ } ;
165151
166152 let dx = position. x . abs_diff ( prev_position. x ) ;
167153 let dy = position. y . abs_diff ( prev_position. y ) ;
168154 let within_dist = dx <= MULTICLICK_ALLOWED_TRAVEL && dy <= MULTICLICK_ALLOWED_TRAVEL ;
169- let within_time = now. saturating_duration_since ( prev_time) <= MULTICLICK_TIMEOUT ;
170155
171156 let count = match ( prev_count, within_time, within_dist) {
157+ ( ClickCount :: Single , true , true ) => ClickCount :: Double ,
172158 ( ClickCount :: Double , true , true ) => ClickCount :: Triple ,
173- ( _ , true , true ) => ClickCount :: Double ,
159+ ( ClickCount :: Triple , true , true ) => ClickCount :: Double ,
174160 _ => ClickCount :: Single ,
175161 } ;
176162
177- * record = match state {
178- ElementState :: Pressed => ClickRecord { down_count : count, ..* record } ,
179- ElementState :: Released => ClickRecord { up_count : count, ..* record } ,
180- } ;
163+ record. time = now;
164+
165+ match state {
166+ ElementState :: Pressed => {
167+ record. down_position = position;
168+ record. down_count = count;
169+ }
170+ ElementState :: Released => {
171+ record. up_position = position;
172+ record. up_count = count;
173+ }
174+ }
175+
181176 count
182177 }
183178}
@@ -202,7 +197,8 @@ impl From<ClickCount> for i32 {
202197#[ derive( Clone , Copy ) ]
203198struct ClickRecord {
204199 time : Instant ,
205- position : MousePosition ,
200+ down_position : MousePosition ,
201+ up_position : MousePosition ,
206202 down_count : ClickCount ,
207203 up_count : ClickCount ,
208204}
@@ -211,7 +207,8 @@ impl Default for ClickRecord {
211207 fn default ( ) -> Self {
212208 Self {
213209 time : Instant :: now ( ) ,
214- position : Default :: default ( ) ,
210+ down_position : Default :: default ( ) ,
211+ up_position : Default :: default ( ) ,
215212 down_count : Default :: default ( ) ,
216213 up_count : Default :: default ( ) ,
217214 }
0 commit comments