When Ctrl+Z undoes a movement, remove that movement form the movement history as well (resolves #64)
This commit is contained in:
+19
-2
@@ -5,11 +5,11 @@ import {checkDependencies, getHexSizeSupportTokenGridCenter} from "./compatibili
|
|||||||
import {moveEntities, onMouseMove} from "./foundry_imports.js"
|
import {moveEntities, onMouseMove} from "./foundry_imports.js"
|
||||||
import {performMigrations} from "./migration.js"
|
import {performMigrations} from "./migration.js"
|
||||||
import {DragRulerRuler} from "./ruler.js";
|
import {DragRulerRuler} from "./ruler.js";
|
||||||
import {getMovementHistory, resetMovementHistory} from "./movement_tracking.js";
|
import {getMovementHistory, removeLastHistoryEntryIfAt, resetMovementHistory} from "./movement_tracking.js";
|
||||||
import {registerSettings, settingsKey} from "./settings.js"
|
import {registerSettings, 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 {setSnapParameterOnOptions} from "./util.js";
|
import {isClose, setSnapParameterOnOptions} from "./util.js";
|
||||||
|
|
||||||
Hooks.once("init", () => {
|
Hooks.once("init", () => {
|
||||||
registerSettings()
|
registerSettings()
|
||||||
@@ -17,6 +17,7 @@ Hooks.once("init", () => {
|
|||||||
hookDragHandlers(Token);
|
hookDragHandlers(Token);
|
||||||
hookDragHandlers(MeasuredTemplate);
|
hookDragHandlers(MeasuredTemplate);
|
||||||
hookKeyboardManagerFunctions()
|
hookKeyboardManagerFunctions()
|
||||||
|
hookLayerFunctions();
|
||||||
|
|
||||||
Ruler = DragRulerRuler;
|
Ruler = DragRulerRuler;
|
||||||
|
|
||||||
@@ -93,6 +94,22 @@ function hookKeyboardManagerFunctions() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function hookLayerFunctions() {
|
||||||
|
const originalTokenLayerUndoHistory = TokenLayer.prototype.undoHistory;
|
||||||
|
TokenLayer.prototype.undoHistory = function () {
|
||||||
|
const historyEntry = this.history[this.history.length - 1];
|
||||||
|
return originalTokenLayerUndoHistory.call(this).then((returnValue) => {
|
||||||
|
if (historyEntry.type === "update") {
|
||||||
|
for (const entry of historyEntry.data) {
|
||||||
|
const token = canvas.tokens.get(entry._id);
|
||||||
|
removeLastHistoryEntryIfAt(token, entry.x, entry.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnValue;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function handleKeys(event, key, up) {
|
function handleKeys(event, key, up) {
|
||||||
if (event.repeat || this.hasFocus)
|
if (event.repeat || this.hasFocus)
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {measureDistances} from "./compatibility.js";
|
import {measureDistances} from "./compatibility.js";
|
||||||
import {recalculate, updateCombatantDragRulerFlags} from "./socket.js";
|
import {recalculate, updateCombatantDragRulerFlags} from "./socket.js";
|
||||||
import {getTokenShape, zip} from "./util.js";
|
import {getTokenShape, isClose, zip} from "./util.js";
|
||||||
|
|
||||||
function initTrackingFlag(combatant) {
|
function initTrackingFlag(combatant) {
|
||||||
const initialFlag = {passedWaypoints: [], trackedRound: 0};
|
const initialFlag = {passedWaypoints: [], trackedRound: 0};
|
||||||
@@ -81,6 +81,20 @@ export function getMovementHistory(token) {
|
|||||||
return dragRulerFlags.passedWaypoints ?? [];
|
return dragRulerFlags.passedWaypoints ?? [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function removeLastHistoryEntryIfAt(token, x, y) {
|
||||||
|
const history = getMovementHistory(token);
|
||||||
|
if (history.length === 0)
|
||||||
|
return;
|
||||||
|
const entry = history[history.length - 1];
|
||||||
|
if (!isClose(x + token.w / 2, entry.x, 0.1) || !isClose(y + token.h / 2, entry.y, 0.1)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
history.pop();
|
||||||
|
const combat = game.combat;
|
||||||
|
const combatant = combat.getCombatantByToken(token.id);
|
||||||
|
await updateCombatantDragRulerFlags(combat, [{_id: combatant.id, dragRulerFlags: combatant.data.flags.dragRuler}]);
|
||||||
|
}
|
||||||
|
|
||||||
export async function resetMovementHistory(combat, combatantId) {
|
export async function resetMovementHistory(combat, combatantId) {
|
||||||
const combatant = combat.combatants.get(combatantId);
|
const combatant = combat.combatants.get(combatantId);
|
||||||
const dragRulerFlags = combatant.data.flags.dragRuler;
|
const dragRulerFlags = combatant.data.flags.dragRuler;
|
||||||
|
|||||||
@@ -210,3 +210,7 @@ export function setSnapParameterOnOptions(sourceObject, options) {
|
|||||||
options.snap = !game.keyboard._downKeys.has("Shift");
|
options.snap = !game.keyboard._downKeys.has("Shift");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isClose(a, b, delta) {
|
||||||
|
return Math.abs(a - b) <= delta;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user