147 lines
5.4 KiB
JavaScript
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); |