vue-poster-editor
Version:
A poster editor based on Vue.js
335 lines (268 loc) • 10.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _merge2 = require('lodash/merge');
var _merge3 = _interopRequireDefault(_merge2);
var _utils = require('../utils/utils');
var _utils2 = _interopRequireDefault(_utils);
var _vueInherit = require('../utils/vue-inherit');
var _vueInherit2 = _interopRequireDefault(_vueInherit);
var _editorElement = require('../canvas/editor-element');
var _editorElement2 = _interopRequireDefault(_editorElement);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = (0, _vueInherit2.default)(_editorElement2.default, {
props: ['model', 'currentElement', 'global'],
data: function data() {
return {
type: 'croper',
clickLocked: true,
showGrid: false,
lastCurrentElement: null,
innerProps: {
editModel: null,
editModelInner: null
}
};
},
computed: {
editor: function editor() {
return this.$parent;
},
zoom: function zoom() {
return this.global.zoom;
},
editModel: function editModel() {
return this.getEditModel();
},
editModelInner: function editModelInner() {
return this.getEditModelInner();
},
rectPrefix: function rectPrefix() {
var currentElement = this.lastCurrentElement;
var ret = {
left: 0,
top: 0
};
if (currentElement && currentElement !== this.model) {
ret.left = currentElement.left;
ret.top = currentElement.top;
}
return ret;
}
},
methods: {
getEditModel: function getEditModel() {
var model = this.model;
var innerProps = this.innerProps;
var editModel = innerProps.editModel;
if (editModel && model === innerProps.modelCache) {
return editModel;
}
var _model$imageTransform = this.model.imageTransform.position,
x = _model$imageTransform.x,
y = _model$imageTransform.y;
var centerPoint = _utils2.default.getPointPosition({
x: model.left + x + model.imageWidth / 2,
y: model.top + y + model.imageHeight / 2
}, {
x: model.left + model.width / 2,
y: model.top + model.height / 2
}, model.rotate);
editModel = (0, _merge3.default)({}, model, {
type: '$' + this.type,
$dragLimit: true,
height: model.imageHeight,
width: model.imageWidth,
left: centerPoint.x - model.imageWidth / 2,
top: centerPoint.y - model.imageHeight / 2,
clip: null,
resize: this.options.cropperOptions.outerResize,
$guider: { show: false, snapTo: false },
rotatable: true,
dragable: true
});
editModel.rotation = model.imageTransform.rotation + model.transform.rotation;
editModel = this.editor.createElement(editModel);
model.$editing = true;
innerProps.editModel = editModel;
innerProps.modelCache = model;
return editModel;
},
getEditModelInner: function getEditModelInner() {
var model = this.model;
var innerProps = this.innerProps;
var editModelInner = innerProps.editModelInner;
if (editModelInner && model === innerProps.modelCache) {
return editModelInner;
}
var padding = model.padding;
editModelInner = (0, _merge3.default)({}, model, {
type: '$' + this.type,
$name: '$cropperInner',
height: model.height + padding[0] + padding[2],
width: model.width + padding[1] + padding[3],
left: model.left,
top: model.top,
$dragLimit: true,
$customDragMove: true,
resize: 7,
rotatable: true,
dragable: true,
$guider: {
show: true,
snapTo: true
},
active: false
});
editModelInner = this.editor.createElement(editModelInner);
model.$editing = true;
innerProps.editModelInner = editModelInner;
innerProps.modelCache = model;
return editModelInner;
},
destroyEditModel: function destroyEditModel() {
var model = this.model;
if (!model) {
return;
}
if (this.lastCurrentElement && (this.currentElement === this.editModel || this.currentElement === this.editModelInner)) {
this.editor.focusElement(this.lastCurrentElement);
}
model.$editing = false;
this.$emit('update:model', null);
},
save: function save() {
var model = this.model,
editModel = this.editModel,
editModelInner = this.editModelInner;
var imageTransform = model.imageTransform;
Object.assign(model, {
imageWidth: editModel.width,
imageHeight: editModel.height,
height: editModelInner.height,
width: editModelInner.width,
left: editModelInner.left,
top: editModelInner.top
});
var newPoint = _utils2.default.getPointPosition({
x: editModel.left + editModel.width / 2,
y: editModel.top + editModel.height / 2
}, {
x: editModelInner.left + editModelInner.width / 2,
y: editModelInner.top + editModelInner.height / 2
}, -editModelInner.rotate);
var x = newPoint.x - editModel.width / 2 - editModelInner.left;
var y = newPoint.y - editModel.height / 2 - editModelInner.top;
imageTransform.position.x = Math.round(x);
imageTransform.position.y = Math.round(y);
imageTransform.rotation = editModel.transform.rotation - editModelInner.transform.rotation;
model.rotation = editModelInner.rotation;
this.editor.changeElement({
imageTransform: imageTransform
});
this.destroyEditModel();
},
cancel: function cancel() {
this.destroyEditModel();
}
},
events: {
'editor.drag.active': function editorDragActive(element) {
if (element.type !== '$masker') {
this.editor.$events.$emit('editor.edit.apply', this.editModel);
return;
}
this.clickLocked = false;
this.showGrid = true;
var editModelInner = this.editModelInner,
editModel = this.editModel;
var xBound = (editModelInner.width + editModel.width) / 2;
var yBound = (editModelInner.height + editModel.height) / 2;
var dragLimit = {
minLeft: -xBound,
maxLeft: xBound,
minTop: -yBound,
maxTop: yBound,
baseLeft: editModel.left,
baseTop: editModel.top,
centerDeltaX: editModel.left + editModel.width / 2 - (editModelInner.left + editModelInner.width / 2),
centerDeltaY: editModel.top + editModel.height / 2 - (editModelInner.top + editModelInner.height / 2)
};
editModel.$getDragLimit = editModelInner.$getDragLimit = function () {
return dragLimit;
};
},
'editor.drag.inactive': function editorDragInactive() {
var _this = this;
this.clickLocked = false;
this.showGrid = false;
setTimeout(function () {
_this.clickLocked = true;
}, 0);
},
'editor.drag.customMoving': function editorDragCustomMoving(_ref) {
var element = _ref.element,
dx = _ref.dx,
dy = _ref.dy;
var _element$$getDragLimi = element.$getDragLimit(),
baseLeft = _element$$getDragLimi.baseLeft,
baseTop = _element$$getDragLimi.baseTop;
var _ref2 = [baseLeft + dx, baseTop + dy];
this.editModel.left = _ref2[0];
this.editModel.top = _ref2[1];
},
'editor.transform.active': function editorTransformActive(element) {
this.showGrid = true;
if (element === this.editModel) {
this.clickLocked = true;
}
},
'editor.transform.inactive': function editorTransformInactive() {
var _this2 = this;
this.clickLocked = false;
this.showGrid = false;
var _editModel = this.editModel,
width = _editModel.width,
height = _editModel.height;
this.$events.$emit('imageCroper.resizeEnd', { width: width, height: height });
setTimeout(function () {
_this2.clickLocked = true;
}, 0);
},
'editor.edit.apply': function editorEditApply(model) {
if (model !== this.editModel && model !== this.editModelInner) {
return;
}
this.save();
},
'editor.edit.cancel': function editorEditCancel(model) {
if (model !== this.editModel && model !== this.editModelInner) {
return;
}
this.cancel();
}
},
watch: {
currentElement: function currentElement(element) {
if (element !== this.editModel && element !== this.editModelInner) {
this.$events.$emit('editor.edit.apply', this.editModel);
this.destroyEditModel();
}
}
},
created: function created() {
this.lastCurrentElement = this.currentElement;
},
mounted: function mounted() {
var _this3 = this;
this.editor.focusElement(this.editModel);
if (this.options.cropperOptions.defaultTarget === 'inner') {
this.$nextTick(function () {
_this3.editor.focusElement(_this3.editModelInner);
_this3.editModelInner.active = true;
});
}
}
});
module.exports = exports['default'];