Prechádzať zdrojové kódy

Use meta key + wheel to zoom in/out (#769)

Timur Khazamov 5 rokov pred
rodič
commit
eee961d65f
4 zmenil súbory, kde vykonal 20 pridanie a 11 odobranie
  1. 1 6
      src/actions/actionCanvas.tsx
  2. 12 4
      src/index.tsx
  3. 1 1
      src/scene/index.ts
  4. 6 0
      src/scene/zoom.ts

+ 1 - 6
src/actions/actionCanvas.tsx

@@ -5,6 +5,7 @@ import { getDefaultAppState } from "../appState";
 import { trash, zoomIn, zoomOut } from "../components/icons";
 import { ToolButton } from "../components/ToolButton";
 import { t } from "../i18n";
+import { getNormalizedZoom } from "../scene";
 
 export const actionChangeViewBackgroundColor: Action = {
   name: "changeViewBackgroundColor",
@@ -56,12 +57,6 @@ export const actionClearCanvas: Action = {
 
 const ZOOM_STEP = 0.1;
 
-function getNormalizedZoom(zoom: number): number {
-  const normalizedZoom = parseFloat(zoom.toFixed(2));
-  const clampedZoom = Math.max(0.1, Math.min(normalizedZoom, 2));
-  return clampedZoom;
-}
-
 export const actionZoomIn: Action = {
   name: "zoomIn",
   perform: (elements, appState) => {

+ 12 - 4
src/index.tsx

@@ -35,6 +35,7 @@ import {
   calculateScrollCenter,
   loadFromBlob,
   getZoomOrigin,
+  getNormalizedZoom,
 } from "./scene";
 
 import { renderScene } from "./renderer";
@@ -1983,10 +1984,17 @@ export class App extends React.Component<any, AppState> {
     e.preventDefault();
     const { deltaX, deltaY } = e;
 
-    this.setState({
-      scrollX: this.state.scrollX - deltaX / this.state.zoom,
-      scrollY: this.state.scrollY - deltaY / this.state.zoom,
-    });
+    if (e[KEYS.META]) {
+      this.setState(({ zoom }) => ({
+        zoom: getNormalizedZoom(zoom - deltaY / 100),
+      }));
+      return;
+    }
+
+    this.setState(({ zoom, scrollX, scrollY }) => ({
+      scrollX: scrollX - deltaX / zoom,
+      scrollY: scrollY - deltaY / zoom,
+    }));
   };
 
   private addElementsFromPaste = (

+ 1 - 1
src/scene/index.ts

@@ -27,4 +27,4 @@ export {
   hasText,
 } from "./comparisons";
 export { createScene } from "./createScene";
-export { getZoomOrigin, getZoomTranslation } from "./zoom";
+export { getZoomOrigin, getZoomTranslation, getNormalizedZoom } from "./zoom";

+ 6 - 0
src/scene/zoom.ts

@@ -28,3 +28,9 @@ export function getZoomTranslation(canvas: HTMLCanvasElement, zoom: number) {
     y: parseFloat(diffMiddleOfTheCanvas.y.toFixed(8)),
   };
 }
+
+export function getNormalizedZoom(zoom: number): number {
+  const normalizedZoom = parseFloat(zoom.toFixed(2));
+  const clampedZoom = Math.max(0.1, Math.min(normalizedZoom, 2));
+  return clampedZoom;
+}