diff --git a/src/App.tsx b/src/App.tsx index fc3b721..c6d5b13 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -74,6 +74,12 @@ class App extends React.Component { } as IAppState); } + public SelectContainer(container: Container) { + this.setState({ + SelectedContainer: container + } as IAppProps); + } + public AddContainer(type: string): void { if (this.state.SelectedContainer === null || this.state.SelectedContainer === undefined) { @@ -91,13 +97,16 @@ class App extends React.Component { throw new Error(`[AddContainer] Object type not found. Found: ${type}`); } + const parent = this.state.SelectedContainer; + + const depth: number = Container.getDepth(parent) + 1; const container = new Container({ - parent: this.state.SelectedContainer, - id: this.state.SelectedContainer.props.children.length.toString(), + parent, + id: `${depth}-${parent.props.children.length.toString()}`, x: 0, y: 0, width: properties?.Width, - height: this.state.configuration.MainContainer.Height, + height: parent.props.height, children: [], style: properties.Style, userData: { @@ -105,7 +114,7 @@ class App extends React.Component { } }); - this.state.SelectedContainer.props.children.push(container); + parent.props.children.push(container); const newMainContainer = new Container(Object.assign({}, this.state.MainContainer.props)); @@ -124,7 +133,12 @@ class App extends React.Component { buttonOnClick={(type: string) => this.AddContainer(type)} /> - this.ToggleSVGSidebar()}/> + this.ToggleSVGSidebar()} + selectContainer={(container: Container) => this.SelectContainer(container)} + /> { this.state.MainContainer } diff --git a/src/Components/SVG/Elements/Container.tsx b/src/Components/SVG/Elements/Container.tsx index b9d33a3..728a954 100644 --- a/src/Components/SVG/Elements/Container.tsx +++ b/src/Components/SVG/Elements/Container.tsx @@ -35,4 +35,16 @@ export class Container extends React.Component { ); } + + public static getDepth(container: Container): number { + let depth = 0; + + let current: Container | null = container.props.parent; + while (current != null) { + depth++; + current = current.props.parent; + } + + return depth; + } } diff --git a/src/Components/SVGSidebar/SVGSidebar.tsx b/src/Components/SVGSidebar/SVGSidebar.tsx index a40adf8..bac4a5a 100644 --- a/src/Components/SVGSidebar/SVGSidebar.tsx +++ b/src/Components/SVGSidebar/SVGSidebar.tsx @@ -4,11 +4,13 @@ import { Container } from '../SVG/Elements/Container'; interface ISVGSidebarProps { MainContainer: Container | null, isOpen: boolean, - onClick: () => void + onClick: () => void, + selectContainer: (container: Container) => void } export class SVGSidebar extends React.Component { public iterateChilds(handleContainer: (container: Container, depth: number) => void): React.ReactNode { + // TODO: fix this by using dfs or sort const root = this.props.MainContainer; if (!root) { return null; @@ -45,7 +47,7 @@ export class SVGSidebar extends React.Component { const key = container.props.id.toString(); const text = '\t\t'.repeat(depth) + key; containerRows.push( -