mirror of
https://github.com/motion-canvas/motion-canvas.git
synced 2026-01-12 07:18:01 -05:00
feat: follow utility
This commit is contained in:
40
src/utils/follow.ts
Normal file
40
src/utils/follow.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import {Node} from 'konva/lib/Node';
|
||||
import {Center, flipOrigin, Origin} from '../types';
|
||||
import {getOriginDelta, isLayoutNode} from '../components/ILayoutNode';
|
||||
|
||||
export interface FollowSubscription {
|
||||
dispose(): void;
|
||||
target(newTarget: Node): void;
|
||||
}
|
||||
|
||||
export function follow(
|
||||
source: Node,
|
||||
target: Node,
|
||||
direction?: Origin,
|
||||
): FollowSubscription {
|
||||
direction ??= isLayoutNode(source)
|
||||
? flipOrigin(source.getOrigin(), Center.Vertical)
|
||||
: Origin.TopLeft;
|
||||
|
||||
const update = () => {
|
||||
const rect = target.getClientRect({relativeTo: target.getLayer()});
|
||||
const offset = getOriginDelta(rect, Origin.TopLeft, direction);
|
||||
source.position({
|
||||
x: rect.x + offset.x,
|
||||
y: rect.y + offset.y,
|
||||
});
|
||||
};
|
||||
|
||||
target.on('absoluteTransformChange', update);
|
||||
update();
|
||||
|
||||
return {
|
||||
dispose: () => target.off('absoluteTransformChange', update),
|
||||
target: (newTarget: Node) => {
|
||||
target.off('absoluteTransformChange', update);
|
||||
target = newTarget;
|
||||
target.on('absoluteTransformChange', update);
|
||||
update();
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1 +1,2 @@
|
||||
export * from './pop';
|
||||
export * from './pop';
|
||||
export * from './follow';
|
||||
Reference in New Issue
Block a user