213 lines
4.3 KiB
JavaScript
213 lines
4.3 KiB
JavaScript
import {
|
|
ACTION_CROP,
|
|
ACTION_ZOOM,
|
|
CLASS_CROP,
|
|
CLASS_MODAL,
|
|
DATA_ACTION,
|
|
DRAG_MODE_CROP,
|
|
DRAG_MODE_MOVE,
|
|
DRAG_MODE_NONE,
|
|
EVENT_CROP_END,
|
|
EVENT_CROP_MOVE,
|
|
EVENT_CROP_START,
|
|
REGEXP_ACTIONS,
|
|
} from './constants';
|
|
import {
|
|
addClass,
|
|
dispatchEvent,
|
|
each,
|
|
extend,
|
|
getData,
|
|
getPointer,
|
|
hasClass,
|
|
toggleClass,
|
|
} from './utilities';
|
|
|
|
export default {
|
|
resize() {
|
|
const { options, container, containerData } = this;
|
|
const minContainerWidth = Number(options.minContainerWidth) || 200;
|
|
const minContainerHeight = Number(options.minContainerHeight) || 100;
|
|
|
|
if (this.disabled || containerData.width <= minContainerWidth ||
|
|
containerData.height <= minContainerHeight) {
|
|
return;
|
|
}
|
|
|
|
const ratio = container.offsetWidth / containerData.width;
|
|
|
|
// Resize when width changed or height changed
|
|
if (ratio !== 1 || container.offsetHeight !== containerData.height) {
|
|
let canvasData;
|
|
let cropBoxData;
|
|
|
|
if (options.restore) {
|
|
canvasData = this.getCanvasData();
|
|
cropBoxData = this.getCropBoxData();
|
|
}
|
|
|
|
this.render();
|
|
|
|
if (options.restore) {
|
|
this.setCanvasData(each(canvasData, (n, i) => {
|
|
canvasData[i] = n * ratio;
|
|
}));
|
|
this.setCropBoxData(each(cropBoxData, (n, i) => {
|
|
cropBoxData[i] = n * ratio;
|
|
}));
|
|
}
|
|
}
|
|
},
|
|
|
|
dblclick() {
|
|
if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {
|
|
return;
|
|
}
|
|
|
|
this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);
|
|
},
|
|
|
|
wheel(e) {
|
|
const ratio = Number(this.options.wheelZoomRatio) || 0.1;
|
|
let delta = 1;
|
|
|
|
if (this.disabled) {
|
|
return;
|
|
}
|
|
|
|
e.preventDefault();
|
|
|
|
// Limit wheel speed to prevent zoom too fast (#21)
|
|
if (this.wheeling) {
|
|
return;
|
|
}
|
|
|
|
this.wheeling = true;
|
|
|
|
setTimeout(() => {
|
|
this.wheeling = false;
|
|
}, 50);
|
|
|
|
if (e.deltaY) {
|
|
delta = e.deltaY > 0 ? 1 : -1;
|
|
} else if (e.wheelDelta) {
|
|
delta = -e.wheelDelta / 120;
|
|
} else if (e.detail) {
|
|
delta = e.detail > 0 ? 1 : -1;
|
|
}
|
|
|
|
this.zoom(-delta * ratio, e);
|
|
},
|
|
|
|
cropStart(e) {
|
|
if (this.disabled) {
|
|
return;
|
|
}
|
|
|
|
const { options, pointers } = this;
|
|
let action;
|
|
|
|
if (e.changedTouches) {
|
|
// Handle touch event
|
|
each(e.changedTouches, (touch) => {
|
|
pointers[touch.identifier] = getPointer(touch);
|
|
});
|
|
} else {
|
|
// Handle mouse event and pointer event
|
|
pointers[e.pointerId || 0] = getPointer(e);
|
|
}
|
|
|
|
if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {
|
|
action = ACTION_ZOOM;
|
|
} else {
|
|
action = getData(e.target, DATA_ACTION);
|
|
}
|
|
|
|
if (!REGEXP_ACTIONS.test(action)) {
|
|
return;
|
|
}
|
|
|
|
if (dispatchEvent(this.element, EVENT_CROP_START, {
|
|
originalEvent: e,
|
|
action,
|
|
}) === false) {
|
|
return;
|
|
}
|
|
|
|
e.preventDefault();
|
|
|
|
this.action = action;
|
|
this.cropping = false;
|
|
|
|
if (action === ACTION_CROP) {
|
|
this.cropping = true;
|
|
addClass(this.dragBox, CLASS_MODAL);
|
|
}
|
|
},
|
|
|
|
cropMove(e) {
|
|
const { action } = this;
|
|
|
|
if (this.disabled || !action) {
|
|
return;
|
|
}
|
|
|
|
const { pointers } = this;
|
|
|
|
e.preventDefault();
|
|
|
|
if (dispatchEvent(this.element, EVENT_CROP_MOVE, {
|
|
originalEvent: e,
|
|
action,
|
|
}) === false) {
|
|
return;
|
|
}
|
|
|
|
if (e.changedTouches) {
|
|
each(e.changedTouches, (touch) => {
|
|
extend(pointers[touch.identifier], getPointer(touch, true));
|
|
});
|
|
} else {
|
|
extend(pointers[e.pointerId || 0], getPointer(e, true));
|
|
}
|
|
|
|
this.change(e);
|
|
},
|
|
|
|
cropEnd(e) {
|
|
if (this.disabled) {
|
|
return;
|
|
}
|
|
|
|
const { action, pointers } = this;
|
|
|
|
if (e.changedTouches) {
|
|
each(e.changedTouches, (touch) => {
|
|
delete pointers[touch.identifier];
|
|
});
|
|
} else {
|
|
delete pointers[e.pointerId || 0];
|
|
}
|
|
|
|
if (!action) {
|
|
return;
|
|
}
|
|
|
|
e.preventDefault();
|
|
|
|
if (!Object.keys(pointers).length) {
|
|
this.action = '';
|
|
}
|
|
|
|
if (this.cropping) {
|
|
this.cropping = false;
|
|
toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);
|
|
}
|
|
|
|
dispatchEvent(this.element, EVENT_CROP_END, {
|
|
originalEvent: e,
|
|
action,
|
|
});
|
|
},
|
|
};
|