From 9552c25e6eaccdd36fccbf96638619a3ab911a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Mon, 2 Aug 2021 14:38:40 +0200 Subject: [PATCH] Add a setting that disables Drag Ruler by default and only activates it once the button to add a waypoint is being pressed --- lang/de.json | 4 +++ lang/en.json | 4 +++ src/main.js | 71 ++++++++++++++++++++++++++++++++++++++++++------- src/settings.js | 9 +++++++ src/util.js | 4 +-- 5 files changed, 80 insertions(+), 12 deletions(-) diff --git a/lang/de.json b/lang/de.json index c93cb90..f4fb429 100644 --- a/lang/de.json +++ b/lang/de.json @@ -34,6 +34,10 @@ "name": "Geschwindigkeit von Spielercharakteren für jeden anzeigen", "hint": "Wenn diese Einstellung aktiviert ist wird die Färbung der hervorgehobenen Felder bei Spielercharakteren allen Spielern angezeigt, selbst wenn diese keinen Zugriff auf den Charakterbogen haben." }, + "autoStartMeasurement": { + "name": "Automatisch mit Messen beginnen", + "hint": "Wenn diese Option aktiviert ist beginnt Drag Ruler mit dem Messen sobald das Token bewegt wird. Wenn die Option deaktiviert ist bleibt Drag Ruler deaktiviert bis der Knopf zum platzieren eines Wegpunkts betätigt wird." + }, "enableMovementHistory": { "name": "Bewegungsverlauf während des Kampfes aktivieren", "hint": "Wenn diesen Option aktiviert ist merkt sich Drag Ruler die Bewegungen, die während einer Runde eines Kampfes gemacht wurden und zeigt diese an, wenn das Token weiterbewegt wird." diff --git a/lang/en.json b/lang/en.json index 5c6113e..d2330dd 100644 --- a/lang/en.json +++ b/lang/en.json @@ -34,6 +34,10 @@ "name": "Show PC speed to everyone", "hint": "If enabled the coloring based on actor speed for player characters will shown to everyone, even if they don't have observer permission for the character sheet." }, + "autoStartMeasurement": { + "name": "Automatically start measuring", + "hint": "If enabled, Drag Ruler will start measuring as soon as the token is being dragged. If disabled, Drag Ruler will remain inactive and will only start measuring once the button to add a waypoint is being pressed." + }, "enableMovementHistory": { "name": "Enable movement history during combat", "hint": "If enabled, Drag Ruler will remember the path a token took during it's turn in combat and will display it when you pick the token back up." diff --git a/src/main.js b/src/main.js index 9cc53c0..df3033d 100644 --- a/src/main.js +++ b/src/main.js @@ -41,7 +41,7 @@ Hooks.on("canvasReady", () => { ruler.draggedEntity = null; Object.defineProperty(ruler, "isDragRuler", { get: function isDragRuler() { - return Boolean(this.draggedEntity); // If draggedEntity is set this is a drag ruler + return Boolean(this.draggedEntity) && this._state !== Ruler.STATES.INACTIVE; } }) }) @@ -99,6 +99,7 @@ function handleKeys(event, key, up) { if (key.toLowerCase() === "x") return onKeyX(up) if (key.toLowerCase() === "shift") return onKeyShift(up) + if (key.toLowerCase() === "space") return onKeySpace(up); return false } @@ -126,10 +127,29 @@ function onKeyShift(up) { ruler.measure(measurePosition, {snap: up}) } +function onKeySpace(up) { + const ruler = canvas.controls.ruler; + if (!ruler.draggedEntity) + return false; + + if (ruler._state !== Ruler.STATES.INACTIVE) + return false; + + const swapSpacebarRightClick = game.settings.get(settingsKey, "swapSpacebarRightClick"); + let options = {}; + setSnapParameterOnOptions(ruler, options); + + if (!up) { + if (swapSpacebarRightClick) + ruler.dragRulerDeleteWaypoint(); + else + startDragRuler.call(ruler.draggedEntity, options); + } + return true; +} + function onEntityLeftDragStart(event) { const isToken = this instanceof Token; - if (isToken && !currentSpeedProvider.usesRuler(this)) - return const ruler = canvas.controls.ruler ruler.draggedEntity = this; let entityCenter; @@ -137,12 +157,33 @@ function onEntityLeftDragStart(event) { entityCenter = getHexSizeSupportTokenGridCenter(this); else entityCenter = this.center; + ruler.rulerOffset = {x: entityCenter.x - event.data.origin.x, y: entityCenter.y - event.data.origin.y}; + if (game.settings.get(settingsKey, "autoStartMeasurement")) { + let options = {}; + setSnapParameterOnOptions(ruler, options); + startDragRuler.call(this, options, false); + } +} + +function startDragRuler(options, measureImmediately=true) { + const isToken = this instanceof Token; + if (isToken && !currentSpeedProvider.usesRuler(this)) + return; + const ruler = canvas.controls.ruler; ruler.clear(); ruler._state = Ruler.STATES.STARTING; - ruler.rulerOffset = {x: entityCenter.x - event.data.origin.x, y: entityCenter.y - event.data.origin.y}; + let entityCenter; + if (isToken && canvas.grid.isHex && game.modules.get("hex-size-support")?.active && CONFIG.hexSizeSupport.getAltSnappingFlag(this)) + entityCenter = getHexSizeSupportTokenGridCenter(this); + else + entityCenter = this.center; if (isToken && game.settings.get(settingsKey, "enableMovementHistory")) ruler.dragRulerAddWaypointHistory(getMovementHistory(this)); ruler.dragRulerAddWaypoint(entityCenter, {snap: false}); + const mousePosition = canvas.app.renderer.plugins.interaction.mouse.getLocalPosition(canvas.tokens); + const destination = {x: mousePosition.x + ruler.rulerOffset.x, y: mousePosition.y + ruler.rulerOffset.y}; + if (measureImmediately) + ruler.measure(destination, options); } function onEntityLeftDragMove(event) { @@ -153,8 +194,10 @@ function onEntityLeftDragMove(event) { function onEntityDragLeftDrop(event) { const ruler = canvas.controls.ruler - if (!ruler.isDragRuler) + if (!ruler.isDragRuler) { + ruler.draggedEntity = undefined; return false + } // When we're dragging a measured template no token will ever be selected, // resulting in only the dragged template to be moved as would be expected const selectedTokens = canvas.tokens.controlled @@ -169,13 +212,21 @@ function onEntityDragLeftDrop(event) { function onEntityDragLeftCancel(event) { // This function is invoked by right clicking const ruler = canvas.controls.ruler - if (!ruler.isDragRuler || ruler._state === Ruler.STATES.MOVING) + if (!ruler.draggedEntity || ruler._state === Ruler.STATES.MOVING) return false - if (ruler._state === Ruler.STATES.MEASURING) { - let options = {}; - setSnapParameterOnOptions(this, event, options); - if (!game.settings.get(settingsKey, "swapSpacebarRightClick")) { + const swapSpacebarRightClick = game.settings.get(settingsKey, "swapSpacebarRightClick"); + let options = {}; + setSnapParameterOnOptions(ruler, options); + + if (ruler._state === Ruler.STATES.INACTIVE) { + if (!swapSpacebarRightClick) + return false; + startDragRuler.call(this, options); + event.preventDefault(); + } + else if (ruler._state === Ruler.STATES.MEASURING) { + if (!swapSpacebarRightClick) { ruler.dragRulerDeleteWaypoint(event, options); } else { diff --git a/src/settings.js b/src/settings.js index 004a180..0636b8b 100644 --- a/src/settings.js +++ b/src/settings.js @@ -11,6 +11,15 @@ export function registerSettings() { default: "fresh install" }) + game.settings.register(settingsKey, "autoStartMeasurement", { + name: "drag-ruler.settings.autoStartMeasurement.name", + hint: "drag-ruler.settings.autoStartMeasurement.hint", + scope: "client", + config: true, + type: Boolean, + default: true, + }); + game.settings.register(settingsKey, "swapSpacebarRightClick", { name: "drag-ruler.settings.swapSpacebarRightClick.name", hint: "drag-ruler.settings.swapSpacebarRightClick.hint", diff --git a/src/util.js b/src/util.js index 3856f2a..3a42f64 100644 --- a/src/util.js +++ b/src/util.js @@ -199,7 +199,7 @@ export function applyTokenSizeOffset(waypoints, token) { return waypoints.map(w => new PIXI.Point(w.x + waypointOffset.x, w.y + waypointOffset.y)) } -export function setSnapParameterOnOptions(sourceObject, event, options) { +export function setSnapParameterOnOptions(sourceObject, options) { // Allow outside modules to override snapping if (sourceObject.snapOverride?.active) { options.snapOverrideActive = true; @@ -207,6 +207,6 @@ export function setSnapParameterOnOptions(sourceObject, event, options) { sourceObject.snapOverride = undefined; // remove it to prevent any lingering data issues } else { - options.snap = !event.shiftKey; + options.snap = !game.keyboard._downKeys.has("Shift"); } }