Merged PR 216: Deprecate parent from IContainerModel for FindContainerById
This commit is contained in:
parent
d40cd8cf8e
commit
b4eba6bb9b
19 changed files with 97 additions and 109 deletions
|
@ -163,7 +163,6 @@ function AddNewContainerToParent(
|
|||
|
||||
// Create the container
|
||||
const newContainer = new ContainerModel(
|
||||
parentClone,
|
||||
defaultProperties,
|
||||
[],
|
||||
{
|
||||
|
|
|
@ -57,9 +57,10 @@ export function DeleteContainer(
|
|||
throw new Error(`[DeleteContainer] Tried to delete a container that is not present in the main container: ${containerId}`);
|
||||
}
|
||||
|
||||
const parent = FindContainerById(containers, container.properties.parentId);
|
||||
if (container === mainContainerClone ||
|
||||
container.parent === undefined ||
|
||||
container.parent === null) {
|
||||
parent === undefined ||
|
||||
parent === null) {
|
||||
Swal.fire({
|
||||
title: 'Oops...',
|
||||
text: 'Deleting the main container is not allowed!',
|
||||
|
@ -75,10 +76,10 @@ export function DeleteContainer(
|
|||
const newSymbols = structuredClone(current.symbols);
|
||||
UnlinkContainerFromSymbols(containers, newSymbols, container);
|
||||
|
||||
const index = container.parent.children.indexOf(container.properties.id);
|
||||
const index = parent.children.indexOf(container.properties.id);
|
||||
const success = containers.delete(container.properties.id);
|
||||
if (index > -1 && success) {
|
||||
container.parent.children.splice(index, 1);
|
||||
parent.children.splice(index, 1);
|
||||
} else {
|
||||
throw new Error('[DeleteContainer] Could not find container among parent\'s children');
|
||||
}
|
||||
|
@ -90,7 +91,7 @@ export function DeleteContainer(
|
|||
const selectedContainerId = GetSelectedContainerOnDelete(
|
||||
containers,
|
||||
current.selectedContainerId,
|
||||
container.parent,
|
||||
parent,
|
||||
index
|
||||
);
|
||||
|
||||
|
@ -202,12 +203,8 @@ export function OnPropertyChange(
|
|||
*/
|
||||
export function SortChildren(
|
||||
containers: Map<string, IContainerModel>,
|
||||
parent: IContainerModel | null | undefined
|
||||
parent: IContainerModel
|
||||
): void {
|
||||
if (parent === null || parent === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
const isHorizontal = parent.properties.orientation === Orientation.Horizontal;
|
||||
const children = parent.children;
|
||||
|
||||
|
@ -293,7 +290,10 @@ function SetContainer(
|
|||
);
|
||||
|
||||
// sort the children list by their position
|
||||
SortChildren(containers, container.parent);
|
||||
const parent = FindContainerById(containers, container.properties.parentId);
|
||||
if (parent !== null && parent !== undefined) {
|
||||
SortChildren(containers, parent);
|
||||
}
|
||||
|
||||
// Apply special behaviors: rigid, flex, symbol, anchor
|
||||
ApplyBehaviors(containers, container, symbols);
|
||||
|
|
|
@ -8,6 +8,7 @@ import { ISetContainerListRequest } from '../../../Interfaces/ISetContainerListR
|
|||
import { ISetContainerListResponse } from '../../../Interfaces/ISetContainerListResponse';
|
||||
import { FindContainerById } from '../../../utils/itertools';
|
||||
import { SetContainerList } from '../../API/api';
|
||||
import { GetCurrentHistoryState } from '../Editor';
|
||||
import { AddContainers } from './AddContainer';
|
||||
import { DeleteContainer } from './ContainerOperations';
|
||||
|
||||
|
@ -62,15 +63,16 @@ export function GetAction(
|
|||
function GetPreviousAndNextSiblings(containers: Map<string, IContainerModel>, container: IContainerModel): { prev: IContainerModel | undefined, next: IContainerModel | undefined } {
|
||||
let prev;
|
||||
let next;
|
||||
if (container.parent !== undefined &&
|
||||
container.parent !== null &&
|
||||
container.parent.children.length > 1) {
|
||||
const index = container.parent.children.indexOf(container.properties.id);
|
||||
const parent = FindContainerById(containers, container.properties.parentId);
|
||||
if (parent !== undefined &&
|
||||
parent !== null &&
|
||||
parent.children.length > 1) {
|
||||
const index = parent.children.indexOf(container.properties.id);
|
||||
if (index > 0) {
|
||||
prev = FindContainerById(containers, container.parent.children[index - 1]);
|
||||
prev = FindContainerById(containers, parent.children[index - 1]);
|
||||
}
|
||||
if (index < container.parent.children.length - 1) {
|
||||
next = FindContainerById(containers, container.parent.children[index + 1]);
|
||||
if (index < parent.children.length - 1) {
|
||||
next = FindContainerById(containers, parent.children[index + 1]);
|
||||
}
|
||||
}
|
||||
return { prev, next };
|
||||
|
@ -86,6 +88,9 @@ function HandleSetContainerList(
|
|||
setNewHistory: (newHistory: IHistoryState[]) => void
|
||||
): void {
|
||||
const addingBehavior = response.AddingBehavior ?? action.AddingBehavior;
|
||||
const current = GetCurrentHistoryState(history, historyCurrentStep);
|
||||
const containers = current.containers;
|
||||
const parent = FindContainerById(containers, selectedContainer.properties.parentId);
|
||||
switch (addingBehavior) {
|
||||
case AddMethod.Append:
|
||||
setNewHistory(
|
||||
|
@ -103,6 +108,7 @@ function HandleSetContainerList(
|
|||
case AddMethod.Replace:
|
||||
setNewHistory(
|
||||
HandleReplace(
|
||||
containers,
|
||||
selectedContainer,
|
||||
response,
|
||||
configuration,
|
||||
|
@ -112,7 +118,7 @@ function HandleSetContainerList(
|
|||
);
|
||||
break;
|
||||
case AddMethod.ReplaceParent:
|
||||
if (selectedContainer.parent === undefined || selectedContainer.parent === null) {
|
||||
if (parent === undefined || parent === null) {
|
||||
Swal.fire({
|
||||
title: 'Error',
|
||||
text: 'The selected container has not parent to replace',
|
||||
|
@ -122,7 +128,8 @@ function HandleSetContainerList(
|
|||
}
|
||||
setNewHistory(
|
||||
HandleReplace(
|
||||
selectedContainer.parent,
|
||||
containers,
|
||||
parent,
|
||||
response,
|
||||
configuration,
|
||||
history,
|
||||
|
@ -134,17 +141,19 @@ function HandleSetContainerList(
|
|||
}
|
||||
|
||||
function HandleReplace(
|
||||
containers: Map<string, IContainerModel>,
|
||||
selectedContainer: IContainerModel,
|
||||
response: ISetContainerListResponse,
|
||||
configuration: IConfiguration,
|
||||
history: IHistoryState[],
|
||||
historyCurrentStep: number
|
||||
): IHistoryState[] {
|
||||
if (selectedContainer.parent === undefined || selectedContainer.parent === null) {
|
||||
const parent = FindContainerById(containers, selectedContainer.properties.parentId);
|
||||
if (parent === undefined || parent === null) {
|
||||
throw new Error('[ReplaceContainer] Cannot replace a container that does not exists');
|
||||
}
|
||||
|
||||
const index = selectedContainer.parent.children.indexOf(selectedContainer.properties.id);
|
||||
const index = parent.children.indexOf(selectedContainer.properties.id);
|
||||
|
||||
const newHistoryAfterDelete = DeleteContainer(
|
||||
selectedContainer.properties.id,
|
||||
|
|
|
@ -18,12 +18,11 @@ export function ApplyBehaviors(containers: Map<string, IContainerModel>, contain
|
|||
try {
|
||||
const symbol = symbols.get(container.properties.linkedSymbolId);
|
||||
if (container.properties.linkedSymbolId !== '' && symbol !== undefined) {
|
||||
ApplySymbol(container, symbol);
|
||||
ApplySymbol(containers, container, symbol);
|
||||
}
|
||||
|
||||
if (container.parent !== undefined && container.parent !== null) {
|
||||
const parent = container.parent;
|
||||
|
||||
const parent = FindContainerById(containers, container.properties.parentId);
|
||||
if (parent !== undefined && parent !== null) {
|
||||
if (container.properties.isAnchor) {
|
||||
ApplyAnchor(containers, container, parent);
|
||||
}
|
||||
|
@ -69,11 +68,12 @@ export function ApplyBehaviorsOnSiblingsChildren(
|
|||
containers: Map<string, IContainerModel>,
|
||||
newContainer: IContainerModel,
|
||||
symbols: Map<string, ISymbolModel>): void {
|
||||
if (newContainer.parent === null || newContainer.parent === undefined) {
|
||||
const parent = FindContainerById(containers, newContainer.properties.parentId);
|
||||
if (parent === null || parent === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
newContainer.parent.children
|
||||
parent.children
|
||||
.forEach((containerId: string) => {
|
||||
const container = FindContainerById(containers, containerId);
|
||||
|
||||
|
@ -81,8 +81,9 @@ export function ApplyBehaviorsOnSiblingsChildren(
|
|||
return;
|
||||
}
|
||||
|
||||
if (container.parent !== null) {
|
||||
UpdateWarning(containers, container, container.parent);
|
||||
const containerParent = FindContainerById(containers, container.properties.parentId);
|
||||
if (containerParent !== null && containerParent !== undefined) {
|
||||
UpdateWarning(containers, container, containerParent);
|
||||
}
|
||||
|
||||
if (container === newContainer) {
|
||||
|
@ -102,11 +103,12 @@ export function ApplyBehaviorsOnSiblingsChildren(
|
|||
* @returns
|
||||
*/
|
||||
export function ApplyBehaviorsOnSiblings(containers: Map<string, IContainerModel>, newContainer: IContainerModel, symbols: Map<string, ISymbolModel>): void {
|
||||
if (newContainer.parent === null || newContainer.parent === undefined) {
|
||||
const parent = FindContainerById(containers, newContainer.properties.parentId);
|
||||
if (parent === null || parent === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
newContainer.parent.children
|
||||
parent.children
|
||||
.forEach((containerId: string) => {
|
||||
const container = FindContainerById(containers, containerId);
|
||||
|
||||
|
@ -116,8 +118,9 @@ export function ApplyBehaviorsOnSiblings(containers: Map<string, IContainerModel
|
|||
|
||||
ApplyBehaviors(containers, container, symbols);
|
||||
|
||||
if (container.parent != null) {
|
||||
UpdateWarning(containers, container, container.parent);
|
||||
const containerParent = FindContainerById(containers, container.properties.parentId);
|
||||
if (containerParent !== null && containerParent !== undefined) {
|
||||
UpdateWarning(containers, container, containerParent);
|
||||
}
|
||||
|
||||
if (container === newContainer) {
|
||||
|
|
|
@ -10,7 +10,7 @@ import { IContainerModel } from '../../../Interfaces/IContainerModel';
|
|||
import { ISizePointer } from '../../../Interfaces/ISizePointer';
|
||||
import { Orientation } from '../../../Enums/Orientation';
|
||||
import { ENABLE_HARD_RIGID } from '../../../utils/default';
|
||||
import { MakeChildrenIterator } from '../../../utils/itertools';
|
||||
import { FindContainerById, MakeChildrenIterator } from '../../../utils/itertools';
|
||||
|
||||
/**
|
||||
* "Transform the container into a rigid body"
|
||||
|
@ -122,17 +122,18 @@ export function ConstraintBodyInsideUnallocatedWidth(
|
|||
containers: Map<string, IContainerModel>,
|
||||
container: IContainerModel
|
||||
): IContainerModel {
|
||||
if (container.parent === null || container.parent === undefined) {
|
||||
const parent = FindContainerById(containers, container.properties.parentId);
|
||||
if (parent === null || parent === undefined) {
|
||||
return container;
|
||||
}
|
||||
|
||||
// Get the available spaces of the parent
|
||||
const isHorizontal =
|
||||
container.parent.properties.orientation === Orientation.Horizontal;
|
||||
const children: IContainerModel[] = [...MakeChildrenIterator(containers, container.parent.children)];
|
||||
parent.properties.orientation === Orientation.Horizontal;
|
||||
const children: IContainerModel[] = [...MakeChildrenIterator(containers, parent.children)];
|
||||
const availableWidths = GetAvailableWidths(
|
||||
0,
|
||||
container.parent.properties.width,
|
||||
parent.properties.width,
|
||||
children,
|
||||
container,
|
||||
isHorizontal
|
||||
|
@ -172,7 +173,7 @@ export function ConstraintBodyInsideUnallocatedWidth(
|
|||
container,
|
||||
0,
|
||||
availableWidthFound.x,
|
||||
container.parent.properties.width,
|
||||
parent.properties.width,
|
||||
availableWidthFound.width
|
||||
);
|
||||
|
||||
|
@ -203,7 +204,7 @@ export function ConstraintBodyInsideUnallocatedWidth(
|
|||
availableWidthFound.x,
|
||||
0,
|
||||
availableWidthFound.width,
|
||||
container.parent.properties.height
|
||||
parent.properties.height
|
||||
);
|
||||
|
||||
return container;
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
import { IContainerModel } from '../../../Interfaces/IContainerModel';
|
||||
import { ISymbolModel } from '../../../Interfaces/ISymbolModel';
|
||||
import { ApplyParentTransform } from '../../../utils/itertools';
|
||||
import { ApplyParentTransform, FindContainerById } from '../../../utils/itertools';
|
||||
import { RestoreX, TransformX } from '../../../utils/svg';
|
||||
|
||||
export function ApplySymbol(container: IContainerModel, symbol: ISymbolModel): IContainerModel {
|
||||
export function ApplySymbol(containers: Map<string, IContainerModel>, container: IContainerModel, symbol: ISymbolModel): IContainerModel {
|
||||
container.properties.x = TransformX(symbol.x, symbol.width, symbol.config.PositionReference);
|
||||
container.properties.x = RestoreX(container.properties.x, container.properties.width, container.properties.positionReference);
|
||||
const [x] = ApplyParentTransform(container.parent, container.properties.x, 0);
|
||||
const parent = FindContainerById(containers, container.properties.parentId);
|
||||
let x = 0;
|
||||
if (parent !== undefined && parent !== null) {
|
||||
([x] = ApplyParentTransform(containers, parent, container.properties.x, 0));
|
||||
}
|
||||
container.properties.x = x;
|
||||
return container;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue