If a measurement is being skipped because of the ruler's rate limiting, schedule the measurement for later to ensure the ruler sticks to the token
This commit is contained in:
@@ -1,3 +1,8 @@
|
|||||||
|
## In development
|
||||||
|
### Bugfixes
|
||||||
|
- Fixed a bug that could cause the ruler to not end up at the token's center (especially if the token is being moved very quickly and then stopped abruptly)
|
||||||
|
|
||||||
|
|
||||||
## 1.7.1
|
## 1.7.1
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
- Fixed a bug that prevented players from moving their tokens ([#74](https://github.com/manuelVo/foundryvtt-drag-ruler/issues/74))
|
- Fixed a bug that prevented players from moving their tokens ([#74](https://github.com/manuelVo/foundryvtt-drag-ruler/issues/74))
|
||||||
|
|||||||
+21
-3
@@ -16,6 +16,9 @@ export async function moveEntities(draggedEntity, selectedEntities) {
|
|||||||
if (!this.visible || !this.destination) return false;
|
if (!this.visible || !this.destination) return false;
|
||||||
if (!draggedEntity) return;
|
if (!draggedEntity) return;
|
||||||
|
|
||||||
|
// Wait until all scheduled measurements are done
|
||||||
|
await this.deferredMeasurementPromise;
|
||||||
|
|
||||||
// Get the movement rays and check collision along each Ray
|
// Get the movement rays and check collision along each Ray
|
||||||
// These rays are center-to-center for the purposes of collision checking
|
// These rays are center-to-center for the purposes of collision checking
|
||||||
const rays = this.constructor.dragRulerGetRaysFromWaypoints(this.waypoints, this.destination);
|
const rays = this.constructor.dragRulerGetRaysFromWaypoints(this.waypoints, this.destination);
|
||||||
@@ -103,8 +106,6 @@ export function onMouseMove(event) {
|
|||||||
if (this._state === Ruler.STATES.MOVING) return;
|
if (this._state === Ruler.STATES.MOVING) return;
|
||||||
|
|
||||||
// Extract event data
|
// Extract event data
|
||||||
const mt = event._measureTime || 0;
|
|
||||||
const originalEvent = event.data.originalEvent;
|
|
||||||
const destination = {x: event.data.destination.x + this.rulerOffset.x, y: event.data.destination.y + this.rulerOffset.y}
|
const destination = {x: event.data.destination.x + this.rulerOffset.x, y: event.data.destination.y + this.rulerOffset.y}
|
||||||
|
|
||||||
// Hide any existing Token HUD
|
// Hide any existing Token HUD
|
||||||
@@ -112,10 +113,27 @@ export function onMouseMove(event) {
|
|||||||
delete event.data.hudState;
|
delete event.data.hudState;
|
||||||
|
|
||||||
// Draw measurement updates
|
// Draw measurement updates
|
||||||
if (Date.now() - mt > 50) {
|
scheduleMeasurement.call(this, destination, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
function scheduleMeasurement(destination, event) {
|
||||||
|
const measurementInterval = 50;
|
||||||
|
const mt = event._measureTime || 0;
|
||||||
|
const originalEvent = event.data.originalEvent;
|
||||||
|
if (Date.now() - mt > measurementInterval) {
|
||||||
this.measure(destination, {snap: !originalEvent.shiftKey});
|
this.measure(destination, {snap: !originalEvent.shiftKey});
|
||||||
event._measureTime = Date.now();
|
event._measureTime = Date.now();
|
||||||
this._state = Ruler.STATES.MEASURING;
|
this._state = Ruler.STATES.MEASURING;
|
||||||
|
window.clearTimeout(this.deferredMeasurementTimeout);
|
||||||
|
this.deferredMeasurementTimeout = undefined;
|
||||||
|
this.deferredMeasurementResolve?.();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.deferredMeasurementData = {destination, event};
|
||||||
|
if (!this.deferredMeasurementTimeout) {
|
||||||
|
this.deferredMeasurementPromise = new Promise((resolve, reject) => this.deferredMeasurementResolve = resolve);
|
||||||
|
this.deferredMeasurementTimeout = window.setTimeout(() => scheduleMeasurement.call(this, this.deferredMeasurementData.destination, this.deferredMeasurementData.event), measurementInterval);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -154,7 +154,6 @@ function onEntityDragLeftDrop(event) {
|
|||||||
const ruler = canvas.controls.ruler
|
const ruler = canvas.controls.ruler
|
||||||
if (!ruler.isDragRuler)
|
if (!ruler.isDragRuler)
|
||||||
return false
|
return false
|
||||||
onMouseMove.call(ruler, event);
|
|
||||||
// When we're dragging a measured template no token will ever be selected,
|
// 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
|
// resulting in only the dragged template to be moved as would be expected
|
||||||
const selectedTokens = canvas.tokens.controlled
|
const selectedTokens = canvas.tokens.controlled
|
||||||
|
|||||||
Reference in New Issue
Block a user