tui-image-editor
Version:
TOAST UI ImageEditor
240 lines (209 loc) • 6.07 kB
JavaScript
import Submenu from '@/ui/submenuBase';
import templateHtml from '@/ui/template/submenu/resize';
import { assignmentForDestroy, toInteger } from '@/util';
import Range from '@/ui/tools/range';
import { defaultResizePixelValues } from '@/consts';
/**
* Resize ui class
* @class
* @ignore
*/
class Resize extends Submenu {
constructor(subMenuElement, { locale, makeSvgIcon, menuBarPosition, usageStatistics }) {
super(subMenuElement, {
locale,
name: 'resize',
makeSvgIcon,
menuBarPosition,
templateHtml,
usageStatistics,
});
this.status = 'active';
this._lockState = false;
/**
* Original dimensions
* @type {Object}
* @private
*/
this._originalDimensions = null;
this._els = {
widthRange: new Range(
{
slider: this.selector('.tie-width-range'),
input: this.selector('.tie-width-range-value'),
},
defaultResizePixelValues
),
heightRange: new Range(
{
slider: this.selector('.tie-height-range'),
input: this.selector('.tie-height-range-value'),
},
defaultResizePixelValues
),
lockAspectRatio: this.selector('.tie-lock-aspect-ratio'),
apply: this.selector('.tie-resize-button .apply'),
cancel: this.selector('.tie-resize-button .cancel'),
};
}
/**
* Executed when the menu starts.
*/
changeStartMode() {
this.actions.modeChange('resize');
const dimensions = this.actions.getCurrentDimensions();
this._originalDimensions = dimensions;
this.setWidthValue(dimensions.width);
this.setHeightValue(dimensions.height);
}
/**
* Returns the menu to its default state.
*/
changeStandbyMode() {
this.actions.stopDrawingMode();
this.actions.reset(true);
}
/**
* Set dimension limits
* @param {object} limits - expect dimension limits for change
*/
setLimit(limits) {
this._els.widthRange.min = this.calcMinValue(limits.minWidth);
this._els.heightRange.min = this.calcMinValue(limits.minHeight);
this._els.widthRange.max = this.calcMaxValue(limits.maxWidth);
this._els.heightRange.max = this.calcMaxValue(limits.maxHeight);
}
/**
* Calculate max value
* @param {number} maxValue - max value
* @returns {number}
*/
calcMaxValue(maxValue) {
if (maxValue <= 0) {
maxValue = defaultResizePixelValues.max;
}
return maxValue;
}
/**
* Calculate min value
* @param {number} minValue - min value
* @returns {number}
*/
calcMinValue(minValue) {
if (minValue <= 0) {
minValue = defaultResizePixelValues.min;
}
return minValue;
}
/**
* Set width value
* @param {number} value - expect value for widthRange change
* @param {boolean} trigger - fire change event control
*/
setWidthValue(value, trigger = false) {
this._els.widthRange.value = value;
if (trigger) {
this._els.widthRange.trigger('change');
}
}
/**
* Set height value
* @param {number} value - expect value for heightRange change
* @param {boolean} trigger - fire change event control
*/
setHeightValue(value, trigger = false) {
this._els.heightRange.value = value;
if (trigger) {
this._els.heightRange.trigger('change');
}
}
/**
* Destroys the instance.
*/
destroy() {
this._removeEvent();
assignmentForDestroy(this);
}
/**
* Add event for resize
* @param {Object} actions - actions for resize
* @param {Function} actions.resize - resize action
* @param {Function} actions.preview - preview action
* @param {Function} actions.getCurrentDimensions - Get current dimensions action
* @param {Function} actions.modeChange - change mode
* @param {Function} actions.stopDrawingMode - stop drawing mode
* @param {Function} actions.lockAspectRatio - lock aspect ratio
* @param {Function} actions.reset - reset action
*/
addEvent(actions) {
this._els.widthRange.on('change', this._changeWidthRangeHandler.bind(this));
this._els.heightRange.on('change', this._changeHeightRangeHandler.bind(this));
this._els.lockAspectRatio.addEventListener('change', this._changeLockAspectRatio.bind(this));
const apply = this._applyEventHandler.bind(this);
const cancel = this._cancelEventHandler.bind(this);
this.eventHandler = {
apply,
cancel,
};
this.actions = actions;
this._els.apply.addEventListener('click', apply);
this._els.cancel.addEventListener('click', cancel);
}
/**
* Change width
* @param {number} value - width range value
* @private
*/
_changeWidthRangeHandler(value) {
this.actions.preview('width', toInteger(value), this._lockState);
}
/**
* Change height
* @param {number} value - height range value
* @private
*/
_changeHeightRangeHandler(value) {
this.actions.preview('height', toInteger(value), this._lockState);
}
/**
* Change lock aspect ratio state
* @param {Event} event - aspect ratio check event
* @private
*/
_changeLockAspectRatio(event) {
this._lockState = event.target.checked;
this.actions.lockAspectRatio(
this._lockState,
defaultResizePixelValues.min,
defaultResizePixelValues.max
);
}
/**
* Remove event
* @private
*/
_removeEvent() {
this._els.apply.removeEventListener('click', this.eventHandler.apply);
this._els.cancel.removeEventListener('click', this.eventHandler.cancel);
}
_applyEventHandler() {
this.actions.resize();
this._els.apply.classList.remove('active');
}
_cancelEventHandler() {
this.actions.reset();
this._els.cancel.classList.remove('active');
}
/**
* Change apply button status
* @param {Boolean} enableStatus - apply button status
*/
changeApplyButtonStatus(enableStatus) {
if (enableStatus) {
this._els.apply.classList.add('active');
} else {
this._els.apply.classList.remove('active');
}
}
}
export default Resize;