Improving bidirectional tool usability

This commit is contained in:
Bruno Alves de Faria 2017-09-01 19:21:40 -03:00
parent 1b0c1d9a3d
commit ffd59650eb

View File

@ -22,7 +22,7 @@ var keys = {
}; };
// The distance between the mouse and the tool to make it active // The distance between the mouse and the tool to make it active
var distanceThreshold = 7; var distanceThreshold = 6;
// Define a callback to get your text annotation // Define a callback to get your text annotation
// This could be used, e.g. to open a modal // This could be used, e.g. to open a modal
@ -46,7 +46,7 @@ function createNewMeasurement(mouseEventData) {
y: mouseEventData.currentPoints.image.y, y: mouseEventData.currentPoints.image.y,
highlight: true, highlight: true,
active: false, active: false,
drawnIndependently: true, drawnIndependently: false,
allowedOutsideImage: true, allowedOutsideImage: true,
index: 0 index: 0
}, },
@ -55,7 +55,7 @@ function createNewMeasurement(mouseEventData) {
y: mouseEventData.currentPoints.image.y, y: mouseEventData.currentPoints.image.y,
highlight: true, highlight: true,
active: true, active: true,
drawnIndependently: true, drawnIndependently: false,
allowedOutsideImage: true, allowedOutsideImage: true,
index: 1 index: 1
}, },
@ -74,7 +74,7 @@ function createNewMeasurement(mouseEventData) {
highlight: true, highlight: true,
active: false, active: false,
locked: true, // If perpendicular line is connected to long-line locked: true, // If perpendicular line is connected to long-line
drawnIndependently: true, drawnIndependently: false,
allowedOutsideImage: true, allowedOutsideImage: true,
index: 2 index: 2
}, },
@ -83,7 +83,7 @@ function createNewMeasurement(mouseEventData) {
y: mouseEventData.currentPoints.image.y, y: mouseEventData.currentPoints.image.y,
highlight: true, highlight: true,
active: false, active: false,
drawnIndependently: true, drawnIndependently: false,
allowedOutsideImage: true, allowedOutsideImage: true,
index: 3 index: 3
} }
@ -145,6 +145,9 @@ function addNewMeasurement(mouseEventData) {
// Bind a one-time event listener for the Esc key // Bind a one-time event listener for the Esc key
$(element).one('keydown', cancelCallback); $(element).one('keydown', cancelCallback);
// Make handle invisible while moving
measurementData.handles.end.drawnIndependently = true;
cornerstone.updateImage(element); cornerstone.updateImage(element);
cornerstoneTools.moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function() { cornerstoneTools.moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function() {
@ -162,6 +165,9 @@ function addNewMeasurement(mouseEventData) {
// perpendicular line is not connected to long-line // perpendicular line is not connected to long-line
measurementData.handles.perpendicularStart.locked = false; measurementData.handles.perpendicularStart.locked = false;
// Enable handle visibility again
measurementData.handles.end.drawnIndependently = false;
$(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback); $(element).on('CornerstoneToolsMouseMove', eventData, mouseMoveCallback);
$(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback); $(element).on('CornerstoneToolsMouseDown', eventData, mouseDownCallback);
$(element).on('CornerstoneToolsMouseDownActivate', eventData, cornerstoneTools.bidirectional.mouseDownActivateCallback); $(element).on('CornerstoneToolsMouseDownActivate', eventData, cornerstoneTools.bidirectional.mouseDownActivateCallback);
@ -377,7 +383,7 @@ function perpendicularLeftFixedPoint(eventData, data) {
if (length === 0) { if (length === 0) {
return false; return false;
} }
var dx = (data.handles.start.x - data.handles.end.x) / length; var dx = (data.handles.start.x - data.handles.end.x) / length;
var dy = (data.handles.start.y - data.handles.end.y) / length; var dy = (data.handles.start.y - data.handles.end.y) / length;
@ -655,21 +661,22 @@ function setHandlesPosition(handle, eventData, data) {
} }
} }
// Sets drawnIndependently property of control points(handles)
function setControlPoints(handles, value) {
Object.keys(handles).forEach(function(name) {
if (name !== 'textBox') {
var handle = handles[name];
handle.drawnIndependently = value;
}
});
}
//****************************************/ //****************************************/
// Cornerstone Methods // Cornerstone Methods
//****************************************/ //****************************************/
// Set if the circular handles will be visible or not
function setHandlesVisible (handles, isVisibile) {
Object.keys(handles).forEach(handleKey => {
if (handleKey === 'textBox') return;
handles[handleKey].drawnIndependently = !isVisibile;
});
};
function moveHandle(mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) { function moveHandle(mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {
// Make handle invisible while moving
handle.drawnIndependently = true;
var element = mouseEventData.element; var element = mouseEventData.element;
var distanceFromTool = { var distanceFromTool = {
x: handle.x - mouseEventData.currentPoints.image.x, x: handle.x - mouseEventData.currentPoints.image.x,
@ -708,7 +715,8 @@ function moveHandle(mouseEventData, toolType, data, handle, doneMovingCallback,
$(element).on('CornerstoneToolsMouseDrag', mouseDragCallback); $(element).on('CornerstoneToolsMouseDrag', mouseDragCallback);
function mouseUpCallback() { function mouseUpCallback() {
handle.active = false; // Enable handle visibility again
handle.drawnIndependently = false;
$(element).off('CornerstoneToolsMouseDrag', mouseDragCallback); $(element).off('CornerstoneToolsMouseDrag', mouseDragCallback);
$(element).off('CornerstoneToolsMouseUp', mouseUpCallback); $(element).off('CornerstoneToolsMouseUp', mouseUpCallback);
$(element).off('CornerstoneToolsMouseClick', mouseUpCallback); $(element).off('CornerstoneToolsMouseClick', mouseUpCallback);
@ -751,9 +759,6 @@ function mouseMoveCallback(e, eventData) {
if ((pointNearTool(eventData.element, data, coords) && !data.active) || (!pointNearTool(eventData.element, data, coords) && data.active)) { if ((pointNearTool(eventData.element, data, coords) && !data.active) || (!pointNearTool(eventData.element, data, coords) && data.active)) {
data.active = !data.active; data.active = !data.active;
// Set handles visibility
setControlPoints(data.handles, !data.active);
imageNeedsUpdate = true; imageNeedsUpdate = true;
} }
} }
@ -770,7 +775,6 @@ function mouseDownCallback(e, eventData) {
var element = eventData.element; var element = eventData.element;
function handleDoneMove() { function handleDoneMove() {
data.active = false;
data.invalidated = true; data.invalidated = true;
if (cornerstoneTools.anyHandlesOutsideImage(eventData, data.handles)) { if (cornerstoneTools.anyHandlesOutsideImage(eventData, data.handles)) {
// delete the measurement // delete the measurement
@ -791,9 +795,7 @@ function mouseDownCallback(e, eventData) {
if (toolData) { if (toolData) {
for (i = 0; i < toolData.data.length; i++) { for (i = 0; i < toolData.data.length; i++) {
data = toolData.data[i]; data = toolData.data[i];
// Hide control points var distance = 6;
setControlPoints(data.handles, true);
var distance = 5;
var handle = cornerstoneTools.getHandleNearImagePoint(element, data.handles, coords, distance); var handle = cornerstoneTools.getHandleNearImagePoint(element, data.handles, coords, distance);
if (handle) { if (handle) {
$(element).off('CornerstoneToolsMouseMove', mouseMoveCallback); $(element).off('CornerstoneToolsMouseMove', mouseMoveCallback);
@ -864,7 +866,7 @@ function drawPerpendicularLine(context, eventData, element, data, color, lineWid
startX = mid.x + (perpendicularLineLength / 2) * vectorY; startX = mid.x + (perpendicularLineLength / 2) * vectorY;
startY = mid.y - (perpendicularLineLength / 2) * vectorX; startY = mid.y - (perpendicularLineLength / 2) * vectorX;
endX = mid.x - (perpendicularLineLength / 2) * vectorY; endX = mid.x - (perpendicularLineLength / 2) * vectorY;
endY = mid.y + (perpendicularLineLength / 2) * vectorX; endY = mid.y + (perpendicularLineLength / 2) * vectorX;
} }
if (data.handles.perpendicularStart.locked) { if (data.handles.perpendicularStart.locked) {
@ -993,7 +995,7 @@ function onImageRendered(e, eventData) {
drawPerpendicularLine(context, eventData, element, data, color, strokeWidth); drawPerpendicularLine(context, eventData, element, data, color, strokeWidth);
// draw the handles // draw the handles
cornerstoneTools.drawHandles(context, eventData, data.handles, color); cornerstoneTools.drawHandles(context, eventData, data.handles, color, { drawHandlesIfActive: true });
// Calculate the long axis length // Calculate the long axis length
var dx = (data.handles.start.x - data.handles.end.x) * (eventData.image.columnPixelSpacing || 1); var dx = (data.handles.start.x - data.handles.end.x) * (eventData.image.columnPixelSpacing || 1);