From 401a76da840033c20a8e9c6faf5597e797b92225 Mon Sep 17 00:00:00 2001 From: dylan <> Date: Sat, 13 May 2023 15:00:16 -0700 Subject: [PATCH] Add middle mouse navigation on map --- maptab.ts | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/maptab.ts b/maptab.ts index b423050..03bd11c 100644 --- a/maptab.ts +++ b/maptab.ts @@ -2,7 +2,7 @@ import { clearScreen, fillRect } from "./window.ts"; import { drawSprite, drawText } from "./builtins.ts"; import { COLOR } from "./colors.ts"; import { getMapSheet, getSheet, setSheet } from "./sheet.ts"; -import { mouseClick, mouseHeld, mousePos } from "./mouse.ts"; +import { M, mouseClick, mouseDown, mouseHeld, mousePos } from "./mouse.ts"; import { drawTransparentRect, drawVoidRect, inRect, reGrid } from "./util.ts"; import { page } from "./viewsheets.ts"; import { useSpritesheet } from "./builtins.ts"; @@ -14,6 +14,11 @@ const state = { selectedSprite: 0, viewX: 0, viewY: 0, + dragging: false, + dragFromViewX: 0, + dragFromViewY: 0, + dragFromX: 0, + dragFromY: 0, get spriteSheetPage() { return Math.floor(this.selectedSprite/64); }, @@ -70,11 +75,12 @@ const spriteSheetPageSwapW = 7; const spriteSheetPageSwapH = 7; const update = () => { + const {x: mouseX, y: mouseY} = mousePos(); + const inPatch = inRect(mouseX, mouseY, patchX, patchY, patchW*spriteW, patchH*spriteH - 2); + const inSpriteSheetPicker = inRect(mouseX, mouseY, spriteSheetPickerX, spriteSheetPickerY, spriteSheetPickerW*spriteSheetPickerTabW, spriteSheetPickerH*spriteSheetPickerTabH); + const inSpriteSheet = inRect(mouseX, mouseY, spriteSheetX, spriteSheetY, spriteSheetW*spriteW, spriteSheetH*spriteH); + const inSpriteSheetPageSwap = inRect(mouseX, mouseY, spriteSheetPageSwapX, spriteSheetPageSwapY, spriteSheetPageSwapW, spriteSheetPageSwapH); if (mouseHeld()) { - const {x: mouseX, y: mouseY} = mousePos(); - const inPatch = inRect(mouseX, mouseY, patchX, patchY, patchW*spriteW, patchH*spriteH - 2); - const inSpriteSheetPicker = inRect(mouseX, mouseY, spriteSheetPickerX, spriteSheetPickerY, spriteSheetPickerW*spriteSheetPickerTabW, spriteSheetPickerH*spriteSheetPickerTabH); - const inSpriteSheet = inRect(mouseX, mouseY, spriteSheetX, spriteSheetY, spriteSheetW*spriteW, spriteSheetH*spriteH); if (inPatch) { const {x, y} = reGrid(mouseX, mouseY, patchX, patchY, spriteW, spriteH); const cellNumber = patchW*y+x; @@ -88,9 +94,24 @@ const update = () => { const {x, y} = reGrid(mouseX, mouseY, spriteSheetX, spriteSheetY, spriteW, spriteH); state.spriteWithinPage = spriteSheetW*y+x; } + } else if (mouseDown(M.MIDDLE)) { + if (inPatch) { + const {x, y} = reGrid(mouseX, mouseY, patchX, patchY, spriteW, spriteH); + state.dragging = true; + state.dragFromX = x; + state.dragFromY = y; + state.dragFromViewX = state.viewX; + state.dragFromViewY = state.viewY; + } + } else if (mouseHeld(M.MIDDLE)) { + if (state.dragging) { + const {x, y} = reGrid(mouseX, mouseY, patchX, patchY, spriteW, spriteH); + state.viewX = state.dragFromViewX - x + state.dragFromX; + state.viewY = state.dragFromViewY - y + state.dragFromY; + } + } else if (mouseClick(M.MIDDLE)) { + state.dragging = false; } else if (mouseClick()) { - const {x: mouseX, y: mouseY} = mousePos(); - const inSpriteSheetPageSwap = inRect(mouseX, mouseY, spriteSheetPageSwapX, spriteSheetPageSwapY, spriteSheetPageSwapW, spriteSheetPageSwapH); if (inSpriteSheetPageSwap) { state.spriteSheetPage = (1+state.spriteSheetPage)%2; }