mirror of
https://github.com/danbulant/heaventaker
synced 2026-06-20 07:01:27 +00:00
70 lines
No EOL
1.7 KiB
JavaScript
70 lines
No EOL
1.7 KiB
JavaScript
class ImageHandler {
|
|
constructor() {
|
|
/** @type {Map<string, HTMLImageElement>} */
|
|
this.images = new Map();
|
|
|
|
/** @type {Function[]} */
|
|
this.onloadHandlers = [];
|
|
this.loaded = false;
|
|
this.shouldFire = false;
|
|
}
|
|
|
|
/**
|
|
* Runs the handler when all images are loaded
|
|
* @param {(images: Map<string, Image>) => void} handler
|
|
*/
|
|
onload(handler) {
|
|
this.onloadHandlers.push(handler);
|
|
}
|
|
|
|
areLoaded() {
|
|
return this.loaded && this.areAllLoaded();
|
|
}
|
|
|
|
startLoad() {
|
|
this.shouldFire = true;
|
|
if(this.areAllLoaded()) {
|
|
this.onloadHandlers.forEach(cb => cb(this.images));
|
|
this.onloadHandlers = [];
|
|
this.loaded = true;
|
|
this.shouldFire = false;
|
|
}
|
|
}
|
|
|
|
areAllLoaded() {
|
|
return [...this.images.values()].every(a => a.complete && a.naturalHeight !== 0);
|
|
}
|
|
|
|
update() {
|
|
if(!this.areAllLoaded() || !this.shouldFire) return; // not yet
|
|
this.onloadHandlers.forEach(cb => cb(this.images));
|
|
this.onloadHandlers = [];
|
|
this.loaded = true;
|
|
}
|
|
|
|
get(image) {
|
|
return this.images.get(image);
|
|
}
|
|
|
|
/**
|
|
* Adds the image to requested load
|
|
* @param {string} key
|
|
* @param {string | Image} image
|
|
*/
|
|
load(key, image) {
|
|
if(typeof image === "string") {
|
|
var i = new Image();
|
|
i.onload = () => this.update();
|
|
i.src = image;
|
|
image = i;
|
|
} else {
|
|
image.onload = () => this.update();
|
|
}
|
|
this.loaded = false;
|
|
this.images.set(key, image);
|
|
}
|
|
}
|
|
|
|
var images = new ImageHandler;
|
|
export { ImageHandler };
|
|
export default images; |