sort of zoom to mouse
This commit is contained in:
parent
dcc1d7e11e
commit
7b11de4b38
56
src/main.js
56
src/main.js
|
|
@ -61,7 +61,6 @@ let fileWidth = 1500
|
||||||
let fileHeight = 1000
|
let fileHeight = 1000
|
||||||
let fileFps = 12
|
let fileFps = 12
|
||||||
|
|
||||||
let zoomLevel = 1
|
|
||||||
|
|
||||||
let playing = false
|
let playing = false
|
||||||
|
|
||||||
|
|
@ -133,6 +132,7 @@ let context = {
|
||||||
selection: [],
|
selection: [],
|
||||||
shapeselection: [],
|
shapeselection: [],
|
||||||
dragDirection: undefined,
|
dragDirection: undefined,
|
||||||
|
zoomLevel: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
let config = {
|
let config = {
|
||||||
|
|
@ -921,8 +921,8 @@ function vectorDist(a, b) {
|
||||||
function getMousePos(canvas, evt) {
|
function getMousePos(canvas, evt) {
|
||||||
var rect = canvas.getBoundingClientRect();
|
var rect = canvas.getBoundingClientRect();
|
||||||
return {
|
return {
|
||||||
x: (evt.clientX - rect.left) / zoomLevel,
|
x: (evt.clientX - rect.left) / context.zoomLevel,
|
||||||
y: (evt.clientY - rect.top) / zoomLevel
|
y: (evt.clientY - rect.top) / context.zoomLevel
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2409,22 +2409,48 @@ async function render() {
|
||||||
document.querySelector("body").style.cursor = "default"
|
document.querySelector("body").style.cursor = "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateScrollPosition(zoomFactor) {
|
||||||
|
if (context.mousePos) {
|
||||||
|
for (let scroller of document.querySelectorAll(".scroll")) {
|
||||||
|
let stage = scroller.querySelector('.stage')
|
||||||
|
let scrollLeft = scroller.scrollLeft;
|
||||||
|
let scrollTop = scroller.scrollTop;
|
||||||
|
|
||||||
|
// Get the mouse position relative to the scroller (taking into account the scroller's position)
|
||||||
|
let scrollerMouseX = context.mousePos.x + scrollLeft;
|
||||||
|
let scrollerMouseY = context.mousePos.y + scrollTop;
|
||||||
|
|
||||||
|
let newScrollLeft = scrollerMouseX - (context.mousePos.x * zoomFactor);
|
||||||
|
let newScrollTop = scrollerMouseY - (context.mousePos.y * zoomFactor);
|
||||||
|
|
||||||
|
// Apply the scroll position adjustments
|
||||||
|
console.log(context.mousePos, scrollerMouseX, scrollerMouseY, newScrollLeft, newScrollTop)
|
||||||
|
scroller.scrollLeft = -newScrollLeft;
|
||||||
|
scroller.scrollTop = -newScrollTop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function zoomIn() {
|
function zoomIn() {
|
||||||
if (zoomLevel < 8) {
|
let zoomFactor = 2
|
||||||
zoomLevel *= 2
|
if (context.zoomLevel < 8) {
|
||||||
|
context.zoomLevel *= zoomFactor
|
||||||
|
updateScrollPosition(zoomFactor)
|
||||||
updateUI()
|
updateUI()
|
||||||
updateMenu()
|
updateMenu()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function zoomOut() {
|
function zoomOut() {
|
||||||
if (zoomLevel > 1/8) {
|
let zoomFactor = 0.5
|
||||||
zoomLevel /= 2
|
if (context.zoomLevel > 1/8) {
|
||||||
|
context.zoomLevel *= zoomFactor
|
||||||
|
updateScrollPosition(zoomFactor)
|
||||||
updateUI()
|
updateUI()
|
||||||
updateMenu()
|
updateMenu()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function resetZoom() {
|
function resetZoom() {
|
||||||
zoomLevel = 1;
|
context.zoomLevel = 1;
|
||||||
updateUI()
|
updateUI()
|
||||||
updateMenu()
|
updateMenu()
|
||||||
}
|
}
|
||||||
|
|
@ -2445,7 +2471,6 @@ function stage() {
|
||||||
cornerRect.classList.add("cornerRect")
|
cornerRect.classList.add("cornerRect")
|
||||||
cornerRect.classList.add(i)
|
cornerRect.classList.add(i)
|
||||||
cornerRect.addEventListener('mousedown', (e) => {
|
cornerRect.addEventListener('mousedown', (e) => {
|
||||||
console.log(i)
|
|
||||||
let bbox = undefined;
|
let bbox = undefined;
|
||||||
let selection = {}
|
let selection = {}
|
||||||
for (let item of context.selection) {
|
for (let item of context.selection) {
|
||||||
|
|
@ -2702,6 +2727,7 @@ function stage() {
|
||||||
})
|
})
|
||||||
stage.addEventListener("mousemove", (e) => {
|
stage.addEventListener("mousemove", (e) => {
|
||||||
let mouse = getMousePos(stage, e)
|
let mouse = getMousePos(stage, e)
|
||||||
|
context.mousePos = mouse
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case "draw":
|
case "draw":
|
||||||
context.activeCurve = undefined
|
context.activeCurve = undefined
|
||||||
|
|
@ -3187,13 +3213,13 @@ function updateLayout(element) {
|
||||||
|
|
||||||
function updateUI() {
|
function updateUI() {
|
||||||
for (let canvas of canvases) {
|
for (let canvas of canvases) {
|
||||||
canvas.width = fileWidth * zoomLevel
|
canvas.width = fileWidth * context.zoomLevel
|
||||||
canvas.height = fileHeight * zoomLevel
|
canvas.height = fileHeight * context.zoomLevel
|
||||||
canvas.style.width = `${fileWidth * zoomLevel}px`
|
canvas.style.width = `${fileWidth * context.zoomLevel}px`
|
||||||
canvas.style.height = `${fileHeight * zoomLevel}px`
|
canvas.style.height = `${fileHeight * context.zoomLevel}px`
|
||||||
let ctx = canvas.getContext("2d")
|
let ctx = canvas.getContext("2d")
|
||||||
ctx.resetTransform();
|
ctx.resetTransform();
|
||||||
ctx.scale(zoomLevel, zoomLevel)
|
ctx.scale(context.zoomLevel, context.zoomLevel)
|
||||||
ctx.beginPath()
|
ctx.beginPath()
|
||||||
ctx.fillStyle = "white"
|
ctx.fillStyle = "white"
|
||||||
ctx.fillRect(0,0,fileWidth,fileHeight)
|
ctx.fillRect(0,0,fileWidth,fileHeight)
|
||||||
|
|
@ -3592,7 +3618,7 @@ async function updateMenu() {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "Reset Zoom",
|
text: "Reset Zoom",
|
||||||
enabled: zoomLevel != 1,
|
enabled: context.zoomLevel != 1,
|
||||||
action: resetZoom
|
action: resetZoom
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue