refactor(review): extract shared anchor math into reviewAnchors.ts
This commit is contained in:
@@ -2,8 +2,8 @@ import { Container, Graphics, Text, TextStyle } from 'pixi.js';
|
|||||||
import type { Viewport } from 'pixi-viewport';
|
import type { Viewport } from 'pixi-viewport';
|
||||||
import type { AnnotationStore } from '../stores/annotationStore';
|
import type { AnnotationStore } from '../stores/annotationStore';
|
||||||
import type { SceneManager } from './SceneManager';
|
import type { SceneManager } from './SceneManager';
|
||||||
import { getItemWorldBounds } from './SceneManager';
|
|
||||||
import { getAuthorColorHex, getAuthorInitial } from '../utils/authorColors';
|
import { getAuthorColorHex, getAuthorInitial } from '../utils/authorColors';
|
||||||
|
import { getThreadAnchorWorld, getPointAnchorWorld } from './reviewAnchors';
|
||||||
|
|
||||||
const PIN_RADIUS = 11;
|
const PIN_RADIUS = 11;
|
||||||
const PIN_COLOR_RESOLVED = 0x555555;
|
const PIN_COLOR_RESOLVED = 0x555555;
|
||||||
@@ -76,13 +76,7 @@ export class PinOverlay extends Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _getAnchorWorld(thread: { object_id: string; anchor_type: string; pin_x: number | null; pin_y: number | null }): { x: number; y: number } | null {
|
private _getAnchorWorld(thread: { object_id: string; anchor_type: string; pin_x: number | null; pin_y: number | null }): { x: number; y: number } | null {
|
||||||
const item = this._scene.items.get(thread.object_id);
|
return getThreadAnchorWorld(this._scene, thread);
|
||||||
if (!item) return null;
|
|
||||||
const b = getItemWorldBounds(item);
|
|
||||||
if (thread.anchor_type === 'point' && thread.pin_x != null && thread.pin_y != null) {
|
|
||||||
return { x: b.x + thread.pin_x * b.w, y: b.y + thread.pin_y * b.h };
|
|
||||||
}
|
|
||||||
return { x: b.x + b.w * 0.9, y: b.y };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -257,12 +251,10 @@ export class PinOverlay extends Container {
|
|||||||
|
|
||||||
if (!this._ghostPin) return;
|
if (!this._ghostPin) return;
|
||||||
|
|
||||||
const item = this._scene.items.get(this._ghostPin.objectId);
|
const pos = getPointAnchorWorld(this._scene, this._ghostPin.objectId, this._ghostPin.pinX, this._ghostPin.pinY);
|
||||||
if (!item) return;
|
if (!pos) return;
|
||||||
|
const wx = pos.x;
|
||||||
const b = getItemWorldBounds(item);
|
const wy = pos.y;
|
||||||
const wx = b.x + this._ghostPin.pinX * b.w;
|
|
||||||
const wy = b.y + this._ghostPin.pinY * b.h;
|
|
||||||
const scale = 1 / this._viewport.scale.x;
|
const scale = 1 / this._viewport.scale.x;
|
||||||
const r = PIN_RADIUS * scale;
|
const r = PIN_RADIUS * scale;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import type { SceneManager } from './SceneManager';
|
||||||
|
import { getItemWorldBounds } from './SceneManager';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the world-space position for a point-pinned anchor.
|
||||||
|
* Returns null if the target object no longer exists in the scene.
|
||||||
|
*/
|
||||||
|
export function getPointAnchorWorld(
|
||||||
|
scene: SceneManager,
|
||||||
|
objectId: string,
|
||||||
|
pinX: number,
|
||||||
|
pinY: number,
|
||||||
|
): { x: number; y: number } | null {
|
||||||
|
const item = scene.items.get(objectId);
|
||||||
|
if (!item) return null;
|
||||||
|
const b = getItemWorldBounds(item);
|
||||||
|
return { x: b.x + pinX * b.w, y: b.y + pinY * b.h };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the world-space position for an object-level anchor.
|
||||||
|
* Default position: top-right corner (90% x, 0% y).
|
||||||
|
*/
|
||||||
|
export function getObjectAnchorWorld(
|
||||||
|
scene: SceneManager,
|
||||||
|
objectId: string,
|
||||||
|
): { x: number; y: number } | null {
|
||||||
|
const item = scene.items.get(objectId);
|
||||||
|
if (!item) return null;
|
||||||
|
const b = getItemWorldBounds(item);
|
||||||
|
return { x: b.x + b.w * 0.9, y: b.y };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute anchor world position for a thread (point or object anchor).
|
||||||
|
* This is the unified entry point — replaces PinOverlay._getAnchorWorld().
|
||||||
|
*/
|
||||||
|
export function getThreadAnchorWorld(
|
||||||
|
scene: SceneManager,
|
||||||
|
thread: { object_id: string; anchor_type: string; pin_x: number | null; pin_y: number | null },
|
||||||
|
): { x: number; y: number } | null {
|
||||||
|
if (thread.anchor_type === 'point' && thread.pin_x != null && thread.pin_y != null) {
|
||||||
|
return getPointAnchorWorld(scene, thread.object_id, thread.pin_x, thread.pin_y);
|
||||||
|
}
|
||||||
|
return getObjectAnchorWorld(scene, thread.object_id);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user