Merge pull request #46 from houseofyin/issue37-navigator
Issue37 navigator
@ -109,6 +109,7 @@ module.exports = function(grunt) {
|
|||||||
qunit: {
|
qunit: {
|
||||||
all: {
|
all: {
|
||||||
options: {
|
options: {
|
||||||
|
timeout: 10000,
|
||||||
urls: [ "http://localhost:8000/test/test.html" ]
|
urls: [ "http://localhost:8000/test/test.html" ]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,9 +66,12 @@ $.ControlAnchor = {
|
|||||||
* @property {Element} wrapper - a nuetral element surrounding the control
|
* @property {Element} wrapper - a nuetral element surrounding the control
|
||||||
* element.
|
* element.
|
||||||
*/
|
*/
|
||||||
$.Control = function ( element, anchor, container ) {
|
$.Control = function ( element, options, container ) {
|
||||||
|
var parent = element.parentNode;
|
||||||
|
options.attachToViewer = (typeof options.attachToViewer === 'undefined') ? true : options.attachToViewer;
|
||||||
|
this.autoFade = (typeof options.autoFade === 'undefined') ? true : options.autoFade;
|
||||||
this.element = element;
|
this.element = element;
|
||||||
this.anchor = anchor;
|
this.anchor = options.anchor;
|
||||||
this.container = container;
|
this.container = container;
|
||||||
this.wrapper = $.makeNeutralElement( "span" );
|
this.wrapper = $.makeNeutralElement( "span" );
|
||||||
this.wrapper.style.display = "inline-block";
|
this.wrapper.style.display = "inline-block";
|
||||||
@ -79,6 +82,7 @@ $.Control = function ( element, anchor, container ) {
|
|||||||
this.wrapper.style.width = this.wrapper.style.height = "100%";
|
this.wrapper.style.width = this.wrapper.style.height = "100%";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.attachToViewer ) {
|
||||||
if ( this.anchor == $.ControlAnchor.TOP_RIGHT ||
|
if ( this.anchor == $.ControlAnchor.TOP_RIGHT ||
|
||||||
this.anchor == $.ControlAnchor.BOTTOM_RIGHT ) {
|
this.anchor == $.ControlAnchor.BOTTOM_RIGHT ) {
|
||||||
this.container.insertBefore(
|
this.container.insertBefore(
|
||||||
@ -88,6 +92,9 @@ $.Control = function ( element, anchor, container ) {
|
|||||||
} else {
|
} else {
|
||||||
this.container.appendChild( this.wrapper );
|
this.container.appendChild( this.wrapper );
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
parent.appendChild( this.wrapper );
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$.Control.prototype = {
|
$.Control.prototype = {
|
||||||
|
@ -88,7 +88,7 @@
|
|||||||
/**
|
/**
|
||||||
* @function
|
* @function
|
||||||
*/
|
*/
|
||||||
addControl: function ( element, anchor ) {
|
addControl: function ( element, controlOptions ) {
|
||||||
element = $.getElement( element );
|
element = $.getElement( element );
|
||||||
var div = null;
|
var div = null;
|
||||||
|
|
||||||
@ -96,7 +96,7 @@
|
|||||||
return; // they're trying to add a duplicate control
|
return; // they're trying to add a duplicate control
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( anchor ) {
|
switch ( controlOptions.anchor ) {
|
||||||
case $.ControlAnchor.TOP_RIGHT:
|
case $.ControlAnchor.TOP_RIGHT:
|
||||||
div = this.controls.topright;
|
div = this.controls.topright;
|
||||||
element.style.position = "relative";
|
element.style.position = "relative";
|
||||||
@ -130,7 +130,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.controls.push(
|
this.controls.push(
|
||||||
new $.Control( element, anchor, div )
|
new $.Control( element, controlOptions, div )
|
||||||
);
|
);
|
||||||
element.style.display = "inline-block";
|
element.style.display = "inline-block";
|
||||||
},
|
},
|
||||||
|
@ -82,7 +82,7 @@ $.EventHandler.prototype = {
|
|||||||
if( $.isArray( events ) ){
|
if( $.isArray( events ) ){
|
||||||
for( i = 0; i < events.length; i++ ){
|
for( i = 0; i < events.length; i++ ){
|
||||||
if( events[ i ] !== handler ){
|
if( events[ i ] !== handler ){
|
||||||
handlers.push( handler );
|
handlers.push( events[ i ] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.events[ eventName ] = handlers;
|
this.events[ eventName ] = handlers;
|
||||||
|
168
src/navigator.js
@ -51,16 +51,26 @@ $.Navigator = function( options ){
|
|||||||
|
|
||||||
var _this = this,
|
var _this = this,
|
||||||
viewer = options.viewer,
|
viewer = options.viewer,
|
||||||
viewerSize = $.getElementSize( viewer.element );
|
viewerSize = $.getElementSize( viewer.element),
|
||||||
|
unneededElement;
|
||||||
|
|
||||||
//We may need to create a new element and id if they did not
|
//We may need to create a new element and id if they did not
|
||||||
//provide the id for the existing element
|
//provide the id for the existing element
|
||||||
if( !options.id ){
|
if( !options.id ){
|
||||||
options.id = 'navigator-' + (+new Date());
|
options.id = 'navigator-' + (+new Date());
|
||||||
this.element = $.makeNeutralElement( "div" );
|
this.element = $.makeNeutralElement( "div" );
|
||||||
this.element.id = options.id;
|
options.controlOptions = {anchor: $.ControlAnchor.TOP_RIGHT,
|
||||||
this.element.className = 'navigator';
|
attachToViewer: true,
|
||||||
|
autoFade: true};
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
this.element = document.getElementById( options.id );
|
||||||
|
options.controlOptions = {anchor: $.ControlAnchor.NONE,
|
||||||
|
attachToViewer: false,
|
||||||
|
autoFade: false};
|
||||||
|
}
|
||||||
|
this.element.id = options.id;
|
||||||
|
this.element.className += ' navigator';
|
||||||
|
|
||||||
options = $.extend( true, {
|
options = $.extend( true, {
|
||||||
sizeRatio: $.DEFAULT_SETTINGS.navigatorSizeRatio
|
sizeRatio: $.DEFAULT_SETTINGS.navigatorSizeRatio
|
||||||
@ -79,29 +89,36 @@ $.Navigator = function( options ){
|
|||||||
|
|
||||||
options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;
|
options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;
|
||||||
|
|
||||||
(function( style ){
|
this.viewerSizeInPoints = viewer.viewport.deltaPointsFromPixels(viewerSize);
|
||||||
style.marginTop = '0px';
|
this.borderWidth = 2;
|
||||||
style.marginRight = '0px';
|
//At some browser magnification levels the display regions lines up correctly, but at some there appears to
|
||||||
style.marginBottom = '0px';
|
//be a one pixel gap.
|
||||||
style.marginLeft = '0px';
|
this.fudge = new $.Point(1, 1);
|
||||||
style.border = '2px solid #555';
|
this.totalBorderWidths = new $.Point(this.borderWidth*2, this.borderWidth*2).minus(this.fudge);
|
||||||
|
|
||||||
|
|
||||||
|
(function( style, borderWidth ){
|
||||||
|
style.margin = '0px';
|
||||||
|
style.border = borderWidth + 'px solid #555';
|
||||||
|
style.padding = '0px';
|
||||||
style.background = '#000';
|
style.background = '#000';
|
||||||
style.opacity = 0.8;
|
style.opacity = 0.8;
|
||||||
style.overflow = 'hidden';
|
style.overflow = 'hidden';
|
||||||
}( this.element.style ));
|
}( this.element.style, this.borderWidth));
|
||||||
|
|
||||||
this.displayRegion = $.makeNeutralElement( "textarea" );
|
this.displayRegion = $.makeNeutralElement( "div" );
|
||||||
this.displayRegion.id = this.element.id + '-displayregion';
|
this.displayRegion.id = this.element.id + '-displayregion';
|
||||||
this.displayRegion.className = 'displayregion';
|
this.displayRegion.className = 'displayregion';
|
||||||
|
|
||||||
(function( style ){
|
(function( style, borderWidth ){
|
||||||
style.position = 'relative';
|
style.position = 'relative';
|
||||||
style.top = '0px';
|
style.top = '0px';
|
||||||
style.left = '0px';
|
style.left = '0px';
|
||||||
style.fontSize = '0px';
|
style.fontSize = '0px';
|
||||||
style.overflow = 'hidden';
|
style.overflow = 'hidden';
|
||||||
style.border = '2px solid #900';
|
style.border = borderWidth + 'px solid #900';
|
||||||
|
style.margin = '0px';
|
||||||
|
style.padding = '0px';
|
||||||
//TODO: IE doesnt like this property being set
|
//TODO: IE doesnt like this property being set
|
||||||
//try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/}
|
//try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/}
|
||||||
|
|
||||||
@ -116,10 +133,13 @@ $.Navigator = function( options ){
|
|||||||
style.styleFloat = 'left'; //IE
|
style.styleFloat = 'left'; //IE
|
||||||
style.zIndex = 999999999;
|
style.zIndex = 999999999;
|
||||||
style.cursor = 'default';
|
style.cursor = 'default';
|
||||||
}( this.displayRegion.style ));
|
}( this.displayRegion.style, this.borderWidth ));
|
||||||
|
|
||||||
|
|
||||||
this.element.innerTracker = new $.MouseTracker({
|
this.element.innerTracker = new $.MouseTracker({
|
||||||
element: this.element,
|
element: this.element,
|
||||||
|
clickHandler: $.delegate( this, onCanvasClick ),
|
||||||
|
releaseHandler: $.delegate( this, onCanvasRelease ),
|
||||||
scrollHandler: function(){
|
scrollHandler: function(){
|
||||||
//dont scroll the page up and down if the user is scrolling
|
//dont scroll the page up and down if the user is scrolling
|
||||||
//in the navigator
|
//in the navigator
|
||||||
@ -131,77 +151,10 @@ $.Navigator = function( options ){
|
|||||||
element: this.displayRegion,
|
element: this.displayRegion,
|
||||||
clickTimeThreshold: this.clickTimeThreshold,
|
clickTimeThreshold: this.clickTimeThreshold,
|
||||||
clickDistThreshold: this.clickDistThreshold,
|
clickDistThreshold: this.clickDistThreshold,
|
||||||
clickHandler: $.delegate( this, onCanvasClick ),
|
|
||||||
dragHandler: $.delegate( this, onCanvasDrag ),
|
dragHandler: $.delegate( this, onCanvasDrag ),
|
||||||
releaseHandler: $.delegate( this, onCanvasRelease ),
|
releaseHandler: $.delegate( this, onCanvasRelease ),
|
||||||
scrollHandler: $.delegate( this, onCanvasScroll ),
|
scrollHandler: $.delegate( this, onCanvasScroll )
|
||||||
focusHandler: function(){
|
|
||||||
var point = $.getElementPosition( _this.viewer.element );
|
|
||||||
|
|
||||||
window.scrollTo( 0, point.y );
|
|
||||||
|
|
||||||
_this.viewer.setControlsEnabled( true );
|
|
||||||
(function( style ){
|
|
||||||
style.border = '2px solid #437AB2';
|
|
||||||
//style.outline = '2px auto #437AB2';
|
|
||||||
}( this.element.style ));
|
|
||||||
|
|
||||||
},
|
|
||||||
blurHandler: function(){
|
|
||||||
_this.viewer.setControlsEnabled( false );
|
|
||||||
(function( style ){
|
|
||||||
style.border = '2px solid #900';
|
|
||||||
//style.outline = '2px auto #900';
|
|
||||||
}( this.element.style ));
|
|
||||||
},
|
|
||||||
keyHandler: function(tracker, keyCode, shiftKey){
|
|
||||||
//console.log( keyCode );
|
|
||||||
switch( keyCode ){
|
|
||||||
case 61://=|+
|
|
||||||
_this.viewer.viewport.zoomBy(1.1);
|
|
||||||
_this.viewer.viewport.applyConstraints();
|
|
||||||
return false;
|
|
||||||
case 45://-|_
|
|
||||||
_this.viewer.viewport.zoomBy(0.9);
|
|
||||||
_this.viewer.viewport.applyConstraints();
|
|
||||||
return false;
|
|
||||||
case 48://0|)
|
|
||||||
_this.viewer.viewport.goHome();
|
|
||||||
_this.viewer.viewport.applyConstraints();
|
|
||||||
return false;
|
|
||||||
case 119://w
|
|
||||||
case 87://W
|
|
||||||
case 38://up arrow
|
|
||||||
if (shiftKey)
|
|
||||||
_this.viewer.viewport.zoomBy(1.1);
|
|
||||||
else
|
|
||||||
_this.viewer.viewport.panBy(new $.Point(0, -0.05));
|
|
||||||
_this.viewer.viewport.applyConstraints();
|
|
||||||
return false;
|
|
||||||
case 115://s
|
|
||||||
case 83://S
|
|
||||||
case 40://down arrow
|
|
||||||
if (shiftKey)
|
|
||||||
_this.viewer.viewport.zoomBy(0.9);
|
|
||||||
else
|
|
||||||
_this.viewer.viewport.panBy(new $.Point(0, 0.05));
|
|
||||||
_this.viewer.viewport.applyConstraints();
|
|
||||||
return false;
|
|
||||||
case 97://a
|
|
||||||
case 37://left arrow
|
|
||||||
_this.viewer.viewport.panBy(new $.Point(-0.05, 0));
|
|
||||||
_this.viewer.viewport.applyConstraints();
|
|
||||||
return false;
|
|
||||||
case 100://d
|
|
||||||
case 39://right arrow
|
|
||||||
_this.viewer.viewport.panBy(new $.Point(0.05, 0));
|
|
||||||
_this.viewer.viewport.applyConstraints();
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
//console.log( 'navigator keycode %s', keyCode );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).setTracking( true ); // default state
|
}).setTracking( true ); // default state
|
||||||
|
|
||||||
/*this.displayRegion.outerTracker = new $.MouseTracker({
|
/*this.displayRegion.outerTracker = new $.MouseTracker({
|
||||||
@ -216,7 +169,7 @@ $.Navigator = function( options ){
|
|||||||
|
|
||||||
viewer.addControl(
|
viewer.addControl(
|
||||||
this.element,
|
this.element,
|
||||||
$.ControlAnchor.TOP_RIGHT
|
options.controlOptions
|
||||||
);
|
);
|
||||||
|
|
||||||
if( options.width && options.height ){
|
if( options.width && options.height ){
|
||||||
@ -230,6 +183,10 @@ $.Navigator = function( options ){
|
|||||||
$.Viewer.apply( this, [ options ] );
|
$.Viewer.apply( this, [ options ] );
|
||||||
|
|
||||||
this.element.getElementsByTagName('form')[0].appendChild( this.displayRegion );
|
this.element.getElementsByTagName('form')[0].appendChild( this.displayRegion );
|
||||||
|
unneededElement = this.element.getElementsByTagName('textarea')[0];
|
||||||
|
if (unneededElement) {
|
||||||
|
unneededElement.parentNode.removeChild(unneededElement);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -248,21 +205,21 @@ $.extend( $.Navigator.prototype, $.EventHandler.prototype, $.Viewer.prototype, {
|
|||||||
if( viewport && this.viewport ){
|
if( viewport && this.viewport ){
|
||||||
bounds = viewport.getBounds( true );
|
bounds = viewport.getBounds( true );
|
||||||
topleft = this.viewport.pixelFromPoint( bounds.getTopLeft());
|
topleft = this.viewport.pixelFromPoint( bounds.getTopLeft());
|
||||||
bottomright = this.viewport.pixelFromPoint( bounds.getBottomRight() );
|
bottomright = this.viewport.pixelFromPoint( bounds.getBottomRight()).minus(this.totalBorderWidths);
|
||||||
|
|
||||||
//update style for navigator-box
|
//update style for navigator-box
|
||||||
(function(style){
|
(function(style, borderWidth){
|
||||||
|
|
||||||
style.top = topleft.y + 'px';
|
style.top = topleft.y + 'px';
|
||||||
style.left = topleft.x + 'px';
|
style.left = topleft.x + 'px';
|
||||||
|
|
||||||
var width = Math.abs( topleft.x - bottomright.x ) - 3; // TODO: What does this magic number mean?
|
var width = Math.abs( topleft.x - bottomright.x );
|
||||||
var height = Math.abs( topleft.y - bottomright.y ) - 3;
|
var height = Math.abs( topleft.y - bottomright.y );
|
||||||
// make sure width and height are non-negative so IE doesn't throw
|
// make sure width and height are non-negative so IE doesn't throw
|
||||||
style.width = Math.max( width, 0 ) + 'px';
|
style.width = Math.max( width, 0 ) + 'px';
|
||||||
style.height = Math.max( height, 0 ) + 'px';
|
style.height = Math.max( height, 0 ) + 'px';
|
||||||
|
|
||||||
}( this.displayRegion.style ));
|
}( this.displayRegion.style, this.borderWidth));
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
@ -283,16 +240,39 @@ $.extend( $.Navigator.prototype, $.EventHandler.prototype, $.Viewer.prototype, {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @inner
|
* @inner
|
||||||
* @function
|
* @function
|
||||||
*/
|
*/
|
||||||
function onCanvasClick( tracker, position, quick, shift ) {
|
function onCanvasClick( tracker, position, quick, shift ) {
|
||||||
this.displayRegion.focus();
|
var newBounds,
|
||||||
|
viewerPosition,
|
||||||
|
dimensions;
|
||||||
|
if (! this.drag) {
|
||||||
|
if ( this.viewer.viewport ) {
|
||||||
|
viewerPosition = this.viewport.deltaPointsFromPixels(position);
|
||||||
|
dimensions = this.viewer.viewport.getBounds().getSize();
|
||||||
|
newBounds = new $.Rect(
|
||||||
|
viewerPosition.x - dimensions.x/2,
|
||||||
|
viewerPosition.y - dimensions.y/2,
|
||||||
|
dimensions.x,
|
||||||
|
dimensions.y
|
||||||
|
);
|
||||||
|
if (this.viewer.source.aspectRatio > this.viewer.viewport.getAspectRatio()) {
|
||||||
|
newBounds.y = newBounds.y - ((this.viewerSizeInPoints.y - (1/this.viewer.source.aspectRatio)) /2 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newBounds.x = newBounds.x - ((this.viewerSizeInPoints.x -1) /2 );
|
||||||
|
}
|
||||||
|
this.viewer.viewport.fitBounds(newBounds);
|
||||||
|
this.viewer.viewport.applyConstraints();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.drag = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
@ -301,6 +281,7 @@ function onCanvasClick( tracker, position, quick, shift ) {
|
|||||||
*/
|
*/
|
||||||
function onCanvasDrag( tracker, position, delta, shift ) {
|
function onCanvasDrag( tracker, position, delta, shift ) {
|
||||||
if ( this.viewer.viewport ) {
|
if ( this.viewer.viewport ) {
|
||||||
|
this.drag = true;
|
||||||
if( !this.panHorizontal ){
|
if( !this.panHorizontal ){
|
||||||
delta.x = 0;
|
delta.x = 0;
|
||||||
}
|
}
|
||||||
@ -339,7 +320,6 @@ function onCanvasScroll( tracker, position, scroll, shift ) {
|
|||||||
factor = Math.pow( this.zoomPerScroll, scroll );
|
factor = Math.pow( this.zoomPerScroll, scroll );
|
||||||
this.viewer.viewport.zoomBy(
|
this.viewer.viewport.zoomBy(
|
||||||
factor,
|
factor,
|
||||||
//this.viewport.pointFromPixel( position, true )
|
|
||||||
this.viewport.getCenter()
|
this.viewport.getCenter()
|
||||||
);
|
);
|
||||||
this.viewer.viewport.applyConstraints();
|
this.viewer.viewport.applyConstraints();
|
||||||
|
@ -519,7 +519,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){
|
|||||||
|
|
||||||
//VIEWPORT NAVIGATOR SETTINGS
|
//VIEWPORT NAVIGATOR SETTINGS
|
||||||
showNavigator: true, //promoted to default in 0.9.64
|
showNavigator: true, //promoted to default in 0.9.64
|
||||||
navigatorElement: null,
|
navigatorId: null,
|
||||||
navigatorHeight: null,
|
navigatorHeight: null,
|
||||||
navigatorWidth: null,
|
navigatorWidth: null,
|
||||||
navigatorPosition: null,
|
navigatorPosition: null,
|
||||||
|
@ -130,7 +130,7 @@ $.ReferenceStrip = function( options ){
|
|||||||
this.element.style.height = options.height + 'px';
|
this.element.style.height = options.height + 'px';
|
||||||
viewer.addControl(
|
viewer.addControl(
|
||||||
this.element,
|
this.element,
|
||||||
$.ControlAnchor.BOTTOM_LEFT
|
{anchor: $.ControlAnchor.BOTTOM_LEFT}
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
if( "horizontal" == options.scroll ){
|
if( "horizontal" == options.scroll ){
|
||||||
@ -147,7 +147,7 @@ $.ReferenceStrip = function( options ){
|
|||||||
|
|
||||||
viewer.addControl(
|
viewer.addControl(
|
||||||
this.element,
|
this.element,
|
||||||
$.ControlAnchor.BOTTOM_LEFT
|
{anchor: $.ControlAnchor.BOTTOM_LEFT}
|
||||||
);
|
);
|
||||||
}else {
|
}else {
|
||||||
this.element.style.height = (
|
this.element.style.height = (
|
||||||
@ -163,7 +163,7 @@ $.ReferenceStrip = function( options ){
|
|||||||
|
|
||||||
viewer.addControl(
|
viewer.addControl(
|
||||||
this.element,
|
this.element,
|
||||||
$.ControlAnchor.TOP_LEFT
|
{anchor: $.ControlAnchor.TOP_LEFT}
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
114
src/viewer.js
@ -204,30 +204,42 @@ $.Viewer = function( options ) {
|
|||||||
|
|
||||||
this.element = this.element || document.getElementById( this.id );
|
this.element = this.element || document.getElementById( this.id );
|
||||||
this.canvas = $.makeNeutralElement( "div" );
|
this.canvas = $.makeNeutralElement( "div" );
|
||||||
|
this.keyboardCommandArea = $.makeNeutralElement( "textarea" );
|
||||||
|
|
||||||
this.canvas.className = "openseadragon-canvas";
|
this.canvas.className = "openseadragon-canvas";
|
||||||
(function( canvas ){
|
(function( style ){
|
||||||
canvas.width = "100%";
|
style.width = "100%";
|
||||||
canvas.height = "100%";
|
style.height = "100%";
|
||||||
canvas.overflow = "hidden";
|
style.overflow = "hidden";
|
||||||
canvas.position = "absolute";
|
style.position = "absolute";
|
||||||
canvas.top = "0px";
|
style.top = "0px";
|
||||||
canvas.left = "0px";
|
style.left = "0px";
|
||||||
}( this.canvas.style ));
|
}( this.canvas.style ));
|
||||||
|
|
||||||
//the container is created through applying the ControlDock constructor above
|
//the container is created through applying the ControlDock constructor above
|
||||||
this.container.className = "openseadragon-container";
|
this.container.className = "openseadragon-container";
|
||||||
(function( container ){
|
(function( style ){
|
||||||
container.width = "100%";
|
style.width = "100%";
|
||||||
container.height = "100%";
|
style.height = "100%";
|
||||||
container.position = "relative";
|
style.position = "relative";
|
||||||
container.overflow = "hidden";
|
style.overflow = "hidden";
|
||||||
container.left = "0px";
|
style.left = "0px";
|
||||||
container.top = "0px";
|
style.top = "0px";
|
||||||
container.textAlign = "left"; // needed to protect against
|
style.textAlign = "left"; // needed to protect against
|
||||||
}( this.container.style ));
|
}( this.container.style ));
|
||||||
|
|
||||||
|
this.keyboardCommandArea.className = "keyboard-command-area";
|
||||||
|
(function( style ){
|
||||||
|
style.width = "100%";
|
||||||
|
style.height = "100%";
|
||||||
|
style.overflow = "hidden";
|
||||||
|
style.position = "absolute";
|
||||||
|
style.top = "0px";
|
||||||
|
style.left = "0px";
|
||||||
|
}( this.keyboardCommandArea.style ));
|
||||||
|
|
||||||
this.container.insertBefore( this.canvas, this.container.firstChild );
|
this.container.insertBefore( this.canvas, this.container.firstChild );
|
||||||
|
this.container.insertBefore( this.keyboardCommandArea, this.container.firstChild );
|
||||||
this.element.appendChild( this.container );
|
this.element.appendChild( this.container );
|
||||||
|
|
||||||
//Used for toggling between fullscreen and default container size
|
//Used for toggling between fullscreen and default container size
|
||||||
@ -238,6 +250,64 @@ $.Viewer = function( options ) {
|
|||||||
this.bodyOverflow = document.body.style.overflow;
|
this.bodyOverflow = document.body.style.overflow;
|
||||||
this.docOverflow = document.documentElement.style.overflow;
|
this.docOverflow = document.documentElement.style.overflow;
|
||||||
|
|
||||||
|
this.keyboardCommandArea.innerTracker = new $.MouseTracker({
|
||||||
|
_this : this,
|
||||||
|
element: this.keyboardCommandArea,
|
||||||
|
focusHandler: function(){
|
||||||
|
var point = $.getElementPosition( this.element );
|
||||||
|
window.scrollTo( 0, point.y );
|
||||||
|
},
|
||||||
|
|
||||||
|
keyHandler: function(tracker, keyCode, shiftKey){
|
||||||
|
switch( keyCode ){
|
||||||
|
case 61://=|+
|
||||||
|
_this.viewport.zoomBy(1.1);
|
||||||
|
_this.viewport.applyConstraints();
|
||||||
|
return false;
|
||||||
|
case 45://-|_
|
||||||
|
_this.viewport.zoomBy(0.9);
|
||||||
|
_this.viewport.applyConstraints();
|
||||||
|
return false;
|
||||||
|
case 48://0|)
|
||||||
|
_this.viewport.goHome();
|
||||||
|
_this.viewport.applyConstraints();
|
||||||
|
return false;
|
||||||
|
case 119://w
|
||||||
|
case 87://W
|
||||||
|
case 38://up arrow
|
||||||
|
if (shiftKey)
|
||||||
|
_this.viewport.zoomBy(1.1);
|
||||||
|
else
|
||||||
|
_this.viewport.panBy(new $.Point(0, -0.05));
|
||||||
|
_this.viewport.applyConstraints();
|
||||||
|
return false;
|
||||||
|
case 115://s
|
||||||
|
case 83://S
|
||||||
|
case 40://down arrow
|
||||||
|
if (shiftKey)
|
||||||
|
_this.viewport.zoomBy(0.9);
|
||||||
|
else
|
||||||
|
_this.viewport.panBy(new $.Point(0, 0.05));
|
||||||
|
_this.viewport.applyConstraints();
|
||||||
|
return false;
|
||||||
|
case 97://a
|
||||||
|
case 37://left arrow
|
||||||
|
_this.viewport.panBy(new $.Point(-0.05, 0));
|
||||||
|
_this.viewport.applyConstraints();
|
||||||
|
return false;
|
||||||
|
case 100://d
|
||||||
|
case 39://right arrow
|
||||||
|
_this.viewport.panBy(new $.Point(0.05, 0));
|
||||||
|
_this.viewport.applyConstraints();
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
//console.log( 'navigator keycode %s', keyCode );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).setTracking( true ); // default state
|
||||||
|
|
||||||
|
|
||||||
this.innerTracker = new $.MouseTracker({
|
this.innerTracker = new $.MouseTracker({
|
||||||
element: this.canvas,
|
element: this.canvas,
|
||||||
clickTimeThreshold: this.clickTimeThreshold,
|
clickTimeThreshold: this.clickTimeThreshold,
|
||||||
@ -267,7 +337,7 @@ $.Viewer = function( options ) {
|
|||||||
for ( i = 0; i < this.customControls.length; i++ ) {
|
for ( i = 0; i < this.customControls.length; i++ ) {
|
||||||
this.addControl(
|
this.addControl(
|
||||||
this.customControls[ i ].id,
|
this.customControls[ i ].id,
|
||||||
this.customControls[ i ].anchor
|
{anchor: this.customControls[ i ].anchor}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -794,12 +864,12 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype,
|
|||||||
if( this.toolbar ){
|
if( this.toolbar ){
|
||||||
this.toolbar.addControl(
|
this.toolbar.addControl(
|
||||||
this.pagingControl,
|
this.pagingControl,
|
||||||
$.ControlAnchor.BOTTOM_RIGHT
|
{anchor: $.ControlAnchor.BOTTOM_RIGHT}
|
||||||
);
|
);
|
||||||
}else{
|
}else{
|
||||||
this.addControl(
|
this.addControl(
|
||||||
this.pagingControl,
|
this.pagingControl,
|
||||||
$.ControlAnchor.TOP_LEFT
|
{anchor: $.ControlAnchor.TOP_LEFT}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -916,12 +986,12 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype,
|
|||||||
if( this.toolbar ){
|
if( this.toolbar ){
|
||||||
this.toolbar.addControl(
|
this.toolbar.addControl(
|
||||||
this.navControl,
|
this.navControl,
|
||||||
$.ControlAnchor.TOP_LEFT
|
{anchor: $.ControlAnchor.TOP_LEFT}
|
||||||
);
|
);
|
||||||
}else{
|
}else{
|
||||||
this.addControl(
|
this.addControl(
|
||||||
this.navControl,
|
this.navControl,
|
||||||
$.ControlAnchor.TOP_LEFT
|
{anchor: $.ControlAnchor.TOP_LEFT}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1069,7 +1139,7 @@ function openTileSource( viewer, source ) {
|
|||||||
//Instantiate a navigator if configured
|
//Instantiate a navigator if configured
|
||||||
if ( _this.showNavigator && ! _this.navigator && !_this.collectionMode ){
|
if ( _this.showNavigator && ! _this.navigator && !_this.collectionMode ){
|
||||||
_this.navigator = new $.Navigator({
|
_this.navigator = new $.Navigator({
|
||||||
id: _this.navigatorElement,
|
id: _this.navigatorId,
|
||||||
position: _this.navigatorPosition,
|
position: _this.navigatorPosition,
|
||||||
sizeRatio: _this.navigatorSizeRatio,
|
sizeRatio: _this.navigatorSizeRatio,
|
||||||
height: _this.navigatorHeight,
|
height: _this.navigatorHeight,
|
||||||
@ -1216,8 +1286,10 @@ function updateControlsFade( viewer ) {
|
|||||||
opacity = Math.max( 0.0, opacity );
|
opacity = Math.max( 0.0, opacity );
|
||||||
|
|
||||||
for ( i = viewer.controls.length - 1; i >= 0; i--) {
|
for ( i = viewer.controls.length - 1; i >= 0; i--) {
|
||||||
|
if (viewer.controls[ i ].autoFade) {
|
||||||
viewer.controls[ i ].setOpacity( opacity );
|
viewer.controls[ i ].setOpacity( opacity );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( opacity > 0 ) {
|
if ( opacity > 0 ) {
|
||||||
// fade again
|
// fade again
|
||||||
|
48
test/demo/navigatorcustomlocationdemo.html
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>OpenSeadragon Navigator in a custom location Demo</title>
|
||||||
|
<script type="text/javascript" src='../../build/openseadragon/openseadragon.js'></script>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
.openseadragon1
|
||||||
|
{
|
||||||
|
width: 800px;
|
||||||
|
height: 600px;
|
||||||
|
border: 1px solid black;
|
||||||
|
color: #333; /* text color for messages */
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
Simple demo page to show how to put the navigator in a custom location
|
||||||
|
</div>
|
||||||
|
<div id="contentDiv" class="openseadragon1"></div>
|
||||||
|
<div id="navigatorDiv" class="findme"></div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
var viewer = OpenSeadragon({
|
||||||
|
id:"contentDiv",
|
||||||
|
navigatorId: "navigatorDiv",
|
||||||
|
prefixUrl:"../../build/openseadragon/images/",
|
||||||
|
tileSources:{
|
||||||
|
Image:{
|
||||||
|
xmlns:"http://schemas.microsoft.com/deepzoom/2008",
|
||||||
|
Url:"../data/testpattern_files/",
|
||||||
|
Format:"jpg",
|
||||||
|
Overlap:"2",
|
||||||
|
TileSize:"256",
|
||||||
|
Size:{
|
||||||
|
Height:"1000",
|
||||||
|
Width:"1000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
55
test/demo/navigatorjquerydemo.html
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>OpenSeadragon Navigator in a JQuery UI Dialog Demo</title>
|
||||||
|
<script type="text/javascript" src='../../build/openseadragon/openseadragon.js'></script>
|
||||||
|
<script type="text/javascript" src='../lib/jquery-1.9.1.min.js'></script>
|
||||||
|
<script type="text/javascript" src='../lib/jquery-ui-1.10.2/js/jquery-ui-1.10.2.min.js'></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="../lib/jquery-ui-1.10.2/css/smoothness/jquery-ui-1.10.2.min.css"/>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
.openseadragon
|
||||||
|
{
|
||||||
|
width: 800px;
|
||||||
|
height: 600px;
|
||||||
|
border: 1px solid black;
|
||||||
|
color: #333; /* text color for messages */
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
Simple demo page to show how to put the navigator in a moveable JQuery UI dialog.
|
||||||
|
</div>
|
||||||
|
<div id="contentDiv" class="openseadragon"></div>
|
||||||
|
<div id="navigatorDialog">
|
||||||
|
<div id="navigatorDiv"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$('#navigatorDialog').dialog();
|
||||||
|
|
||||||
|
var viewer = OpenSeadragon({
|
||||||
|
id:"contentDiv",
|
||||||
|
navigatorId: "navigatorDiv",
|
||||||
|
prefixUrl:"../../build/openseadragon/images/",
|
||||||
|
tileSources:{
|
||||||
|
Image:{
|
||||||
|
xmlns:"http://schemas.microsoft.com/deepzoom/2008",
|
||||||
|
Url:"../data/testpattern_files/",
|
||||||
|
Format:"jpg",
|
||||||
|
Overlap:"2",
|
||||||
|
TileSize:"256",
|
||||||
|
Size:{
|
||||||
|
Height:"1000",
|
||||||
|
Width:"1000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -10,7 +10,7 @@
|
|||||||
// ----------
|
// ----------
|
||||||
var testOpen = function(name) {
|
var testOpen = function(name) {
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
var timeWatcher = Util.timeWatcher();
|
var timeWatcher = Util.timeWatcher(7000);
|
||||||
|
|
||||||
viewer = OpenSeadragon({
|
viewer = OpenSeadragon({
|
||||||
id: 'example',
|
id: 'example',
|
||||||
|
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/animated-overlay.gif
Executable file
After Width: | Height: | Size: 1.7 KiB |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
Executable file
After Width: | Height: | Size: 212 B |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
Executable file
After Width: | Height: | Size: 208 B |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
Executable file
After Width: | Height: | Size: 335 B |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
Executable file
After Width: | Height: | Size: 207 B |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png
Executable file
After Width: | Height: | Size: 262 B |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
Executable file
After Width: | Height: | Size: 262 B |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
Executable file
After Width: | Height: | Size: 332 B |
After Width: | Height: | Size: 280 B |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-icons_222222_256x240.png
Executable file
After Width: | Height: | Size: 6.8 KiB |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-icons_2e83ff_256x240.png
Executable file
After Width: | Height: | Size: 4.4 KiB |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-icons_454545_256x240.png
Executable file
After Width: | Height: | Size: 6.8 KiB |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-icons_888888_256x240.png
Executable file
After Width: | Height: | Size: 6.8 KiB |
BIN
test/lib/jquery-ui-1.10.2/css/smoothness/images/ui-icons_cd0a0a_256x240.png
Executable file
After Width: | Height: | Size: 4.4 KiB |
5
test/lib/jquery-ui-1.10.2/css/smoothness/jquery-ui-1.10.2.min.css
vendored
Executable file
7
test/lib/jquery-ui-1.10.2/js/jquery-ui-1.10.2.min.js
vendored
Executable file
435
test/navigator.js
Normal file
@ -0,0 +1,435 @@
|
|||||||
|
QUnit.config.autostart = false;
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
var viewer,
|
||||||
|
displayRegion,
|
||||||
|
navigator,
|
||||||
|
navigatorAspectRatio,
|
||||||
|
leftScalingFactor,
|
||||||
|
maxHeightFactor,
|
||||||
|
contentStartFromLeft,
|
||||||
|
contentStartFromTop,
|
||||||
|
displayRegionWidth,
|
||||||
|
displayRegionHeight;
|
||||||
|
|
||||||
|
module("navigator", {
|
||||||
|
setup:function () {
|
||||||
|
Util.resetDom();
|
||||||
|
resetTestVariables();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).ready(function () {
|
||||||
|
start();
|
||||||
|
});
|
||||||
|
|
||||||
|
var resetTestVariables = function () {
|
||||||
|
if (viewer != null) {
|
||||||
|
viewer.close();
|
||||||
|
}
|
||||||
|
displayRegion = null;
|
||||||
|
navigator = null;
|
||||||
|
navigatorAspectRatio = null;
|
||||||
|
leftScalingFactor = null;
|
||||||
|
maxHeightFactor = null;
|
||||||
|
contentStartFromLeft = null;
|
||||||
|
contentStartFromTop = null;
|
||||||
|
displayRegionWidth = null;
|
||||||
|
displayRegionHeight = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessNavigatorLocation = function (expectedX, expectedY) {
|
||||||
|
var navigator = $(".navigator");
|
||||||
|
|
||||||
|
Util.assessNumericValue(expectedX, navigator.offset().left, 4, ' Navigator x position');
|
||||||
|
Util.assessNumericValue(expectedY, navigator.offset().top, 4, ' Navigator y position');
|
||||||
|
};
|
||||||
|
|
||||||
|
var navigatorRegionBoundsInPoints = function () {
|
||||||
|
var regionBoundsInPoints,
|
||||||
|
expectedDisplayRegionWidth,
|
||||||
|
expectedDisplayRegionHeight,
|
||||||
|
expectedDisplayRegionXLocation,
|
||||||
|
expectedDisplayRegionYLocation;
|
||||||
|
if (navigator === null) {
|
||||||
|
maxHeightFactor = 1;
|
||||||
|
navigator = $(".navigator");
|
||||||
|
navigatorAspectRatio = navigator.height() / navigator.width();
|
||||||
|
leftScalingFactor = navigatorAspectRatio * viewer.source.aspectRatio;
|
||||||
|
if (viewer.source.aspectRatio < 1) {
|
||||||
|
if (viewer.source.aspectRatio < navigatorAspectRatio) {
|
||||||
|
maxHeightFactor = viewer.source.aspectRatio * navigatorAspectRatio;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
maxHeightFactor = viewer.source.aspectRatio;
|
||||||
|
}
|
||||||
|
contentStartFromLeft = ((1 / maxHeightFactor) - 1) / 2 * maxHeightFactor * navigator.width();
|
||||||
|
contentStartFromTop = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (viewer.source.aspectRatio < navigatorAspectRatio) {
|
||||||
|
contentStartFromTop = (navigatorAspectRatio - (1 / viewer.source.aspectRatio)) / 2 / navigatorAspectRatio * navigator.height();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
contentStartFromTop = (navigatorAspectRatio - (1 / viewer.source.aspectRatio)) / 2 / navigatorAspectRatio * navigator.height();
|
||||||
|
leftScalingFactor = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
displayRegionWidth = navigator.width() - 2 * contentStartFromLeft;
|
||||||
|
displayRegionHeight = navigator.height() - 2 * contentStartFromTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedDisplayRegionWidth = navigator.width() / viewer.viewport.getZoom() * maxHeightFactor;
|
||||||
|
expectedDisplayRegionHeight = navigator.height() / viewer.viewport.getZoom() * maxHeightFactor;
|
||||||
|
expectedDisplayRegionXLocation = viewer.viewport.getBounds().x * maxHeightFactor * navigator.width() + contentStartFromLeft;
|
||||||
|
expectedDisplayRegionYLocation = viewer.viewport.getBounds().y * leftScalingFactor * navigator.width() + contentStartFromTop;
|
||||||
|
regionBoundsInPoints = new OpenSeadragon.Rect(expectedDisplayRegionXLocation, expectedDisplayRegionYLocation, expectedDisplayRegionWidth, expectedDisplayRegionHeight);
|
||||||
|
|
||||||
|
return regionBoundsInPoints;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessDisplayRegion = function (status) {
|
||||||
|
|
||||||
|
var expectedBounds = navigatorRegionBoundsInPoints();
|
||||||
|
Util.assessNumericValue(expectedBounds.width, displayRegion.width() + viewer.navigator.totalBorderWidths.x, 2, status + ' Width synchronization');
|
||||||
|
Util.assessNumericValue(expectedBounds.height, displayRegion.height() + viewer.navigator.totalBorderWidths.y, 2, status + ' Height synchronization');
|
||||||
|
Util.assessNumericValue(expectedBounds.x, displayRegion.position().left, 2, status + ' Left synchronization');
|
||||||
|
Util.assessNumericValue(expectedBounds.y, displayRegion.position().top, 2, status + ' Top synchronization');
|
||||||
|
};
|
||||||
|
|
||||||
|
var waitForViewer = function () {
|
||||||
|
return function (handler, count, lastDisplayRegionLeft, lastDisplayWidth) {
|
||||||
|
var viewerAndNavigatorDisplayReady = false,
|
||||||
|
currentDisplayRegionLeft,
|
||||||
|
currentDisplayWidth;
|
||||||
|
if (displayRegion === null) {
|
||||||
|
displayRegion = $(".displayregion");
|
||||||
|
}
|
||||||
|
if (typeof count !== "number") {
|
||||||
|
count = 0;
|
||||||
|
lastDisplayRegionLeft = null;
|
||||||
|
lastDisplayWidth = null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
currentDisplayRegionLeft = displayRegion.position().left;
|
||||||
|
currentDisplayWidth = displayRegion.width();
|
||||||
|
viewerAndNavigatorDisplayReady = viewer.drawer !== null &&
|
||||||
|
!viewer.drawer.needsUpdate() &&
|
||||||
|
currentDisplayWidth > 0 &&
|
||||||
|
Util.equalsWithVariance(lastDisplayRegionLeft, currentDisplayRegionLeft, .0001) &&
|
||||||
|
Util.equalsWithVariance(lastDisplayWidth, currentDisplayWidth, .0001) &&
|
||||||
|
Util.equalsWithVariance(viewer.viewport.getBounds(true).x, viewer.viewport.getBounds().x, .0001) &&
|
||||||
|
Util.equalsWithVariance(viewer.viewport.getBounds(true).y, viewer.viewport.getBounds().y, .0001) &&
|
||||||
|
Util.equalsWithVariance(viewer.viewport.getBounds(true).width, viewer.viewport.getBounds().width, .0001);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
//Ignore. Subsequent code will try again shortly
|
||||||
|
}
|
||||||
|
if (( !viewerAndNavigatorDisplayReady) && count < 50) {
|
||||||
|
count++;
|
||||||
|
setTimeout(function () {
|
||||||
|
waitForViewer(handler, count, currentDisplayRegionLeft, currentDisplayWidth);
|
||||||
|
}, 100)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (count === 40) {
|
||||||
|
console.log("waitForViewer:" +
|
||||||
|
viewer.drawer + ":" + viewer.drawer.needsUpdate() + ":" +
|
||||||
|
viewerAndNavigatorDisplayReady + ":" +
|
||||||
|
lastDisplayRegionLeft + ":" + currentDisplayRegionLeft + ":" +
|
||||||
|
lastDisplayWidth + ":" + currentDisplayWidth + ":" +
|
||||||
|
viewer.viewport.getBounds(true).x + ":" + viewer.viewport.getBounds().x + ":" +
|
||||||
|
viewer.viewport.getBounds(true).y + ":" + viewer.viewport.getBounds().y + ":" +
|
||||||
|
viewer.viewport.getBounds(true).width + ":" + viewer.viewport.getBounds().width + ":" +
|
||||||
|
count);
|
||||||
|
}
|
||||||
|
handler();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}();
|
||||||
|
|
||||||
|
var simulateNavigatorClick = function (viewer, locationX, locationY) {
|
||||||
|
var $canvas = $(viewer.element).find('.openseadragon-canvas'),
|
||||||
|
offset = $canvas.offset(),
|
||||||
|
event = {
|
||||||
|
clientX:offset.left + locationX,
|
||||||
|
clientY:offset.top + locationY
|
||||||
|
};
|
||||||
|
$canvas
|
||||||
|
.simulate('mouseover', event)
|
||||||
|
.simulate('mousedown', event)
|
||||||
|
.simulate('mouseup', event);
|
||||||
|
};
|
||||||
|
|
||||||
|
var simulateNavigatorDrag = function (viewer, distanceX, distanceY) {
|
||||||
|
var $canvas = $(viewer.element).find('.displayregion'),
|
||||||
|
event = {
|
||||||
|
dx:Math.floor(distanceX),
|
||||||
|
dy:Math.floor(distanceY)
|
||||||
|
};
|
||||||
|
$canvas
|
||||||
|
.simulate('drag', event);
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessViewerInCorner = function (theContentCorner) {
|
||||||
|
return function () {
|
||||||
|
var expectedXCoordinate, expecteYCoordinate;
|
||||||
|
if (theContentCorner === "TOPLEFT") {
|
||||||
|
expectedXCoordinate = 0;
|
||||||
|
expecteYCoordinate = 0;
|
||||||
|
}
|
||||||
|
else if (theContentCorner === "TOPRIGHT") {
|
||||||
|
expectedXCoordinate = 1 - viewer.viewport.getBounds().width;
|
||||||
|
expecteYCoordinate = 0;
|
||||||
|
}
|
||||||
|
else if (theContentCorner === "BOTTOMRIGHT") {
|
||||||
|
expectedXCoordinate = 1 - viewer.viewport.getBounds().width;
|
||||||
|
expecteYCoordinate = 1 / viewer.source.aspectRatio - viewer.viewport.getBounds().height;
|
||||||
|
}
|
||||||
|
else if (theContentCorner === "BOTTOMLEFT") {
|
||||||
|
expectedXCoordinate = 0;
|
||||||
|
expecteYCoordinate = 1 / viewer.source.aspectRatio - viewer.viewport.getBounds().height;
|
||||||
|
}
|
||||||
|
if (viewer.viewport.getBounds().width < 1) {
|
||||||
|
Util.assessNumericValue(expectedXCoordinate, viewer.viewport.getBounds().x, .04, ' Viewer at ' + theContentCorner + ', x coord');
|
||||||
|
}
|
||||||
|
if (viewer.viewport.getBounds().height < 1 / viewer.source.aspectRatio) {
|
||||||
|
Util.assessNumericValue(expecteYCoordinate, viewer.viewport.getBounds().y, .04, ' Viewer at ' + theContentCorner + ', y coord');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessViewerInCenter = function () {
|
||||||
|
var yPositionVariance = .04;
|
||||||
|
if (viewer.source.aspectRatio < 1) {
|
||||||
|
yPositionVariance = yPositionVariance / viewer.source.aspectRatio;
|
||||||
|
}
|
||||||
|
Util.assessNumericValue(1 / viewer.source.aspectRatio / 2, viewer.viewport.getCenter().y, yPositionVariance, ' Viewer at center, y coord');
|
||||||
|
Util.assessNumericValue(.5, viewer.viewport.getCenter().x, .4, ' Viewer at center, x coord');
|
||||||
|
};
|
||||||
|
|
||||||
|
var clickOnNavigator = function (theContentCorner) {
|
||||||
|
return function () {
|
||||||
|
var xPos,
|
||||||
|
yPos;
|
||||||
|
if (theContentCorner === "TOPLEFT") {
|
||||||
|
xPos = contentStartFromLeft;
|
||||||
|
yPos = contentStartFromTop;
|
||||||
|
}
|
||||||
|
else if (theContentCorner === "TOPRIGHT") {
|
||||||
|
xPos = contentStartFromLeft + displayRegionWidth;
|
||||||
|
yPos = contentStartFromTop;
|
||||||
|
}
|
||||||
|
else if (theContentCorner === "BOTTOMRIGHT") {
|
||||||
|
xPos = contentStartFromLeft + displayRegionWidth;
|
||||||
|
yPos = contentStartFromTop + displayRegionHeight;
|
||||||
|
}
|
||||||
|
else if (theContentCorner === "BOTTOMLEFT") {
|
||||||
|
xPos = contentStartFromLeft;
|
||||||
|
yPos = contentStartFromTop + displayRegionHeight;
|
||||||
|
}
|
||||||
|
simulateNavigatorClick(viewer.navigator, xPos, yPos);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var dragNavigatorBackToCenter = function () {
|
||||||
|
var start = viewer.viewport.getBounds().getTopLeft(),
|
||||||
|
target = new OpenSeadragon.Point(0.5 - viewer.viewport.getBounds().width / 2,
|
||||||
|
1 / viewer.source.aspectRatio / 2 - viewer.viewport.getBounds().height / 2),
|
||||||
|
delta = target.minus(start);
|
||||||
|
if (viewer.source.aspectRatio < 1) {
|
||||||
|
delta.y = delta.y * viewer.source.aspectRatio;
|
||||||
|
}
|
||||||
|
simulateNavigatorDrag(viewer.navigator, delta.x * displayRegionWidth, delta.y * displayRegionHeight);
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessNavigatorViewerPlacement = function (seadragonProperties, testProperties) {
|
||||||
|
var navigatorOperationScenarios = [
|
||||||
|
{interactionOperation:clickOnNavigator("TOPRIGHT"),
|
||||||
|
assessmentOperation:assessViewerInCorner("TOPRIGHT"),
|
||||||
|
assessmentMessage:"After click on navigator on top right" },
|
||||||
|
{interactionOperation:dragNavigatorBackToCenter,
|
||||||
|
assessmentOperation:assessViewerInCenter,
|
||||||
|
assessmentMessage:"After drag on navigator from top right" },
|
||||||
|
{interactionOperation:clickOnNavigator("BOTTOMLEFT"),
|
||||||
|
assessmentOperation:assessViewerInCorner("BOTTOMLEFT"),
|
||||||
|
assessmentMessage:"After click on navigator on bottom left" },
|
||||||
|
{interactionOperation:dragNavigatorBackToCenter,
|
||||||
|
assessmentOperation:assessViewerInCenter,
|
||||||
|
assessmentMessage:"After drag on navigator from bottom left" },
|
||||||
|
{interactionOperation:clickOnNavigator("BOTTOMRIGHT"),
|
||||||
|
assessmentOperation:assessViewerInCorner("BOTTOMRIGHT"),
|
||||||
|
assessmentMessage:"After click on navigator on bottom right" },
|
||||||
|
{interactionOperation:dragNavigatorBackToCenter,
|
||||||
|
assessmentOperation:assessViewerInCenter,
|
||||||
|
assessmentMessage:"After drag on navigator from bottom right" },
|
||||||
|
{interactionOperation:clickOnNavigator("TOPLEFT"),
|
||||||
|
assessmentOperation:assessViewerInCorner("TOPLEFT"),
|
||||||
|
assessmentMessage:"After click on navigator on top left" },
|
||||||
|
{interactionOperation:dragNavigatorBackToCenter,
|
||||||
|
assessmentOperation:assessViewerInCenter,
|
||||||
|
assessmentMessage:"After drag on navigator from top left" }
|
||||||
|
],
|
||||||
|
autoHideWaitTime = 7500;
|
||||||
|
|
||||||
|
seadragonProperties.visibilityRatio = 1;
|
||||||
|
viewer = OpenSeadragon(seadragonProperties);
|
||||||
|
|
||||||
|
var assessNavigatorOperationAndTakeNextStep = function (step) {
|
||||||
|
return function () {
|
||||||
|
var nextStep = step + 1;
|
||||||
|
assessDisplayRegion(navigatorOperationScenarios[step].assessmentMessage);
|
||||||
|
navigatorOperationScenarios[step].assessmentOperation();
|
||||||
|
if (step === navigatorOperationScenarios.length - 1) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
navigatorOperationScenarios[nextStep].interactionOperation();
|
||||||
|
waitForViewer(assessNavigatorOperationAndTakeNextStep(nextStep));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessAfterDragOnViewer = function () {
|
||||||
|
assessDisplayRegion("After pan");
|
||||||
|
navigatorOperationScenarios[0].interactionOperation();
|
||||||
|
waitForViewer(assessNavigatorOperationAndTakeNextStep(0));
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessAfterZoomOnViewer = function () {
|
||||||
|
var target = new OpenSeadragon.Point(0.4, 0.4);
|
||||||
|
assessDisplayRegion("After image zoom");
|
||||||
|
viewer.viewport.panTo(target);
|
||||||
|
waitForViewer(assessAfterDragOnViewer);
|
||||||
|
};
|
||||||
|
|
||||||
|
var captureInitialStateThenAct = function () {
|
||||||
|
assessDisplayRegion("After image load");
|
||||||
|
|
||||||
|
testProperties.determineExpectationsAndAssessNavigatorLocation(seadragonProperties, testProperties);
|
||||||
|
|
||||||
|
viewer.viewport.zoomTo(viewer.viewport.getZoom() * 2);
|
||||||
|
waitForViewer(assessAfterZoomOnViewer);
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessAutohideTriggered = function () {
|
||||||
|
ok($(testProperties.navigatorLocator).parent().css("opacity") == 0, "Expecting navigator to be autohide when in the default location");
|
||||||
|
waitForViewer(captureInitialStateThenAct);
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessAutohideDisabled = function () {
|
||||||
|
ok($(testProperties.navigatorLocator).parent().css("opacity") > 0, "Expecting navigator to be always visible when in a custom location");
|
||||||
|
waitForViewer(captureInitialStateThenAct);
|
||||||
|
};
|
||||||
|
|
||||||
|
var openHandler = function () {
|
||||||
|
viewer.removeHandler('open', openHandler);
|
||||||
|
if (!testProperties.testAutohide) {
|
||||||
|
waitForViewer(captureInitialStateThenAct);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ok($(testProperties.navigatorLocator).parent().css("opacity") > 0, "Expecting navigator to be visible initially");
|
||||||
|
var event = {
|
||||||
|
clientX:1,
|
||||||
|
clientY:1
|
||||||
|
};
|
||||||
|
var body = $("body").simulate('mouseover', event);
|
||||||
|
if (testProperties.expectedAutoHide) {
|
||||||
|
setTimeout(assessAutohideTriggered,autoHideWaitTime);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setTimeout(assessAutohideDisabled,autoHideWaitTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
viewer.addHandler('open', openHandler);
|
||||||
|
};
|
||||||
|
|
||||||
|
asyncTest('DefaultNavigatorLocationWithWideImageTallViewer', function () {
|
||||||
|
assessNavigatorViewerPlacement({
|
||||||
|
id:'tallexample',
|
||||||
|
prefixUrl:'/build/openseadragon/images/',
|
||||||
|
tileSources:'/test/data/wide.dzi',
|
||||||
|
showNavigator:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayRegionLocator:'.navigator .displayregion',
|
||||||
|
navigatorLocator:'.navigator',
|
||||||
|
testAutohide: false,
|
||||||
|
expectedAutoHide: false,
|
||||||
|
determineExpectationsAndAssessNavigatorLocation:function (seadragonProperties, testProperties) {
|
||||||
|
var mainViewerElement = $("#" + seadragonProperties.id),
|
||||||
|
navigatorElement = $(testProperties.navigatorLocator);
|
||||||
|
assessNavigatorLocation(mainViewerElement.offset().left + mainViewerElement.width() - navigatorElement.width(),
|
||||||
|
mainViewerElement.offset().top);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
asyncTest('CustomNavigatorLocationWithWideImageWideViewer', function () {
|
||||||
|
assessNavigatorViewerPlacement({
|
||||||
|
id:'wideexample',
|
||||||
|
navigatorId:'exampleNavigator',
|
||||||
|
prefixUrl:'/build/openseadragon/images/',
|
||||||
|
tileSources:'/test/data/wide.dzi',
|
||||||
|
showNavigator:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayRegionLocator:'#exampleNavigator .displayregion',
|
||||||
|
navigatorLocator:'#exampleNavigator',
|
||||||
|
testAutohide: false,
|
||||||
|
expectedAutoHide: true,
|
||||||
|
determineExpectationsAndAssessNavigatorLocation:function (seadragonProperties, testProperties) {
|
||||||
|
var mainViewerElement = $("#" + seadragonProperties.id),
|
||||||
|
navigatorViewerElement = $("#" + seadragonProperties.navigatorId);
|
||||||
|
assessNavigatorLocation(mainViewerElement.offset().left,
|
||||||
|
mainViewerElement.offset().top - navigatorViewerElement.parent().height());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
asyncTest('CustomDialogNavigatorLocationWithTallImageTallViewer', function () {
|
||||||
|
$('#exampleNavigator').dialog();
|
||||||
|
assessNavigatorViewerPlacement({
|
||||||
|
id:'tallexample',
|
||||||
|
navigatorId:'exampleNavigator',
|
||||||
|
prefixUrl:'/build/openseadragon/images/',
|
||||||
|
tileSources:'/test/data/tall.dzi',
|
||||||
|
showNavigator:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayRegionLocator:'#exampleNavigator .displayregion',
|
||||||
|
navigatorLocator:'#exampleNavigator',
|
||||||
|
testAutohide: true,
|
||||||
|
expectedAutoHide: false,
|
||||||
|
determineExpectationsAndAssessNavigatorLocation:function (seadragonProperties, testProperties) {
|
||||||
|
var jqueryDialog = $(testProperties.navigatorLocator);
|
||||||
|
assessNavigatorLocation(jqueryDialog.offset().left,
|
||||||
|
jqueryDialog.offset().top);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
asyncTest('DefaultNavigatorLocationWithTallImageWideViewer', function () {
|
||||||
|
assessNavigatorViewerPlacement({
|
||||||
|
id:'wideexample',
|
||||||
|
prefixUrl:'/build/openseadragon/images/',
|
||||||
|
tileSources:'/test/data/tall.dzi',
|
||||||
|
showNavigator:true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayRegionLocator:'.navigator .displayregion',
|
||||||
|
navigatorLocator:'.navigator',
|
||||||
|
testAutohide: true,
|
||||||
|
expectedAutoHide: true,
|
||||||
|
determineExpectationsAndAssessNavigatorLocation:function (seadragonProperties, testProperties) {
|
||||||
|
var mainViewerElement = $("#" + seadragonProperties.id),
|
||||||
|
navigatorElement = $(testProperties.navigatorLocator);
|
||||||
|
assessNavigatorLocation(mainViewerElement.offset().left + mainViewerElement.width() - navigatorElement.width(),
|
||||||
|
mainViewerElement.offset().top);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
@ -2,3 +2,14 @@
|
|||||||
height: 500px;
|
height: 500px;
|
||||||
width: 500px;
|
width: 500px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#wideexample {
|
||||||
|
height: 300px;
|
||||||
|
width: 700px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tallexample {
|
||||||
|
height: 700px;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -4,18 +4,26 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>OpenSeadragon QUnit</title>
|
<title>OpenSeadragon QUnit</title>
|
||||||
<link rel="stylesheet" href="/node_modules/grunt-contrib-qunit/test/libs/qunit.css">
|
<link rel="stylesheet" href="/node_modules/grunt-contrib-qunit/test/libs/qunit.css">
|
||||||
|
<link rel="stylesheet" href="/test/lib/jquery-ui-1.10.2/css/smoothness/jquery-ui-1.10.2.min.css">
|
||||||
<link rel="stylesheet" href="/test/test.css">
|
<link rel="stylesheet" href="/test/test.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="qunit"></div>
|
<div id="qunit"></div>
|
||||||
<div id="qunit-fixture"></div>
|
<div id="qunit-fixture"></div>
|
||||||
|
<div>
|
||||||
<div id="example"></div>
|
<div id="example"></div>
|
||||||
|
<div id="exampleNavigator"></div>
|
||||||
|
</div>
|
||||||
|
<div id="wideexample"></div>
|
||||||
|
<div id="tallexample"></div>
|
||||||
<script src="/node_modules/grunt-contrib-qunit/test/libs/qunit.js"></script>
|
<script src="/node_modules/grunt-contrib-qunit/test/libs/qunit.js"></script>
|
||||||
<script src="/test/lib/jquery-1.9.1.min.js"></script>
|
<script src="/test/lib/jquery-1.9.1.min.js"></script>
|
||||||
|
<script src="/test/lib/jquery-ui-1.10.2/js/jquery-ui-1.10.2.min.js"></script>
|
||||||
<script src="/test/lib/jquery.simulate.js"></script>
|
<script src="/test/lib/jquery.simulate.js"></script>
|
||||||
<script src="/build/openseadragon/openseadragon.min.js"></script>
|
<script src="/build/openseadragon/openseadragon.min.js"></script>
|
||||||
<script src="/test/test.js"></script>
|
<script src="/test/test.js"></script>
|
||||||
<script src="/test/basic.js"></script>
|
<script src="/test/basic.js"></script>
|
||||||
|
<script src="/test/navigator.js"></script>
|
||||||
<script src="/test/strings.js"></script>
|
<script src="/test/strings.js"></script>
|
||||||
<script src="/test/formats.js"></script>
|
<script src="/test/formats.js"></script>
|
||||||
<script src="/test/utils.js"></script>
|
<script src="/test/utils.js"></script>
|
||||||
|
25
test/test.js
@ -8,11 +8,13 @@
|
|||||||
widthFactor = 0.5;
|
widthFactor = 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO Redefine to be the middle by default
|
||||||
if (heightFactor === undefined) {
|
if (heightFactor === undefined) {
|
||||||
heightFactor = 0.5;
|
heightFactor = 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
widthFactor = Math.min(1, Math.max(0, widthFactor));
|
widthFactor = Math.min(1, Math.max(0, widthFactor));
|
||||||
|
//TODO Fix this. The max height should be 1/AR
|
||||||
heightFactor = Math.min(1, Math.max(0, heightFactor));
|
heightFactor = Math.min(1, Math.max(0, heightFactor));
|
||||||
|
|
||||||
var $canvas = $(viewer.element).find('.openseadragon-canvas').not('.navigator .openseadragon-canvas');
|
var $canvas = $(viewer.element).find('.openseadragon-canvas').not('.navigator .openseadragon-canvas');
|
||||||
@ -28,7 +30,26 @@
|
|||||||
.simulate('mouseup', event);
|
.simulate('mouseup', event);
|
||||||
},
|
},
|
||||||
|
|
||||||
// ----------
|
resetDom: function () {
|
||||||
|
if ($('#exampleNavigator').is(':ui-dialog')) {
|
||||||
|
$('#exampleNavigator').dialog('destroy');
|
||||||
|
}
|
||||||
|
$("#exampleNavigator").remove();
|
||||||
|
$(".navigator").remove();
|
||||||
|
$("#example").empty();
|
||||||
|
$("#tallexample").empty();
|
||||||
|
$("#wideexample").empty();
|
||||||
|
$("#example").parent().append('<div id="exampleNavigator"></div>');
|
||||||
|
},
|
||||||
|
|
||||||
|
equalsWithVariance: function (value1, value2, variance) {
|
||||||
|
return Math.abs(value1 - value2) <= variance;
|
||||||
|
},
|
||||||
|
|
||||||
|
assessNumericValue: function (value1, value2, variance, message) {
|
||||||
|
ok(Util.equalsWithVariance(value1, value2, variance), message + " Expected:" + value1 + " Found: " + value2 + " Variance: " + variance);
|
||||||
|
},
|
||||||
|
|
||||||
timeWatcher: function(time) {
|
timeWatcher: function(time) {
|
||||||
time = time || 2000;
|
time = time || 2000;
|
||||||
var finished = false;
|
var finished = false;
|
||||||
@ -50,6 +71,8 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|