Code changes for v9 compatibility (moves keybindings into the new foundry API)
This commit is contained in:
+23
-5
@@ -29,6 +29,19 @@
|
|||||||
"dash": "sprinten"
|
"dash": "sprinten"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"keybindings": {
|
||||||
|
"cancelDrag": "Ziehen beenden",
|
||||||
|
"createWaypoint": "Wegpunkt erstellen",
|
||||||
|
"deleteWaypoint": "Wegpunkt löschen",
|
||||||
|
"disableSnap": {
|
||||||
|
"name": "Raster deaktivieren",
|
||||||
|
"hint": "Während diese Taste gedrückt ist wird das Raster temporär deaktiviert"
|
||||||
|
},
|
||||||
|
"moveWithoutAnimation": {
|
||||||
|
"name": "Token animation deaktivieren",
|
||||||
|
"hint": "Wenn diese Taste gedrückt wird, während ein Token fallen gelassen wird, bewegt es sich ohne Animation zum Zielort."
|
||||||
|
}
|
||||||
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"alwaysShowSpeedForPCs": {
|
"alwaysShowSpeedForPCs": {
|
||||||
"name": "Geschwindigkeit von Spielercharakteren für jeden anzeigen",
|
"name": "Geschwindigkeit von Spielercharakteren für jeden anzeigen",
|
||||||
@@ -42,6 +55,15 @@
|
|||||||
"name": "Bewegungsverlauf während des Kampfes aktivieren",
|
"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."
|
"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."
|
||||||
},
|
},
|
||||||
|
"rightClickAction": {
|
||||||
|
"name": "Aktion bei Rechtsklick",
|
||||||
|
"hint": "Was soll getan werden, wenn die rechte Maustaste während des Ziehens gedrückt wird?",
|
||||||
|
"choices": {
|
||||||
|
"create": "Wegpunkt erstellen",
|
||||||
|
"delete": "Wegpunkt löschen",
|
||||||
|
"cancel": "Ziehen beenden"
|
||||||
|
}
|
||||||
|
},
|
||||||
"showGMRulerToPlayers": {
|
"showGMRulerToPlayers": {
|
||||||
"name": "Lineal des Spielleiters bei Spielern anzeigen",
|
"name": "Lineal des Spielleiters bei Spielern anzeigen",
|
||||||
"hint": "Wenn diese Option deaktiviert ist wird das Lineal des Spielleiters bei den anderen Spielern nicht angezeigt."
|
"hint": "Wenn diese Option deaktiviert ist wird das Lineal des Spielleiters bei den anderen Spielern nicht angezeigt."
|
||||||
@@ -78,13 +100,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"swapSpacebarRightClick": {
|
|
||||||
"name": "Leertaste und Rechtsklick tauschen",
|
|
||||||
"hint": "Die Funktionen der Leertaste und des Rechtsklicks sind, während eine Spielfigur bewegt wird, vertauscht. Wenn diese Option aktiviert wird können mit Rechtsklick Wegpunkte gesetzt werden und mit der Leertaste werden sie wieder gelöscht."
|
|
||||||
},
|
|
||||||
"useGridlessraster": {
|
"useGridlessraster": {
|
||||||
"name": "Geschwindigkeitsraster aktivieren",
|
"name": "Geschwindigkeitsraster aktivieren",
|
||||||
"hint": "Lässt Spielfiguren auf gitterlosen Szenen an deren Geschwindigkeitsgrenzen einrasten. Dies kann vorübergehend deaktiviert werden, indem während des ziehens die Umschalttaste gedrückt wird."
|
"hint": "Lässt Spielfiguren auf gitterlosen Szenen an deren Geschwindigkeitsgrenzen einrasten."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-5
@@ -29,6 +29,19 @@
|
|||||||
"dash": "dash"
|
"dash": "dash"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"keybindings": {
|
||||||
|
"cancelDrag": "Cancel dragging",
|
||||||
|
"createWaypoint": "Create waypoint",
|
||||||
|
"deleteWaypoint": "Delete waypoint",
|
||||||
|
"disableSnap": {
|
||||||
|
"name": "Disable snapping",
|
||||||
|
"hint": "Snapping will be temporarily disabled while this key is being held down"
|
||||||
|
},
|
||||||
|
"moveWithoutAnimation": {
|
||||||
|
"name": "Disable token animation",
|
||||||
|
"hint": "When being held while dropping a token, the token will move to the target location without animating"
|
||||||
|
}
|
||||||
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"alwaysShowSpeedForPCs": {
|
"alwaysShowSpeedForPCs": {
|
||||||
"name": "Show PC speed to everyone",
|
"name": "Show PC speed to everyone",
|
||||||
@@ -42,6 +55,15 @@
|
|||||||
"name": "Enable movement history during combat",
|
"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."
|
"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."
|
||||||
},
|
},
|
||||||
|
"rightClickAction": {
|
||||||
|
"name": "Right click action",
|
||||||
|
"hint": "What action shall be performed when right clicking while dragging a token?",
|
||||||
|
"choices": {
|
||||||
|
"create": "Create waypoint",
|
||||||
|
"delete": "Delete waypoint",
|
||||||
|
"cancel": "Cancel drag"
|
||||||
|
}
|
||||||
|
},
|
||||||
"showGMRulerToPlayers": {
|
"showGMRulerToPlayers": {
|
||||||
"name": "Show GM ruler to players",
|
"name": "Show GM ruler to players",
|
||||||
"hint": "If disabled the ruler of GMs will not be shown for non-GM players"
|
"hint": "If disabled the ruler of GMs will not be shown for non-GM players"
|
||||||
@@ -78,13 +100,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"swapSpacebarRightClick": {
|
|
||||||
"name": "Swap spacebar and right click",
|
|
||||||
"hint": "Swaps the functions of spacebar and right click during dragging. If enabled right click will place waypoints and spacebar will delete them"
|
|
||||||
},
|
|
||||||
"useGridlessRaster": {
|
"useGridlessRaster": {
|
||||||
"name": "Use speed based snapping",
|
"name": "Use speed based snapping",
|
||||||
"hint": "On Gridless scenes, this makes tokens snap to the token's speed ranges. This can be temporarily disabled by pressing Shift during drag."
|
"hint": "On Gridless scenes, this makes tokens snap to the token's speed ranges."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,10 +82,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"swapSpacebarRightClick": {
|
|
||||||
"name": "Intercambiar barra espaciadora y clic-derecho",
|
|
||||||
"hint": "Cambia el funcionamiento de la barra espaciadora y el clic-derecho del ratón mientras se arrastra un icono. Si está habilitado, clic-derecho establecerá puntos en la ruta y la barra espaciadora los borrará"
|
|
||||||
},
|
|
||||||
"useGridlessRaster": {
|
"useGridlessRaster": {
|
||||||
"name": "Usar ajuste a la velocidad",
|
"name": "Usar ajuste a la velocidad",
|
||||||
"hint": "Cuando no se use rejilla en la escena, este ajuste hace que los iconos se ajusten a sus rangos de velocidad. Se puede deshabilitar temporalmente pulsando la tecla Mayús mientras se arrastra"
|
"hint": "Cuando no se use rejilla en la escena, este ajuste hace que los iconos se ajusten a sus rangos de velocidad. Se puede deshabilitar temporalmente pulsando la tecla Mayús mientras se arrastra"
|
||||||
|
|||||||
@@ -79,10 +79,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"swapSpacebarRightClick": {
|
|
||||||
"name": "スペースキーと右クリックを入れ替える",
|
|
||||||
"hint": "ドラッグ中のスペースキーと右クリックの機能を入れ替えます。有効にすると右クリックがウェイポイントの配置、スペースキーが削除になります。"
|
|
||||||
},
|
|
||||||
"useGridlessRaster": {
|
"useGridlessRaster": {
|
||||||
"name": "移動速度制限",
|
"name": "移動速度制限",
|
||||||
"hint": "グリッドの無いシーンでは、コマがドラッグできる範囲を移動速度ぶんまで制限します。Shiftキーを押すことで一時的にこの制限を無視できます。"
|
"hint": "グリッドの無いシーンでは、コマがドラッグできる範囲を移動速度ぶんまで制限します。Shiftキーを押すことで一時的にこの制限を無視できます。"
|
||||||
|
|||||||
@@ -73,10 +73,6 @@
|
|||||||
"system": "시스템 {name}"
|
"system": "시스템 {name}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"swapSpacebarRightClick": {
|
|
||||||
"name": "스페이스바와 우클릭 스왑",
|
|
||||||
"hint": "드래그 도중 스페이스바의 기능을 우클릭 기능과 바꾼다. 활성화된 경우 드래그시 우클릭을 사용하면 경유지가 배치되고, 스페이스바가 해당 경유지를 삭제한다."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,10 +56,6 @@
|
|||||||
"system": "系統 {name}"
|
"system": "系統 {name}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"swapSpacebarRightClick": {
|
|
||||||
"name": "交換空格鍵並鼠標右鍵",
|
|
||||||
"hint": "交換空格鍵和右鍵點擊在拖動過程中的功能。如果啟用,右鍵單擊將放置航點,空格鍵將刪除它們。"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -3,8 +3,8 @@
|
|||||||
"title": "Drag Ruler",
|
"title": "Drag Ruler",
|
||||||
"description": "When dragging a token displays a ruler showing how far you've moved that token.",
|
"description": "When dragging a token displays a ruler showing how far you've moved that token.",
|
||||||
"version": "1.9.1",
|
"version": "1.9.1",
|
||||||
"minimumCoreVersion" : "0.8.5",
|
"minimumCoreVersion" : "9.238",
|
||||||
"compatibleCoreVersion" : "0.8.9",
|
"compatibleCoreVersion" : "9",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "Manuel Vögele",
|
"name": "Manuel Vögele",
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import {highlightMeasurementTerrainRuler, measureDistances} from "./compatibility.js";
|
import {highlightMeasurementTerrainRuler, measureDistances} from "./compatibility.js";
|
||||||
import {getGridPositionFromPixels} from "./foundry_fixes.js";
|
import {getGridPositionFromPixels} from "./foundry_fixes.js";
|
||||||
import {Line} from "./geometry.js";
|
import {Line} from "./geometry.js";
|
||||||
|
import {disableSnap, moveWithoutAnimation} from "./keybindings.js";
|
||||||
import {trackRays} from "./movement_tracking.js"
|
import {trackRays} from "./movement_tracking.js"
|
||||||
import {recalculate} from "./socket.js";
|
import {recalculate} from "./socket.js";
|
||||||
import {applyTokenSizeOffset, getSnapPointForEntity, getSnapPointForToken, getTokenShape, highlightTokenShape, zip} from "./util.js";
|
import {applyTokenSizeOffset, getSnapPointForEntity, getSnapPointForToken, getTokenShape, highlightTokenShape, zip} from "./util.js";
|
||||||
@@ -69,7 +70,7 @@ async function animateEntities(entities, draggedEntity, draggedRays, wasPaused)
|
|||||||
});
|
});
|
||||||
|
|
||||||
const isToken = draggedEntity instanceof Token;
|
const isToken = draggedEntity instanceof Token;
|
||||||
const animate = isToken && !game.keyboard.isDown("Alt");
|
const animate = isToken && !moveWithoutAnimation;
|
||||||
const startWaypoint = animate ? 0 : entityAnimationData[0].rays.length - 1;
|
const startWaypoint = animate ? 0 : entityAnimationData[0].rays.length - 1;
|
||||||
|
|
||||||
// This is a flag of the "Monk's Active Tile Triggers" module that signals that the movement should be cancelled early
|
// This is a flag of the "Monk's Active Tile Triggers" module that signals that the movement should be cancelled early
|
||||||
@@ -130,7 +131,7 @@ function scheduleMeasurement(destination, event) {
|
|||||||
const mt = event._measureTime || 0;
|
const mt = event._measureTime || 0;
|
||||||
const originalEvent = event.data.originalEvent;
|
const originalEvent = event.data.originalEvent;
|
||||||
if (Date.now() - mt > measurementInterval) {
|
if (Date.now() - mt > measurementInterval) {
|
||||||
this.measure(destination, {snap: !originalEvent.shiftKey});
|
this.measure(destination, {snap: !disableSnap});
|
||||||
event._measureTime = Date.now();
|
event._measureTime = Date.now();
|
||||||
this._state = Ruler.STATES.MEASURING;
|
this._state = Ruler.STATES.MEASURING;
|
||||||
cancelScheduledMeasurement.call(this);
|
cancelScheduledMeasurement.call(this);
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
import {settingsKey} from "./settings.js";
|
||||||
|
import { getMeasurePosition, setSnapParameterOnOptions } from "./util.js";
|
||||||
|
|
||||||
|
export let disableSnap = false;
|
||||||
|
export let moveWithoutAnimation = false;
|
||||||
|
|
||||||
|
export function registerKeybindings() {
|
||||||
|
game.keybindings.register(settingsKey, "cancelDrag", {
|
||||||
|
name: "drag-ruler.keybindings.cancelDrag",
|
||||||
|
onDown: cancelDrag,
|
||||||
|
uneditable: [{
|
||||||
|
key: "Escape",
|
||||||
|
}],
|
||||||
|
precedence: -1,
|
||||||
|
});
|
||||||
|
|
||||||
|
game.keybindings.register(settingsKey, "createWaypoint", {
|
||||||
|
name: "drag-ruler.keybindings.createWaypoint",
|
||||||
|
onDown: handleCreateWaypoint,
|
||||||
|
editable: [{
|
||||||
|
key: "Space"
|
||||||
|
}],
|
||||||
|
precedence: -1,
|
||||||
|
});
|
||||||
|
|
||||||
|
game.keybindings.register(settingsKey, "deleteWaypoint", {
|
||||||
|
name: "drag-ruler.keybindings.deleteWaypoint",
|
||||||
|
onDown: handleDeleteWaypoint,
|
||||||
|
precedence: -1,
|
||||||
|
});
|
||||||
|
|
||||||
|
game.keybindings.register(settingsKey, "disableSnap", {
|
||||||
|
name: "drag-ruler.keybindings.disableSnap.name",
|
||||||
|
hint: "drag-ruler.keybindings.disableSnap.hint",
|
||||||
|
onDown: handleDisableSnap,
|
||||||
|
onUp: handleDisableSnap,
|
||||||
|
editable: [{
|
||||||
|
key: "ShiftLeft",
|
||||||
|
}],
|
||||||
|
precedence: -1,
|
||||||
|
});
|
||||||
|
|
||||||
|
game.keybindings.register(settingsKey, "moveWithoutAnimation", {
|
||||||
|
name: "drag-ruler.keybindings.moveWithoutAnimation.name",
|
||||||
|
hint: "drag-ruler.keybindings.moveWithoutAnimation.hint",
|
||||||
|
onDown: handleMoveWithoutAnimation,
|
||||||
|
onUp: handleMoveWithoutAnimation,
|
||||||
|
editable: [{
|
||||||
|
key: "AltLeft",
|
||||||
|
}],
|
||||||
|
precedence: -1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleDeleteWaypoint() {
|
||||||
|
const ruler = canvas.controls.ruler;
|
||||||
|
if (!ruler.draggedEntity)
|
||||||
|
return false;
|
||||||
|
ruler.dragRulerDeleteWaypoint();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleCreateWaypoint() {
|
||||||
|
const ruler = canvas.controls.ruler;
|
||||||
|
// .draggedEntity is used here because .isDragRuler only returns true once the ruler started measuring
|
||||||
|
// Ruler can end up being undefined here if no canvas is active
|
||||||
|
if (!ruler?.draggedEntity)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let options = {};
|
||||||
|
setSnapParameterOnOptions(ruler, options);
|
||||||
|
|
||||||
|
if (ruler._state === Ruler.STATES.INACTIVE) {
|
||||||
|
ruler.dragRulerStart(options);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ruler.dragRulerAddWaypoint(getMeasurePosition(), options);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancelDrag() {
|
||||||
|
const ruler = canvas.controls.ruler;
|
||||||
|
if (!ruler.draggedEntity)
|
||||||
|
return false;
|
||||||
|
ruler.dragRulerAbortDrag();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleDisableSnap(event) {
|
||||||
|
disableSnap = !event.up;
|
||||||
|
|
||||||
|
const ruler = canvas.controls.ruler;
|
||||||
|
if (!ruler.isDragRuler)
|
||||||
|
return false;
|
||||||
|
if (ruler._state !== Ruler.STATES.MEASURING)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ruler.measure(getMeasurePosition(), {snap: !disableSnap});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMoveWithoutAnimation(event) {
|
||||||
|
moveWithoutAnimation = !event.up;
|
||||||
|
}
|
||||||
+22
-105
@@ -1,23 +1,24 @@
|
|||||||
"use strict"
|
"use strict"
|
||||||
|
|
||||||
import {currentSpeedProvider, getColorForDistanceAndToken, getMovedDistanceFromToken, getRangesFromSpeedProvider, initApi, registerModule, registerSystem} from "./api.js";
|
import {getColorForDistanceAndToken, getMovedDistanceFromToken, getRangesFromSpeedProvider, initApi, registerModule, registerSystem} from "./api.js";
|
||||||
import {checkDependencies, getHexSizeSupportTokenGridCenter, highlightMeasurementTerrainRuler} from "./compatibility.js";
|
import {checkDependencies, getHexSizeSupportTokenGridCenter, highlightMeasurementTerrainRuler} from "./compatibility.js";
|
||||||
import {moveEntities, onMouseMove} from "./foundry_imports.js"
|
import {moveEntities, onMouseMove} from "./foundry_imports.js"
|
||||||
|
import {disableSnap, registerKeybindings} from "./keybindings.js";
|
||||||
import {libWrapper} from "./libwrapper_shim.js";
|
import {libWrapper} from "./libwrapper_shim.js";
|
||||||
import {performMigrations} from "./migration.js"
|
import {performMigrations} from "./migration.js"
|
||||||
import {getMovementHistory, removeLastHistoryEntryIfAt, resetMovementHistory} from "./movement_tracking.js";
|
import {removeLastHistoryEntryIfAt, resetMovementHistory} from "./movement_tracking.js";
|
||||||
import {extendRuler} from "./ruler.js";
|
import {extendRuler} from "./ruler.js";
|
||||||
import {registerSettings, settingsKey} from "./settings.js"
|
import {registerSettings, RightClickAction, settingsKey} from "./settings.js"
|
||||||
import {recalculate} from "./socket.js";
|
import {recalculate} from "./socket.js";
|
||||||
import {SpeedProvider} from "./speed_provider.js"
|
import {SpeedProvider} from "./speed_provider.js"
|
||||||
import {isClose, setSnapParameterOnOptions} from "./util.js";
|
import {isClose, setSnapParameterOnOptions} from "./util.js";
|
||||||
|
|
||||||
Hooks.once("init", () => {
|
Hooks.once("init", () => {
|
||||||
registerSettings()
|
registerSettings()
|
||||||
|
registerKeybindings()
|
||||||
initApi()
|
initApi()
|
||||||
hookDragHandlers(Token);
|
hookDragHandlers(Token);
|
||||||
hookDragHandlers(MeasuredTemplate);
|
hookDragHandlers(MeasuredTemplate);
|
||||||
libWrapper.register("drag-ruler", "KeyboardManager.prototype._handleKeys", forwardIfUnahndled(handleKeys), "MIXED");
|
|
||||||
libWrapper.register("drag-ruler", "TokenLayer.prototype.undoHistory", tokenLayerUndoHistory, "WRAPPER");
|
libWrapper.register("drag-ruler", "TokenLayer.prototype.undoHistory", tokenLayerUndoHistory, "WRAPPER");
|
||||||
|
|
||||||
extendRuler();
|
extendRuler();
|
||||||
@@ -89,74 +90,6 @@ async function tokenLayerUndoHistory(wrapped) {
|
|||||||
return returnValue;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleKeys(event, key, up) {
|
|
||||||
if (event.repeat || this.hasFocus)
|
|
||||||
return false
|
|
||||||
|
|
||||||
const lowercaseKey = key.toLowerCase();
|
|
||||||
|
|
||||||
if (lowercaseKey === "x") return onKeyX(up)
|
|
||||||
if (lowercaseKey === "shift") return onKeyShift(up)
|
|
||||||
if (lowercaseKey === "space") return onKeySpace(up);
|
|
||||||
if (lowercaseKey === "escape") return onKeyEscape(up);
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
function onKeyX(up) {
|
|
||||||
if (up)
|
|
||||||
return false
|
|
||||||
const ruler = canvas.controls.ruler;
|
|
||||||
if (!ruler.isDragRuler)
|
|
||||||
return false
|
|
||||||
|
|
||||||
ruler.dragRulerDeleteWaypoint();
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
function onKeyShift(up) {
|
|
||||||
const ruler = canvas.controls.ruler
|
|
||||||
if (!ruler.isDragRuler)
|
|
||||||
return false
|
|
||||||
if (ruler._state !== Ruler.STATES.MEASURING)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const mousePosition = canvas.app.renderer.plugins.interaction.mouse.getLocalPosition(canvas.tokens)
|
|
||||||
const rulerOffset = ruler.rulerOffset
|
|
||||||
const measurePosition = {x: mousePosition.x + rulerOffset.x, y: mousePosition.y + rulerOffset.y}
|
|
||||||
ruler.measure(measurePosition, {snap: up})
|
|
||||||
}
|
|
||||||
|
|
||||||
function onKeySpace(up) {
|
|
||||||
const ruler = canvas.controls.ruler;
|
|
||||||
// Ruler can end up being undefined here if no canvas is active
|
|
||||||
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.dragRulerAbortDrag();
|
|
||||||
else
|
|
||||||
startDragRuler.call(ruler.draggedEntity, options);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function onKeyEscape(up) {
|
|
||||||
const ruler = canvas.controls.ruler;
|
|
||||||
if (!ruler.draggedEntity)
|
|
||||||
return false;
|
|
||||||
if (!up)
|
|
||||||
ruler.dragRulerAbortDrag();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function onEntityLeftDragStart(wrapped, event) {
|
function onEntityLeftDragStart(wrapped, event) {
|
||||||
wrapped(event);
|
wrapped(event);
|
||||||
const isToken = this instanceof Token;
|
const isToken = this instanceof Token;
|
||||||
@@ -171,31 +104,10 @@ function onEntityLeftDragStart(wrapped, event) {
|
|||||||
if (game.settings.get(settingsKey, "autoStartMeasurement")) {
|
if (game.settings.get(settingsKey, "autoStartMeasurement")) {
|
||||||
let options = {};
|
let options = {};
|
||||||
setSnapParameterOnOptions(ruler, options);
|
setSnapParameterOnOptions(ruler, options);
|
||||||
startDragRuler.call(this, options, false);
|
ruler.dragRulerStart(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;
|
|
||||||
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 onEntityLeftDragMoveSnap(wrapped, event) {
|
function onEntityLeftDragMoveSnap(wrapped, event) {
|
||||||
applyGridlessSnapping.call(this, event);
|
applyGridlessSnapping.call(this, event);
|
||||||
onEntityLeftDragMove.call(this, wrapped, event);
|
onEntityLeftDragMove.call(this, wrapped, event);
|
||||||
@@ -231,26 +143,31 @@ function onEntityDragLeftCancel(event) {
|
|||||||
if (!ruler.draggedEntity || ruler._state === Ruler.STATES.MOVING)
|
if (!ruler.draggedEntity || ruler._state === Ruler.STATES.MOVING)
|
||||||
return false
|
return false
|
||||||
|
|
||||||
const swapSpacebarRightClick = game.settings.get(settingsKey, "swapSpacebarRightClick");
|
const rightClickAction = game.settings.get(settingsKey, "rightClickAction");
|
||||||
let options = {};
|
let options = {};
|
||||||
setSnapParameterOnOptions(ruler, options);
|
setSnapParameterOnOptions(ruler, options);
|
||||||
|
|
||||||
if (ruler._state === Ruler.STATES.INACTIVE) {
|
if (ruler._state === Ruler.STATES.INACTIVE) {
|
||||||
if (!swapSpacebarRightClick)
|
if (rightClickAction !== RightClickAction.CREATE_WAYPOINT)
|
||||||
return false;
|
return false;
|
||||||
startDragRuler.call(this, options);
|
ruler.dragRulerStart(options);
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
else if (ruler._state === Ruler.STATES.MEASURING) {
|
else if (ruler._state === Ruler.STATES.MEASURING) {
|
||||||
if (!swapSpacebarRightClick) {
|
switch (rightClickAction) {
|
||||||
ruler.dragRulerDeleteWaypoint(event, options);
|
case RightClickAction.CREATE_WAYPOINT:
|
||||||
}
|
event.preventDefault();
|
||||||
else {
|
ruler.dragRulerAddWaypoint(ruler.destination, options);
|
||||||
event.preventDefault();
|
break;
|
||||||
ruler.dragRulerAddWaypoint(ruler.destination, options);
|
case RightClickAction.DELETE_WAYPOINT:
|
||||||
|
ruler.dragRulerDeleteWaypoint(event, options);
|
||||||
|
break;
|
||||||
|
case RightClickAction.ABORT_DRAG:
|
||||||
|
ruler.dragRulerAbortDrag();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyGridlessSnapping(event) {
|
function applyGridlessSnapping(event) {
|
||||||
@@ -259,7 +176,7 @@ function applyGridlessSnapping(event) {
|
|||||||
return;
|
return;
|
||||||
if (!ruler.isDragRuler)
|
if (!ruler.isDragRuler)
|
||||||
return;
|
return;
|
||||||
if (game.keyboard.isDown("Shift"))
|
if (disableSnap)
|
||||||
return;
|
return;
|
||||||
if (canvas.grid.type !== CONST.GRID_TYPES.GRIDLESS)
|
if (canvas.grid.type !== CONST.GRID_TYPES.GRIDLESS)
|
||||||
return;
|
return;
|
||||||
|
|||||||
+35
-6
@@ -1,14 +1,43 @@
|
|||||||
import {settingsKey} from "./settings.js"
|
import {RightClickAction, settingsKey} from "./settings.js"
|
||||||
|
|
||||||
const currentDataVersion = "1.3.0"
|
const currentDataVersion = "1.10.0"
|
||||||
|
|
||||||
export function performMigrations() {
|
export async function performMigrations() {
|
||||||
if (!game.user.isGM)
|
if (game.user.isGM)
|
||||||
return
|
await performWorldMigraionts()
|
||||||
|
await performClientMigrations()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function performWorldMigraionts() {
|
||||||
|
let dataVersion = game.settings.get(settingsKey, "dataVersion");
|
||||||
|
|
||||||
|
if (dataVersion === currentDataVersion)
|
||||||
|
return;
|
||||||
|
|
||||||
let dataVersion = game.settings.get(settingsKey, "dataVersion")
|
|
||||||
if (dataVersion === "fresh install") {
|
if (dataVersion === "fresh install") {
|
||||||
game.settings.set(settingsKey, "dataVersion", currentDataVersion)
|
game.settings.set(settingsKey, "dataVersion", currentDataVersion)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dataVersion === "1.3.0") {
|
||||||
|
dataVersion = "1.10.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
game.settings.set(settingsKey, "dataVersion", dataVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function performClientMigrations() {
|
||||||
|
let dataVersion = game.settings.get(settingsKey, "clientDataVersion");
|
||||||
|
|
||||||
|
if (dataVersion === "fresh install") {
|
||||||
|
// Start of migration from unnamed version (< 1.10.0). TODO Remove in a future version
|
||||||
|
const swapSpacebarRightClick = game.settings.storage.get("client").getItem(`${settingsKey}.swapSpacebarRightClick`);
|
||||||
|
if (swapSpacebarRightClick) {
|
||||||
|
game.settings.set(settingsKey, "rightClickAction", RightClickAction.CREATE_WAYPOINT);
|
||||||
|
await game.keybindings.set(settingsKey, "createWaypoint", []);
|
||||||
|
await game.keybindings.set(settingsKey, "deleteWaypoint", [{key: "Space"}]);
|
||||||
|
}
|
||||||
|
// End of migration from unnamed version
|
||||||
|
game.settings.set(settingsKey, "clientDataVersion", currentDataVersion)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-12
@@ -1,4 +1,5 @@
|
|||||||
import {getColorForDistanceAndToken, getRangesFromSpeedProvider} from "./api.js";
|
import {currentSpeedProvider, getColorForDistanceAndToken, getRangesFromSpeedProvider} from "./api.js";
|
||||||
|
import {getHexSizeSupportTokenGridCenter} from "./compatibility.js";
|
||||||
import {cancelScheduledMeasurement, measure} from "./foundry_imports.js"
|
import {cancelScheduledMeasurement, measure} from "./foundry_imports.js"
|
||||||
import {getMovementHistory} from "./movement_tracking.js";
|
import {getMovementHistory} from "./movement_tracking.js";
|
||||||
import {settingsKey} from "./settings.js";
|
import {settingsKey} from "./settings.js";
|
||||||
@@ -22,19 +23,9 @@ export function extendRuler() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async moveToken(event) {
|
async moveToken(event) {
|
||||||
// This function is invoked by left clicking
|
// Disable moveToken if Drag Ruler is active
|
||||||
if (!this.isDragRuler)
|
if (!this.isDragRuler)
|
||||||
return await super.moveToken(event);
|
return await super.moveToken(event);
|
||||||
|
|
||||||
let options = {};
|
|
||||||
setSnapParameterOnOptions(this, options);
|
|
||||||
|
|
||||||
if (!game.settings.get(settingsKey, "swapSpacebarRightClick")) {
|
|
||||||
this.dragRulerAddWaypoint(this.destination, options);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.dragRulerDeleteWaypoint(event, options);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toJSON() {
|
toJSON() {
|
||||||
@@ -172,6 +163,28 @@ export function extendRuler() {
|
|||||||
this.dragRulerRanges = getRangesFromSpeedProvider(this.draggedEntity);
|
this.dragRulerRanges = getRangesFromSpeedProvider(this.draggedEntity);
|
||||||
return getColorForDistanceAndToken(distance, this.draggedEntity, this.dragRulerRanges) ?? this.color;
|
return getColorForDistanceAndToken(distance, this.draggedEntity, this.dragRulerRanges) ?? this.color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dragRulerStart(options, measureImmediately=true) {
|
||||||
|
const entity = this.draggedEntity;
|
||||||
|
const isToken = entity instanceof Token;
|
||||||
|
if (isToken && !currentSpeedProvider.usesRuler(entity))
|
||||||
|
return;
|
||||||
|
const ruler = canvas.controls.ruler;
|
||||||
|
ruler.clear();
|
||||||
|
ruler._state = Ruler.STATES.STARTING;
|
||||||
|
let entityCenter;
|
||||||
|
if (isToken && canvas.grid.isHex && game.modules.get("hex-size-support")?.active && CONFIG.hexSizeSupport.getAltSnappingFlag(entity))
|
||||||
|
entityCenter = getHexSizeSupportTokenGridCenter(entity);
|
||||||
|
else
|
||||||
|
entityCenter = entity.center;
|
||||||
|
if (isToken && game.settings.get(settingsKey, "enableMovementHistory"))
|
||||||
|
ruler.dragRulerAddWaypointHistory(getMovementHistory(entity));
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ruler = DragRulerRuler;
|
Ruler = DragRulerRuler;
|
||||||
|
|||||||
+26
-9
@@ -3,6 +3,12 @@ import {SpeedProvider} from "./speed_provider.js"
|
|||||||
|
|
||||||
export const settingsKey = "drag-ruler";
|
export const settingsKey = "drag-ruler";
|
||||||
|
|
||||||
|
export const RightClickAction = Object.freeze({
|
||||||
|
CREATE_WAYPOINT: 0,
|
||||||
|
DELETE_WAYPOINT: 1,
|
||||||
|
ABORT_DRAG:2,
|
||||||
|
});
|
||||||
|
|
||||||
export function registerSettings() {
|
export function registerSettings() {
|
||||||
game.settings.register(settingsKey, "dataVersion", {
|
game.settings.register(settingsKey, "dataVersion", {
|
||||||
scope: "world",
|
scope: "world",
|
||||||
@@ -11,6 +17,26 @@ export function registerSettings() {
|
|||||||
default: "fresh install"
|
default: "fresh install"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
game.settings.register(settingsKey, "clientDataVersion", {
|
||||||
|
scope: "client",
|
||||||
|
config: false,
|
||||||
|
type: String,
|
||||||
|
default: "fresh install"
|
||||||
|
});
|
||||||
|
|
||||||
|
game.settings.register(settingsKey, "rightClickAction", {
|
||||||
|
name: "drag-ruler.settings.rightClickAction.name",
|
||||||
|
hint: "drag-ruler.settings.rightClickAction.hint",
|
||||||
|
config: true,
|
||||||
|
type: Number,
|
||||||
|
default: RightClickAction.DELETE_WAYPOINT,
|
||||||
|
choices: {
|
||||||
|
0: "drag-ruler.settings.rightClickAction.choices.create",
|
||||||
|
1: "drag-ruler.settings.rightClickAction.choices.delete",
|
||||||
|
2: "drag-ruler.settings.rightClickAction.choices.cancel",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
game.settings.register(settingsKey, "autoStartMeasurement", {
|
game.settings.register(settingsKey, "autoStartMeasurement", {
|
||||||
name: "drag-ruler.settings.autoStartMeasurement.name",
|
name: "drag-ruler.settings.autoStartMeasurement.name",
|
||||||
hint: "drag-ruler.settings.autoStartMeasurement.hint",
|
hint: "drag-ruler.settings.autoStartMeasurement.hint",
|
||||||
@@ -20,15 +46,6 @@ export function registerSettings() {
|
|||||||
default: true,
|
default: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
game.settings.register(settingsKey, "swapSpacebarRightClick", {
|
|
||||||
name: "drag-ruler.settings.swapSpacebarRightClick.name",
|
|
||||||
hint: "drag-ruler.settings.swapSpacebarRightClick.hint",
|
|
||||||
scope: "client",
|
|
||||||
config: true,
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
})
|
|
||||||
|
|
||||||
game.settings.register(settingsKey, "useGridlessRaster", {
|
game.settings.register(settingsKey, "useGridlessRaster", {
|
||||||
name: "drag-ruler.settings.useGridlessRaster.name",
|
name: "drag-ruler.settings.useGridlessRaster.name",
|
||||||
hint: "drag-ruler.settings.useGridlessRaster.hint",
|
hint: "drag-ruler.settings.useGridlessRaster.hint",
|
||||||
|
|||||||
+9
-1
@@ -1,4 +1,5 @@
|
|||||||
import {getPixelsFromGridPosition} from "./foundry_fixes.js"
|
import {getPixelsFromGridPosition} from "./foundry_fixes.js"
|
||||||
|
import { disableSnap } from "./keybindings.js";
|
||||||
|
|
||||||
export function* zip(it1, it2) {
|
export function* zip(it1, it2) {
|
||||||
for (let i = 0;i < Math.min(it1.length, it2.length);i++) {
|
for (let i = 0;i < Math.min(it1.length, it2.length);i++) {
|
||||||
@@ -235,10 +236,17 @@ export function setSnapParameterOnOptions(sourceObject, options) {
|
|||||||
sourceObject.snapOverride = undefined; // remove it to prevent any lingering data issues
|
sourceObject.snapOverride = undefined; // remove it to prevent any lingering data issues
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
options.snap = !game.keyboard._downKeys.has("Shift");
|
options.snap = !disableSnap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isClose(a, b, delta) {
|
export function isClose(a, b, delta) {
|
||||||
return Math.abs(a - b) <= delta;
|
return Math.abs(a - b) <= delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getMeasurePosition() {
|
||||||
|
const mousePosition = canvas.app.renderer.plugins.interaction.mouse.getLocalPosition(canvas.tokens);
|
||||||
|
const rulerOffset = canvas.controls.ruler.rulerOffset;
|
||||||
|
const measurePosition = {x: mousePosition.x + rulerOffset.x, y: mousePosition.y + rulerOffset.y};
|
||||||
|
return measurePosition;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user