Skip to content

Commit 5ccf95e

Browse files
fix: Refactor event bindings of viewport (#62)
* Fix event bindings of viewport * Remove comment
1 parent a18dd08 commit 5ccf95e

File tree

1 file changed

+44
-30
lines changed

1 file changed

+44
-30
lines changed

src/CornerstoneViewport/CornerstoneViewport.js

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)