UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 5.08 kB
import*as Common from"../../core/common/common.js";import*as i18n from"../../core/i18n/i18n.js";import*as Platform from"../../core/platform/platform.js";import*as UI from"../../ui/legacy/legacy.js";const UIStrings={panModeX:"Pan mode (X)",rotateModeV:"Rotate mode (V)",resetTransform:"Reset transform (0)"},str_=i18n.i18n.registerUIStrings("panels/layer_viewer/TransformController.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);export class TransformController extends Common.ObjectWrapper.ObjectWrapper{mode;scaleInternal;offsetXInternal;offsetYInternal;rotateXInternal;rotateYInternal;oldRotateX;oldRotateY;originX;originY;element;minScale;maxScale;controlPanelToolbar;modeButtons;constructor(t,e){if(super(),this.scaleInternal=1,this.offsetXInternal=0,this.offsetYInternal=0,this.rotateXInternal=0,this.rotateYInternal=0,this.oldRotateX=0,this.oldRotateY=0,this.originX=0,this.originY=0,this.element=t,this.registerShortcuts(),UI.UIUtils.installDragHandle(t,this.onDragStart.bind(this),this.onDrag.bind(this),this.onDragEnd.bind(this),"move",null),t.addEventListener("wheel",this.onMouseWheel.bind(this),!1),this.minScale=0,this.maxScale=1/0,this.controlPanelToolbar=new UI.Toolbar.Toolbar("transform-control-panel"),this.modeButtons={},!e){const t=new UI.Toolbar.ToolbarToggle(i18nString(UIStrings.panModeX),"3d-pan");t.addEventListener(UI.Toolbar.ToolbarButton.Events.Click,this.setMode.bind(this,"Pan")),this.modeButtons.Pan=t,this.controlPanelToolbar.appendToolbarItem(t);const e=new UI.Toolbar.ToolbarToggle(i18nString(UIStrings.rotateModeV),"3d-rotate");e.addEventListener(UI.Toolbar.ToolbarButton.Events.Click,this.setMode.bind(this,"Rotate")),this.modeButtons.Rotate=e,this.controlPanelToolbar.appendToolbarItem(e)}this.setMode("Pan");const n=new UI.Toolbar.ToolbarButton(i18nString(UIStrings.resetTransform),"3d-center");n.addEventListener(UI.Toolbar.ToolbarButton.Events.Click,this.resetAndNotify.bind(this,void 0)),this.controlPanelToolbar.appendToolbarItem(n),this.reset()}toolbar(){return this.controlPanelToolbar}registerShortcuts(){UI.ShortcutRegistry.ShortcutRegistry.instance().addShortcutListener(this.element,{"layers.reset-view":async()=>(this.resetAndNotify(),!0),"layers.pan-mode":async()=>(this.setMode("Pan"),!0),"layers.rotate-mode":async()=>(this.setMode("Rotate"),!0),"layers.zoom-in":this.onKeyboardZoom.bind(this,1.1),"layers.zoom-out":this.onKeyboardZoom.bind(this,1/1.1),"layers.up":this.onKeyboardPanOrRotate.bind(this,0,-1),"layers.down":this.onKeyboardPanOrRotate.bind(this,0,1),"layers.left":this.onKeyboardPanOrRotate.bind(this,-1,0),"layers.right":this.onKeyboardPanOrRotate.bind(this,1,0)})}postChangeEvent(){this.dispatchEventToListeners(Events.TransformChanged)}reset(){this.scaleInternal=1,this.offsetXInternal=0,this.offsetYInternal=0,this.rotateXInternal=0,this.rotateYInternal=0}setMode(t){this.mode!==t&&(this.mode=t,this.updateModeButtons())}updateModeButtons(){for(const t in this.modeButtons)this.modeButtons[t].setToggled(t===this.mode)}resetAndNotify(t){this.reset(),this.postChangeEvent(),t&&t.preventDefault(),this.element.focus()}setScaleConstraints(t,e){this.minScale=t,this.maxScale=e,this.scaleInternal=Platform.NumberUtilities.clamp(this.scaleInternal,t,e)}clampOffsets(t,e,n,o){this.offsetXInternal=Platform.NumberUtilities.clamp(this.offsetXInternal,t,e),this.offsetYInternal=Platform.NumberUtilities.clamp(this.offsetYInternal,n,o)}scale(){return this.scaleInternal}offsetX(){return this.offsetXInternal}offsetY(){return this.offsetYInternal}rotateX(){return this.rotateXInternal}rotateY(){return this.rotateYInternal}onScale(t,e,n){t=Platform.NumberUtilities.clamp(this.scaleInternal*t,this.minScale,this.maxScale)/this.scaleInternal,this.scaleInternal*=t,this.offsetXInternal-=(e-this.offsetXInternal)*(t-1),this.offsetYInternal-=(n-this.offsetYInternal)*(t-1),this.postChangeEvent()}onPan(t,e){this.offsetXInternal+=t,this.offsetYInternal+=e,this.postChangeEvent()}onRotate(t,e){this.rotateXInternal=t,this.rotateYInternal=e,this.postChangeEvent()}async onKeyboardZoom(t){return this.onScale(t,this.element.clientWidth/2,this.element.clientHeight/2),!0}async onKeyboardPanOrRotate(t,e){return"Rotate"===this.mode?this.onRotate(this.rotateXInternal+5*e,this.rotateYInternal+5*t):this.onPan(6*t,6*e),!0}onMouseWheel(t){const e=t,n=Math.pow(1.1,-e.deltaY*(1/53));this.onScale(n,e.clientX-this.element.getBoundingClientRect().left,e.clientY-this.element.getBoundingClientRect().top)}onDrag(t){const{clientX:e,clientY:n}=t;"Rotate"===this.mode?this.onRotate(this.oldRotateX+(this.originY-n)/this.element.clientHeight*180,this.oldRotateY-(this.originX-e)/this.element.clientWidth*180):(this.onPan(e-this.originX,n-this.originY),this.originX=e,this.originY=n)}onDragStart(t){return this.element.focus(),this.originX=t.clientX,this.originY=t.clientY,this.oldRotateX=this.rotateXInternal,this.oldRotateY=this.rotateYInternal,!0}onDragEnd(){this.originX=0,this.originY=0,this.oldRotateX=0,this.oldRotateY=0}}export var Events;!function(t){t.TransformChanged="TransformChanged"}(Events||(Events={}));