Fix fly-to vertical centering at non-1 zoom levels
Clicking ×N sometimes flew to a blank area far below the tree. Cause: family-chart's cardToMiddle scales datum.x by the zoom factor k but not datum.y (`y = height/2 - datum.y`, missing the ·k), so vertical centering is only correct at k=1 and drifts by datum.y·(k−1) at any other zoom — worse the deeper the person sits. That's why it worked only when the view happened to be near 1:1. Compensate by pre-multiplying the y we pass to cardToMiddle by the current scale, cancelling the library's missing ·k. x was already correct. Signed-off-by: Justin Paul <justin@jpaul.me>
This commit is contained in:
@@ -315,8 +315,12 @@ export default function TreePage() {
|
|||||||
try {
|
try {
|
||||||
const rect = svg.getBoundingClientRect();
|
const rect = svg.getBoundingClientRect();
|
||||||
const scale = handlers.getCurrentZoom ? handlers.getCurrentZoom(svg).k : 1;
|
const scale = handlers.getCurrentZoom ? handlers.getCurrentZoom(svg).k : 1;
|
||||||
|
// family-chart's cardToMiddle scales datum.x by the zoom but NOT
|
||||||
|
// datum.y (a library bug), so vertical centering is only correct at
|
||||||
|
// scale 1 and drifts by datum.y·(k−1) otherwise — landing "below the
|
||||||
|
// tree". Pre-multiply y by the scale to cancel the missing ·k.
|
||||||
handlers.cardToMiddle({
|
handlers.cardToMiddle({
|
||||||
datum: xy,
|
datum: { x: xy.x, y: xy.y * scale },
|
||||||
svg,
|
svg,
|
||||||
svg_dim: { width: rect.width, height: rect.height },
|
svg_dim: { width: rect.width, height: rect.height },
|
||||||
scale,
|
scale,
|
||||||
|
|||||||
Reference in New Issue
Block a user