janky fit window
This commit is contained in:
parent
2d36c04a49
commit
d571a09b39
@ -15,7 +15,7 @@ import Note from "./note";
|
|||||||
export default function Canvas(props) {
|
export default function Canvas(props) {
|
||||||
const { tables, updateTable, relationships, addRelationship } =
|
const { tables, updateTable, relationships, addRelationship } =
|
||||||
useContext(TableContext);
|
useContext(TableContext);
|
||||||
const { areas, setAreas, updateArea } = useContext(AreaContext);
|
const { areas, updateArea } = useContext(AreaContext);
|
||||||
const { notes, updateNote } = useContext(NoteContext);
|
const { notes, updateNote } = useContext(NoteContext);
|
||||||
const { settings, setSettings } = useContext(SettingsContext);
|
const { settings, setSettings } = useContext(SettingsContext);
|
||||||
const { setUndoStack, setRedoStack } = useContext(UndoRedoContext);
|
const { setUndoStack, setRedoStack } = useContext(UndoRedoContext);
|
||||||
@ -118,8 +118,8 @@ export default function Canvas(props) {
|
|||||||
dragging.element === ObjectType.NONE &&
|
dragging.element === ObjectType.NONE &&
|
||||||
areaResize.id === -1
|
areaResize.id === -1
|
||||||
) {
|
) {
|
||||||
const dx = (e.clientX - panOffset.x) / settings.zoom;
|
const dx = e.clientX - panOffset.x;
|
||||||
const dy = (e.clientY - panOffset.y) / settings.zoom;
|
const dy = e.clientY - panOffset.y;
|
||||||
setSettings((prev) => ({
|
setSettings((prev) => ({
|
||||||
...prev,
|
...prev,
|
||||||
pan: { x: prev.pan.x + dx, y: prev.pan.y + dy },
|
pan: { x: prev.pan.x + dx, y: prev.pan.y + dy },
|
||||||
@ -169,20 +169,12 @@ export default function Canvas(props) {
|
|||||||
newHeight = initCoords.height + (mouseY - initCoords.mouseY);
|
newHeight = initCoords.height + (mouseY - initCoords.mouseY);
|
||||||
}
|
}
|
||||||
|
|
||||||
setAreas((prev) =>
|
updateArea(areaResize.id, {
|
||||||
prev.map((a) => {
|
x: newX,
|
||||||
if (a.id === areaResize.id) {
|
y: newY,
|
||||||
return {
|
width: newWidth,
|
||||||
...a,
|
height: newHeight,
|
||||||
x: newX,
|
});
|
||||||
y: newY,
|
|
||||||
width: newWidth,
|
|
||||||
height: newHeight,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -379,6 +371,7 @@ export default function Canvas(props) {
|
|||||||
transform: `translate(${settings.pan.x}px, ${settings.pan.y}px) scale(${settings.zoom})`,
|
transform: `translate(${settings.pan.x}px, ${settings.pan.y}px) scale(${settings.zoom})`,
|
||||||
transformOrigin: "top left",
|
transformOrigin: "top left",
|
||||||
}}
|
}}
|
||||||
|
id="diagram"
|
||||||
>
|
>
|
||||||
{areas.map((a) => (
|
{areas.map((a) => (
|
||||||
<Area
|
<Area
|
||||||
|
@ -404,6 +404,24 @@ export default function ControlPanel(props) {
|
|||||||
};
|
};
|
||||||
const resetView = () =>
|
const resetView = () =>
|
||||||
setSettings((prev) => ({ ...prev, zoom: 1, pan: { x: 0, y: 0 } }));
|
setSettings((prev) => ({ ...prev, zoom: 1, pan: { x: 0, y: 0 } }));
|
||||||
|
const fitWindow = () => {
|
||||||
|
const diagram = document.getElementById("diagram").getBoundingClientRect();
|
||||||
|
const canvas = document.getElementById("canvas").getBoundingClientRect();
|
||||||
|
|
||||||
|
const scaleX = canvas.width / diagram.width;
|
||||||
|
const scaleY = canvas.height / diagram.height;
|
||||||
|
|
||||||
|
const scale = Math.min(scaleX, scaleY);
|
||||||
|
|
||||||
|
const translateX = canvas.width / 2;
|
||||||
|
const translateY = canvas.height / 2;
|
||||||
|
|
||||||
|
setSettings((prev) => ({
|
||||||
|
...prev,
|
||||||
|
zoom: scale,
|
||||||
|
pan: { x: translateX, y: translateY },
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
const menu = {
|
const menu = {
|
||||||
File: {
|
File: {
|
||||||
@ -691,6 +709,7 @@ export default function ControlPanel(props) {
|
|||||||
});
|
});
|
||||||
useHotkeys("ctrl+alt+c, meta+alt+c", copyAsImage, { preventDefault: true });
|
useHotkeys("ctrl+alt+c, meta+alt+c", copyAsImage, { preventDefault: true });
|
||||||
useHotkeys("ctrl+r, meta+r", resetView, { preventDefault: true });
|
useHotkeys("ctrl+r, meta+r", resetView, { preventDefault: true });
|
||||||
|
useHotkeys("ctrl+alt+w, meta+alt+w", fitWindow, { preventDefault: true });
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
@ -700,11 +719,17 @@ export default function ControlPanel(props) {
|
|||||||
{layoutDropdown()}
|
{layoutDropdown()}
|
||||||
<Divider layout="vertical" margin="8px" />
|
<Divider layout="vertical" margin="8px" />
|
||||||
<Dropdown
|
<Dropdown
|
||||||
style={{ width: "180px" }}
|
style={{ width: "240px" }}
|
||||||
position="bottomLeft"
|
position="bottomLeft"
|
||||||
render={
|
render={
|
||||||
<Dropdown.Menu>
|
<Dropdown.Menu>
|
||||||
<Dropdown.Item>Fit window</Dropdown.Item>
|
<Dropdown.Item
|
||||||
|
onClick={fitWindow}
|
||||||
|
style={{ display: "flex", justifyContent: "space-between" }}
|
||||||
|
>
|
||||||
|
<div>Fit window / Reset</div>
|
||||||
|
<div className="text-gray-400">Ctrl+Alt+W</div>
|
||||||
|
</Dropdown.Item>
|
||||||
<Dropdown.Divider />
|
<Dropdown.Divider />
|
||||||
{[0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 3.0].map((e, i) => (
|
{[0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 3.0].map((e, i) => (
|
||||||
<Dropdown.Item
|
<Dropdown.Item
|
||||||
|
@ -2,7 +2,7 @@ import React from "react";
|
|||||||
|
|
||||||
export default function Sidebar() {
|
export default function Sidebar() {
|
||||||
return (
|
return (
|
||||||
<div className="px-3 fixed right-0 bg-white h-full">
|
<div className="px-3 right-0 bg-white h-full">
|
||||||
<div className="w-12 h-12 bg-blue-200 rounded-full mb-4"></div>
|
<div className="w-12 h-12 bg-blue-200 rounded-full mb-4"></div>
|
||||||
<div className="w-12 h-12 bg-blue-200 rounded-full mb-4"></div>
|
<div className="w-12 h-12 bg-blue-200 rounded-full mb-4"></div>
|
||||||
<div className="w-12 h-12 bg-blue-200 rounded-full mb-4"></div>
|
<div className="w-12 h-12 bg-blue-200 rounded-full mb-4"></div>
|
||||||
|
Loading…
Reference in New Issue
Block a user