mirror of
https://github.com/openseadragon/openseadragon.git
synced 2025-01-31 23:21:42 +03:00
Allow base layer reassignment if not in sequence mode.
This commit is contained in:
parent
facccf7b45
commit
1c1cd0dc4d
@ -994,7 +994,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|||||||
/**
|
/**
|
||||||
* Add a layer.
|
* Add a layer.
|
||||||
* options.tileSource can be anything that {@link OpenSeadragon.Viewer#open}
|
* options.tileSource can be anything that {@link OpenSeadragon.Viewer#open}
|
||||||
* supports.
|
* supports except arrays of images as layers cannot be sequences.
|
||||||
* @function
|
* @function
|
||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
* @param {String|Object|Function} [options.tileSource] The TileSource of the layer.
|
* @param {String|Object|Function} [options.tileSource] The TileSource of the layer.
|
||||||
@ -1008,6 +1008,9 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|||||||
var _this = this,
|
var _this = this,
|
||||||
tileSource = options.tileSource;
|
tileSource = options.tileSource;
|
||||||
|
|
||||||
|
if ( !this.isOpen() ) {
|
||||||
|
throw new Error( "An image must be loaded before adding layers." );
|
||||||
|
}
|
||||||
if ( !tileSource ) {
|
if ( !tileSource ) {
|
||||||
throw new Error( "No tile source provided as new layer." );
|
throw new Error( "No tile source provided as new layer." );
|
||||||
}
|
}
|
||||||
@ -1034,7 +1037,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|||||||
|
|
||||||
if ( tileSource instanceof Array ) {
|
if ( tileSource instanceof Array ) {
|
||||||
raiseAddLayerFailed({
|
raiseAddLayerFailed({
|
||||||
message: "Collections can not be added as layers.",
|
message: "Sequences can not be added as layers.",
|
||||||
source: tileSource,
|
source: tileSource,
|
||||||
options: options
|
options: options
|
||||||
});
|
});
|
||||||
@ -1062,7 +1065,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|||||||
debugGridColor: _this.debugGridColor
|
debugGridColor: _this.debugGridColor
|
||||||
});
|
});
|
||||||
_this.drawers.push( drawer );
|
_this.drawers.push( drawer );
|
||||||
if ( options.level ) {
|
if ( options.level !== undefined ) {
|
||||||
_this.setLayerLevel( drawer, options.level );
|
_this.setLayerLevel( drawer, options.level );
|
||||||
}
|
}
|
||||||
THIS[ _this.hash ].forceRedraw = true;
|
THIS[ _this.hash ].forceRedraw = true;
|
||||||
@ -1114,8 +1117,8 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|||||||
* Get the number of layers used.
|
* Get the number of layers used.
|
||||||
* @returns {Number} The number of layers used.
|
* @returns {Number} The number of layers used.
|
||||||
*/
|
*/
|
||||||
getNumberOfLayers: function() {
|
getLayersCount: function() {
|
||||||
return this.drawers.length - 1;
|
return this.drawers.length;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1128,22 +1131,33 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|||||||
*/
|
*/
|
||||||
setLayerLevel: function( drawer, level ) {
|
setLayerLevel: function( drawer, level ) {
|
||||||
var oldLevel = this.getLevelOfLayer( drawer );
|
var oldLevel = this.getLevelOfLayer( drawer );
|
||||||
if ( level === 0 || oldLevel === 0 ) {
|
|
||||||
throw new Error( "Cannot reassign base level." );
|
|
||||||
}
|
|
||||||
if ( level >= this.drawers.length ) {
|
if ( level >= this.drawers.length ) {
|
||||||
throw new Error( "Level bigger than number of layers." );
|
throw new Error( "Level bigger than number of layers." );
|
||||||
}
|
}
|
||||||
if ( level === oldLevel || oldLevel === -1 ) {
|
if ( level === oldLevel || oldLevel === -1 ) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
if ( level === 0 || oldLevel === 0 ) {
|
||||||
|
if ( THIS[ this.hash ].sequenced ) {
|
||||||
|
throw new Error( "Cannot reassign base level when in sequence mode." );
|
||||||
|
}
|
||||||
|
// We need to re-assign the base drawer
|
||||||
|
this.drawer = level === 0 ? drawer : this.getLayerAtLevel( level );
|
||||||
|
}
|
||||||
this.drawers.splice( oldLevel, 1 );
|
this.drawers.splice( oldLevel, 1 );
|
||||||
this.drawers.splice( level, 0, drawer );
|
this.drawers.splice( level, 0, drawer );
|
||||||
this.canvas.removeChild( drawer.canvas );
|
this.canvas.removeChild( drawer.canvas );
|
||||||
|
if ( level === 0 ) {
|
||||||
|
var nextLevelCanvas = this.drawers[ 1 ].canvas;
|
||||||
|
nextLevelCanvas.parentNode.insertBefore( drawer.canvas,
|
||||||
|
nextLevelCanvas );
|
||||||
|
} else {
|
||||||
// Insert right after layer at level - 1
|
// Insert right after layer at level - 1
|
||||||
var prevLevelCanvas = this.drawers[level - 1].canvas;
|
var prevLevelCanvas = this.drawers[level - 1].canvas;
|
||||||
prevLevelCanvas.parentNode.insertBefore( drawer.canvas,
|
prevLevelCanvas.parentNode.insertBefore( drawer.canvas,
|
||||||
prevLevelCanvas.nextSibling );
|
prevLevelCanvas.nextSibling );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Raised when the order of the layers has been changed.
|
* Raised when the order of the layers has been changed.
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div id="availables">
|
<div id="availables">
|
||||||
Availables layers<br>
|
Available layers<br>
|
||||||
<select name="layers-availables" size="4" multiple="multiple">
|
<select name="layers-availables" size="4" multiple="multiple">
|
||||||
<option>CCyan</option>
|
<option>CCyan</option>
|
||||||
<option>DDandelion</option>
|
<option>DDandelion</option>
|
||||||
|
130
test/layers.js
130
test/layers.js
@ -28,11 +28,9 @@
|
|||||||
// ----------
|
// ----------
|
||||||
asyncTest( 'Layers operations', function() {
|
asyncTest( 'Layers operations', function() {
|
||||||
expect( 22 );
|
expect( 22 );
|
||||||
|
|
||||||
viewer.addHandler( "open", function( ) {
|
viewer.addHandler( "open", function( ) {
|
||||||
equal( 0, viewer.getNumberOfLayers(),
|
equal( 1, viewer.getLayersCount( ),
|
||||||
"No layer should be present after opening." );
|
"One layer should be present after opening." );
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
tileSource: {
|
tileSource: {
|
||||||
type: 'legacy-image-pyramid',
|
type: 'legacy-image-pyramid',
|
||||||
@ -47,9 +45,8 @@
|
|||||||
viewer.addHandler( "add-layer", function addFirstLayerHandler( event ) {
|
viewer.addHandler( "add-layer", function addFirstLayerHandler( event ) {
|
||||||
viewer.removeHandler( "add-layer", addFirstLayerHandler );
|
viewer.removeHandler( "add-layer", addFirstLayerHandler );
|
||||||
var layer1 = event.drawer;
|
var layer1 = event.drawer;
|
||||||
|
equal( viewer.getLayersCount( ), 2,
|
||||||
equal( viewer.getNumberOfLayers(), 1,
|
"2 layers should be present after adding a layer." );
|
||||||
"1 layer should be present after adding a layer." );
|
|
||||||
equal( options, event.options,
|
equal( options, event.options,
|
||||||
"The options should be transmitted via the event." );
|
"The options should be transmitted via the event." );
|
||||||
equal( viewer.getLevelOfLayer( layer1 ), 1,
|
equal( viewer.getLevelOfLayer( layer1 ), 1,
|
||||||
@ -61,9 +58,8 @@
|
|||||||
viewer.addHandler( "add-layer", function addSecondLayerHandler( event ) {
|
viewer.addHandler( "add-layer", function addSecondLayerHandler( event ) {
|
||||||
viewer.removeHandler( "add-layer", addSecondLayerHandler );
|
viewer.removeHandler( "add-layer", addSecondLayerHandler );
|
||||||
var layer2 = event.drawer;
|
var layer2 = event.drawer;
|
||||||
|
equal( viewer.getLayersCount( ), 3,
|
||||||
equal( viewer.getNumberOfLayers(), 2,
|
"3 layers should be present after adding a second layer." );
|
||||||
"2 layers should be present after adding a second layer." );
|
|
||||||
equal( viewer.getLevelOfLayer( layer2 ), 2,
|
equal( viewer.getLevelOfLayer( layer2 ), 2,
|
||||||
"If not specified, a layer should be added with the highest level." );
|
"If not specified, a layer should be added with the highest level." );
|
||||||
equal( viewer.getLayerAtLevel( 2 ), layer2,
|
equal( viewer.getLayerAtLevel( 2 ), layer2,
|
||||||
@ -95,9 +91,8 @@
|
|||||||
viewer.addHandler( "add-layer", function addThirdLayerHandler( event ) {
|
viewer.addHandler( "add-layer", function addThirdLayerHandler( event ) {
|
||||||
viewer.removeHandler( "add-layer", addThirdLayerHandler );
|
viewer.removeHandler( "add-layer", addThirdLayerHandler );
|
||||||
var layer3 = event.drawer;
|
var layer3 = event.drawer;
|
||||||
|
equal( viewer.getLayersCount( ), 4,
|
||||||
equal( viewer.getNumberOfLayers(), 3,
|
"4 layers should be present after adding a third layer." );
|
||||||
"3 layers should be present after adding a third layer." );
|
|
||||||
equal( viewer.getLevelOfLayer( layer3 ), 2,
|
equal( viewer.getLevelOfLayer( layer3 ), 2,
|
||||||
"Layer 3 should be added with level 2." );
|
"Layer 3 should be added with level 2." );
|
||||||
equal( viewer.getLevelOfLayer( layer2 ), 1,
|
equal( viewer.getLevelOfLayer( layer2 ), 1,
|
||||||
@ -125,7 +120,7 @@
|
|||||||
viewer.open( '/test/data/testpattern.dzi' );
|
viewer.open( '/test/data/testpattern.dzi' );
|
||||||
});
|
});
|
||||||
|
|
||||||
asyncTest( 'Collections as layers', function() {
|
asyncTest( 'Sequences as layers', function() {
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
tileSource: [{
|
tileSource: [{
|
||||||
@ -151,8 +146,7 @@
|
|||||||
viewer.addHandler( "add-layer-failed",
|
viewer.addHandler( "add-layer-failed",
|
||||||
function addLayerFailedHandler( event ) {
|
function addLayerFailedHandler( event ) {
|
||||||
viewer.removeHandler( "add-layer-failed", addLayerFailedHandler );
|
viewer.removeHandler( "add-layer-failed", addLayerFailedHandler );
|
||||||
|
equal( event.message, "Sequences can not be added as layers." );
|
||||||
equal( event.message, "Collections can not be added as layers." );
|
|
||||||
equal( event.options, options, "Layer failed event should give the options." );
|
equal( event.options, options, "Layer failed event should give the options." );
|
||||||
start();
|
start();
|
||||||
} );
|
} );
|
||||||
@ -161,4 +155,108 @@
|
|||||||
});
|
});
|
||||||
viewer.open( '/test/data/testpattern.dzi' );
|
viewer.open( '/test/data/testpattern.dzi' );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
asyncTest( 'Reassign base layer', function() {
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
tileSource: {
|
||||||
|
type: 'legacy-image-pyramid',
|
||||||
|
levels: [ {
|
||||||
|
url: "data/A.png",
|
||||||
|
width: 1000,
|
||||||
|
height: 1000
|
||||||
|
} ]
|
||||||
|
},
|
||||||
|
level: 0
|
||||||
|
};
|
||||||
|
viewer.addHandler( "open", function openHandler( ) {
|
||||||
|
viewer.removeHandler( "open", openHandler );
|
||||||
|
var testPatternDrawer = viewer.drawer;
|
||||||
|
equal( viewer.drawer, testPatternDrawer, "Viewer.drawer should be set to testPatternDrawer." );
|
||||||
|
viewer.addHandler( "add-layer", function addLayerHandler( event ) {
|
||||||
|
viewer.removeHandler( "add-layer", addLayerHandler );
|
||||||
|
var aDrawer = event.drawer;
|
||||||
|
equal( viewer.drawer, aDrawer, "Viewer.drawer should be set to aDrawer." );
|
||||||
|
viewer.setLayerLevel( aDrawer, 1 );
|
||||||
|
equal( viewer.drawer, testPatternDrawer, "Viewer.drawer should be set back to testPatternDrawer." );
|
||||||
|
start( );
|
||||||
|
} );
|
||||||
|
viewer.addLayer( options );
|
||||||
|
} );
|
||||||
|
viewer.open( '/test/data/testpattern.dzi' );
|
||||||
|
} );
|
||||||
|
|
||||||
|
asyncTest( 'Layers and sequences', function() {
|
||||||
|
expect( 1 );
|
||||||
|
|
||||||
|
// TODO: Remove workaround when issue #321 is fixed.
|
||||||
|
// https://github.com/openseadragon/openseadragon/issues/321
|
||||||
|
// viewer.open( [{
|
||||||
|
// type: 'legacy-image-pyramid',
|
||||||
|
// levels: [ {
|
||||||
|
// url: "data/A.png",
|
||||||
|
// width: 1000,
|
||||||
|
// height: 1000
|
||||||
|
// }]
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// type: 'legacy-image-pyramid',
|
||||||
|
// levels: [ {
|
||||||
|
// url: "data/BBlue.png",
|
||||||
|
// width: 1000,
|
||||||
|
// height: 1000
|
||||||
|
// }]}] );
|
||||||
|
|
||||||
|
viewer.close();
|
||||||
|
viewer = OpenSeadragon( {
|
||||||
|
id: 'layersexample',
|
||||||
|
prefixUrl: '/build/openseadragon/images/',
|
||||||
|
springStiffness: 100, // Faster animation = faster tests
|
||||||
|
tileSources: [ {
|
||||||
|
type: 'legacy-image-pyramid',
|
||||||
|
levels: [ {
|
||||||
|
url: "data/A.png",
|
||||||
|
width: 1000,
|
||||||
|
height: 1000
|
||||||
|
} ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'legacy-image-pyramid',
|
||||||
|
levels: [ {
|
||||||
|
url: "data/BBlue.png",
|
||||||
|
width: 1000,
|
||||||
|
height: 1000
|
||||||
|
} ] } ]
|
||||||
|
|
||||||
|
} );
|
||||||
|
// End workaround
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
tileSource: {
|
||||||
|
type: 'legacy-image-pyramid',
|
||||||
|
levels: [ {
|
||||||
|
url: "data/CCyan.png",
|
||||||
|
width: 1000,
|
||||||
|
height: 1000
|
||||||
|
} ]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
viewer.addHandler( "open", function openHandler() {
|
||||||
|
viewer.addHandler( "add-layer", function addLayerHandler( event ) {
|
||||||
|
viewer.removeHandler( "add-layer", addLayerHandler );
|
||||||
|
|
||||||
|
var layer = event.drawer;
|
||||||
|
try {
|
||||||
|
viewer.setLayerLevel( layer, 0 );
|
||||||
|
} catch (e) {
|
||||||
|
ok( true );
|
||||||
|
}
|
||||||
|
start();
|
||||||
|
} );
|
||||||
|
viewer.addLayer( options );
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
})();
|
})();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user