@@ -17,6 +17,7 @@ use std::time::Instant;
17
17
#[ derive( Debug , Default ) ]
18
18
struct Connections {
19
19
appwindow_block_pinch_zoom_bind : Option < glib:: Binding > ,
20
+ appwindow_block_touch_bind : Option < glib:: Binding > ,
20
21
appwindow_show_scrollbars_bind : Option < glib:: Binding > ,
21
22
appwindow_inertial_scrolling_bind : Option < glib:: Binding > ,
22
23
appwindow_righthanded_bind : Option < glib:: Binding > ,
@@ -32,6 +33,7 @@ mod imp {
32
33
pub ( crate ) canvas_touch_drawing_handler : RefCell < Option < glib:: SignalHandlerId > > ,
33
34
pub ( crate ) show_scrollbars : Cell < bool > ,
34
35
pub ( crate ) block_pinch_zoom : Cell < bool > ,
36
+ pub ( crate ) block_touch : Cell < bool > ,
35
37
pub ( crate ) inertial_scrolling : Cell < bool > ,
36
38
pub ( crate ) pointer_pos : Cell < Option < na:: Vector2 < f64 > > > ,
37
39
pub ( crate ) last_contextmenu_pos : Cell < Option < na:: Vector2 < f64 > > > ,
@@ -131,6 +133,7 @@ mod imp {
131
133
canvas_touch_drawing_handler : RefCell :: new ( None ) ,
132
134
show_scrollbars : Cell :: new ( false ) ,
133
135
block_pinch_zoom : Cell :: new ( false ) ,
136
+ block_touch : Cell :: new ( false ) ,
134
137
inertial_scrolling : Cell :: new ( true ) ,
135
138
pointer_pos : Cell :: new ( None ) ,
136
139
last_contextmenu_pos : Cell :: new ( None ) ,
@@ -244,6 +247,9 @@ mod imp {
244
247
glib:: ParamSpecBoolean :: builder( "block-pinch-zoom" )
245
248
. default_value( false )
246
249
. build( ) ,
250
+ glib:: ParamSpecBoolean :: builder( "block-touch" )
251
+ . default_value( false )
252
+ . build( ) ,
247
253
glib:: ParamSpecBoolean :: builder( "inertial-scrolling" )
248
254
. default_value( true )
249
255
. build( ) ,
@@ -256,6 +262,7 @@ mod imp {
256
262
match pspec. name ( ) {
257
263
"show-scrollbars" => self . show_scrollbars . get ( ) . to_value ( ) ,
258
264
"block-pinch-zoom" => self . block_pinch_zoom . get ( ) . to_value ( ) ,
265
+ "block-touch" => self . block_pinch_zoom . get ( ) . to_value ( ) ,
259
266
"inertial-scrolling" => self . inertial_scrolling . get ( ) . to_value ( ) ,
260
267
_ => unimplemented ! ( ) ,
261
268
}
@@ -279,6 +286,15 @@ mod imp {
279
286
self . block_pinch_zoom . replace ( block_pinch_zoom) ;
280
287
self . canvas_zoom_gesture_update ( ) ;
281
288
}
289
+ "block-touch" => {
290
+ let block_touch = value
291
+ . get :: < bool > ( )
292
+ . expect ( "The value needs to be of type `bool`" ) ;
293
+ self . block_touch . replace ( block_touch) ;
294
+ self . canvas_touch_pan_update ( ) ;
295
+ self . canvas_zoom_gesture_update ( ) ;
296
+ self . canvas_kinetic_scrolling_update ( ) ;
297
+ }
282
298
"inertial-scrolling" => {
283
299
let inertial_scrolling = value
284
300
. get :: < bool > ( )
@@ -296,7 +312,7 @@ mod imp {
296
312
297
313
impl RnCanvasWrapper {
298
314
fn canvas_zoom_gesture_update ( & self ) {
299
- if !self . block_pinch_zoom . get ( ) && !self . canvas . touch_drawing ( ) {
315
+ if !self . block_pinch_zoom . get ( ) && !self . block_touch . get ( ) && ! self . canvas . touch_drawing ( ) {
300
316
self . canvas_zoom_gesture
301
317
. set_propagation_phase ( PropagationPhase :: Capture ) ;
302
318
} else {
@@ -305,9 +321,21 @@ mod imp {
305
321
}
306
322
}
307
323
324
+ fn canvas_touch_pan_update ( & self ) {
325
+ if !self . block_touch . get ( ) && !self . canvas . touch_drawing ( ) {
326
+ self . canvas_drag_gesture . set_propagation_phase ( PropagationPhase :: Bubble ) ;
327
+ self . touch_two_finger_long_press_gesture . set_propagation_phase ( PropagationPhase :: Capture ) ;
328
+ self . touch_long_press_gesture . set_propagation_phase ( PropagationPhase :: Capture ) ;
329
+ } else { // set everythinbg to `None`
330
+ self . canvas_drag_gesture . set_propagation_phase ( PropagationPhase :: None ) ;
331
+ self . touch_two_finger_long_press_gesture . set_propagation_phase ( PropagationPhase :: None ) ;
332
+ self . touch_long_press_gesture . set_propagation_phase ( PropagationPhase :: None ) ;
333
+ }
334
+ }
335
+
308
336
fn canvas_kinetic_scrolling_update ( & self ) {
309
337
self . scroller . set_kinetic_scrolling (
310
- !self . canvas . touch_drawing ( ) && self . inertial_scrolling . get ( ) ,
338
+ !self . block_touch . get ( ) && ! self . canvas . touch_drawing ( ) && self . inertial_scrolling . get ( ) ,
311
339
) ;
312
340
}
313
341
@@ -397,6 +425,7 @@ mod imp {
397
425
398
426
// Drag canvas gesture
399
427
{
428
+
400
429
let touch_drag_start = Rc :: new ( Cell :: new ( na:: vector![ 0.0 , 0.0 ] ) ) ;
401
430
402
431
self . canvas_drag_gesture . connect_drag_begin ( clone ! (
@@ -405,6 +434,7 @@ mod imp {
405
434
#[ weak( rename_to=canvaswrapper) ]
406
435
obj,
407
436
move |_, _, _| {
437
+ if canvaswrapper. block_touch( ) { return ( ) ; }
408
438
// We don't claim the sequence, because we we want to allow touch zooming.
409
439
// When the zoom gesture is recognized, it claims it and denies this touch drag gesture.
410
440
@@ -420,6 +450,7 @@ mod imp {
420
450
#[ weak( rename_to=canvaswrapper) ]
421
451
obj,
422
452
move |_, x, y| {
453
+ if canvaswrapper. block_touch( ) { return ( ) ; }
423
454
let canvas = canvaswrapper. canvas( ) ;
424
455
let new_offset = touch_drag_start. get( ) - na:: vector![ x, y] ;
425
456
let widget_flags = canvas. engine_mut( ) . camera_set_offset_expand( new_offset) ;
@@ -430,6 +461,7 @@ mod imp {
430
461
#[ weak( rename_to=canvaswrapper) ]
431
462
obj,
432
463
move |_, _, _| {
464
+ if canvaswrapper. block_touch( ) { return ( ) ; }
433
465
let widget_flags = canvaswrapper
434
466
. canvas( )
435
467
. engine_mut( )
@@ -832,6 +864,7 @@ impl RnCanvasWrapper {
832
864
pub ( crate ) fn set_show_scrollbars ( & self , show_scrollbars : bool ) {
833
865
self . set_property ( "show-scrollbars" , show_scrollbars. to_value ( ) ) ;
834
866
}
867
+
835
868
#[ allow( unused) ]
836
869
pub ( crate ) fn block_pinch_zoom ( & self ) -> bool {
837
870
self . property :: < bool > ( "block-pinch-zoom" )
@@ -842,6 +875,16 @@ impl RnCanvasWrapper {
842
875
self . set_property ( "block-pinch-zoom" , block_pinch_zoom) ;
843
876
}
844
877
878
+ #[ allow( unused) ]
879
+ pub ( crate ) fn block_touch ( & self ) -> bool {
880
+ self . property :: < bool > ( "block-touch" )
881
+ }
882
+
883
+ #[ allow( unused) ]
884
+ pub ( crate ) fn set_block_touch ( & self , block_touch : bool ) {
885
+ self . set_property ( "block-touch" , block_touch) ;
886
+ }
887
+
845
888
#[ allow( unused) ]
846
889
pub ( crate ) fn inertial_scrolling ( & self ) -> bool {
847
890
self . property :: < bool > ( "inertial-scrolling" )
@@ -885,6 +928,11 @@ impl RnCanvasWrapper {
885
928
. sync_create ( )
886
929
. build ( ) ;
887
930
931
+ let appwindow_block_touch_bind = appwindow
932
+ . bind_property ( "block-touch" , self , "block_touch" )
933
+ . sync_create ( )
934
+ . build ( ) ;
935
+
888
936
let appwindow_show_scrollbars_bind = appwindow
889
937
. sidebar ( )
890
938
. settings_panel ( )
@@ -920,6 +968,12 @@ impl RnCanvasWrapper {
920
968
{
921
969
old. unbind ( )
922
970
}
971
+ if let Some ( old) = connections
972
+ . appwindow_block_touch_bind
973
+ . replace ( appwindow_block_touch_bind)
974
+ {
975
+ old. unbind ( )
976
+ }
923
977
if let Some ( old) = connections
924
978
. appwindow_show_scrollbars_bind
925
979
. replace ( appwindow_show_scrollbars_bind)
@@ -951,6 +1005,9 @@ impl RnCanvasWrapper {
951
1005
if let Some ( old) = connections. appwindow_block_pinch_zoom_bind . take ( ) {
952
1006
old. unbind ( ) ;
953
1007
}
1008
+ if let Some ( old) = connections. appwindow_block_touch_bind . take ( ) {
1009
+ old. unbind ( ) ;
1010
+ }
954
1011
if let Some ( old) = connections. appwindow_show_scrollbars_bind . take ( ) {
955
1012
old. unbind ( ) ;
956
1013
}
0 commit comments