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); };