2013-05-01 08:46:16 +04:00
|
|
|
/*
|
2013-05-14 08:00:24 +04:00
|
|
|
* OpenSeadragon - Navigator
|
2013-05-01 08:46:16 +04:00
|
|
|
*
|
|
|
|
* Copyright (C) 2009 CodePlex Foundation
|
2013-05-14 07:32:09 +04:00
|
|
|
* Copyright (C) 2010-2013 OpenSeadragon contributors
|
2013-05-01 08:46:16 +04:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are
|
|
|
|
* met:
|
|
|
|
*
|
|
|
|
* - Redistributions of source code must retain the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
|
*
|
|
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* - Neither the name of CodePlex Foundation nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived from
|
|
|
|
* this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
|
|
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
2012-03-07 07:20:00 +04:00
|
|
|
(function( $ ){
|
2013-06-19 21:33:25 +04:00
|
|
|
|
2012-03-07 07:20:00 +04:00
|
|
|
/**
|
2013-11-25 20:48:44 +04:00
|
|
|
* @class Navigator
|
|
|
|
* @classdesc The Navigator provides a small view of the current image as fixed
|
2012-04-11 01:02:24 +04:00
|
|
|
* while representing the viewport as a moving box serving as a frame
|
|
|
|
* of reference in the larger viewport as to which portion of the image
|
2013-01-31 22:18:32 +04:00
|
|
|
* is currently being examined. The navigator's viewport can be interacted
|
2012-04-11 01:02:24 +04:00
|
|
|
* with using the keyboard or the mouse.
|
2013-11-25 20:48:44 +04:00
|
|
|
*
|
2013-11-16 10:19:53 +04:00
|
|
|
* @memberof OpenSeadragon
|
2012-04-11 01:02:24 +04:00
|
|
|
* @extends OpenSeadragon.Viewer
|
2013-09-25 00:36:13 +04:00
|
|
|
* @extends OpenSeadragon.EventSource
|
2012-03-07 07:20:00 +04:00
|
|
|
* @param {Object} options
|
|
|
|
*/
|
|
|
|
$.Navigator = function( options ){
|
|
|
|
|
2013-06-19 01:55:19 +04:00
|
|
|
var viewer = options.viewer,
|
2014-08-15 12:46:27 +04:00
|
|
|
_this = this,
|
Enhanced Navigator Resizability (#280, #296)
New navigator options:
* @property {Boolean} [showNavigator=false]
* Set to true to make the navigator minimap appear.
*
* @property {Boolean} [navigatorId=navigator-GENERATED DATE]
* The ID of a div to hold the navigator minimap.
* If an ID is specified, the navigatorPosition, navigatorSizeRatio,
navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width options
will be ignored.
* If an ID is not specified, a div element will be generated and
placed on top of the main image.
*
* @property {String} [navigatorPosition='TOP_RIGHT']
* Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT',
'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
* If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width
determines the size and position of the navigator minimap in the viewer,
and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
* For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT',
the navigatorSizeRatio or navigatorHeight|Width values determine the
size of the navigator minimap.
*
* @property {Number} [navigatorSizeRatio=0.2]
* Ratio of navigator size to viewer size. Ignored if
navigatorHeight|Width are specified.
*
* @property {Boolean} [navigatorMaintainSizeRatio=false]
* If true, the navigator minimap is resized (using
navigatorSizeRatio) when the viewer size changes.
*
* @property {Number|String} [navigatorTop=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorLeft=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorHeight=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
*
* @property {Number|String} [navigatorWidth=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
Fixes #280 and #296
2013-12-13 21:23:56 +04:00
|
|
|
viewerSize,
|
2015-01-21 00:56:06 +03:00
|
|
|
navigatorSize;
|
2013-03-16 06:29:27 +04:00
|
|
|
|
2012-03-07 07:20:00 +04:00
|
|
|
//We may need to create a new element and id if they did not
|
|
|
|
//provide the id for the existing element
|
|
|
|
if( !options.id ){
|
2013-06-21 00:23:16 +04:00
|
|
|
options.id = 'navigator-' + $.now();
|
2012-03-16 19:36:28 +04:00
|
|
|
this.element = $.makeNeutralElement( "div" );
|
2013-08-08 08:12:44 +04:00
|
|
|
options.controlOptions = {
|
|
|
|
anchor: $.ControlAnchor.TOP_RIGHT,
|
|
|
|
attachToViewer: true,
|
2016-05-06 04:00:01 +03:00
|
|
|
autoFade: options.autoFade
|
2013-08-08 08:12:44 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
if( options.position ){
|
|
|
|
if( 'BOTTOM_RIGHT' == options.position ){
|
|
|
|
options.controlOptions.anchor = $.ControlAnchor.BOTTOM_RIGHT;
|
|
|
|
} else if( 'BOTTOM_LEFT' == options.position ){
|
|
|
|
options.controlOptions.anchor = $.ControlAnchor.BOTTOM_LEFT;
|
|
|
|
} else if( 'TOP_RIGHT' == options.position ){
|
|
|
|
options.controlOptions.anchor = $.ControlAnchor.TOP_RIGHT;
|
|
|
|
} else if( 'TOP_LEFT' == options.position ){
|
|
|
|
options.controlOptions.anchor = $.ControlAnchor.TOP_LEFT;
|
Enhanced Navigator Resizability (#280, #296)
New navigator options:
* @property {Boolean} [showNavigator=false]
* Set to true to make the navigator minimap appear.
*
* @property {Boolean} [navigatorId=navigator-GENERATED DATE]
* The ID of a div to hold the navigator minimap.
* If an ID is specified, the navigatorPosition, navigatorSizeRatio,
navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width options
will be ignored.
* If an ID is not specified, a div element will be generated and
placed on top of the main image.
*
* @property {String} [navigatorPosition='TOP_RIGHT']
* Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT',
'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
* If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width
determines the size and position of the navigator minimap in the viewer,
and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
* For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT',
the navigatorSizeRatio or navigatorHeight|Width values determine the
size of the navigator minimap.
*
* @property {Number} [navigatorSizeRatio=0.2]
* Ratio of navigator size to viewer size. Ignored if
navigatorHeight|Width are specified.
*
* @property {Boolean} [navigatorMaintainSizeRatio=false]
* If true, the navigator minimap is resized (using
navigatorSizeRatio) when the viewer size changes.
*
* @property {Number|String} [navigatorTop=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorLeft=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorHeight=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
*
* @property {Number|String} [navigatorWidth=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
Fixes #280 and #296
2013-12-13 21:23:56 +04:00
|
|
|
} else if( 'ABSOLUTE' == options.position ){
|
|
|
|
options.controlOptions.anchor = $.ControlAnchor.ABSOLUTE;
|
|
|
|
options.controlOptions.top = options.top;
|
|
|
|
options.controlOptions.left = options.left;
|
|
|
|
options.controlOptions.height = options.height;
|
|
|
|
options.controlOptions.width = options.width;
|
2013-08-08 08:12:44 +04:00
|
|
|
}
|
|
|
|
}
|
2014-09-24 03:15:03 +04:00
|
|
|
|
2013-08-08 08:12:44 +04:00
|
|
|
} else {
|
2013-03-15 18:59:47 +04:00
|
|
|
this.element = document.getElementById( options.id );
|
2013-08-08 08:12:44 +04:00
|
|
|
options.controlOptions = {
|
|
|
|
anchor: $.ControlAnchor.NONE,
|
|
|
|
attachToViewer: false,
|
|
|
|
autoFade: false
|
|
|
|
};
|
2013-03-15 18:59:47 +04:00
|
|
|
}
|
|
|
|
this.element.id = options.id;
|
|
|
|
this.element.className += ' navigator';
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2012-03-09 20:04:28 +04:00
|
|
|
options = $.extend( true, {
|
2013-01-31 01:51:37 +04:00
|
|
|
sizeRatio: $.DEFAULT_SETTINGS.navigatorSizeRatio
|
2012-03-09 20:04:28 +04:00
|
|
|
}, options, {
|
2012-03-07 07:20:00 +04:00
|
|
|
element: this.element,
|
2015-01-21 23:47:42 +03:00
|
|
|
tabIndex: -1, // No keyboard navigation, omit from tab order
|
2012-03-07 07:20:00 +04:00
|
|
|
//These need to be overridden to prevent recursion since
|
|
|
|
//the navigator is a viewer and a viewer has a navigator
|
|
|
|
showNavigator: false,
|
|
|
|
mouseNavEnabled: false,
|
2012-04-11 01:02:24 +04:00
|
|
|
showNavigationControl: false,
|
2013-03-06 14:51:31 +04:00
|
|
|
showSequenceControl: false,
|
|
|
|
immediateRender: true,
|
|
|
|
blendTime: 0,
|
2013-12-15 02:45:11 +04:00
|
|
|
animationTime: 0,
|
2015-09-03 02:13:10 +03:00
|
|
|
autoResize: options.autoResize,
|
|
|
|
// prevent resizing the navigator from adding unwanted space around the image
|
|
|
|
minZoomImageRatio: 1.0
|
2012-03-07 07:20:00 +04:00
|
|
|
});
|
|
|
|
|
2012-09-07 16:55:19 +04:00
|
|
|
options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;
|
2012-03-20 03:03:58 +04:00
|
|
|
|
2014-08-06 03:57:54 +04:00
|
|
|
$.setElementTouchActionNone( this.element );
|
2014-08-05 08:41:07 +04:00
|
|
|
|
2013-03-16 06:29:27 +04:00
|
|
|
this.borderWidth = 2;
|
2013-03-24 07:06:34 +04:00
|
|
|
//At some browser magnification levels the display regions lines up correctly, but at some there appears to
|
|
|
|
//be a one pixel gap.
|
|
|
|
this.fudge = new $.Point(1, 1);
|
2017-01-08 17:52:57 +03:00
|
|
|
this.totalBorderWidths = new $.Point(this.borderWidth * 2, this.borderWidth * 2).minus(this.fudge);
|
2013-03-24 07:06:34 +04:00
|
|
|
|
2013-03-16 06:29:27 +04:00
|
|
|
|
2014-01-14 02:51:22 +04:00
|
|
|
if ( options.controlOptions.anchor != $.ControlAnchor.NONE ) {
|
|
|
|
(function( style, borderWidth ){
|
|
|
|
style.margin = '0px';
|
|
|
|
style.border = borderWidth + 'px solid #555';
|
|
|
|
style.padding = '0px';
|
|
|
|
style.background = '#000';
|
|
|
|
style.opacity = 0.8;
|
|
|
|
style.overflow = 'hidden';
|
|
|
|
}( this.element.style, this.borderWidth));
|
|
|
|
}
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2013-03-16 06:29:27 +04:00
|
|
|
this.displayRegion = $.makeNeutralElement( "div" );
|
2012-03-20 03:03:58 +04:00
|
|
|
this.displayRegion.id = this.element.id + '-displayregion';
|
|
|
|
this.displayRegion.className = 'displayregion';
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2013-03-16 06:29:27 +04:00
|
|
|
(function( style, borderWidth ){
|
2012-03-07 07:20:00 +04:00
|
|
|
style.position = 'relative';
|
|
|
|
style.top = '0px';
|
|
|
|
style.left = '0px';
|
2012-03-21 05:58:23 +04:00
|
|
|
style.fontSize = '0px';
|
2012-09-11 20:31:42 +04:00
|
|
|
style.overflow = 'hidden';
|
2013-03-16 06:29:27 +04:00
|
|
|
style.border = borderWidth + 'px solid #900';
|
|
|
|
style.margin = '0px';
|
|
|
|
style.padding = '0px';
|
2012-03-20 23:00:25 +04:00
|
|
|
//TODO: IE doesnt like this property being set
|
2013-01-24 08:00:11 +04:00
|
|
|
//try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/}
|
2013-06-19 21:33:25 +04:00
|
|
|
|
2012-03-07 07:20:00 +04:00
|
|
|
style.background = 'transparent';
|
2013-01-29 22:06:39 +04:00
|
|
|
|
|
|
|
// We use square bracket notation on the statement below, because float is a keyword.
|
2013-01-31 22:18:32 +04:00
|
|
|
// This is important for the Google Closure compiler, if nothing else.
|
2013-06-19 21:33:25 +04:00
|
|
|
/*jshint sub:true */
|
2013-01-29 22:06:39 +04:00
|
|
|
style['float'] = 'left'; //Webkit
|
2013-06-19 21:33:25 +04:00
|
|
|
|
2012-03-20 10:26:34 +04:00
|
|
|
style.cssFloat = 'left'; //Firefox
|
2012-03-20 23:30:29 +04:00
|
|
|
style.styleFloat = 'left'; //IE
|
2012-03-07 07:20:00 +04:00
|
|
|
style.zIndex = 999999999;
|
2013-12-16 19:17:35 +04:00
|
|
|
style.cursor = 'default';
|
2013-03-16 06:29:27 +04:00
|
|
|
}( this.displayRegion.style, this.borderWidth ));
|
|
|
|
|
2014-08-12 18:27:16 +04:00
|
|
|
this.displayRegionContainer = $.makeNeutralElement("div");
|
|
|
|
this.displayRegionContainer.id = this.element.id + '-displayregioncontainer';
|
|
|
|
this.displayRegionContainer.className = "displayregioncontainer";
|
|
|
|
this.displayRegionContainer.style.width = "100%";
|
|
|
|
this.displayRegionContainer.style.height = "100%";
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2013-06-19 21:33:25 +04:00
|
|
|
viewer.addControl(
|
|
|
|
this.element,
|
2013-03-15 18:59:47 +04:00
|
|
|
options.controlOptions
|
2012-03-16 19:36:28 +04:00
|
|
|
);
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2014-11-11 03:25:17 +03:00
|
|
|
this._resizeWithViewer = options.controlOptions.anchor != $.ControlAnchor.ABSOLUTE &&
|
|
|
|
options.controlOptions.anchor != $.ControlAnchor.NONE;
|
|
|
|
|
|
|
|
if ( this._resizeWithViewer ) {
|
2013-12-13 23:55:36 +04:00
|
|
|
if ( options.width && options.height ) {
|
2017-01-08 17:52:57 +03:00
|
|
|
this.element.style.height = typeof (options.height) == "number" ? (options.height + 'px') : options.height;
|
|
|
|
this.element.style.width = typeof (options.width) == "number" ? (options.width + 'px') : options.width;
|
2013-12-13 23:55:36 +04:00
|
|
|
} else {
|
|
|
|
viewerSize = $.getElementSize( viewer.element );
|
2014-04-19 22:48:26 +04:00
|
|
|
this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px';
|
|
|
|
this.element.style.width = Math.round( viewerSize.x * options.sizeRatio ) + 'px';
|
2014-01-19 06:19:22 +04:00
|
|
|
this.oldViewerSize = viewerSize;
|
Enhanced Navigator Resizability (#280, #296)
New navigator options:
* @property {Boolean} [showNavigator=false]
* Set to true to make the navigator minimap appear.
*
* @property {Boolean} [navigatorId=navigator-GENERATED DATE]
* The ID of a div to hold the navigator minimap.
* If an ID is specified, the navigatorPosition, navigatorSizeRatio,
navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width options
will be ignored.
* If an ID is not specified, a div element will be generated and
placed on top of the main image.
*
* @property {String} [navigatorPosition='TOP_RIGHT']
* Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT',
'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
* If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width
determines the size and position of the navigator minimap in the viewer,
and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
* For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT',
the navigatorSizeRatio or navigatorHeight|Width values determine the
size of the navigator minimap.
*
* @property {Number} [navigatorSizeRatio=0.2]
* Ratio of navigator size to viewer size. Ignored if
navigatorHeight|Width are specified.
*
* @property {Boolean} [navigatorMaintainSizeRatio=false]
* If true, the navigator minimap is resized (using
navigatorSizeRatio) when the viewer size changes.
*
* @property {Number|String} [navigatorTop=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorLeft=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorHeight=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
*
* @property {Number|String} [navigatorWidth=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
Fixes #280 and #296
2013-12-13 21:23:56 +04:00
|
|
|
}
|
2014-01-19 06:19:22 +04:00
|
|
|
navigatorSize = $.getElementSize( this.element );
|
|
|
|
this.elementArea = navigatorSize.x * navigatorSize.y;
|
2012-03-07 07:20:00 +04:00
|
|
|
}
|
|
|
|
|
2013-12-15 02:45:11 +04:00
|
|
|
this.oldContainerSize = new $.Point( 0, 0 );
|
|
|
|
|
2013-06-19 21:33:25 +04:00
|
|
|
$.Viewer.apply( this, [ options ] );
|
2012-03-16 19:36:28 +04:00
|
|
|
|
2014-08-12 18:27:16 +04:00
|
|
|
this.displayRegionContainer.appendChild(this.displayRegion);
|
|
|
|
this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer);
|
2012-08-29 22:46:34 +04:00
|
|
|
|
2016-02-10 03:20:52 +03:00
|
|
|
function rotate(degrees) {
|
|
|
|
_setTransformRotate(_this.displayRegionContainer, degrees);
|
|
|
|
_setTransformRotate(_this.displayRegion, -degrees);
|
|
|
|
_this.viewport.setRotation(degrees);
|
|
|
|
}
|
2014-09-24 03:15:03 +04:00
|
|
|
if (options.navigatorRotate) {
|
2016-02-10 03:20:52 +03:00
|
|
|
var degrees = options.viewer.viewport ?
|
|
|
|
options.viewer.viewport.getRotation() :
|
|
|
|
options.viewer.degrees || 0;
|
2018-04-04 13:31:18 +03:00
|
|
|
|
2016-02-10 03:20:52 +03:00
|
|
|
rotate(degrees);
|
2014-08-13 13:53:52 +04:00
|
|
|
options.viewer.addHandler("rotate", function (args) {
|
2016-02-10 03:20:52 +03:00
|
|
|
rotate(args.degrees);
|
2014-08-13 13:53:52 +04:00
|
|
|
});
|
|
|
|
}
|
2014-09-24 03:15:03 +04:00
|
|
|
|
2018-04-04 13:31:18 +03:00
|
|
|
|
2015-01-21 00:56:06 +03:00
|
|
|
// Remove the base class' (Viewer's) innerTracker and replace it with our own
|
|
|
|
this.innerTracker.destroy();
|
|
|
|
this.innerTracker = new $.MouseTracker({
|
|
|
|
element: this.element,
|
|
|
|
dragHandler: $.delegate( this, onCanvasDrag ),
|
|
|
|
clickHandler: $.delegate( this, onCanvasClick ),
|
|
|
|
releaseHandler: $.delegate( this, onCanvasRelease ),
|
|
|
|
scrollHandler: $.delegate( this, onCanvasScroll )
|
2015-01-21 22:18:52 +03:00
|
|
|
});
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2014-09-24 03:15:03 +04:00
|
|
|
this.addHandler("reset-size", function() {
|
|
|
|
if (_this.viewport) {
|
|
|
|
_this.viewport.goHome(true);
|
|
|
|
}
|
|
|
|
});
|
2014-09-25 00:58:09 +04:00
|
|
|
|
2014-11-13 03:31:46 +03:00
|
|
|
viewer.world.addHandler("item-index-change", function(event) {
|
2017-05-22 14:42:09 +03:00
|
|
|
window.setTimeout(function(){
|
|
|
|
var item = _this.world.getItemAt(event.previousIndex);
|
|
|
|
_this.world.setItemIndex(item, event.newIndex);
|
|
|
|
}, 1);
|
2014-09-25 00:58:09 +04:00
|
|
|
});
|
|
|
|
|
2014-10-25 02:18:32 +04:00
|
|
|
viewer.world.addHandler("remove-item", function(event) {
|
2014-12-20 00:57:08 +03:00
|
|
|
var theirItem = event.item;
|
|
|
|
var myItem = _this._getMatchingItem(theirItem);
|
|
|
|
if (myItem) {
|
|
|
|
_this.world.removeItem(myItem);
|
2014-10-25 02:18:32 +04:00
|
|
|
}
|
2014-09-25 00:58:09 +04:00
|
|
|
});
|
2014-10-30 02:39:43 +03:00
|
|
|
|
|
|
|
this.update(viewer.viewport);
|
2012-03-07 07:20:00 +04:00
|
|
|
};
|
|
|
|
|
2013-11-16 10:19:53 +04:00
|
|
|
$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2012-04-11 01:02:24 +04:00
|
|
|
/**
|
2014-09-24 03:15:03 +04:00
|
|
|
* Used to notify the navigator when its size has changed.
|
2013-12-15 02:45:11 +04:00
|
|
|
* Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable.
|
|
|
|
* @function
|
|
|
|
*/
|
|
|
|
updateSize: function () {
|
|
|
|
if ( this.viewport ) {
|
|
|
|
var containerSize = new $.Point(
|
|
|
|
(this.container.clientWidth === 0 ? 1 : this.container.clientWidth),
|
|
|
|
(this.container.clientHeight === 0 ? 1 : this.container.clientHeight)
|
|
|
|
);
|
2014-12-03 22:13:06 +03:00
|
|
|
|
2013-12-15 02:45:11 +04:00
|
|
|
if ( !containerSize.equals( this.oldContainerSize ) ) {
|
|
|
|
this.viewport.resize( containerSize, true );
|
2014-12-03 22:13:06 +03:00
|
|
|
this.viewport.goHome(true);
|
2013-12-15 02:45:11 +04:00
|
|
|
this.oldContainerSize = containerSize;
|
2014-12-02 22:44:02 +03:00
|
|
|
this.drawer.clear();
|
|
|
|
this.world.draw();
|
2013-12-15 02:45:11 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2018-04-04 13:31:18 +03:00
|
|
|
/**
|
|
|
|
/* Flip navigator element
|
|
|
|
*/
|
2018-04-06 14:02:45 +03:00
|
|
|
toggleFlip: function() {
|
|
|
|
this.flipped = !this.flipped;
|
2018-04-06 13:52:10 +03:00
|
|
|
|
2018-04-06 14:02:45 +03:00
|
|
|
this.setDisplayTransform(this.viewer.flipped ? "scale(-1,1)" : "scale(1,1)");
|
2018-04-04 13:31:18 +03:00
|
|
|
this.viewport.viewer.forceRedraw();
|
|
|
|
},
|
2013-12-15 02:45:11 +04:00
|
|
|
|
2018-04-06 13:52:10 +03:00
|
|
|
setDisplayTransform: function(rule) {
|
2018-04-06 14:02:45 +03:00
|
|
|
setElementTransform(this.displayRegion, rule);
|
|
|
|
setElementTransform(this.canvas, rule);
|
2018-04-06 13:52:10 +03:00
|
|
|
setElementTransform(this.element, rule);
|
|
|
|
},
|
|
|
|
|
2013-12-15 02:45:11 +04:00
|
|
|
/**
|
|
|
|
* Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs.
|
2012-04-11 01:02:24 +04:00
|
|
|
* @function
|
2013-12-15 02:45:11 +04:00
|
|
|
* @param {OpenSeadragon.Viewport} The viewport this navigator is tracking.
|
2012-04-11 01:02:24 +04:00
|
|
|
*/
|
2013-12-15 02:45:11 +04:00
|
|
|
update: function( viewport ) {
|
2012-03-07 07:20:00 +04:00
|
|
|
|
Enhanced Navigator Resizability (#280, #296)
New navigator options:
* @property {Boolean} [showNavigator=false]
* Set to true to make the navigator minimap appear.
*
* @property {Boolean} [navigatorId=navigator-GENERATED DATE]
* The ID of a div to hold the navigator minimap.
* If an ID is specified, the navigatorPosition, navigatorSizeRatio,
navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width options
will be ignored.
* If an ID is not specified, a div element will be generated and
placed on top of the main image.
*
* @property {String} [navigatorPosition='TOP_RIGHT']
* Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT',
'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
* If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width
determines the size and position of the navigator minimap in the viewer,
and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
* For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT',
the navigatorSizeRatio or navigatorHeight|Width values determine the
size of the navigator minimap.
*
* @property {Number} [navigatorSizeRatio=0.2]
* Ratio of navigator size to viewer size. Ignored if
navigatorHeight|Width are specified.
*
* @property {Boolean} [navigatorMaintainSizeRatio=false]
* If true, the navigator minimap is resized (using
navigatorSizeRatio) when the viewer size changes.
*
* @property {Number|String} [navigatorTop=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorLeft=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorHeight=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
*
* @property {Number|String} [navigatorWidth=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
Fixes #280 and #296
2013-12-13 21:23:56 +04:00
|
|
|
var viewerSize,
|
2014-01-19 06:19:22 +04:00
|
|
|
newWidth,
|
|
|
|
newHeight,
|
Enhanced Navigator Resizability (#280, #296)
New navigator options:
* @property {Boolean} [showNavigator=false]
* Set to true to make the navigator minimap appear.
*
* @property {Boolean} [navigatorId=navigator-GENERATED DATE]
* The ID of a div to hold the navigator minimap.
* If an ID is specified, the navigatorPosition, navigatorSizeRatio,
navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width options
will be ignored.
* If an ID is not specified, a div element will be generated and
placed on top of the main image.
*
* @property {String} [navigatorPosition='TOP_RIGHT']
* Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT',
'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
* If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width
determines the size and position of the navigator minimap in the viewer,
and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
* For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT',
the navigatorSizeRatio or navigatorHeight|Width values determine the
size of the navigator minimap.
*
* @property {Number} [navigatorSizeRatio=0.2]
* Ratio of navigator size to viewer size. Ignored if
navigatorHeight|Width are specified.
*
* @property {Boolean} [navigatorMaintainSizeRatio=false]
* If true, the navigator minimap is resized (using
navigatorSizeRatio) when the viewer size changes.
*
* @property {Number|String} [navigatorTop=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorLeft=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorHeight=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
*
* @property {Number|String} [navigatorWidth=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
Fixes #280 and #296
2013-12-13 21:23:56 +04:00
|
|
|
bounds,
|
2012-04-03 11:08:27 +04:00
|
|
|
topleft,
|
|
|
|
bottomright;
|
|
|
|
|
2014-01-19 06:19:22 +04:00
|
|
|
viewerSize = $.getElementSize( this.viewer.element );
|
2015-02-21 15:00:21 +03:00
|
|
|
if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) {
|
2014-01-19 06:19:22 +04:00
|
|
|
this.oldViewerSize = viewerSize;
|
2014-11-11 02:53:38 +03:00
|
|
|
|
|
|
|
if ( this.maintainSizeRatio || !this.elementArea) {
|
2014-01-19 06:19:22 +04:00
|
|
|
newWidth = viewerSize.x * this.sizeRatio;
|
|
|
|
newHeight = viewerSize.y * this.sizeRatio;
|
2014-11-11 02:53:38 +03:00
|
|
|
} else {
|
2014-01-19 06:19:22 +04:00
|
|
|
newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y));
|
|
|
|
newHeight = this.elementArea / newWidth;
|
Enhanced Navigator Resizability (#280, #296)
New navigator options:
* @property {Boolean} [showNavigator=false]
* Set to true to make the navigator minimap appear.
*
* @property {Boolean} [navigatorId=navigator-GENERATED DATE]
* The ID of a div to hold the navigator minimap.
* If an ID is specified, the navigatorPosition, navigatorSizeRatio,
navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width options
will be ignored.
* If an ID is not specified, a div element will be generated and
placed on top of the main image.
*
* @property {String} [navigatorPosition='TOP_RIGHT']
* Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT',
'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
* If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width
determines the size and position of the navigator minimap in the viewer,
and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
* For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT',
the navigatorSizeRatio or navigatorHeight|Width values determine the
size of the navigator minimap.
*
* @property {Number} [navigatorSizeRatio=0.2]
* Ratio of navigator size to viewer size. Ignored if
navigatorHeight|Width are specified.
*
* @property {Boolean} [navigatorMaintainSizeRatio=false]
* If true, the navigator minimap is resized (using
navigatorSizeRatio) when the viewer size changes.
*
* @property {Number|String} [navigatorTop=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorLeft=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorHeight=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
*
* @property {Number|String} [navigatorWidth=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
Fixes #280 and #296
2013-12-13 21:23:56 +04:00
|
|
|
}
|
2014-11-11 02:53:38 +03:00
|
|
|
|
2014-04-19 22:48:26 +04:00
|
|
|
this.element.style.width = Math.round( newWidth ) + 'px';
|
|
|
|
this.element.style.height = Math.round( newHeight ) + 'px';
|
2014-11-11 02:53:38 +03:00
|
|
|
|
|
|
|
if (!this.elementArea) {
|
|
|
|
this.elementArea = newWidth * newHeight;
|
|
|
|
}
|
|
|
|
|
2014-01-19 06:19:22 +04:00
|
|
|
this.updateSize();
|
Enhanced Navigator Resizability (#280, #296)
New navigator options:
* @property {Boolean} [showNavigator=false]
* Set to true to make the navigator minimap appear.
*
* @property {Boolean} [navigatorId=navigator-GENERATED DATE]
* The ID of a div to hold the navigator minimap.
* If an ID is specified, the navigatorPosition, navigatorSizeRatio,
navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width options
will be ignored.
* If an ID is not specified, a div element will be generated and
placed on top of the main image.
*
* @property {String} [navigatorPosition='TOP_RIGHT']
* Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT',
'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
* If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width
determines the size and position of the navigator minimap in the viewer,
and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
* For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT',
the navigatorSizeRatio or navigatorHeight|Width values determine the
size of the navigator minimap.
*
* @property {Number} [navigatorSizeRatio=0.2]
* Ratio of navigator size to viewer size. Ignored if
navigatorHeight|Width are specified.
*
* @property {Boolean} [navigatorMaintainSizeRatio=false]
* If true, the navigator minimap is resized (using
navigatorSizeRatio) when the viewer size changes.
*
* @property {Number|String} [navigatorTop=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorLeft=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorHeight=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
*
* @property {Number|String} [navigatorWidth=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
Fixes #280 and #296
2013-12-13 21:23:56 +04:00
|
|
|
}
|
|
|
|
|
2016-05-05 05:26:33 +03:00
|
|
|
if (viewport && this.viewport) {
|
|
|
|
bounds = viewport.getBoundsNoRotate(true);
|
2015-12-23 02:19:22 +03:00
|
|
|
topleft = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false);
|
|
|
|
bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false)
|
2014-10-30 02:39:43 +03:00
|
|
|
.minus( this.totalBorderWidths );
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2013-06-19 21:33:25 +04:00
|
|
|
//update style for navigator-box
|
2014-10-30 02:39:43 +03:00
|
|
|
var style = this.displayRegion.style;
|
|
|
|
style.display = this.world.getItemCount() ? 'block' : 'none';
|
2013-01-28 22:11:14 +04:00
|
|
|
|
2014-10-30 02:39:43 +03:00
|
|
|
style.top = Math.round( topleft.y ) + 'px';
|
|
|
|
style.left = Math.round( topleft.x ) + 'px';
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2014-10-30 02:39:43 +03:00
|
|
|
var width = Math.abs( topleft.x - bottomright.x );
|
|
|
|
var height = Math.abs( topleft.y - bottomright.y );
|
|
|
|
// make sure width and height are non-negative so IE doesn't throw
|
|
|
|
style.width = Math.round( Math.max( width, 0 ) ) + 'px';
|
|
|
|
style.height = Math.round( Math.max( height, 0 ) ) + 'px';
|
2013-06-19 21:33:25 +04:00
|
|
|
}
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2013-03-06 14:51:31 +04:00
|
|
|
},
|
|
|
|
|
2014-11-04 22:53:39 +03:00
|
|
|
// overrides Viewer.addTiledImage
|
2014-10-25 02:18:32 +04:00
|
|
|
addTiledImage: function(options) {
|
2014-12-20 00:57:08 +03:00
|
|
|
var _this = this;
|
|
|
|
|
2014-10-25 02:18:32 +04:00
|
|
|
var original = options.originalTiledImage;
|
|
|
|
delete options.original;
|
2012-03-07 07:20:00 +04:00
|
|
|
|
2014-10-25 02:18:32 +04:00
|
|
|
var optionsClone = $.extend({}, options, {
|
2014-10-30 02:11:21 +03:00
|
|
|
success: function(event) {
|
2014-12-20 00:57:08 +03:00
|
|
|
var myItem = event.item;
|
|
|
|
myItem._originalForNavigator = original;
|
|
|
|
_this._matchBounds(myItem, original, true);
|
|
|
|
|
2016-08-28 15:39:14 +03:00
|
|
|
function matchBounds() {
|
2014-12-20 00:57:08 +03:00
|
|
|
_this._matchBounds(myItem, original);
|
2016-08-28 15:39:14 +03:00
|
|
|
}
|
|
|
|
|
2017-05-25 19:10:54 +03:00
|
|
|
function matchOpacity() {
|
|
|
|
_this._matchOpacity(myItem, original);
|
|
|
|
}
|
|
|
|
|
|
|
|
function matchCompositeOperation() {
|
|
|
|
_this._matchCompositeOperation(myItem, original);
|
|
|
|
}
|
|
|
|
|
2016-08-28 15:39:14 +03:00
|
|
|
original.addHandler('bounds-change', matchBounds);
|
|
|
|
original.addHandler('clip-change', matchBounds);
|
2017-05-25 19:10:54 +03:00
|
|
|
original.addHandler('opacity-change', matchOpacity);
|
|
|
|
original.addHandler('composite-operation-change', matchCompositeOperation);
|
2014-10-25 02:18:32 +04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]);
|
2014-12-20 00:57:08 +03:00
|
|
|
},
|
|
|
|
|
|
|
|
// private
|
|
|
|
_getMatchingItem: function(theirItem) {
|
|
|
|
var count = this.world.getItemCount();
|
|
|
|
var item;
|
|
|
|
for (var i = 0; i < count; i++) {
|
|
|
|
item = this.world.getItemAt(i);
|
|
|
|
if (item._originalForNavigator === theirItem) {
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
|
|
|
|
// private
|
|
|
|
_matchBounds: function(myItem, theirItem, immediately) {
|
2017-01-08 20:36:37 +03:00
|
|
|
var bounds = theirItem.getBoundsNoRotate();
|
2014-12-20 00:57:08 +03:00
|
|
|
myItem.setPosition(bounds.getTopLeft(), immediately);
|
|
|
|
myItem.setWidth(bounds.width, immediately);
|
2017-01-08 20:36:37 +03:00
|
|
|
myItem.setRotation(theirItem.getRotation(), immediately);
|
|
|
|
myItem.setClip(theirItem.getClip());
|
2017-05-25 19:10:54 +03:00
|
|
|
},
|
|
|
|
|
|
|
|
// private
|
|
|
|
_matchOpacity: function(myItem, theirItem) {
|
|
|
|
myItem.setOpacity(theirItem.opacity);
|
|
|
|
},
|
|
|
|
|
|
|
|
// private
|
|
|
|
_matchCompositeOperation: function(myItem, theirItem) {
|
|
|
|
myItem.setCompositeOperation(theirItem.compositeOperation);
|
2014-10-25 02:18:32 +04:00
|
|
|
}
|
2012-03-07 07:20:00 +04:00
|
|
|
});
|
|
|
|
|
2018-04-06 13:52:10 +03:00
|
|
|
|
2012-04-11 01:02:24 +04:00
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
* @inner
|
|
|
|
* @function
|
|
|
|
*/
|
2013-10-11 04:00:15 +04:00
|
|
|
function onCanvasClick( event ) {
|
2014-08-06 00:56:18 +04:00
|
|
|
if ( event.quick && this.viewer.viewport ) {
|
2018-04-06 14:02:45 +03:00
|
|
|
if(this.viewer.flipped){
|
2018-04-04 13:31:18 +03:00
|
|
|
event.position.x = this.viewport.getContainerSize().x - event.position.x;
|
|
|
|
}
|
2015-12-27 06:15:17 +03:00
|
|
|
this.viewer.viewport.panTo(this.viewport.pointFromPixel(event.position));
|
2014-08-06 00:56:18 +04:00
|
|
|
this.viewer.viewport.applyConstraints();
|
2013-03-16 06:29:27 +04:00
|
|
|
}
|
2013-01-29 21:32:58 +04:00
|
|
|
}
|
2012-04-03 11:08:27 +04:00
|
|
|
|
2012-04-11 01:02:24 +04:00
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
* @inner
|
|
|
|
* @function
|
|
|
|
*/
|
2013-10-11 04:00:15 +04:00
|
|
|
function onCanvasDrag( event ) {
|
2012-04-03 11:08:27 +04:00
|
|
|
if ( this.viewer.viewport ) {
|
|
|
|
if( !this.panHorizontal ){
|
2013-10-11 04:00:15 +04:00
|
|
|
event.delta.x = 0;
|
2012-04-03 11:08:27 +04:00
|
|
|
}
|
|
|
|
if( !this.panVertical ){
|
2013-10-11 04:00:15 +04:00
|
|
|
event.delta.y = 0;
|
2012-04-03 11:08:27 +04:00
|
|
|
}
|
2018-04-04 13:31:18 +03:00
|
|
|
|
2018-04-06 14:02:45 +03:00
|
|
|
if(this.viewer.flipped){
|
2018-04-04 13:31:18 +03:00
|
|
|
event.delta.x = -event.delta.x;
|
|
|
|
}
|
|
|
|
|
2013-06-19 21:33:25 +04:00
|
|
|
this.viewer.viewport.panBy(
|
|
|
|
this.viewport.deltaPointsFromPixels(
|
2013-10-11 04:00:15 +04:00
|
|
|
event.delta
|
2013-06-19 21:33:25 +04:00
|
|
|
)
|
2012-04-03 11:08:27 +04:00
|
|
|
);
|
2017-01-12 07:11:43 +03:00
|
|
|
if( this.viewer.constrainDuringPan ){
|
|
|
|
this.viewer.viewport.applyConstraints();
|
|
|
|
}
|
2012-04-03 11:08:27 +04:00
|
|
|
}
|
2013-01-29 21:32:58 +04:00
|
|
|
}
|
2012-04-03 11:08:27 +04:00
|
|
|
|
|
|
|
|
2012-04-11 01:02:24 +04:00
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
* @inner
|
|
|
|
* @function
|
|
|
|
*/
|
2013-10-11 04:00:15 +04:00
|
|
|
function onCanvasRelease( event ) {
|
|
|
|
if ( event.insideElementPressed && this.viewer.viewport ) {
|
2012-04-03 11:08:27 +04:00
|
|
|
this.viewer.viewport.applyConstraints();
|
|
|
|
}
|
2013-01-29 21:32:58 +04:00
|
|
|
}
|
2012-04-03 11:08:27 +04:00
|
|
|
|
2012-04-11 01:02:24 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @private
|
|
|
|
* @inner
|
|
|
|
* @function
|
|
|
|
*/
|
2013-10-11 04:00:15 +04:00
|
|
|
function onCanvasScroll( event ) {
|
Enhanced Navigator Resizability (#280, #296)
New navigator options:
* @property {Boolean} [showNavigator=false]
* Set to true to make the navigator minimap appear.
*
* @property {Boolean} [navigatorId=navigator-GENERATED DATE]
* The ID of a div to hold the navigator minimap.
* If an ID is specified, the navigatorPosition, navigatorSizeRatio,
navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width options
will be ignored.
* If an ID is not specified, a div element will be generated and
placed on top of the main image.
*
* @property {String} [navigatorPosition='TOP_RIGHT']
* Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT',
'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
* If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width
determines the size and position of the navigator minimap in the viewer,
and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
* For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT',
the navigatorSizeRatio or navigatorHeight|Width values determine the
size of the navigator minimap.
*
* @property {Number} [navigatorSizeRatio=0.2]
* Ratio of navigator size to viewer size. Ignored if
navigatorHeight|Width are specified.
*
* @property {Boolean} [navigatorMaintainSizeRatio=false]
* If true, the navigator minimap is resized (using
navigatorSizeRatio) when the viewer size changes.
*
* @property {Number|String} [navigatorTop=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorLeft=null]
* Specifies the location of the navigator minimap (see
navigatorPosition).
*
* @property {Number|String} [navigatorHeight=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
*
* @property {Number|String} [navigatorWidth=null]
* Specifies the size of the navigator minimap (see
navigatorPosition).
* If specified, navigatorSizeRatio and navigatorMaintainSizeRatio
are ignored.
Fixes #280 and #296
2013-12-13 21:23:56 +04:00
|
|
|
/**
|
|
|
|
* Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#navigator} element (mouse wheel, touch pinch, etc.).
|
|
|
|
*
|
|
|
|
* @event navigator-scroll
|
|
|
|
* @memberof OpenSeadragon.Viewer
|
|
|
|
* @type {object}
|
|
|
|
* @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
|
|
|
|
* @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
|
|
|
|
* @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
|
|
|
|
* @property {Number} scroll - The scroll delta for the event.
|
|
|
|
* @property {Boolean} shift - True if the shift key was pressed during this event.
|
|
|
|
* @property {Object} originalEvent - The original DOM event.
|
|
|
|
* @property {?Object} userData - Arbitrary subscriber-defined object.
|
|
|
|
*/
|
|
|
|
this.viewer.raiseEvent( 'navigator-scroll', {
|
|
|
|
tracker: event.eventSource,
|
|
|
|
position: event.position,
|
|
|
|
scroll: event.scroll,
|
|
|
|
shift: event.shift,
|
|
|
|
originalEvent: event.originalEvent
|
|
|
|
});
|
|
|
|
|
|
|
|
//dont scroll the page up and down if the user is scrolling
|
|
|
|
//in the navigator
|
2012-04-03 11:08:27 +04:00
|
|
|
return false;
|
2013-01-29 21:32:58 +04:00
|
|
|
}
|
2012-04-03 11:08:27 +04:00
|
|
|
|
2014-08-13 13:53:52 +04:00
|
|
|
/**
|
|
|
|
* @function
|
|
|
|
* @private
|
|
|
|
* @param {Object} element
|
|
|
|
* @param {Number} degrees
|
|
|
|
*/
|
2018-04-06 13:52:10 +03:00
|
|
|
function _setTransformRotate( element, degrees ) {
|
|
|
|
setElementTransform(element, "rotate(" + degrees + "deg)");
|
|
|
|
}
|
|
|
|
|
|
|
|
function setElementTransform( element, rule ) {
|
|
|
|
element.style.webkitTransform = rule;
|
|
|
|
element.style.mozTransform = rule;
|
|
|
|
element.style.msTransform = rule;
|
|
|
|
element.style.oTransform = rule;
|
|
|
|
element.style.transform = rule;
|
2014-08-13 13:53:52 +04:00
|
|
|
}
|
2012-04-03 11:08:27 +04:00
|
|
|
|
2018-04-06 13:52:10 +03:00
|
|
|
|
2018-04-06 14:02:45 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-01-25 17:17:35 +04:00
|
|
|
}( OpenSeadragon ));
|