You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.5 KiB
102 lines
2.5 KiB
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); |
|
};
|
|
|