Spaces:
Runtime error
Runtime error
import { app } from "../../scripts/app.js"; | |
let touchZooming; | |
let touchCount = 0; | |
app.registerExtension({ | |
name: "Comfy.SimpleTouchSupport", | |
setup() { | |
let zoomPos; | |
let touchTime; | |
let lastTouch; | |
function getMultiTouchPos(e) { | |
return Math.hypot(e.touches[0].clientX - e.touches[1].clientX, e.touches[0].clientY - e.touches[1].clientY); | |
} | |
app.canvasEl.addEventListener( | |
"touchstart", | |
(e) => { | |
touchCount++; | |
lastTouch = null; | |
if (e.touches?.length === 1) { | |
// Store start time for press+hold for context menu | |
touchTime = new Date(); | |
lastTouch = e.touches[0]; | |
} else { | |
touchTime = null; | |
if (e.touches?.length === 2) { | |
// Store center pos for zoom | |
zoomPos = getMultiTouchPos(e); | |
app.canvas.pointer_is_down = false; | |
} | |
} | |
}, | |
true | |
); | |
app.canvasEl.addEventListener("touchend", (e) => { | |
touchZooming = false; | |
touchCount = e.touches?.length ?? touchCount - 1; | |
if (touchTime && !e.touches?.length) { | |
if (new Date() - touchTime > 600) { | |
try { | |
// hack to get litegraph to use this event | |
e.constructor = CustomEvent; | |
} catch (error) {} | |
e.clientX = lastTouch.clientX; | |
e.clientY = lastTouch.clientY; | |
app.canvas.pointer_is_down = true; | |
app.canvas._mousedown_callback(e); | |
} | |
touchTime = null; | |
} | |
}); | |
app.canvasEl.addEventListener( | |
"touchmove", | |
(e) => { | |
touchTime = null; | |
if (e.touches?.length === 2) { | |
app.canvas.pointer_is_down = false; | |
touchZooming = true; | |
LiteGraph.closeAllContextMenus(); | |
app.canvas.search_box?.close(); | |
const newZoomPos = getMultiTouchPos(e); | |
const midX = (e.touches[0].clientX + e.touches[1].clientX) / 2; | |
const midY = (e.touches[0].clientY + e.touches[1].clientY) / 2; | |
let scale = app.canvas.ds.scale; | |
const diff = zoomPos - newZoomPos; | |
if (diff > 0.5) { | |
scale *= 1 / 1.07; | |
} else if (diff < -0.5) { | |
scale *= 1.07; | |
} | |
app.canvas.ds.changeScale(scale, [midX, midY]); | |
app.canvas.setDirty(true, true); | |
zoomPos = newZoomPos; | |
} | |
}, | |
true | |
); | |
}, | |
}); | |
const processMouseDown = LGraphCanvas.prototype.processMouseDown; | |
LGraphCanvas.prototype.processMouseDown = function (e) { | |
if (touchZooming || touchCount) { | |
return; | |
} | |
return processMouseDown.apply(this, arguments); | |
}; | |
const processMouseMove = LGraphCanvas.prototype.processMouseMove; | |
LGraphCanvas.prototype.processMouseMove = function (e) { | |
if (touchZooming || touchCount > 1) { | |
return; | |
} | |
return processMouseMove.apply(this, arguments); | |
}; | |