components/mixins/pointerGesture.mjs

import { isFromMouse, armPointerGesture } from '../../js/domGesture.mjs'

/**
 * pointer 通道(觸控/觸控筆)之手勢入口接線 —— 畫布/節點/四角/把手/轉折點/label 共用同一份規則。
 *
 * 分流與延後之理由見 js/domGesture.mjs 之 isFromMouse 與 armPointerGesture:
 * 滑鼠同時送 pointer 與 mouse 兩套事件(故跳過滑鼠), 觸控之點按會補送相容滑鼠事件而拖曳不會(故延後到跨門檻)。
 *
 * 用法: 元件 template 掛 `@pointerdown="onXxxPointerDown"`, method 內呼叫
 * `this.armPointer(event, (down) => this.onXxxMouseDown(down))` —— 既有滑鼠 handler 原樣重用, 不複製手勢邏輯。
 */
export default {
    beforeDestroy() {
        //尚未跨門檻即被銷毀者, 其 document 監聽不會自行移除
        this.disposePointerArm()
    },
    methods: {
        armPointer(event, start) {
            if (isFromMouse(event)) return
            //同一元件上一次之未啟動閘門先收掉(如手指放開未送達 pointerup), 避免監聽器疊加
            this.disposePointerArm()
            this._ptrArm = armPointerGesture(event, (down) => {
                this._ptrArm = null
                start(down)
            })
        },
        disposePointerArm() {
            if (!this._ptrArm) return false
            this._ptrArm.dispose()
            this._ptrArm = null
            return true
        },
    },
}