2019-10-09 16:23:14 +02:00
|
|
|
import OHIF from '@ohif/core';
|
|
|
|
|
import cornerstone from 'cornerstone-core';
|
|
|
|
|
import csTools from 'cornerstone-tools';
|
|
|
|
|
import throttle from 'lodash.throttle';
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
onAdded,
|
|
|
|
|
onRemoved,
|
|
|
|
|
onModified,
|
|
|
|
|
} = OHIF.measurements.MeasurementHandlers;
|
|
|
|
|
|
|
|
|
|
const MEASUREMENT_ACTION_MAP = {
|
|
|
|
|
added: onAdded,
|
|
|
|
|
removed: onRemoved,
|
|
|
|
|
modified: throttle(event => {
|
|
|
|
|
return onModified(event);
|
|
|
|
|
}, 300),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* @export
|
2019-12-09 18:47:23 +01:00
|
|
|
* @param {Object} servicesManager
|
|
|
|
|
* @param {Object} configuration
|
2019-10-09 16:23:14 +02:00
|
|
|
*/
|
2019-12-09 18:47:23 +01:00
|
|
|
export default function init({
|
|
|
|
|
servicesManager,
|
|
|
|
|
commandsManager,
|
|
|
|
|
configuration,
|
|
|
|
|
}) {
|
|
|
|
|
const {
|
|
|
|
|
UIContextMenuService,
|
|
|
|
|
UILabellingFlowService,
|
|
|
|
|
} = servicesManager.services;
|
2019-10-09 16:23:14 +02:00
|
|
|
|
|
|
|
|
// TODO: MEASUREMENT_COMPLETED (not present in initial implementation)
|
|
|
|
|
const onMeasurementsChanged = (action, event) => {
|
|
|
|
|
return MEASUREMENT_ACTION_MAP[action](event);
|
|
|
|
|
};
|
|
|
|
|
const onMeasurementAdded = onMeasurementsChanged.bind(this, 'added');
|
|
|
|
|
const onMeasurementRemoved = onMeasurementsChanged.bind(this, 'removed');
|
|
|
|
|
const onMeasurementModified = onMeasurementsChanged.bind(this, 'modified');
|
|
|
|
|
const onLabelmapModified = onMeasurementsChanged.bind(
|
|
|
|
|
this,
|
|
|
|
|
'labelmapModified'
|
|
|
|
|
);
|
2019-12-09 18:47:23 +01:00
|
|
|
|
|
|
|
|
const onRightClick = event => {
|
|
|
|
|
if (UIContextMenuService) {
|
|
|
|
|
UIContextMenuService.show({ event: event.detail });
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const onTouchPress = event => {
|
|
|
|
|
if (UIContextMenuService) {
|
|
|
|
|
UIContextMenuService.show({
|
|
|
|
|
event: event.detail,
|
|
|
|
|
props: {
|
|
|
|
|
isTouchEvent: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const onTouchStart = () => resetLabelligAndContextMenu();
|
|
|
|
|
|
|
|
|
|
const onMouseClick = () => resetLabelligAndContextMenu();
|
|
|
|
|
|
|
|
|
|
const resetLabelligAndContextMenu = () => {
|
|
|
|
|
if (UILabellingFlowService && UIContextMenuService) {
|
|
|
|
|
UILabellingFlowService.hide();
|
|
|
|
|
UIContextMenuService.hide();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// TODO: This makes scrolling painfully slow
|
|
|
|
|
// const onNewImage = ...
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Because click gives us the native "mouse up", buttons will always be `0`
|
|
|
|
|
* Need to fallback to event.which;
|
|
|
|
|
*
|
|
|
|
|
*/
|
2019-10-09 16:23:14 +02:00
|
|
|
const handleClick = cornerstoneMouseClickEvent => {
|
|
|
|
|
const mouseUpEvent = cornerstoneMouseClickEvent.detail.event;
|
|
|
|
|
const isRightClick = mouseUpEvent.which === 3;
|
|
|
|
|
|
|
|
|
|
if (isRightClick) {
|
|
|
|
|
onRightClick(cornerstoneMouseClickEvent);
|
|
|
|
|
} else {
|
|
|
|
|
onMouseClick(cornerstoneMouseClickEvent);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function elementEnabledHandler(evt) {
|
|
|
|
|
const element = evt.detail.element;
|
|
|
|
|
|
|
|
|
|
element.addEventListener(
|
|
|
|
|
csTools.EVENTS.MEASUREMENT_ADDED,
|
|
|
|
|
onMeasurementAdded
|
|
|
|
|
);
|
|
|
|
|
element.addEventListener(
|
|
|
|
|
csTools.EVENTS.MEASUREMENT_REMOVED,
|
|
|
|
|
onMeasurementRemoved
|
|
|
|
|
);
|
|
|
|
|
element.addEventListener(
|
|
|
|
|
csTools.EVENTS.MEASUREMENT_MODIFIED,
|
|
|
|
|
onMeasurementModified
|
|
|
|
|
);
|
|
|
|
|
element.addEventListener(
|
|
|
|
|
csTools.EVENTS.LABELMAP_MODIFIED,
|
|
|
|
|
onLabelmapModified
|
|
|
|
|
);
|
2019-12-09 18:47:23 +01:00
|
|
|
|
2019-10-09 16:23:14 +02:00
|
|
|
element.addEventListener(csTools.EVENTS.TOUCH_PRESS, onTouchPress);
|
|
|
|
|
element.addEventListener(csTools.EVENTS.MOUSE_CLICK, handleClick);
|
|
|
|
|
element.addEventListener(csTools.EVENTS.TOUCH_START, onTouchStart);
|
2019-12-09 18:47:23 +01:00
|
|
|
|
2019-10-09 16:23:14 +02:00
|
|
|
// TODO: This makes scrolling painfully slow
|
|
|
|
|
// element.addEventListener(cornerstone.EVENTS.NEW_IMAGE, onNewImage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function elementDisabledHandler(evt) {
|
|
|
|
|
const element = evt.detail.element;
|
|
|
|
|
|
|
|
|
|
element.removeEventListener(
|
|
|
|
|
csTools.EVENTS.MEASUREMENT_ADDED,
|
|
|
|
|
onMeasurementAdded
|
|
|
|
|
);
|
|
|
|
|
element.removeEventListener(
|
|
|
|
|
csTools.EVENTS.MEASUREMENT_REMOVED,
|
|
|
|
|
onMeasurementRemoved
|
|
|
|
|
);
|
|
|
|
|
element.removeEventListener(
|
|
|
|
|
csTools.EVENTS.MEASUREMENT_MODIFIED,
|
|
|
|
|
onMeasurementModified
|
|
|
|
|
);
|
|
|
|
|
element.removeEventListener(
|
|
|
|
|
csTools.EVENTS.LABELMAP_MODIFIED,
|
|
|
|
|
onLabelmapModified
|
|
|
|
|
);
|
2019-12-09 18:47:23 +01:00
|
|
|
|
2019-10-09 16:23:14 +02:00
|
|
|
element.removeEventListener(csTools.EVENTS.TOUCH_PRESS, onTouchPress);
|
|
|
|
|
element.removeEventListener(csTools.EVENTS.MOUSE_CLICK, handleClick);
|
|
|
|
|
element.removeEventListener(csTools.EVENTS.TOUCH_START, onTouchStart);
|
2019-12-09 18:47:23 +01:00
|
|
|
|
|
|
|
|
// TODO: This makes scrolling painfully slow
|
2019-10-09 16:23:14 +02:00
|
|
|
// element.removeEventListener(cornerstone.EVENTS.NEW_IMAGE, onNewImage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cornerstone.events.addEventListener(
|
|
|
|
|
cornerstone.EVENTS.ELEMENT_ENABLED,
|
|
|
|
|
elementEnabledHandler
|
|
|
|
|
);
|
|
|
|
|
cornerstone.events.addEventListener(
|
|
|
|
|
cornerstone.EVENTS.ELEMENT_DISABLED,
|
|
|
|
|
elementDisabledHandler
|
|
|
|
|
);
|
|
|
|
|
}
|