@@ -33,78 +33,6 @@ use crate::session::Session;
3333use crate :: utils:: * ;
3434use crate :: * ;
3535
36- struct ResizeObserverHandle {
37- elem : HtmlElement ,
38- observer : ResizeObserver ,
39- _callback : Closure < dyn FnMut ( js_sys:: Array ) > ,
40- }
41-
42- impl ResizeObserverHandle {
43- fn new ( elem : & HtmlElement , renderer : & Renderer , root : & AppHandle < PerspectiveViewer > ) -> Self {
44- let on_resize = root. callback ( |( ) | PerspectiveViewerMsg :: Resize ) ;
45- let mut state = ResizeObserverState {
46- elem : elem. clone ( ) ,
47- renderer : renderer. clone ( ) ,
48- width : elem. offset_width ( ) ,
49- height : elem. offset_height ( ) ,
50- on_resize,
51- } ;
52-
53- let _callback = ( move |xs| state. on_resize ( & xs) ) . into_closure_mut ( ) ;
54- let func = _callback. as_ref ( ) . unchecked_ref :: < js_sys:: Function > ( ) ;
55- let observer = ResizeObserver :: new ( func) ;
56- observer. observe ( elem) ;
57- Self {
58- elem : elem. clone ( ) ,
59- _callback,
60- observer,
61- }
62- }
63- }
64-
65- impl Drop for ResizeObserverHandle {
66- fn drop ( & mut self ) {
67- self . observer . unobserve ( & self . elem ) ;
68- }
69- }
70-
71- struct ResizeObserverState {
72- elem : HtmlElement ,
73- renderer : Renderer ,
74- width : i32 ,
75- height : i32 ,
76- on_resize : Callback < ( ) > ,
77- }
78-
79- impl ResizeObserverState {
80- fn on_resize ( & mut self , entries : & js_sys:: Array ) {
81- let is_visible = self
82- . elem
83- . offset_parent ( )
84- . map ( |x| !x. is_null ( ) )
85- . unwrap_or ( false ) ;
86-
87- for y in entries. iter ( ) {
88- let entry: ResizeObserverEntry = y. unchecked_into ( ) ;
89- let content = entry. content_rect ( ) ;
90- let content_width = content. width ( ) . floor ( ) as i32 ;
91- let content_height = content. height ( ) . floor ( ) as i32 ;
92- let resized = self . width != content_width || self . height != content_height;
93- if resized && is_visible {
94- clone ! ( self . on_resize, self . renderer) ;
95- ApiFuture :: spawn ( async move {
96- renderer. resize ( ) . await ?;
97- on_resize. emit ( ( ) ) ;
98- Ok ( ( ) )
99- } ) ;
100- }
101-
102- self . width = content_width;
103- self . height = content_height;
104- }
105- }
106- }
107-
10836/// A `customElements` class which encapsulates both the `<perspective-viewer>`
10937/// public API, as well as the Rust component state.
11038///
@@ -131,6 +59,7 @@ pub struct PerspectiveViewerElement {
13159 elem : HtmlElement ,
13260 root : Rc < RefCell < Option < AppHandle < PerspectiveViewer > > > > ,
13361 resize_handle : Rc < RefCell < Option < ResizeObserverHandle > > > ,
62+ intersection_handle : Rc < RefCell < Option < IntersectionObserverHandle > > > ,
13463 session : Session ,
13564 renderer : Renderer ,
13665 presentation : Presentation ,
@@ -192,6 +121,7 @@ impl PerspectiveViewerElement {
192121 renderer,
193122 presentation,
194123 resize_handle : Rc :: new ( RefCell :: new ( Some ( resize_handle) ) ) ,
124+ intersection_handle : Rc :: new ( RefCell :: new ( None ) ) ,
195125 _events : events,
196126 _subscriptions : Rc :: new ( update_sub) ,
197127 }
@@ -485,13 +415,12 @@ impl PerspectiveViewerElement {
485415 ApiFuture :: new ( async move { renderer. resize ( ) . await } )
486416 }
487417
488- /// Sets the auto-size behavior of this component. When `true`, this
418+ /// Sets the auto-size behavior of this component. When `true`, this
489419 /// `<perspective-viewer>` will register a `ResizeObserver` on itself and
490420 /// call `resize()` whenever its own dimensions change.
491421 ///
492422 /// # Arguments
493- /// - `autosize` Whether to register a `ResizeObserver` on this element or
494- /// not.
423+ /// - `autosize` Whether to enable `auto-size` behavior or not.
495424 #[ wasm_bindgen( js_name = "setAutoSize" ) ]
496425 pub fn set_auto_size ( & mut self , autosize : bool ) {
497426 if autosize {
@@ -506,6 +435,26 @@ impl PerspectiveViewerElement {
506435 }
507436 }
508437
438+ /// Sets the auto-pause behavior of this component. When `true`, this
439+ /// `<perspective-viewer>` will register an `IntersectionObserver` on
440+ /// itself and call `pause()` whenever its viewport visibility changes.
441+ ///
442+ /// # Arguments
443+ /// - `autopause` Whether to enable `auto-pause` behavior or not.
444+ #[ wasm_bindgen( js_name = "setAutoPause" ) ]
445+ pub fn set_auto_pause ( & mut self , autopause : bool ) {
446+ if autopause {
447+ let handle = Some ( IntersectionObserverHandle :: new (
448+ & self . elem ,
449+ & self . session ,
450+ & self . renderer ,
451+ ) ) ;
452+ * self . intersection_handle . borrow_mut ( ) = handle;
453+ } else {
454+ * self . intersection_handle . borrow_mut ( ) = None ;
455+ }
456+ }
457+
509458 /// Get this viewer's edit port for the currently loaded `Table`.
510459 #[ wasm_bindgen( js_name = "getEditPort" ) ]
511460 pub fn get_edit_port ( & self ) -> Result < f64 , JsValue > {
0 commit comments