Spaces:
Running
Running
| import Range from '@/ui/tools/range'; | |
| import Submenu from '@/ui/submenuBase'; | |
| import templateHtml from '@/ui/template/submenu/rotate'; | |
| import { toInteger, assignmentForDestroy } from '@/util'; | |
| import { defaultRotateRangeValues } from '@/consts'; | |
| const CLOCKWISE = 30; | |
| const COUNTERCLOCKWISE = -30; | |
| /** | |
| * Rotate ui class | |
| * @class | |
| * @ignore | |
| */ | |
| class Rotate extends Submenu { | |
| constructor(subMenuElement, { locale, makeSvgIcon, menuBarPosition, usageStatistics }) { | |
| super(subMenuElement, { | |
| locale, | |
| name: 'rotate', | |
| makeSvgIcon, | |
| menuBarPosition, | |
| templateHtml, | |
| usageStatistics, | |
| }); | |
| this._value = 0; | |
| this._els = { | |
| rotateButton: this.selector('.tie-rotate-button'), | |
| rotateRange: new Range( | |
| { | |
| slider: this.selector('.tie-rotate-range'), | |
| input: this.selector('.tie-rotate-range-value'), | |
| }, | |
| defaultRotateRangeValues | |
| ), | |
| }; | |
| } | |
| /** | |
| * Destroys the instance. | |
| */ | |
| destroy() { | |
| this._removeEvent(); | |
| this._els.rotateRange.destroy(); | |
| assignmentForDestroy(this); | |
| } | |
| setRangeBarAngle(type, angle) { | |
| let resultAngle = angle; | |
| if (type === 'rotate') { | |
| resultAngle = parseInt(this._els.rotateRange.value, 10) + angle; | |
| } | |
| this._setRangeBarRatio(resultAngle); | |
| } | |
| _setRangeBarRatio(angle) { | |
| this._els.rotateRange.value = angle; | |
| } | |
| /** | |
| * Add event for rotate | |
| * @param {Object} actions - actions for crop | |
| * @param {Function} actions.rotate - rotate action | |
| * @param {Function} actions.setAngle - set angle action | |
| */ | |
| addEvent(actions) { | |
| this.eventHandler.rotationAngleChanged = this._changeRotateForButton.bind(this); | |
| // {rotate, setAngle} | |
| this.actions = actions; | |
| this._els.rotateButton.addEventListener('click', this.eventHandler.rotationAngleChanged); | |
| this._els.rotateRange.on('change', this._changeRotateForRange.bind(this)); | |
| } | |
| /** | |
| * Remove event | |
| * @private | |
| */ | |
| _removeEvent() { | |
| this._els.rotateButton.removeEventListener('click', this.eventHandler.rotationAngleChanged); | |
| this._els.rotateRange.off(); | |
| } | |
| /** | |
| * Change rotate for range | |
| * @param {number} value - angle value | |
| * @param {boolean} isLast - Is last change | |
| * @private | |
| */ | |
| _changeRotateForRange(value, isLast) { | |
| const angle = toInteger(value); | |
| this.actions.setAngle(angle, !isLast); | |
| this._value = angle; | |
| } | |
| /** | |
| * Change rotate for button | |
| * @param {object} event - add button event object | |
| * @private | |
| */ | |
| _changeRotateForButton(event) { | |
| const button = event.target.closest('.tui-image-editor-button'); | |
| const angle = this._els.rotateRange.value; | |
| if (button) { | |
| const rotateType = this.getButtonType(button, ['counterclockwise', 'clockwise']); | |
| const rotateAngle = { | |
| clockwise: CLOCKWISE, | |
| counterclockwise: COUNTERCLOCKWISE, | |
| }[rotateType]; | |
| const newAngle = parseInt(angle, 10) + rotateAngle; | |
| const isRotatable = newAngle >= -360 && newAngle <= 360; | |
| if (isRotatable) { | |
| this.actions.rotate(rotateAngle); | |
| } | |
| } | |
| } | |
| } | |
| export default Rotate; | |