@leafer-in/viewport 1.12.0 → 1.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/viewport.cjs +60 -19
- package/dist/viewport.esm.js +60 -19
- package/dist/viewport.esm.min.js +1 -1
- package/dist/viewport.esm.min.js.map +1 -1
- package/dist/viewport.js +59 -19
- package/dist/viewport.min.cjs +1 -1
- package/dist/viewport.min.cjs.map +1 -1
- package/dist/viewport.min.js +1 -1
- package/dist/viewport.min.js.map +1 -1
- package/package.json +4 -4
- package/src/Leafer.ts +1 -1
- package/src/interaction/Dragger.ts +64 -15
- package/src/type/viewport.ts +6 -1
package/dist/viewport.min.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var t=require("@leafer-ui/core");function e(e,a,n){o(e.parentApp?e.parentApp:e,a),e.isApp||n||e.__eventIds.push(e.on_(t.MoveEvent.BEFORE_MOVE,t=>{e.zoomLayer.move(e.
|
|
1
|
+
"use strict";var t=require("@leafer-ui/core");function e(e,a,n){o(e.parentApp?e.parentApp:e,a),e.isApp||n||e.__eventIds.push(e.on_(t.MoveEvent.BEFORE_MOVE,t=>{const o=e.getValidMove(t.moveX,t.moveY,!1);e.zoomLayer.move(o)}),e.on_(t.MoveEvent.DRAG_ANIMATE,()=>{const t=e.getValidMove(0,0);(t.x||t.y)&&e.interaction.stopDragAnimate()}),e.on_(t.MoveEvent.END,o=>{t.LeafHelper.animateMove(e.zoomLayer,e.getValidMove(o.moveX,o.moveY))}),e.on_(t.ZoomEvent.BEFORE_ZOOM,t=>{const{zoomLayer:o}=e,a=e.getValidScale(t.scale);1!==a&&o.scaleOfWorld(t,a)}))}function o(e,o){const a={wheel:{preventDefault:!0},touch:{preventDefault:!0},pointer:{preventDefaultMenu:!0}};o&&t.DataHelper.assign(a,o),t.DataHelper.assign(e.config,a,e.userConfig)}const a=t.Debug.get("LeaferTypeCreator"),n={list:{},register(t,e){i[t]&&a.repeat(t),i[t]=e},run(t,e){const o=i[t];o&&o(e)}},{list:i,register:s}=n;s("viewport",e),s("custom",function(t){e(t,null,!0)}),s("design",function(t){e(t,{zoom:{min:.01,max:256},move:{holdSpaceKey:!0,holdMiddleKey:!0}})}),s("document",function(t){e(t,{zoom:{min:1},move:{scroll:"limit"}})});const r={state:{type:"none",typeCount:0,startTime:0,totalData:null,center:{}},getData(e){const o=e[0],a=e[1],n=t.PointHelper.getCenter(o.from,a.from),i=t.PointHelper.getCenter(o.to,a.to),s={x:i.x-n.x,y:i.y-n.y},r=t.PointHelper.getDistance(o.from,a.from);return{move:s,scale:t.PointHelper.getDistance(o.to,a.to)/r,rotation:t.PointHelper.getRotation(o.from,a.from,o.to,a.to),center:i}},getType(t,e){const o=Math.hypot(t.move.x,t.move.y)/(e.move||5),a=Math.abs(t.scale-1)/(e.scale||.03),n=Math.abs(t.rotation)/(e.rotation||2);return o<1&&a<1&&n<1?"none":o>=a&&o>=n?"move":a>=n?"zoom":"rotate"},detect(t,e){const{state:o}=c,a=c.getType(t,e);if(o.totalData||(o.startTime=Date.now(),o.center=t.center),c.add(t,o.totalData),o.totalData=t,a===o.type){if(o.typeCount++,o.typeCount>=(e.count||3)&&"none"!==a)return a}else o.type=a,o.typeCount=1;return Date.now()-o.startTime>=(e.time||160)?c.getType(o.totalData,e):"none"},add(e,o){o&&(t.PointHelper.move(e.move,o.move),e.scale*=o.scale,e.rotation+=o.rotation,e.center=o.center)},reset(){const{state:t}=c;t.type="none",t.typeCount=0,t.startTime=0,t.totalData=null}},c=r,{abs:m,max:l}=Math,{sign:h,within:u}=t.MathHelper,v={getMove(t,e){let{moveSpeed:o}=e,{deltaX:a,deltaY:n}=t;t.shiftKey&&!a&&(a=n,n=0);const i=m(a),s=m(n);return i>50&&(a=l(50,i/3)*h(a)),s>50&&(n=l(50,s/3)*h(n)),{x:-a*o*2,y:-n*o*2}},getScale(e,o){let a,n=1,{zoomMode:i,zoomSpeed:s}=o;const r=e.deltaY||e.deltaX;if(i?(a="mouse"===i||!e.deltaX&&(t.Platform.intWheelDeltaY?Math.abs(r)>17:Math.ceil(r)!==r),(e.shiftKey||e.metaKey||e.ctrlKey)&&(a=!0)):a=!e.shiftKey&&(e.metaKey||e.ctrlKey),a){s=u(s,0,1);const t=e.deltaY?o.delta.y:o.delta.x,a=u(1-m(r)/(4*t)*s,.5,2);n=r>0?a:1/a}return n}};let g,d,p,f;class D{get transforming(){return this.moving||this.zooming||this.rotating}get moving(){return!!this.moveData}get zooming(){return!!this.zoomData}get rotating(){return!!this.rotateData}constructor(t){this.interaction=t}move(e){const{interaction:o}=this;e.moveType||(e.moveType="move"),this.moveData||(this.setPath(e),g=0,d=0,this.moveData=Object.assign(Object.assign({},e),{moveX:0,moveY:0,totalX:g,totalY:d}),o.emit(t.MoveEvent.START,this.moveData)),e.path=this.moveData.path,e.totalX=g+=e.moveX,e.totalY=d+=e.moveY,o.emit(t.MoveEvent.BEFORE_MOVE,e),o.emit(t.MoveEvent.MOVE,e),this.transformEndWait()}zoom(e){const{interaction:o}=this;this.zoomData||(this.setPath(e),p=1,this.zoomData=Object.assign(Object.assign({},e),{scale:1,totalScale:p}),o.emit(t.ZoomEvent.START,this.zoomData)),e.path=this.zoomData.path,e.totalScale=p*=e.scale,o.emit(t.ZoomEvent.BEFORE_ZOOM,e),o.emit(t.ZoomEvent.ZOOM,e),this.transformEndWait()}rotate(e){const{interaction:o}=this;this.rotateData||(this.setPath(e),f=0,this.rotateData=Object.assign(Object.assign({},e),{rotation:0,totalRotation:f}),o.emit(t.RotateEvent.START,this.rotateData)),e.path=this.rotateData.path,e.totalRotation=f+=e.rotation,o.emit(t.RotateEvent.BEFORE_ROTATE,e),o.emit(t.RotateEvent.ROTATE,e),this.transformEndWait()}setPath(t){const{interaction:e}=this,{path:o}=e.selector.getByPoint(t,e.hitRadius);t.path=o,e.cancelHover()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout(()=>{this.transformEnd()},this.interaction.p.transformTime)}transformEnd(){const{interaction:e,moveData:o,zoomData:a,rotateData:n}=this;o&&e.emit(t.MoveEvent.END,Object.assign(Object.assign({},o),{totalX:g,totalY:d})),a&&e.emit(t.ZoomEvent.END,Object.assign(Object.assign({},a),{totalScale:p})),n&&e.emit(t.RotateEvent.END,Object.assign(Object.assign({},n),{totalRotation:f})),this.reset()}reset(){this.zoomData=this.moveData=this.rotateData=null}destroy(){this.reset()}}const y=t.Leafer.prototype,E=new t.Bounds,M=new t.Point;function O(t,e){return Object.assign(Object.assign({},e),{moveX:t.x,moveY:t.y})}function b(t,e){return Object.assign(Object.assign({},e),{scale:t})}y.initType=function(t){n.run(t,this)},y.getValidMove=function(e,o,a=!0){const{scroll:n,disabled:i}=this.app.config.move;if(M.set(e,o),n){const e=!0===n?"":n;e.includes("x")?M.y=0:e.includes("y")?M.x=0:Math.abs(M.x)>Math.abs(M.y)?M.y=0:M.x=0,a&&e.includes("limit")&&(E.set(this.__world).addPoint(this.zoomLayer),t.DragBoundsHelper.getValidMove(E,this.canvas.bounds,"auto",M,!0),e.includes("x")?M.y=0:e.includes("y")&&(M.x=0))}return{x:i?0:M.x,y:i?0:M.y}},y.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:o,max:a,disabled:n}=this.app.config.zoom,i=Math.abs(e*t);return o&&i<o?t=o/e:a&&i>a&&(t=a/e),n?1:t};const T=t.InteractionBase.prototype;T.createTransformer=function(){this.transformer=new D(this)},T.move=function(t){this.transformer.move(t)},T.zoom=function(t){this.transformer.zoom(t)},T.rotate=function(t){this.transformer.rotate(t)},T.transformEnd=function(){this.transformer.transformEnd()},T.wheel=function(e){const{wheel:o,pointer:a}=this.config,{posDeltaSpeed:n,negDeltaSpeed:i}=o;if(o.disabled)return;e.deltaX>0?n&&(e.deltaX*=n):i&&(e.deltaX*=i),e.deltaY>0?n&&(e.deltaY*=n):i&&(e.deltaY*=i);const s=o.getScale?o.getScale(e,o):v.getScale(e,o);if(1!==s)this.zoom(b(s,e));else{const n=o.getMove?o.getMove(e,o):v.getMove(e,o);a.snap&&t.PointHelper.round(n),this.move(O(n,e))}},T.multiTouch=function(e,o){const{disabled:a,singleGesture:n}=this.config.multiTouch;if(a)return;this.pointerWaitCancel();let i=r.getData(o),{moving:s,zooming:c,rotating:m}=this.transformer;if(n){if(!this.transformer.transforming){switch(r.detect(i,t.isObject(n)?n:{})){case"move":s=!0;break;case"zoom":c=!0;break;case"rotate":m=!0;break;default:return}r.reset()}s||(i.center=r.state.center)}else s=c=m=!0;var l,h;Object.assign(e,i.center),e.multiTouch=!0,m&&this.rotate((l=i.rotation,h=e,Object.assign(Object.assign({},h),{rotation:l}))),c&&this.zoom(b(i.scale,e)),s&&this.move(O(i.move,e))};const x=t.Dragger.prototype,{abs:z,min:R,max:j,hypot:H}=Math;x.checkDragEndAnimate=function(e){const{interaction:o}=this,a=this.canAnimate&&this.moving&&o.m.dragAnimate;if(a){const n=t.isNumber(a)?a:.95,i=.15,s=150;let r,c,m,l=0,h=0,u=0,v=0,g=3;const{dragDataList:d}=this,p=d.length;for(let t=p-1;t>=j(p-3,0)&&(m=d[t],!(m.time&&Date.now()-m.time>100));t--)r=g--,l+=m.moveX*r,h+=m.moveY*r,v+=r,c=H(m.moveX,m.moveY),c>u&&(u=c);if(v&&(l/=v,h/=v),u>8){const t=1.15+R((u-8)/17,1)*(1.6-1.15);l*=t,h*=t}const f=j(z(l),z(h));f>s&&(c=s/f,l*=c,h*=c);const D=()=>{if(l*=n,h*=n,e=Object.assign({},e),z(l)<i&&z(h)<i)return this.dragEndReal(e);t.PointHelper.move(e,l,h),this.drag(e),this.animate(D),o.emit(t.MoveEvent.DRAG_ANIMATE,e)};this.animate(D)}return a},x.animate=function(t,e){const o=t||this.animateWait;o&&this.interaction.target.nextRender(o,null,e),this.animateWait=t},x.stopAnimate=function(){this.animate(null,"off"),this.interaction.target.nextRender(()=>{this.dragData&&this.dragEndReal(this.dragData)})},x.checkDragOut=function(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)},x.autoMoveOnDragOut=function(e){const{interaction:o,downData:a,canDragOut:n}=this,{autoDistance:i,dragOut:s}=o.m;if(!s||!n||!i)return;const r=o.shrinkCanvasBounds,{x:c,y:m}=r,l=t.BoundsHelper.maxX(r),h=t.BoundsHelper.maxY(r),u=e.x<c?i:l<e.x?-i:0,v=e.y<m?i:h<e.y?-i:0;let g=0,d=0;this.autoMoveTimer=setInterval(()=>{g+=u,d+=v,t.PointHelper.move(a,u,v),t.PointHelper.move(this.dragData,u,v),o.move(Object.assign(Object.assign({},e),{moveX:u,moveY:v,totalX:g,totalY:d,moveType:"drag"})),o.pointerMoveReal(e)},10)},x.autoMoveCancel=function(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)},t.Plugin.add("viewport"),exports.LeaferTypeCreator=n,exports.MultiTouchHelper=r,exports.Transformer=D,exports.WheelEventHelper=v,exports.addViewport=e,exports.addViewportConfig=o;
|
|
2
2
|
//# sourceMappingURL=viewport.min.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewport.min.cjs","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n leafer.zoomLayer.move(leafer.getValidMove(e.moveX, e.moveY, false))\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData, IGestureType, IPointData, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n state: { // 单一手势识别状态\n type: 'none' as IGestureType,\n typeCount: 0,\n startTime: 0,\n totalData: null as IMultiTouchData,\n center: {} as IPointData\n },\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n return { move, scale, rotation, center }\n },\n\n getType(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n const moveScore = Math.hypot(data.move.x, data.move.y) / (config.move || 5)\n const scaleScore = Math.abs(data.scale - 1) / (config.scale || 0.03)\n const rotateScore = Math.abs(data.rotation) / (config.rotation || 2)\n\n if (moveScore < 1 && scaleScore < 1 && rotateScore < 1) return 'none'\n if (moveScore >= scaleScore && moveScore >= rotateScore) return 'move'\n if (scaleScore >= rotateScore) return 'zoom'\n return 'rotate'\n },\n\n // 识别单一手势\n detect(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n const { state } = M\n const type = M.getType(data, config)\n\n if (!state.totalData) {\n state.startTime = Date.now()\n state.center = data.center\n }\n\n M.add(data, state.totalData)\n state.totalData = data\n\n if (type === state.type) { // 连续多帧一样的类型才进行锁定\n state.typeCount++\n if (state.typeCount >= (config.count || 3) && type !== 'none') return type\n } else {\n state.type = type\n state.typeCount = 1\n }\n\n if ((Date.now() - state.startTime) >= (config.time || 160)) return M.getType(state.totalData, config) // 限制最长识别时间\n\n return 'none'\n },\n\n add(data: IMultiTouchData, add: IMultiTouchData): void {\n if (!add) return\n PointHelper.move(data.move, add.move)\n data.scale *= add.scale\n data.rotation += add.rotation\n data.center = add.center\n },\n\n reset() {\n const { state } = M\n state.type = 'none'\n state.typeCount = 0\n state.startTime = 0\n state.totalData = null\n }\n\n}\n\nconst M = MultiTouchHelper","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n const absScale = within(1 - abs(delta) / (min * 4) * zoomSpeed, 0.5, 2)\n scale = delta > 0 ? absScale : 1 / absScale // 让 scale 放大、缩小可以定位在有规律的刻度上\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nlet totalX: number, totalY: number, totalScale: number, totalRotation: number\n\nexport class Transformer {\n\n public get transforming(): boolean { return this.moving || this.zooming || this.rotating }\n public get moving(): boolean { return !!this.moveData }\n public get zooming(): boolean { return !!this.zoomData }\n public get rotating(): boolean { return !!this.rotateData }\n\n public moveData: IMoveEvent\n public zoomData: IZoomEvent\n public rotateData: IRotateEvent\n\n protected interaction: InteractionBase\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n totalX = 0, totalY = 0\n this.moveData = { ...data, moveX: 0, moveY: 0, totalX, totalY }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n data.totalX = totalX = totalX + data.moveX\n data.totalY = totalY = totalY + data.moveY\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n totalScale = 1\n this.zoomData = { ...data, scale: 1, totalScale }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n data.totalScale = totalScale = totalScale * data.scale\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n totalRotation = 0\n this.rotateData = { ...data, rotation: 0, totalRotation }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n data.totalRotation = totalRotation = totalRotation + data.rotation\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, { ...moveData, totalX, totalY } as IMoveEvent)\n if (zoomData) interaction.emit(ZoomEvent.END, { ...zoomData, totalScale } as IZoomEvent)\n if (rotateData) interaction.emit(RotateEvent.END, { ...rotateData, totalRotation } as IRotateEvent)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'inner', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper, isObject } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n const { disabled, singleGesture } = this.config.multiTouch\n if (disabled) return\n this.pointerWaitCancel()\n\n let gestureData = MultiTouchHelper.getData(list)\n let { moving, zooming, rotating } = this.transformer\n\n if (singleGesture) {\n\n if (!this.transformer.transforming) {\n\n const type = MultiTouchHelper.detect(gestureData, isObject(singleGesture) ? singleGesture : {} as ISingleGestureConfig)\n\n switch (type) {\n case 'move': moving = true; break\n case 'zoom': zooming = true; break\n case 'rotate': rotating = true; break\n default: return\n }\n\n MultiTouchHelper.reset()\n\n }\n\n if (!moving) gestureData.center = MultiTouchHelper.state.center\n\n } else moving = zooming = rotating = true\n\n Object.assign(data, gestureData.center)\n data.multiTouch = true\n\n if (rotating) this.rotate(getRotateEventData(gestureData.rotation, data))\n if (zooming) this.zoom(getZoomEventData(gestureData.scale, data))\n if (moving) this.move(getMoveEventData(gestureData.move, data))\n}","import { IPointerEvent, IFunction } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent, speed?: number): boolean | number {\n const { moveX, moveY } = this.dragData\n const absMoveX = abs(moveX), absMoveY = abs(moveY), minMove = speed ? 1 : 0.1\n const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate\n\n if (dragAnimate) {\n const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70\n speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia\n if (absMoveX * speed > maxMove) speed = maxMove / absMoveX\n else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY\n\n data = { ...data }\n PointHelper.move(data, moveX * speed, moveY * speed)\n\n this.drag(data)\n this.animate(() => { this.dragEnd(data, 1) })\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","zoomLayer","move","getValidMove","moveX","moveY","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","state","type","typeCount","startTime","totalData","center","getData","a","b","lastCenter","PointHelper","getCenter","from","to","x","y","lastDistance","getDistance","rotation","getRotation","getType","data","moveScore","Math","hypot","scaleScore","abs","rotateScore","detect","M","Date","now","add","count","time","reset","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","absScale","totalX","totalY","totalScale","totalRotation","Transformer","transforming","this","moving","zooming","rotating","moveData","zoomData","rotateData","constructor","interaction","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","singleGesture","pointerWaitCancel","gestureData","isObject","dragger","Dragger","checkDragEndAnimate","speed","dragData","absMoveX","absMoveY","minMove","dragAnimate","canAnimate","m","inertia","pointerType","maxMove","isNumber","drag","animate","dragEnd","func","off","animateWait","target","nextRender","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"viewport.min.cjs","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n const move = leafer.getValidMove(e.moveX, e.moveY, false)\n leafer.zoomLayer.move(move)\n }),\n leafer.on_(MoveEvent.DRAG_ANIMATE, () => {\n const move = leafer.getValidMove(0, 0)\n if (move.x || move.y) leafer.interaction.stopDragAnimate()\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData, IGestureType, IPointData, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n state: { // 单一手势识别状态\n type: 'none' as IGestureType,\n typeCount: 0,\n startTime: 0,\n totalData: null as IMultiTouchData,\n center: {} as IPointData\n },\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n return { move, scale, rotation, center }\n },\n\n getType(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n const moveScore = Math.hypot(data.move.x, data.move.y) / (config.move || 5)\n const scaleScore = Math.abs(data.scale - 1) / (config.scale || 0.03)\n const rotateScore = Math.abs(data.rotation) / (config.rotation || 2)\n\n if (moveScore < 1 && scaleScore < 1 && rotateScore < 1) return 'none'\n if (moveScore >= scaleScore && moveScore >= rotateScore) return 'move'\n if (scaleScore >= rotateScore) return 'zoom'\n return 'rotate'\n },\n\n // 识别单一手势\n detect(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n const { state } = M\n const type = M.getType(data, config)\n\n if (!state.totalData) {\n state.startTime = Date.now()\n state.center = data.center\n }\n\n M.add(data, state.totalData)\n state.totalData = data\n\n if (type === state.type) { // 连续多帧一样的类型才进行锁定\n state.typeCount++\n if (state.typeCount >= (config.count || 3) && type !== 'none') return type\n } else {\n state.type = type\n state.typeCount = 1\n }\n\n if ((Date.now() - state.startTime) >= (config.time || 160)) return M.getType(state.totalData, config) // 限制最长识别时间\n\n return 'none'\n },\n\n add(data: IMultiTouchData, add: IMultiTouchData): void {\n if (!add) return\n PointHelper.move(data.move, add.move)\n data.scale *= add.scale\n data.rotation += add.rotation\n data.center = add.center\n },\n\n reset() {\n const { state } = M\n state.type = 'none'\n state.typeCount = 0\n state.startTime = 0\n state.totalData = null\n }\n\n}\n\nconst M = MultiTouchHelper","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n const absScale = within(1 - abs(delta) / (min * 4) * zoomSpeed, 0.5, 2)\n scale = delta > 0 ? absScale : 1 / absScale // 让 scale 放大、缩小可以定位在有规律的刻度上\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nlet totalX: number, totalY: number, totalScale: number, totalRotation: number\n\nexport class Transformer {\n\n public get transforming(): boolean { return this.moving || this.zooming || this.rotating }\n public get moving(): boolean { return !!this.moveData }\n public get zooming(): boolean { return !!this.zoomData }\n public get rotating(): boolean { return !!this.rotateData }\n\n public moveData: IMoveEvent\n public zoomData: IZoomEvent\n public rotateData: IRotateEvent\n\n protected interaction: InteractionBase\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n totalX = 0, totalY = 0\n this.moveData = { ...data, moveX: 0, moveY: 0, totalX, totalY }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n data.totalX = totalX = totalX + data.moveX\n data.totalY = totalY = totalY + data.moveY\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n totalScale = 1\n this.zoomData = { ...data, scale: 1, totalScale }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n data.totalScale = totalScale = totalScale * data.scale\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n totalRotation = 0\n this.rotateData = { ...data, rotation: 0, totalRotation }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n data.totalRotation = totalRotation = totalRotation + data.rotation\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, { ...moveData, totalX, totalY } as IMoveEvent)\n if (zoomData) interaction.emit(ZoomEvent.END, { ...zoomData, totalScale } as IZoomEvent)\n if (rotateData) interaction.emit(RotateEvent.END, { ...rotateData, totalRotation } as IRotateEvent)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'auto', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper, isObject } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n const { disabled, singleGesture } = this.config.multiTouch\n if (disabled) return\n this.pointerWaitCancel()\n\n let gestureData = MultiTouchHelper.getData(list)\n let { moving, zooming, rotating } = this.transformer\n\n if (singleGesture) {\n\n if (!this.transformer.transforming) {\n\n const type = MultiTouchHelper.detect(gestureData, isObject(singleGesture) ? singleGesture : {} as ISingleGestureConfig)\n\n switch (type) {\n case 'move': moving = true; break\n case 'zoom': zooming = true; break\n case 'rotate': rotating = true; break\n default: return\n }\n\n MultiTouchHelper.reset()\n\n }\n\n if (!moving) gestureData.center = MultiTouchHelper.state.center\n\n } else moving = zooming = rotating = true\n\n Object.assign(data, gestureData.center)\n data.multiTouch = true\n\n if (rotating) this.rotate(getRotateEventData(gestureData.rotation, data))\n if (zooming) this.zoom(getZoomEventData(gestureData.scale, data))\n if (moving) this.move(getMoveEventData(gestureData.move, data))\n}","import { IPointerEvent, IFunction, IDragEvent } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, MoveEvent, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs, min, max, hypot } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent): boolean | number {\n const { interaction } = this\n const dragAnimate = this.canAnimate && this.moving && interaction.m.dragAnimate\n\n if (dragAnimate) {\n\n const inertia = isNumber(dragAnimate) ? dragAnimate : 0.95\n const stopMove = 0.15\n const maxMove = 150\n\n let moveX = 0, moveY = 0, flickSpeed = 0 // 快速滑动加速\n let totalWeight = 0, weight: number, w = 3, s: number, frame: IDragEvent\n\n const { dragDataList } = this, len = dragDataList.length\n for (let i = len - 1; i >= max(len - 3, 0); i--) {\n frame = dragDataList[i]\n if (frame.time && (Date.now() - frame.time > 100)) break\n weight = w--\n\n moveX += frame.moveX * weight\n moveY += frame.moveY * weight\n totalWeight += weight\n\n s = hypot(frame.moveX, frame.moveY)\n if (s > flickSpeed) flickSpeed = s\n }\n\n if (totalWeight) moveX /= totalWeight, moveY /= totalWeight\n\n if (flickSpeed > 8) {\n const t = min((flickSpeed - 8) / 17, 1)\n const boost = 1.15 + t * (1.6 - 1.15)\n moveX *= boost\n moveY *= boost\n }\n\n const maxAbs = max(abs(moveX), abs(moveY))\n if (maxAbs > maxMove) {\n s = maxMove / maxAbs\n moveX *= s\n moveY *= s\n }\n\n const step = () => {\n moveX *= inertia\n moveY *= inertia\n\n data = { ...data }\n if (abs(moveX) < stopMove && abs(moveY) < stopMove) return this.dragEndReal(data)\n\n PointHelper.move(data, moveX, moveY)\n this.drag(data)\n\n this.animate(step)\n interaction.emit(MoveEvent.DRAG_ANIMATE, data)\n }\n\n this.animate(step)\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.stopAnimate = function (): void {\n this.animate(null, 'off')\n this.interaction.target.nextRender(() => {\n if (this.dragData) this.dragEndReal(this.dragData)\n })\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","move","getValidMove","moveX","moveY","zoomLayer","DRAG_ANIMATE","x","y","interaction","stopDragAnimate","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","state","type","typeCount","startTime","totalData","center","getData","a","b","lastCenter","PointHelper","getCenter","from","to","lastDistance","getDistance","rotation","getRotation","getType","data","moveScore","Math","hypot","scaleScore","abs","rotateScore","detect","M","Date","now","add","count","time","reset","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","absScale","totalX","totalY","totalScale","totalRotation","Transformer","transforming","this","moving","zooming","rotating","moveData","zoomData","rotateData","constructor","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","singleGesture","pointerWaitCancel","gestureData","isObject","dragger","Dragger","checkDragEndAnimate","dragAnimate","canAnimate","m","inertia","isNumber","stopMove","maxMove","weight","s","frame","flickSpeed","totalWeight","w","dragDataList","len","length","i","boost","maxAbs","step","dragEndReal","drag","animate","func","off","animateWait","target","nextRender","stopAnimate","dragData","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin"],"mappings":"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"}
|
package/dist/viewport.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
this.LeaferIN=this.LeaferIN||{},this.LeaferIN.viewport=function(t,e){"use strict";function o(t,o,n){a(t.parentApp?t.parentApp:t,o),t.isApp||n||t.__eventIds.push(t.on_(e.MoveEvent.BEFORE_MOVE,e=>{t.zoomLayer.move(t.
|
|
1
|
+
this.LeaferIN=this.LeaferIN||{},this.LeaferIN.viewport=function(t,e){"use strict";function o(t,o,n){a(t.parentApp?t.parentApp:t,o),t.isApp||n||t.__eventIds.push(t.on_(e.MoveEvent.BEFORE_MOVE,e=>{const o=t.getValidMove(e.moveX,e.moveY,!1);t.zoomLayer.move(o)}),t.on_(e.MoveEvent.DRAG_ANIMATE,()=>{const e=t.getValidMove(0,0);(e.x||e.y)&&t.interaction.stopDragAnimate()}),t.on_(e.MoveEvent.END,o=>{e.LeafHelper.animateMove(t.zoomLayer,t.getValidMove(o.moveX,o.moveY))}),t.on_(e.ZoomEvent.BEFORE_ZOOM,e=>{const{zoomLayer:o}=t,a=t.getValidScale(e.scale);1!==a&&o.scaleOfWorld(e,a)}))}function a(t,o){const a={wheel:{preventDefault:!0},touch:{preventDefault:!0},pointer:{preventDefaultMenu:!0}};o&&e.DataHelper.assign(a,o),e.DataHelper.assign(t.config,a,t.userConfig)}const n=e.Debug.get("LeaferTypeCreator"),i={list:{},register(t,e){s[t]&&n.repeat(t),s[t]=e},run(t,e){const o=s[t];o&&o(e)}},{list:s,register:r}=i;r("viewport",o),r("custom",function(t){o(t,null,!0)}),r("design",function(t){o(t,{zoom:{min:.01,max:256},move:{holdSpaceKey:!0,holdMiddleKey:!0}})}),r("document",function(t){o(t,{zoom:{min:1},move:{scroll:"limit"}})});const c={state:{type:"none",typeCount:0,startTime:0,totalData:null,center:{}},getData(t){const o=t[0],a=t[1],n=e.PointHelper.getCenter(o.from,a.from),i=e.PointHelper.getCenter(o.to,a.to),s={x:i.x-n.x,y:i.y-n.y},r=e.PointHelper.getDistance(o.from,a.from);return{move:s,scale:e.PointHelper.getDistance(o.to,a.to)/r,rotation:e.PointHelper.getRotation(o.from,a.from,o.to,a.to),center:i}},getType(t,e){const o=Math.hypot(t.move.x,t.move.y)/(e.move||5),a=Math.abs(t.scale-1)/(e.scale||.03),n=Math.abs(t.rotation)/(e.rotation||2);return o<1&&a<1&&n<1?"none":o>=a&&o>=n?"move":a>=n?"zoom":"rotate"},detect(t,e){const{state:o}=m,a=m.getType(t,e);if(o.totalData||(o.startTime=Date.now(),o.center=t.center),m.add(t,o.totalData),o.totalData=t,a===o.type){if(o.typeCount++,o.typeCount>=(e.count||3)&&"none"!==a)return a}else o.type=a,o.typeCount=1;return Date.now()-o.startTime>=(e.time||160)?m.getType(o.totalData,e):"none"},add(t,o){o&&(e.PointHelper.move(t.move,o.move),t.scale*=o.scale,t.rotation+=o.rotation,t.center=o.center)},reset(){const{state:t}=m;t.type="none",t.typeCount=0,t.startTime=0,t.totalData=null}},m=c,{abs:l,max:h}=Math,{sign:u,within:v}=e.MathHelper,g={getMove(t,e){let{moveSpeed:o}=e,{deltaX:a,deltaY:n}=t;t.shiftKey&&!a&&(a=n,n=0);const i=l(a),s=l(n);return i>50&&(a=h(50,i/3)*u(a)),s>50&&(n=h(50,s/3)*u(n)),{x:-a*o*2,y:-n*o*2}},getScale(t,o){let a,n=1,{zoomMode:i,zoomSpeed:s}=o;const r=t.deltaY||t.deltaX;if(i?(a="mouse"===i||!t.deltaX&&(e.Platform.intWheelDeltaY?Math.abs(r)>17:Math.ceil(r)!==r),(t.shiftKey||t.metaKey||t.ctrlKey)&&(a=!0)):a=!t.shiftKey&&(t.metaKey||t.ctrlKey),a){s=v(s,0,1);const e=t.deltaY?o.delta.y:o.delta.x,a=v(1-l(r)/(4*e)*s,.5,2);n=r>0?a:1/a}return n}};let d,f,p,D;class y{get transforming(){return this.moving||this.zooming||this.rotating}get moving(){return!!this.moveData}get zooming(){return!!this.zoomData}get rotating(){return!!this.rotateData}constructor(t){this.interaction=t}move(t){const{interaction:o}=this;t.moveType||(t.moveType="move"),this.moveData||(this.setPath(t),d=0,f=0,this.moveData=Object.assign(Object.assign({},t),{moveX:0,moveY:0,totalX:d,totalY:f}),o.emit(e.MoveEvent.START,this.moveData)),t.path=this.moveData.path,t.totalX=d+=t.moveX,t.totalY=f+=t.moveY,o.emit(e.MoveEvent.BEFORE_MOVE,t),o.emit(e.MoveEvent.MOVE,t),this.transformEndWait()}zoom(t){const{interaction:o}=this;this.zoomData||(this.setPath(t),p=1,this.zoomData=Object.assign(Object.assign({},t),{scale:1,totalScale:p}),o.emit(e.ZoomEvent.START,this.zoomData)),t.path=this.zoomData.path,t.totalScale=p*=t.scale,o.emit(e.ZoomEvent.BEFORE_ZOOM,t),o.emit(e.ZoomEvent.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:o}=this;this.rotateData||(this.setPath(t),D=0,this.rotateData=Object.assign(Object.assign({},t),{rotation:0,totalRotation:D}),o.emit(e.RotateEvent.START,this.rotateData)),t.path=this.rotateData.path,t.totalRotation=D+=t.rotation,o.emit(e.RotateEvent.BEFORE_ROTATE,t),o.emit(e.RotateEvent.ROTATE,t),this.transformEndWait()}setPath(t){const{interaction:e}=this,{path:o}=e.selector.getByPoint(t,e.hitRadius);t.path=o,e.cancelHover()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout(()=>{this.transformEnd()},this.interaction.p.transformTime)}transformEnd(){const{interaction:t,moveData:o,zoomData:a,rotateData:n}=this;o&&t.emit(e.MoveEvent.END,Object.assign(Object.assign({},o),{totalX:d,totalY:f})),a&&t.emit(e.ZoomEvent.END,Object.assign(Object.assign({},a),{totalScale:p})),n&&t.emit(e.RotateEvent.END,Object.assign(Object.assign({},n),{totalRotation:D})),this.reset()}reset(){this.zoomData=this.moveData=this.rotateData=null}destroy(){this.reset()}}const E=e.Leafer.prototype,M=new e.Bounds,O=new e.Point;function b(t,e){return Object.assign(Object.assign({},e),{moveX:t.x,moveY:t.y})}function T(t,e){return Object.assign(Object.assign({},e),{scale:t})}E.initType=function(t){i.run(t,this)},E.getValidMove=function(t,o,a=!0){const{scroll:n,disabled:i}=this.app.config.move;if(O.set(t,o),n){const t=!0===n?"":n;t.includes("x")?O.y=0:t.includes("y")?O.x=0:Math.abs(O.x)>Math.abs(O.y)?O.y=0:O.x=0,a&&t.includes("limit")&&(M.set(this.__world).addPoint(this.zoomLayer),e.DragBoundsHelper.getValidMove(M,this.canvas.bounds,"auto",O,!0),t.includes("x")?O.y=0:t.includes("y")&&(O.x=0))}return{x:i?0:O.x,y:i?0:O.y}},E.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:o,max:a,disabled:n}=this.app.config.zoom,i=Math.abs(e*t);return o&&i<o?t=o/e:a&&i>a&&(t=a/e),n?1:t};const x=e.InteractionBase.prototype;x.createTransformer=function(){this.transformer=new y(this)},x.move=function(t){this.transformer.move(t)},x.zoom=function(t){this.transformer.zoom(t)},x.rotate=function(t){this.transformer.rotate(t)},x.transformEnd=function(){this.transformer.transformEnd()},x.wheel=function(t){const{wheel:o,pointer:a}=this.config,{posDeltaSpeed:n,negDeltaSpeed:i}=o;if(o.disabled)return;t.deltaX>0?n&&(t.deltaX*=n):i&&(t.deltaX*=i),t.deltaY>0?n&&(t.deltaY*=n):i&&(t.deltaY*=i);const s=o.getScale?o.getScale(t,o):g.getScale(t,o);if(1!==s)this.zoom(T(s,t));else{const n=o.getMove?o.getMove(t,o):g.getMove(t,o);a.snap&&e.PointHelper.round(n),this.move(b(n,t))}},x.multiTouch=function(t,o){const{disabled:a,singleGesture:n}=this.config.multiTouch;if(a)return;this.pointerWaitCancel();let i=c.getData(o),{moving:s,zooming:r,rotating:m}=this.transformer;if(n){if(!this.transformer.transforming){switch(c.detect(i,e.isObject(n)?n:{})){case"move":s=!0;break;case"zoom":r=!0;break;case"rotate":m=!0;break;default:return}c.reset()}s||(i.center=c.state.center)}else s=r=m=!0;var l,h;Object.assign(t,i.center),t.multiTouch=!0,m&&this.rotate((l=i.rotation,h=t,Object.assign(Object.assign({},h),{rotation:l}))),r&&this.zoom(T(i.scale,t)),s&&this.move(b(i.move,t))};const z=e.Dragger.prototype,{abs:R,min:j,max:H,hypot:P}=Math;return z.checkDragEndAnimate=function(t){const{interaction:o}=this,a=this.canAnimate&&this.moving&&o.m.dragAnimate;if(a){const n=e.isNumber(a)?a:.95,i=.15,s=150;let r,c,m,l=0,h=0,u=0,v=0,g=3;const{dragDataList:d}=this,f=d.length;for(let t=f-1;t>=H(f-3,0)&&(m=d[t],!(m.time&&Date.now()-m.time>100));t--)r=g--,l+=m.moveX*r,h+=m.moveY*r,v+=r,c=P(m.moveX,m.moveY),c>u&&(u=c);if(v&&(l/=v,h/=v),u>8){const t=1.15+j((u-8)/17,1)*(1.6-1.15);l*=t,h*=t}const p=H(R(l),R(h));p>s&&(c=s/p,l*=c,h*=c);const D=()=>{if(l*=n,h*=n,t=Object.assign({},t),R(l)<i&&R(h)<i)return this.dragEndReal(t);e.PointHelper.move(t,l,h),this.drag(t),this.animate(D),o.emit(e.MoveEvent.DRAG_ANIMATE,t)};this.animate(D)}return a},z.animate=function(t,e){const o=t||this.animateWait;o&&this.interaction.target.nextRender(o,null,e),this.animateWait=t},z.stopAnimate=function(){this.animate(null,"off"),this.interaction.target.nextRender(()=>{this.dragData&&this.dragEndReal(this.dragData)})},z.checkDragOut=function(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)},z.autoMoveOnDragOut=function(t){const{interaction:o,downData:a,canDragOut:n}=this,{autoDistance:i,dragOut:s}=o.m;if(!s||!n||!i)return;const r=o.shrinkCanvasBounds,{x:c,y:m}=r,l=e.BoundsHelper.maxX(r),h=e.BoundsHelper.maxY(r),u=t.x<c?i:l<t.x?-i:0,v=t.y<m?i:h<t.y?-i:0;let g=0,d=0;this.autoMoveTimer=setInterval(()=>{g+=u,d+=v,e.PointHelper.move(a,u,v),e.PointHelper.move(this.dragData,u,v),o.move(Object.assign(Object.assign({},t),{moveX:u,moveY:v,totalX:g,totalY:d,moveType:"drag"})),o.pointerMoveReal(t)},10)},z.autoMoveCancel=function(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)},e.Plugin.add("viewport"),t.LeaferTypeCreator=i,t.MultiTouchHelper=c,t.Transformer=y,t.WheelEventHelper=g,t.addViewport=o,t.addViewportConfig=a,t}({},LeaferUI);
|
|
2
2
|
//# sourceMappingURL=viewport.min.js.map
|
package/dist/viewport.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewport.min.js","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n leafer.zoomLayer.move(leafer.getValidMove(e.moveX, e.moveY, false))\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData, IGestureType, IPointData, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n state: { // 单一手势识别状态\n type: 'none' as IGestureType,\n typeCount: 0,\n startTime: 0,\n totalData: null as IMultiTouchData,\n center: {} as IPointData\n },\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n return { move, scale, rotation, center }\n },\n\n getType(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n const moveScore = Math.hypot(data.move.x, data.move.y) / (config.move || 5)\n const scaleScore = Math.abs(data.scale - 1) / (config.scale || 0.03)\n const rotateScore = Math.abs(data.rotation) / (config.rotation || 2)\n\n if (moveScore < 1 && scaleScore < 1 && rotateScore < 1) return 'none'\n if (moveScore >= scaleScore && moveScore >= rotateScore) return 'move'\n if (scaleScore >= rotateScore) return 'zoom'\n return 'rotate'\n },\n\n // 识别单一手势\n detect(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n const { state } = M\n const type = M.getType(data, config)\n\n if (!state.totalData) {\n state.startTime = Date.now()\n state.center = data.center\n }\n\n M.add(data, state.totalData)\n state.totalData = data\n\n if (type === state.type) { // 连续多帧一样的类型才进行锁定\n state.typeCount++\n if (state.typeCount >= (config.count || 3) && type !== 'none') return type\n } else {\n state.type = type\n state.typeCount = 1\n }\n\n if ((Date.now() - state.startTime) >= (config.time || 160)) return M.getType(state.totalData, config) // 限制最长识别时间\n\n return 'none'\n },\n\n add(data: IMultiTouchData, add: IMultiTouchData): void {\n if (!add) return\n PointHelper.move(data.move, add.move)\n data.scale *= add.scale\n data.rotation += add.rotation\n data.center = add.center\n },\n\n reset() {\n const { state } = M\n state.type = 'none'\n state.typeCount = 0\n state.startTime = 0\n state.totalData = null\n }\n\n}\n\nconst M = MultiTouchHelper","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n const absScale = within(1 - abs(delta) / (min * 4) * zoomSpeed, 0.5, 2)\n scale = delta > 0 ? absScale : 1 / absScale // 让 scale 放大、缩小可以定位在有规律的刻度上\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nlet totalX: number, totalY: number, totalScale: number, totalRotation: number\n\nexport class Transformer {\n\n public get transforming(): boolean { return this.moving || this.zooming || this.rotating }\n public get moving(): boolean { return !!this.moveData }\n public get zooming(): boolean { return !!this.zoomData }\n public get rotating(): boolean { return !!this.rotateData }\n\n public moveData: IMoveEvent\n public zoomData: IZoomEvent\n public rotateData: IRotateEvent\n\n protected interaction: InteractionBase\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n totalX = 0, totalY = 0\n this.moveData = { ...data, moveX: 0, moveY: 0, totalX, totalY }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n data.totalX = totalX = totalX + data.moveX\n data.totalY = totalY = totalY + data.moveY\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n totalScale = 1\n this.zoomData = { ...data, scale: 1, totalScale }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n data.totalScale = totalScale = totalScale * data.scale\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n totalRotation = 0\n this.rotateData = { ...data, rotation: 0, totalRotation }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n data.totalRotation = totalRotation = totalRotation + data.rotation\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, { ...moveData, totalX, totalY } as IMoveEvent)\n if (zoomData) interaction.emit(ZoomEvent.END, { ...zoomData, totalScale } as IZoomEvent)\n if (rotateData) interaction.emit(RotateEvent.END, { ...rotateData, totalRotation } as IRotateEvent)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'inner', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper, isObject } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n const { disabled, singleGesture } = this.config.multiTouch\n if (disabled) return\n this.pointerWaitCancel()\n\n let gestureData = MultiTouchHelper.getData(list)\n let { moving, zooming, rotating } = this.transformer\n\n if (singleGesture) {\n\n if (!this.transformer.transforming) {\n\n const type = MultiTouchHelper.detect(gestureData, isObject(singleGesture) ? singleGesture : {} as ISingleGestureConfig)\n\n switch (type) {\n case 'move': moving = true; break\n case 'zoom': zooming = true; break\n case 'rotate': rotating = true; break\n default: return\n }\n\n MultiTouchHelper.reset()\n\n }\n\n if (!moving) gestureData.center = MultiTouchHelper.state.center\n\n } else moving = zooming = rotating = true\n\n Object.assign(data, gestureData.center)\n data.multiTouch = true\n\n if (rotating) this.rotate(getRotateEventData(gestureData.rotation, data))\n if (zooming) this.zoom(getZoomEventData(gestureData.scale, data))\n if (moving) this.move(getMoveEventData(gestureData.move, data))\n}","import { IPointerEvent, IFunction } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent, speed?: number): boolean | number {\n const { moveX, moveY } = this.dragData\n const absMoveX = abs(moveX), absMoveY = abs(moveY), minMove = speed ? 1 : 0.1\n const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate\n\n if (dragAnimate) {\n const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70\n speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia\n if (absMoveX * speed > maxMove) speed = maxMove / absMoveX\n else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY\n\n data = { ...data }\n PointHelper.move(data, moveX * speed, moveY * speed)\n\n this.drag(data)\n this.animate(() => { this.dragEnd(data, 1) })\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","zoomLayer","move","getValidMove","moveX","moveY","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","state","type","typeCount","startTime","totalData","center","getData","a","b","lastCenter","PointHelper","getCenter","from","to","x","y","lastDistance","getDistance","rotation","getRotation","getType","data","moveScore","Math","hypot","scaleScore","abs","rotateScore","detect","M","Date","now","add","count","time","reset","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","absScale","totalX","totalY","totalScale","totalRotation","Transformer","transforming","this","moving","zooming","rotating","moveData","zoomData","rotateData","constructor","interaction","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","singleGesture","pointerWaitCancel","gestureData","isObject","dragger","Dragger","checkDragEndAnimate","speed","dragData","absMoveX","absMoveY","minMove","dragAnimate","canAnimate","m","inertia","pointerType","maxMove","isNumber","drag","animate","dragEnd","func","off","animateWait","target","nextRender","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"viewport.min.js","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n const move = leafer.getValidMove(e.moveX, e.moveY, false)\n leafer.zoomLayer.move(move)\n }),\n leafer.on_(MoveEvent.DRAG_ANIMATE, () => {\n const move = leafer.getValidMove(0, 0)\n if (move.x || move.y) leafer.interaction.stopDragAnimate()\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData, IGestureType, IPointData, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n state: { // 单一手势识别状态\n type: 'none' as IGestureType,\n typeCount: 0,\n startTime: 0,\n totalData: null as IMultiTouchData,\n center: {} as IPointData\n },\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n return { move, scale, rotation, center }\n },\n\n getType(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n const moveScore = Math.hypot(data.move.x, data.move.y) / (config.move || 5)\n const scaleScore = Math.abs(data.scale - 1) / (config.scale || 0.03)\n const rotateScore = Math.abs(data.rotation) / (config.rotation || 2)\n\n if (moveScore < 1 && scaleScore < 1 && rotateScore < 1) return 'none'\n if (moveScore >= scaleScore && moveScore >= rotateScore) return 'move'\n if (scaleScore >= rotateScore) return 'zoom'\n return 'rotate'\n },\n\n // 识别单一手势\n detect(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n const { state } = M\n const type = M.getType(data, config)\n\n if (!state.totalData) {\n state.startTime = Date.now()\n state.center = data.center\n }\n\n M.add(data, state.totalData)\n state.totalData = data\n\n if (type === state.type) { // 连续多帧一样的类型才进行锁定\n state.typeCount++\n if (state.typeCount >= (config.count || 3) && type !== 'none') return type\n } else {\n state.type = type\n state.typeCount = 1\n }\n\n if ((Date.now() - state.startTime) >= (config.time || 160)) return M.getType(state.totalData, config) // 限制最长识别时间\n\n return 'none'\n },\n\n add(data: IMultiTouchData, add: IMultiTouchData): void {\n if (!add) return\n PointHelper.move(data.move, add.move)\n data.scale *= add.scale\n data.rotation += add.rotation\n data.center = add.center\n },\n\n reset() {\n const { state } = M\n state.type = 'none'\n state.typeCount = 0\n state.startTime = 0\n state.totalData = null\n }\n\n}\n\nconst M = MultiTouchHelper","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n const absScale = within(1 - abs(delta) / (min * 4) * zoomSpeed, 0.5, 2)\n scale = delta > 0 ? absScale : 1 / absScale // 让 scale 放大、缩小可以定位在有规律的刻度上\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nlet totalX: number, totalY: number, totalScale: number, totalRotation: number\n\nexport class Transformer {\n\n public get transforming(): boolean { return this.moving || this.zooming || this.rotating }\n public get moving(): boolean { return !!this.moveData }\n public get zooming(): boolean { return !!this.zoomData }\n public get rotating(): boolean { return !!this.rotateData }\n\n public moveData: IMoveEvent\n public zoomData: IZoomEvent\n public rotateData: IRotateEvent\n\n protected interaction: InteractionBase\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n totalX = 0, totalY = 0\n this.moveData = { ...data, moveX: 0, moveY: 0, totalX, totalY }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n data.totalX = totalX = totalX + data.moveX\n data.totalY = totalY = totalY + data.moveY\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n totalScale = 1\n this.zoomData = { ...data, scale: 1, totalScale }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n data.totalScale = totalScale = totalScale * data.scale\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n totalRotation = 0\n this.rotateData = { ...data, rotation: 0, totalRotation }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n data.totalRotation = totalRotation = totalRotation + data.rotation\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, { ...moveData, totalX, totalY } as IMoveEvent)\n if (zoomData) interaction.emit(ZoomEvent.END, { ...zoomData, totalScale } as IZoomEvent)\n if (rotateData) interaction.emit(RotateEvent.END, { ...rotateData, totalRotation } as IRotateEvent)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'auto', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper, isObject } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n const { disabled, singleGesture } = this.config.multiTouch\n if (disabled) return\n this.pointerWaitCancel()\n\n let gestureData = MultiTouchHelper.getData(list)\n let { moving, zooming, rotating } = this.transformer\n\n if (singleGesture) {\n\n if (!this.transformer.transforming) {\n\n const type = MultiTouchHelper.detect(gestureData, isObject(singleGesture) ? singleGesture : {} as ISingleGestureConfig)\n\n switch (type) {\n case 'move': moving = true; break\n case 'zoom': zooming = true; break\n case 'rotate': rotating = true; break\n default: return\n }\n\n MultiTouchHelper.reset()\n\n }\n\n if (!moving) gestureData.center = MultiTouchHelper.state.center\n\n } else moving = zooming = rotating = true\n\n Object.assign(data, gestureData.center)\n data.multiTouch = true\n\n if (rotating) this.rotate(getRotateEventData(gestureData.rotation, data))\n if (zooming) this.zoom(getZoomEventData(gestureData.scale, data))\n if (moving) this.move(getMoveEventData(gestureData.move, data))\n}","import { IPointerEvent, IFunction, IDragEvent } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, MoveEvent, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs, min, max, hypot } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent): boolean | number {\n const { interaction } = this\n const dragAnimate = this.canAnimate && this.moving && interaction.m.dragAnimate\n\n if (dragAnimate) {\n\n const inertia = isNumber(dragAnimate) ? dragAnimate : 0.95\n const stopMove = 0.15\n const maxMove = 150\n\n let moveX = 0, moveY = 0, flickSpeed = 0 // 快速滑动加速\n let totalWeight = 0, weight: number, w = 3, s: number, frame: IDragEvent\n\n const { dragDataList } = this, len = dragDataList.length\n for (let i = len - 1; i >= max(len - 3, 0); i--) {\n frame = dragDataList[i]\n if (frame.time && (Date.now() - frame.time > 100)) break\n weight = w--\n\n moveX += frame.moveX * weight\n moveY += frame.moveY * weight\n totalWeight += weight\n\n s = hypot(frame.moveX, frame.moveY)\n if (s > flickSpeed) flickSpeed = s\n }\n\n if (totalWeight) moveX /= totalWeight, moveY /= totalWeight\n\n if (flickSpeed > 8) {\n const t = min((flickSpeed - 8) / 17, 1)\n const boost = 1.15 + t * (1.6 - 1.15)\n moveX *= boost\n moveY *= boost\n }\n\n const maxAbs = max(abs(moveX), abs(moveY))\n if (maxAbs > maxMove) {\n s = maxMove / maxAbs\n moveX *= s\n moveY *= s\n }\n\n const step = () => {\n moveX *= inertia\n moveY *= inertia\n\n data = { ...data }\n if (abs(moveX) < stopMove && abs(moveY) < stopMove) return this.dragEndReal(data)\n\n PointHelper.move(data, moveX, moveY)\n this.drag(data)\n\n this.animate(step)\n interaction.emit(MoveEvent.DRAG_ANIMATE, data)\n }\n\n this.animate(step)\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.stopAnimate = function (): void {\n this.animate(null, 'off')\n this.interaction.target.nextRender(() => {\n if (this.dragData) this.dragEndReal(this.dragData)\n })\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","move","getValidMove","moveX","moveY","zoomLayer","DRAG_ANIMATE","x","y","interaction","stopDragAnimate","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","state","type","typeCount","startTime","totalData","center","getData","a","b","lastCenter","PointHelper","getCenter","from","to","lastDistance","getDistance","rotation","getRotation","getType","data","moveScore","Math","hypot","scaleScore","abs","rotateScore","detect","M","Date","now","add","count","time","reset","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","absScale","totalX","totalY","totalScale","totalRotation","Transformer","transforming","this","moving","zooming","rotating","moveData","zoomData","rotateData","constructor","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","singleGesture","pointerWaitCancel","gestureData","isObject","dragger","Dragger","checkDragEndAnimate","dragAnimate","canAnimate","m","inertia","isNumber","stopMove","maxMove","weight","s","frame","flickSpeed","totalWeight","w","dragDataList","len","length","i","boost","maxAbs","step","dragEndReal","drag","animate","func","off","animateWait","target","nextRender","stopAnimate","dragData","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leafer-in/viewport",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.2",
|
|
4
4
|
"description": "@leafer-in/viewport",
|
|
5
5
|
"author": "Chao (Leafer) Wan",
|
|
6
6
|
"license": "MIT",
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"leaferjs"
|
|
35
35
|
],
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@leafer-ui/core": "^1.12.
|
|
38
|
-
"@leafer-ui/interface": "^1.12.
|
|
39
|
-
"@leafer-in/interface": "^1.12.
|
|
37
|
+
"@leafer-ui/core": "^1.12.2",
|
|
38
|
+
"@leafer-ui/interface": "^1.12.2",
|
|
39
|
+
"@leafer-in/interface": "^1.12.2"
|
|
40
40
|
}
|
|
41
41
|
}
|
package/src/Leafer.ts
CHANGED
|
@@ -25,7 +25,7 @@ leafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true)
|
|
|
25
25
|
|
|
26
26
|
if (checkLimit && type.includes('limit')) {
|
|
27
27
|
bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)
|
|
28
|
-
DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, '
|
|
28
|
+
DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'auto', move, true)
|
|
29
29
|
if (type.includes('x')) move.y = 0
|
|
30
30
|
else if (type.includes('y')) move.x = 0
|
|
31
31
|
}
|
|
@@ -1,27 +1,69 @@
|
|
|
1
|
-
import { IPointerEvent, IFunction } from '@leafer-ui/interface'
|
|
1
|
+
import { IPointerEvent, IFunction, IDragEvent } from '@leafer-ui/interface'
|
|
2
2
|
|
|
3
|
-
import { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'
|
|
3
|
+
import { Dragger, BoundsHelper, PointHelper, MoveEvent, isNumber } from '@leafer-ui/core'
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
const dragger = Dragger.prototype
|
|
7
|
-
const { abs } = Math
|
|
7
|
+
const { abs, min, max, hypot } = Math
|
|
8
8
|
|
|
9
|
-
dragger.checkDragEndAnimate = function (data: IPointerEvent
|
|
10
|
-
const {
|
|
11
|
-
const
|
|
12
|
-
const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate
|
|
9
|
+
dragger.checkDragEndAnimate = function (data: IPointerEvent): boolean | number {
|
|
10
|
+
const { interaction } = this
|
|
11
|
+
const dragAnimate = this.canAnimate && this.moving && interaction.m.dragAnimate
|
|
13
12
|
|
|
14
13
|
if (dragAnimate) {
|
|
15
|
-
const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70
|
|
16
|
-
speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia
|
|
17
|
-
if (absMoveX * speed > maxMove) speed = maxMove / absMoveX
|
|
18
|
-
else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY
|
|
19
14
|
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
const inertia = isNumber(dragAnimate) ? dragAnimate : 0.95
|
|
16
|
+
const stopMove = 0.15
|
|
17
|
+
const maxMove = 150
|
|
18
|
+
|
|
19
|
+
let moveX = 0, moveY = 0, flickSpeed = 0 // 快速滑动加速
|
|
20
|
+
let totalWeight = 0, weight: number, w = 3, s: number, frame: IDragEvent
|
|
21
|
+
|
|
22
|
+
const { dragDataList } = this, len = dragDataList.length
|
|
23
|
+
for (let i = len - 1; i >= max(len - 3, 0); i--) {
|
|
24
|
+
frame = dragDataList[i]
|
|
25
|
+
if (frame.time && (Date.now() - frame.time > 100)) break
|
|
26
|
+
weight = w--
|
|
27
|
+
|
|
28
|
+
moveX += frame.moveX * weight
|
|
29
|
+
moveY += frame.moveY * weight
|
|
30
|
+
totalWeight += weight
|
|
31
|
+
|
|
32
|
+
s = hypot(frame.moveX, frame.moveY)
|
|
33
|
+
if (s > flickSpeed) flickSpeed = s
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (totalWeight) moveX /= totalWeight, moveY /= totalWeight
|
|
37
|
+
|
|
38
|
+
if (flickSpeed > 8) {
|
|
39
|
+
const t = min((flickSpeed - 8) / 17, 1)
|
|
40
|
+
const boost = 1.15 + t * (1.6 - 1.15)
|
|
41
|
+
moveX *= boost
|
|
42
|
+
moveY *= boost
|
|
43
|
+
}
|
|
22
44
|
|
|
23
|
-
|
|
24
|
-
|
|
45
|
+
const maxAbs = max(abs(moveX), abs(moveY))
|
|
46
|
+
if (maxAbs > maxMove) {
|
|
47
|
+
s = maxMove / maxAbs
|
|
48
|
+
moveX *= s
|
|
49
|
+
moveY *= s
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const step = () => {
|
|
53
|
+
moveX *= inertia
|
|
54
|
+
moveY *= inertia
|
|
55
|
+
|
|
56
|
+
data = { ...data }
|
|
57
|
+
if (abs(moveX) < stopMove && abs(moveY) < stopMove) return this.dragEndReal(data)
|
|
58
|
+
|
|
59
|
+
PointHelper.move(data, moveX, moveY)
|
|
60
|
+
this.drag(data)
|
|
61
|
+
|
|
62
|
+
this.animate(step)
|
|
63
|
+
interaction.emit(MoveEvent.DRAG_ANIMATE, data)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
this.animate(step)
|
|
25
67
|
}
|
|
26
68
|
|
|
27
69
|
return dragAnimate
|
|
@@ -33,6 +75,13 @@ dragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd an
|
|
|
33
75
|
this.animateWait = func
|
|
34
76
|
}
|
|
35
77
|
|
|
78
|
+
dragger.stopAnimate = function (): void {
|
|
79
|
+
this.animate(null, 'off')
|
|
80
|
+
this.interaction.target.nextRender(() => {
|
|
81
|
+
if (this.dragData) this.dragEndReal(this.dragData)
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
36
85
|
dragger.checkDragOut = function (data: IPointerEvent): void {
|
|
37
86
|
const { interaction } = this
|
|
38
87
|
this.autoMoveCancel()
|