mirror of
https://github.com/openseadragon/openseadragon.git
synced 2024-11-25 14:46:10 +03:00
174 lines
4.8 KiB
JavaScript
174 lines
4.8 KiB
JavaScript
/* global App, $ */
|
|
(function() {
|
|
|
|
// ----------
|
|
var component = App.Page = function(config) {
|
|
this.label = config.label;
|
|
this.alternates = config.alternates;
|
|
this.pageIndex = config.pageIndex;
|
|
this.details = config.details;
|
|
|
|
if (config.masterWidth && config.masterHeight) {
|
|
this.bounds = new OpenSeadragon.Rect(0, 0, config.masterWidth, config.masterHeight);
|
|
}
|
|
|
|
this.starter = {
|
|
x: config.x,
|
|
y: config.y,
|
|
width: config.width,
|
|
tileSource: config.tileSource
|
|
};
|
|
|
|
if (config.clip) {
|
|
this.starter.clip = new OpenSeadragon.Rect(config.clip.x, config.clip.y,
|
|
config.clip.width, config.clip.height);
|
|
}
|
|
|
|
this.main = {};
|
|
|
|
this.alternateIndex = -1;
|
|
};
|
|
|
|
// ----------
|
|
component.prototype = {
|
|
// ----------
|
|
setTiledImage: function(tiledImage) {
|
|
this.setDetail(this.main, this.starter, tiledImage);
|
|
|
|
if (!this.bounds) {
|
|
this.bounds = this.main.tiledImage.getBounds();
|
|
}
|
|
},
|
|
|
|
// ----------
|
|
setDetail: function(detail, info, tiledImage) {
|
|
detail.tiledImage = tiledImage;
|
|
detail.x = info.x || 0;
|
|
detail.y = info.y || 0;
|
|
detail.width = info.width || 1;
|
|
},
|
|
|
|
// ----------
|
|
selectAlternate: function(index) {
|
|
var self = this;
|
|
|
|
if (index === this.alternateIndex) {
|
|
return;
|
|
}
|
|
|
|
var itemInfo = (index === -1 ? this.starter : this.alternates[index]);
|
|
|
|
App.viewer.world.removeItem(this.main.tiledImage);
|
|
App.viewer.addTiledImage({
|
|
tileSource: itemInfo.tileSource,
|
|
clip: itemInfo.clip,
|
|
index: this.pageIndex,
|
|
success: function(event) {
|
|
self.setDetail(self.main, itemInfo, event.item);
|
|
self.placeDetail(self.main, true);
|
|
}
|
|
});
|
|
|
|
this.alternateIndex = index;
|
|
},
|
|
|
|
// ----------
|
|
addDetails: function() {
|
|
var self = this;
|
|
|
|
if (!this.details) {
|
|
return;
|
|
}
|
|
|
|
$.each(this.details, function(i, v) {
|
|
if (v.tiledImage) {
|
|
return;
|
|
}
|
|
|
|
App.viewer.addTiledImage({
|
|
tileSource: v.tileSource,
|
|
clip: v.clip,
|
|
success: function(event) {
|
|
v.tiledImage = event.item;
|
|
self.placeDetail(v, true);
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
// ----------
|
|
removeDetails: function() {
|
|
var self = this;
|
|
|
|
if (!this.details) {
|
|
return;
|
|
}
|
|
|
|
$.each(this.details, function(i, v) {
|
|
if (v.tiledImage) {
|
|
App.viewer.world.removeItem(v.tiledImage);
|
|
delete v.tiledImage;
|
|
}
|
|
});
|
|
},
|
|
|
|
// ----------
|
|
hitTest: function(pos) {
|
|
if (!this.details) {
|
|
return this.main.tiledImage;
|
|
}
|
|
|
|
var count = this.details.length;
|
|
var detail, box;
|
|
|
|
for (var i = 0; i < count; i++) {
|
|
detail = this.details[i];
|
|
if (!detail.tiledImage) {
|
|
continue;
|
|
}
|
|
|
|
box = detail.tiledImage.getBounds();
|
|
if (pos.x > box.x && pos.y > box.y && pos.x < box.x + box.width &&
|
|
pos.y < box.y + box.height) {
|
|
return detail.tiledImage;
|
|
}
|
|
}
|
|
|
|
return this.main.tiledImage;
|
|
},
|
|
|
|
// ----------
|
|
getBounds: function() {
|
|
return this.bounds.clone();
|
|
},
|
|
|
|
// ----------
|
|
place: function(bounds, immediately) {
|
|
var self = this;
|
|
|
|
this.bounds = bounds.clone();
|
|
|
|
this.placeDetail(this.main, immediately);
|
|
|
|
if (this.details) {
|
|
$.each(this.details, function(i, v) {
|
|
if (v.tiledImage) {
|
|
self.placeDetail(v, immediately);
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
// ----------
|
|
placeDetail: function(detail, immediately) {
|
|
var position = new OpenSeadragon.Point(
|
|
this.bounds.x + (this.bounds.width * detail.x),
|
|
this.bounds.y + (this.bounds.width * detail.y));
|
|
|
|
detail.tiledImage.setPosition(position, immediately);
|
|
detail.tiledImage.setWidth(this.bounds.width * detail.width, immediately);
|
|
}
|
|
};
|
|
|
|
})();
|