Skip to content

Commit

Permalink
Fix wysiwyg center (excalidraw#1101)
Browse files Browse the repository at this point in the history
This wasn't taking into account zoom properly.

The logic should probably get refactored a bit, it's not ideal that we're passing canvas, state and scale as different arguments. Also it's weird that the function that returns the center is computing the viewport translation. But I'm not motivated enough to fix it right now...

Fixes excalidraw#1100
  • Loading branch information
vjeux authored Mar 28, 2020
1 parent aa54364 commit 6056170
Showing 1 changed file with 28 additions and 10 deletions.
38 changes: 28 additions & 10 deletions src/components/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import React from "react";
import socketIOClient from "socket.io-client";
import rough from "roughjs/bin/rough";
import { RoughCanvas } from "roughjs/bin/canvas";
import { FlooredNumber } from "../types";

import {
newElement,
Expand Down Expand Up @@ -1128,6 +1129,9 @@ export class App extends React.Component<any, AppState> {
const snappedToCenterPosition = this.getTextWysiwygSnappedToCenterPosition(
x,
y,
this.state,
this.canvas,
window.devicePixelRatio,
);

if (snappedToCenterPosition) {
Expand Down Expand Up @@ -1615,7 +1619,13 @@ export class App extends React.Component<any, AppState> {

const snappedToCenterPosition = event.altKey
? null
: this.getTextWysiwygSnappedToCenterPosition(x, y);
: this.getTextWysiwygSnappedToCenterPosition(
x,
y,
this.state,
this.canvas,
window.devicePixelRatio,
);

const element = newTextElement({
x: snappedToCenterPosition?.elementCenterX ?? x,
Expand Down Expand Up @@ -2491,7 +2501,17 @@ export class App extends React.Component<any, AppState> {
}));
});

private getTextWysiwygSnappedToCenterPosition(x: number, y: number) {
private getTextWysiwygSnappedToCenterPosition(
x: number,
y: number,
state: {
scrollX: FlooredNumber;
scrollY: FlooredNumber;
zoom: number;
},
canvas: HTMLCanvasElement | null,
scale: number,
) {
const elementClickedInside = getElementContainingPosition(
globalSceneState.getAllElements(),
x,
Expand All @@ -2509,14 +2529,12 @@ export class App extends React.Component<any, AppState> {
const isSnappedToCenter =
distanceToCenter < TEXT_TO_CENTER_SNAP_THRESHOLD;
if (isSnappedToCenter) {
const wysiwygX =
this.state.scrollX +
elementClickedInside.x +
elementClickedInside.width / 2;
const wysiwygY =
this.state.scrollY +
elementClickedInside.y +
elementClickedInside.height / 2;
const { x: wysiwygX, y: wysiwygY } = sceneCoordsToViewportCoords(
{ sceneX: elementCenterX, sceneY: elementCenterY },
state,
canvas,
scale,
);
return { wysiwygX, wysiwygY, elementCenterX, elementCenterY };
}
}
Expand Down

0 comments on commit 6056170

Please sign in to comment.