79 lines
1.6 KiB
JavaScript
79 lines
1.6 KiB
JavaScript
import {extend} from './utils.js';
|
|
|
|
export default class Cartographer {
|
|
constructor(settings) {
|
|
[
|
|
'getOriginX',
|
|
'getOriginY',
|
|
|
|
'getScale',
|
|
|
|
'move',
|
|
'zoom'
|
|
].map(method => this[method] = this[method].bind(this));
|
|
|
|
this.pointyTop = settings.pointyTop;
|
|
|
|
// in pixels
|
|
this.originX = 0;
|
|
this.originY = 0;
|
|
|
|
// in pixels
|
|
this.scale = 25;
|
|
this.scaleMin = 10;
|
|
this.scaleMax = 250;
|
|
|
|
// in cells
|
|
this.width = 0;
|
|
this.height = 0;
|
|
|
|
extend(this, settings);
|
|
|
|
this.originX = parseInt(this.originX);
|
|
this.originY = parseInt(this.originY);
|
|
|
|
this.width = parseInt(this.width);
|
|
this.height = parseInt(this.height);
|
|
}
|
|
|
|
getOriginX() {return this.originX;}
|
|
getOriginY() {return this.originY;}
|
|
|
|
getScale() {return this.scale;}
|
|
|
|
move(event) {
|
|
if (event.deltaX) {
|
|
|
|
this.originX = Math.floor((this.originX*1000) + (event.deltaX*1000)) / 1000;
|
|
}
|
|
|
|
if (event.deltaY) {
|
|
|
|
this.originY = Math.floor((this.originY*1000) + (event.deltaY*1000)) / 1000;
|
|
}
|
|
}
|
|
|
|
zoom(event) {
|
|
let scaleOrig = this.scale;
|
|
|
|
let scaleTemp = parseInt((scaleOrig + (event.deltaY / -10)) * 1000) / 1000;
|
|
|
|
// make sure 'scale' doesn't get too small nor too big
|
|
if (scaleTemp < this.scaleMin)
|
|
scaleTemp = this.scaleMin;
|
|
else if (scaleTemp > this.scaleMax)
|
|
scaleTemp = this.scaleMax;
|
|
|
|
if (scaleOrig != scaleTemp) {
|
|
|
|
this.scale = scaleTemp;
|
|
|
|
// zoom to the current mouse location
|
|
this.move({
|
|
deltaX: (((event.offsetX - this.originX) / scaleOrig) * (scaleOrig - scaleTemp)),
|
|
deltaY: (((event.offsetY - this.originY) / scaleOrig) * (scaleOrig - scaleTemp))
|
|
});
|
|
}
|
|
}
|
|
}
|