@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 4.96 kB
JavaScript
import{math as t}from"../../../core/math/math.js";import{ORIENTATION_HORIZONTAL as e}from"../../../scene/constants.js";import{GraphNode as n}from"../../../scene/graph-node.js";import{Component as i}from"../component.js";import{ElementDragHelper as s}from"../element/element-drag-helper.js";class a extends i{constructor(t,e){super(t,e),this._handleEntity=null,this._evtHandleEntityElementAdd=null,this._evtHandleEntityChanges=[],this._toggleLifecycleListeners("on")}get data(){const t=this.system.store[this.entity.getGuid()];return t?t.data:null}set enabled(t){this._setValue("enabled",t)}get enabled(){return this.data.enabled}set orientation(t){this._setValue("orientation",t)}get orientation(){return this.data.orientation}set value(t){this._setValue("value",t)}get value(){return this.data.value}set handleSize(t){this._setValue("handleSize",t)}get handleSize(){return this.data.handleSize}set handleEntity(t){if(this._handleEntity===t)return;const e="string"==typeof t;this._handleEntity&&e&&this._handleEntity.getGuid()===t||(this._handleEntity&&this._handleEntityUnsubscribe(),this._handleEntity=t instanceof n?t:e&&this.system.app.getEntityFromIndex(t)||null,this._handleEntity&&this._handleEntitySubscribe(),this._handleEntity?this.data.handleEntity=this._handleEntity.getGuid():e&&t&&(this.data.handleEntity=t))}get handleEntity(){return this._handleEntity}_setValue(t,e){const n=this.data,i=n[t];n[t]=e,this.fire("set",t,i,e)}_toggleLifecycleListeners(t){this[t]("set_value",this._onSetValue,this),this[t]("set_handleSize",this._onSetHandleSize,this),this[t]("set_orientation",this._onSetOrientation,this)}_handleEntitySubscribe(){this._evtHandleEntityElementAdd=this._handleEntity.on("element:add",this._onHandleElementGain,this),this._handleEntity.element&&this._onHandleElementGain()}_handleEntityUnsubscribe(){var t,e;null==(t=this._evtHandleEntityElementAdd)||t.off(),this._evtHandleEntityElementAdd=null,null!=(e=this._handleEntity)&&e.element&&this._onHandleElementLose()}_handleEntityElementSubscribe(){const t=this._handleEntity.element,e=this._evtHandleEntityChanges;e.push(t.once("beforeremove",this._onHandleElementLose,this)),e.push(t.on("set:anchor",this._onSetHandleAlignment,this)),e.push(t.on("set:margin",this._onSetHandleAlignment,this)),e.push(t.on("set:pivot",this._onSetHandleAlignment,this))}_handleEntityElementUnsubscribe(){for(let t=0;t<this._evtHandleEntityChanges.length;t++)this._evtHandleEntityChanges[t].off();this._evtHandleEntityChanges.length=0}_onHandleElementGain(){this._handleEntityElementSubscribe(),this._destroyDragHelper(),this._handleDragHelper=new s(this._handleEntity.element,this._getAxis()),this._handleDragHelper.on("drag:move",this._onHandleDrag,this),this._updateHandlePositionAndSize()}_onHandleElementLose(){this._handleEntityElementUnsubscribe(),this._destroyDragHelper()}_onHandleDrag(t){this._handleEntity&&this.enabled&&this.entity.enabled&&(this.value=this._handlePositionToScrollValue(t[this._getAxis()]))}_onSetValue(e,n,i){Math.abs(i-n)>1e-5&&(this.data.value=t.clamp(i,0,1),this._updateHandlePositionAndSize(),this.fire("set:value",this.data.value))}_onSetHandleSize(e,n,i){Math.abs(i-n)>1e-5&&(this.data.handleSize=t.clamp(i,0,1),this._updateHandlePositionAndSize())}_onSetHandleAlignment(){this._updateHandlePositionAndSize()}_onSetOrientation(t,e,n){var i;n!==e&&null!=(i=this._handleEntity)&&i.element&&(this._handleEntity.element[this._getOppositeDimension()]=0)}_updateHandlePositionAndSize(){const t=this._handleEntity,e=null==t?void 0:t.element;if(t){const e=t.getLocalPosition();e[this._getAxis()]=this._getHandlePosition(),t.setLocalPosition(e)}e&&(e[this._getDimension()]=this._getHandleLength())}_handlePositionToScrollValue(t){return t*this._getSign()/this._getUsableTrackLength()}_scrollValueToHandlePosition(t){return t*this._getSign()*this._getUsableTrackLength()}_getUsableTrackLength(){return Math.max(this._getTrackLength()-this._getHandleLength(),.001)}_getTrackLength(){return this.entity.element?this.orientation===e?this.entity.element.calculatedWidth:this.entity.element.calculatedHeight:0}_getHandleLength(){return this._getTrackLength()*this.handleSize}_getHandlePosition(){return this._scrollValueToHandlePosition(this.value)}_getSign(){return this.orientation===e?1:-1}_getAxis(){return this.orientation===e?"x":"y"}_getDimension(){return this.orientation===e?"width":"height"}_getOppositeDimension(){return this.orientation===e?"height":"width"}_destroyDragHelper(){this._handleDragHelper&&this._handleDragHelper.destroy()}_setHandleDraggingEnabled(t){this._handleDragHelper&&(this._handleDragHelper.enabled=t)}onEnable(){this._setHandleDraggingEnabled(!0)}onDisable(){this._setHandleDraggingEnabled(!1)}onRemove(){this._destroyDragHelper(),this._toggleLifecycleListeners("off")}resolveDuplicatedEntityReferenceProperties(t,e){t.handleEntity&&(this.handleEntity=e[t.handleEntity.getGuid()])}}a.EVENT_SETVALUE="set:value";export{a as ScrollbarComponent};