80 lines
2.7 KiB
JavaScript
80 lines
2.7 KiB
JavaScript
import { Template } from 'meteor/templating';
|
|
import { $ } from 'meteor/jquery';
|
|
import { _ } from 'meteor/underscore';
|
|
import { OHIF } from 'meteor/ohif:core';
|
|
import { setActiveViewport } from '../../../lib/setActiveViewport';
|
|
import { switchToImageByIndex } from '../../../lib/switchToImageByIndex';
|
|
|
|
const slideTimeoutTime = 40;
|
|
let slideTimeout;
|
|
|
|
Template.imageControls.onRendered(() => {
|
|
const instance = Template.instance();
|
|
|
|
// Set the current imageSlider width to its parent's height
|
|
// (because webkit is stupid and can't style vertical sliders)
|
|
const $slider = instance.$('.imageSlider');
|
|
const $viewport = $slider.closest('.imageViewerViewportOverlay').siblings('.imageViewerViewport');
|
|
|
|
instance.handleResize = _.throttle(() => {
|
|
const viewportHeight = $viewport.height();
|
|
$slider.width(viewportHeight - 20);
|
|
}, 150);
|
|
|
|
instance.handleResize();
|
|
|
|
$(window).on('resize', instance.handleResize);
|
|
});
|
|
|
|
Template.imageControls.onDestroyed(() => {
|
|
const instance = Template.instance();
|
|
if (instance.handleResize) {
|
|
$(window).off('resize', instance.handleResize);
|
|
}
|
|
});
|
|
|
|
Template.imageControls.events({
|
|
'rescale .scrollbar'(event, instance) {
|
|
instance.handleResize();
|
|
},
|
|
|
|
'keydown input[type=range]'(event) {
|
|
// We don't allow direct keyboard up/down input on the
|
|
// image sliders since the natural direction is reversed (0 is at the top)
|
|
|
|
// Store the KeyCodes in an object for readability
|
|
const keys = {
|
|
DOWN: 40,
|
|
UP: 38
|
|
};
|
|
|
|
if (event.which === keys.DOWN) {
|
|
OHIF.commands.run('scrollDown');
|
|
event.preventDefault();
|
|
} else if (event.which === keys.UP) {
|
|
OHIF.commands.run('scrollUp');
|
|
event.preventDefault();
|
|
}
|
|
},
|
|
|
|
'input input[type=range], change input[type=range]'(event) {
|
|
// Note that we throttle requests to prevent the
|
|
// user's ultrafast scrolling from firing requests too quickly.
|
|
clearTimeout(slideTimeout);
|
|
slideTimeout = setTimeout(() => {
|
|
// Using the slider in an inactive viewport
|
|
// should cause that viewport to become active
|
|
const $slider = $(event.currentTarget);
|
|
const newActiveElement = $slider.parents('.viewportContainer').find('.imageViewerViewport');
|
|
setActiveViewport(newActiveElement);
|
|
|
|
// Subtract 1 here since the slider goes from 1 to N images
|
|
// But the stack indexing starts at 0
|
|
const newImageIdIndex = parseInt($slider.val(), 10) - 1;
|
|
switchToImageByIndex(newImageIdIndex);
|
|
}, slideTimeoutTime);
|
|
|
|
return false;
|
|
}
|
|
});
|