Merged PR 203: Improve responsive design and refactor layout

This commit is contained in:
Eric Nguyen 2022-10-03 12:05:16 +00:00
parent 50626218ba
commit 0d05f0959c
27 changed files with 968 additions and 485 deletions

View file

@ -1,10 +1,8 @@
import './SVG.scss';
import * as React from 'react';
import { ReactSVGPanZoom, Tool, TOOL_PAN, Value } from 'react-svg-pan-zoom';
import { Container } from './Elements/Container';
import { ContainerModel } from '../../Interfaces/IContainerModel';
import { Selector } from './Elements/Selector/Selector';
import { BAR_WIDTH } from '../Bar/Bar';
import { DepthDimensionLayer } from './Elements/DepthDimensionLayer';
import { MAX_FRAMERATE, SHOW_DIMENSIONS_PER_DEPTH } from '../../utils/default';
import { SymbolLayer } from './Elements/SymbolLayer';
@ -12,11 +10,15 @@ import { ISymbolModel } from '../../Interfaces/ISymbolModel';
import { DimensionLayer } from './Elements/DimensionLayer';
interface ISVGProps {
className?: string
viewerWidth: number
viewerHeight: number
width: number
height: number
children: ContainerModel
selected?: ContainerModel
symbols: Map<string, ISymbolModel>
selectContainer: (containerId: string) => void
}
interface Viewer {
@ -26,29 +28,7 @@ interface Viewer {
export const ID = 'svg';
function UseSVGAutoResizer(
setViewer: React.Dispatch<React.SetStateAction<Viewer>>
): void {
React.useEffect(() => {
function OnResize(): void {
setViewer({
viewerWidth: window.innerWidth - BAR_WIDTH,
viewerHeight: window.innerHeight
});
}
window.addEventListener('resize', OnResize);
return () => {
window.removeEventListener('resize', OnResize);
};
});
}
export function SVG(props: ISVGProps): JSX.Element {
const [viewer, setViewer] = React.useState<Viewer>({
viewerWidth: window.innerWidth - BAR_WIDTH,
viewerHeight: window.innerHeight
});
const [tool, setTool] = React.useState<Tool>(TOOL_PAN);
const [value, setValue] = React.useState<Value>({} as Value);
const [scale, setScale] = React.useState<number>(value.a ?? 1);
@ -63,7 +43,6 @@ export function SVG(props: ISVGProps): JSX.Element {
// const startTimer = React.useRef(Date.now());
// console.log(renderCounter.current / ((Date.now() - startTimer.current) / 1000));
UseSVGAutoResizer(setViewer);
UseFitOnce(svgViewer, props.width, props.height);
const xmlns = '<http://www.w3.org/2000/svg>';
@ -79,14 +58,15 @@ export function SVG(props: ISVGProps): JSX.Element {
model={props.children}
depth={0}
scale={scale}
selectContainer={props.selectContainer}
/>;
return (
<div id={ID} className='ml-16'>
<div id={ID} className={props.className}>
<ReactSVGPanZoom
ref={svgViewer}
width={viewer.viewerWidth}
height={viewer.viewerHeight}
width={props.viewerWidth}
height={props.viewerHeight}
tool={tool} onChangeTool={setTool}
value={value} onChangeValue={(value: Value) => {
// Framerate limiter