Add zoom on mousewheel

This commit is contained in:
1ilit 2023-09-19 15:49:32 +03:00
parent 6eaad6e720
commit cfa60763a0

View File

@ -1,4 +1,4 @@
import React, { useContext, useRef, useState } from "react"; import React, { useContext, useRef, useState, useEffect } from "react";
import { useDrop } from "react-dnd"; import { useDrop } from "react-dnd";
import Table from "./table"; import Table from "./table";
import { import {
@ -51,6 +51,7 @@ export default function Canvas(props) {
mouseY: 0, mouseY: 0,
}); });
const [cursor, setCursor] = useState("default"); const [cursor, setCursor] = useState("default");
const [zoom, setZoom] = useState(1);
const canvas = useRef(null); const canvas = useRef(null);
@ -347,6 +348,26 @@ export default function Canvas(props) {
[tables, areas] [tables, areas]
); );
const handleMouseWheel = (e) => {
// const zoomDirection = e.deltaY > 0 ? "out" : "in";
e.preventDefault();
if (e.deltaY <= 0 ) {
setZoom((prev) => prev * 1.1);
} else {
setZoom((prev) => prev / 1.1);
}
};
useEffect(() => {
const canvasElement = canvas.current;
canvasElement.addEventListener("wheel", handleMouseWheel, {
passive: false,
});
return () => {
canvasElement.removeEventListener("wheel", handleMouseWheel);
};
}, []);
return ( return (
<div ref={drop} className="flex-grow h-full" id="canvas"> <div ref={drop} className="flex-grow h-full" id="canvas">
<div ref={canvas} className="w-full h-full"> <div ref={canvas} className="w-full h-full">
@ -385,47 +406,53 @@ export default function Canvas(props) {
height="100%" height="100%"
fill="url(#pattern-circles)" fill="url(#pattern-circles)"
></rect> ></rect>
{areas.map((a) => ( <g style={{ transform: `scale(${zoom})`, transformOrigin: "0 0" }}>
<Area {areas.map((a) => (
key={a.id} <Area
areaData={a} key={a.id}
onMouseDown={(e) => handleMouseDownRect(e, a.id, ObjectType.AREA)} areaData={a}
setResize={setAreaResize} onMouseDown={(e) =>
initCoords={initCoords} handleMouseDownRect(e, a.id, ObjectType.AREA)
setInitCoords={setInitCoords} }
></Area> setResize={setAreaResize}
))} initCoords={initCoords}
{tables.map((table) => ( setInitCoords={setInitCoords}
<Table ></Area>
key={table.id} ))}
tableData={table} {tables.map((table) => (
setOnRect={setOnRect} <Table
handleGripField={handleGripField} key={table.id}
setLine={setLine} tableData={table}
onMouseDown={(e) => setOnRect={setOnRect}
handleMouseDownRect(e, table.id, ObjectType.TABLE) handleGripField={handleGripField}
} setLine={setLine}
selectedTable={props.selectedTable} onMouseDown={(e) =>
setSelectedTable={props.setSelectedTable} handleMouseDownRect(e, table.id, ObjectType.TABLE)
/> }
))} selectedTable={props.selectedTable}
{linking && ( setSelectedTable={props.setSelectedTable}
<path />
d={`M ${line.startX} ${line.startY} L ${line.endX} ${line.endY}`} ))}
stroke="red" {linking && (
strokeDasharray="8,8" <path
/> d={`M ${line.startX} ${line.startY} L ${line.endX} ${line.endY}`}
)} stroke="red"
{relationships.map((e, i) => ( strokeDasharray="8,8"
<Relationship key={i} data={e} /> />
))} )}
{notes.map((n) => ( {relationships.map((e, i) => (
<Note <Relationship key={i} data={e} />
key={n.id} ))}
data={n} {notes.map((n) => (
onMouseDown={(e) => handleMouseDownRect(e, n.id, ObjectType.NOTE)} <Note
></Note> key={n.id}
))} data={n}
onMouseDown={(e) =>
handleMouseDownRect(e, n.id, ObjectType.NOTE)
}
></Note>
))}
</g>
</svg> </svg>
</div> </div>
</div> </div>