From f13691f60d0205a5b08abf42bb48b2c75ee05951 Mon Sep 17 00:00:00 2001 From: Larissa Smith Date: Wed, 19 Aug 2015 13:29:55 -0600 Subject: [PATCH 1/2] Added option in addTiledImage to replace tiledImage at index. --- src/viewer.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/viewer.js b/src/viewer.js index b0ee7757..7b482990 100644 --- a/src/viewer.js +++ b/src/viewer.js @@ -1193,6 +1193,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, * named 'getTileUrl', it is treated as a custom TileSource. * @param {Number} [options.index] The index of the item. Added on top of * all other items if not specified. + * @param {Boolean} [options.replace=false] If true, the item at options.index will be + * removed and the new item is added in its place. options.tileSource will be + * interpreted and fetched if necessary before the old item is removed to avoid leaving + * a gap in the world. * @param {Number} [options.x=0] The X position for the image in viewport coordinates. * @param {Number} [options.y=0] The Y position for the image in viewport coordinates. * @param {Number} [options.width=1] The width for the image in viewport coordinates. @@ -1216,6 +1220,8 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, addTiledImage: function( options ) { $.console.assert(options, "[Viewer.addTiledImage] options is required"); $.console.assert(options.tileSource, "[Viewer.addTiledImage] options.tileSource is required"); + $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()), + "[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world"); var _this = this; @@ -1283,6 +1289,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, _this._loadQueue.splice(0, 1); + if (queueItem.options.replace) { + _this.world.removeItem(_this.world.getItemAt(queueItem.options.index)); + } + tiledImage = new $.TiledImage({ viewer: _this, source: queueItem.tileSource, From 7076d64b1b6c0f8cbaad44cca4d89a808dbe0cd7 Mon Sep 17 00:00:00 2001 From: Larissa Smith Date: Fri, 21 Aug 2015 11:01:32 -0600 Subject: [PATCH 2/2] Fixed race condition for replacing a tiledImage where the world may have changed before the new tiledImage loads. Added test for replacing with addTiledImage. --- src/viewer.js | 10 +++++++++- test/modules/multi-image.js | 40 +++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/viewer.js b/src/viewer.js index 7b482990..ce7609dd 100644 --- a/src/viewer.js +++ b/src/viewer.js @@ -1225,6 +1225,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, var _this = this; + if (options.replace) { + options.replaceItem = _this.world.getItemAt(options.index); + } + this._hideMessage(); if (options.placeholderFillStyle === undefined) { @@ -1290,7 +1294,11 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, _this._loadQueue.splice(0, 1); if (queueItem.options.replace) { - _this.world.removeItem(_this.world.getItemAt(queueItem.options.index)); + var newIndex = _this.world.getIndexOfItem(options.replaceItem); + if (newIndex != -1) { + options.index = newIndex; + } + _this.world.removeItem(options.replaceItem); } tiledImage = new $.TiledImage({ diff --git a/test/modules/multi-image.js b/test/modules/multi-image.js index c875757c..5d4b21bd 100644 --- a/test/modules/multi-image.js +++ b/test/modules/multi-image.js @@ -27,7 +27,7 @@ // ---------- asyncTest( 'Multi-image operations', function() { - expect( 21 ); + expect( 24 ); viewer.addHandler( "open", function( ) { equal( 1, viewer.world.getItemCount( ), "One item should be present after opening." ); @@ -95,22 +95,36 @@ equal( viewer.world.getIndexOfItem( item2 ), 1, "Item 2 should stay at index 1." ); - viewer.world.addHandler( "remove-item", function removeItemHandler( event ) { - viewer.world.removeHandler( "remove-item", removeItemHandler ); + options.index = 2; + options.replace = true; + viewer.addTiledImage( options ); + viewer.world.addHandler( "add-item", function replaceAddItemHandler( event ) { + viewer.world.removeHandler( "add-item", replaceAddItemHandler ); + var item4 = event.item; + equal( viewer.world.getItemCount( ), 4, + "4 items should still be present after replacing the second item." ); + equal( viewer.world.getIndexOfItem( item4 ), 2, + "Item 4 should be added with index 2." ); + equal( viewer.world.getIndexOfItem( item3 ), -1, + "Item 3 should be at index -1." ); - equal( item2, event.item, "Removed item should be item2." ); + viewer.world.addHandler( "remove-item", function removeItemHandler( event ) { + viewer.world.removeHandler( "remove-item", removeItemHandler ); - equal( viewer.world.getIndexOfItem( item1 ), 2, - "Item 1 should be at index 2." ); - equal( viewer.world.getIndexOfItem( item2 ), -1, - "Item 2 should be at index -1." ); - equal( viewer.world.getIndexOfItem( item3 ), 1, - "Item 3 should be at index 1." ); + equal( item2, event.item, "Removed item should be item2." ); - start(); + equal( viewer.world.getIndexOfItem( item1 ), 2, + "Item 1 should be at index 2." ); + equal( viewer.world.getIndexOfItem( item2 ), -1, + "Item 2 should be at index -1." ); + equal( viewer.world.getIndexOfItem( item4 ), 1, + "Item 4 should be at index 1." ); + + start(); + }); + + viewer.world.removeItem( item2 ); }); - - viewer.world.removeItem( item2 ); }); }); });