1
0
Fork 0
su-collab/script/openseadragon/openseadragon-smartScrollZo...

147 lines
5.4 KiB
JavaScript

/**
* @file OpenSeadragon plugin that allows for adjustment of zoom speed based upon the speed that the user scrolls the mouse wheel
* @author Bassil Virk
* @version 1.0.0
*/
(function($){
$.Viewer.prototype.smartScrollZoom = function (options) {
if (!this.smartScrollZoomInstance) {
options = options || {};
options.viewer = this;
this.smartScrollZoomInstance = new $.SmartScrollZoom(options);
} else {
this.smartScrollZoomInstance.setOptions(options);
}
};
/**
* @class SmartScrollZoom
* @classdesc Changes zoom speed based on scrolling speed
* @memberof OpenSeadragon
* @param {Object} options
* @param {Number} options.timeThreshold - Amount of time, in milliseconds, that the minimum number of scrolls must occur within
* before logic begins
* @param {Number} options.minScrolls - Required number of consecutive scrolls that must take place within the specified time
* threshold of each other before logic begins
* @param {Number} options.minZoomPerScroll - Minimum factor to zoom by with a single scroll. Setting this to 1 will affectively
* result in no zoom while logic is not being executing
* @param {Number} options.maxZoomPerScroll - Maximum zoom factor that can be reached
* @param {Number} options.zoomIncrement - Amount to increment zoom factor by with every scroll after minScrolls
* @param {Boolean} options.enabled - Whether or not the scroll zoom logic is currently active
*/
$.SmartScrollZoom = function (options) {
//If this was not set to a viewer, throw an error
if (!options.viewer) {
throw new Error("SmartScrollZoom must be set to a viewer");
}
this.viewer = options.viewer; //Set viewer
this.timeThreshold = options.timeThreshold || 400;
this.minScrolls = options.minScrolls || 2;
this.minZoomPerScroll = options.minZoomPerScroll || 1.2; //OpenSeadragon has a default of 1.2
this.maxZoomPerScroll = options.maxZoomPerScroll || 2.5;
this.zoomIncrement = options.zoomIncrement || 0.2;
this.enabled = options.enabled ? true : false;
var self = this;
//Create handler for logic
this.viewer.addHandler("canvas-scroll", function () {
//Do nothing if not enabled
if (!self.enabled) {
return;
}
//Create var to count number of consecutive scrolls that have taken place within the specified time limit of each other
if (typeof self.scrollNum == 'undefined') {
self.scrollNum = 0;
}
//Create var to store the time of the previous scroll that occurred
if (typeof self.lastScroll == 'undefined') {
self.lastScroll = new Date();
}
self.currentScroll = new Date(); //Time that this scroll occurred at
//If the last scroll was less than 400 ms ago, increase the scroll count
if (self.currentScroll - self.lastScroll < self.timeThreshold) {
self.scrollNum++;
}
//Otherwise, reset the count and zoom speed
else {
self.scrollNum = 0;
self.viewer.zoomPerScroll = self.minZoomPerScroll;
}
//If user has scrolled more than twice consecutively within 400 ms, increase the scroll speed with each consecutive scroll afterwards
if (self.scrollNum > self.minScrolls) {
//Limit maximum scroll speed to 2.5
if (self.viewer.zoomPerScroll <= self.maxZoomPerScroll) {
self.viewer.zoomPerScroll += self.zoomIncrement;
}
}
self.lastScroll = self.currentScroll; //Set last scroll to now
});
};
$.SmartScrollZoom.prototype = {
/**
* Set new options
*
* @function
* @memberof OpenSeadragon.SmartScrollZoom
* @since 1.0.0
* @version 1.0.0
* @param {Object} options
*/
setOptions: function (options) {
//If no new options were specifed, do nothing
if (!options) {
return;
}
//Set time threshold
if (options.timeThreshold !== undefined) {
this.timeThreshold = options.timeThreshold;
}
//Set minimum scroll number
if (options.minScrolls !== undefined) {
this.minScrolls = options.minScrolls;
}
//Set minimum zoom per scroll
if (options.minZoomPerScroll !== undefined) {
this.minZoomPerScroll = options.minZoomPerScroll;
}
//Set maximum zoom per scroll
if (options.maxZoomPerScroll !== undefined) {
this.maxZoomPerScroll = options.maxZoomPerScroll;
}
//Set zoom increment
if (options.zoomIncrement !== undefined) {
this.zoomIncrement = options.zoomIncrement;
}
},
/**
* Toggle the enabled option
*
* @function
* @memberof OpenSeadragon.SmartScrollZoom
* @since 1.0.0
* @version 1.0.0
*/
toggleEnable: function () {
this.enabled = !this.enabled;
}
};
})(OpenSeadragon);