comfyanonymous
9 months ago
4 changed files with 252 additions and 62 deletions
@ -0,0 +1,102 @@
|
||||
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); |
||||
}; |
Loading…
Reference in new issue