@@ -142,13 +142,17 @@ class CornerstoneViewport extends Component {
142142 const { imageIdIndex } = this . state ;
143143 const imageId = imageIds [ imageIdIndex ] ;
144144
145- // EVENTS
146- this . _bindInternalEventListeners ( ) ;
147- this . _bindExternalEventListeners ( ) ;
145+ // ~~ EVENTS: CORNERSTONE
148146 this . _handleOnElementEnabledEvent ( ) ;
147+ this . _bindInternalCornerstoneEventListeners ( ) ;
148+ this . _bindExternalEventListeners ( "cornerstone" ) ;
149149
150- // Fire 'er up
151150 cornerstone . enable ( this . element , cornerstoneOptions ) ;
151+
152+ // ~~ EVENTS: ELEMENT
153+ this . _bindInternalElementEventListeners ( ) ;
154+ this . _bindExternalEventListeners ( "element" ) ;
155+
152156 if ( resizeThrottleMs ) {
153157 windowResizeHandler . enable ( this . element , resizeThrottleMs ) ;
154158 }
@@ -192,14 +196,7 @@ class CornerstoneViewport extends Component {
192196 }
193197 }
194198
195- // I pretty much only care here if the stack's updated, right?
196199 async componentDidUpdate ( prevProps , prevState ) {
197- // TODO: Expensive compare?
198- // It's actually most expensive when there are _no changes_
199- // We could _not_ update for stack changes, and instead use identity compare
200- // Where... If "StackUniqueIdentifier" has changed (displaySet/StudyId)
201- // `componentDidUpdate` is currently called every render and `newImage`
202-
203200 // ~~ STACK/IMAGE
204201 const {
205202 imageIds : stack ,
@@ -281,17 +278,14 @@ class CornerstoneViewport extends Component {
281278 cornerstoneTools . stopClip ( this . element ) ;
282279 }
283280
281+ // ~~ OVERLAY
282+ if ( isOverlayVisible !== prevIsOverlayVisible )
283+ updatedState . isOverlayVisible = isOverlayVisible
284+
284285 // ~~ STATE: Update aggregated state changes
285286 if ( Object . keys ( updatedState ) . length > 0 ) {
286287 this . setState ( updatedState ) ;
287288 }
288-
289- if ( isOverlayVisible !== prevIsOverlayVisible )
290- this . setState ( { isOverlayVisible } ) ;
291-
292- // Rebind event listeners when props change to handle functional component method
293- this . _bindExternalEventListeners ( true ) ;
294- this . _bindExternalEventListeners ( ) ;
295289 }
296290
297291 /**
@@ -304,8 +298,11 @@ class CornerstoneViewport extends Component {
304298 componentWillUnmount ( ) {
305299 const clear = true ;
306300
307- this . _bindInternalEventListeners ( clear ) ;
308- this . _bindExternalEventListeners ( clear ) ;
301+ this . _bindInternalCornerstoneEventListeners ( clear ) ;
302+ this . _bindInternalElementEventListeners ( clear ) ;
303+ this . _bindExternalEventListeners ( "cornerstone" , clear ) ;
304+ this . _bindExternalEventListeners ( "element" , clear ) ;
305+
309306 this . _setupLoadHandlers ( clear ) ;
310307 if ( this . props . isStackPrefetchEnabled ) {
311308 _enableStackPrefetching ( this . element , clear ) ;
@@ -407,17 +404,11 @@ class CornerstoneViewport extends Component {
407404 * @memberof CornerstoneViewport
408405 * @returns {undefined }
409406 */
410- _bindInternalEventListeners ( clear = false ) {
407+ _bindInternalCornerstoneEventListeners ( clear = false ) {
411408 const addOrRemoveEventListener = clear
412409 ? 'removeEventListener'
413410 : 'addEventListener' ;
414411
415- // Updates state's imageId, and imageIndex
416- this . element [ addOrRemoveEventListener ] (
417- cornerstone . EVENTS . NEW_IMAGE ,
418- this . onNewImage
419- ) ;
420-
421412 // Update image load progress
422413 cornerstone . events [ addOrRemoveEventListener ] (
423414 'cornerstoneimageloadprogress' ,
@@ -429,6 +420,25 @@ class CornerstoneViewport extends Component {
429420 cornerstone . EVENTS . IMAGE_LOADED ,
430421 this . onImageLoaded
431422 ) ;
423+ }
424+
425+ /**
426+ *
427+ *
428+ * @param {boolean } [clear=false] - True to clear event listeners
429+ * @memberof CornerstoneViewport
430+ * @returns {undefined }
431+ */
432+ _bindInternalElementEventListeners ( clear = false ) {
433+ const addOrRemoveEventListener = clear
434+ ? 'removeEventListener'
435+ : 'addEventListener' ;
436+
437+ // Updates state's imageId, and imageIndex
438+ this . element [ addOrRemoveEventListener ] (
439+ cornerstone . EVENTS . NEW_IMAGE ,
440+ this . onNewImage
441+ ) ;
432442
433443 // Updates state's viewport
434444 this . element [ addOrRemoveEventListener ] (
@@ -461,10 +471,11 @@ class CornerstoneViewport extends Component {
461471
462472 /**
463473 *
474+ * @param {string } target - "cornerstone" || "element"
464475 * @param {boolean } [clear=false] - True to clear event listeners
465476 * @returns {undefined }
466477 */
467- _bindExternalEventListeners ( clear = false ) {
478+ _bindExternalEventListeners ( target , clear = false ) {
468479 if ( ! this . eventListeners ) {
469480 return ;
470481 }
@@ -477,7 +488,9 @@ class CornerstoneViewport extends Component {
477488
478489 for ( let i = 0 ; i < this . eventListeners . length ; i ++ ) {
479490 const { target : targetType , eventName, handler } = this . eventListeners [ i ] ;
480- const target =
491+ if ( targetType !== target ) { continue ; }
492+
493+ const targetElementOrCornerstone =
481494 targetType === 'element' ? this . element : cornerstone . events ;
482495
483496 if (
@@ -490,7 +503,7 @@ class CornerstoneViewport extends Component {
490503 continue ;
491504 }
492505
493- target [ addOrRemoveEventListener ] ( eventName , handler ) ;
506+ targetElementOrCornerstone [ addOrRemoveEventListener ] ( eventName , handler ) ;
494507 }
495508 }
496509
@@ -611,6 +624,7 @@ class CornerstoneViewport extends Component {
611624
612625 if ( this . props . onNewImage ) {
613626 this . props . onNewImage ( {
627+ currentImageIdIndex,
614628 sopInstanceUid,
615629 } ) ;
616630 }
0 commit comments