diff --git a/src/Components/Editor/Behaviors/AnchorBehaviors.ts b/src/Components/Editor/Behaviors/AnchorBehaviors.ts index a5e02f7..8d1adf9 100644 --- a/src/Components/Editor/Behaviors/AnchorBehaviors.ts +++ b/src/Components/Editor/Behaviors/AnchorBehaviors.ts @@ -13,11 +13,52 @@ * or make them lose their property as a rigid body */ +import { IContainerModel } from '../../../Interfaces/IContainerModel'; +import { constraintBodyInsideUnallocatedWidth } from './RigidBodyBehaviors'; + /** * Impose the container position * Apply the following modification to the overlapping rigid body container : - * */ -export function ImposePosition(){ +export function ImposePosition(container: IContainerModel): IContainerModel { + if (container.parent === undefined || + container.parent === null) { + return container; + } -} \ No newline at end of file + // Get the closest one + const rigidBodies = container.parent.children.filter( + child => child.properties.isRigidBody && !child.properties.isAnchor + ); + + const overlappingContainers = getOverlappingContainers(container, rigidBodies); + for (const overlappingContainer of overlappingContainers) { + constraintBodyInsideUnallocatedWidth(overlappingContainer); + } + return container; +} + +function getOverlappingContainers( + container: IContainerModel, + siblings: IContainerModel[] +): IContainerModel[] { + const min1 = container.properties.x; + const max1 = container.properties.x + Number(container.properties.width); + const overlappingContainers: IContainerModel[] = []; + for (const sibling of siblings) { + if (sibling === container) { + continue; + } + + const min2 = sibling.properties.x; + const max2 = sibling.properties.x + Number(sibling.properties.width); + const isOverlapping = Math.min(max1, max2) - Math.max(min1, min2) > 0; + + if (!isOverlapping) { + continue; + } + + overlappingContainers.push(sibling); + } + return overlappingContainers; +} diff --git a/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts b/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts index b250ed2..0bdefd0 100644 --- a/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts +++ b/src/Components/Editor/Behaviors/RigidBodyBehaviors.ts @@ -112,7 +112,7 @@ function constraintBodyInsideSpace( * @param container * @returns Updated container */ -function constraintBodyInsideUnallocatedWidth( +export function constraintBodyInsideUnallocatedWidth( container: IContainerModel ): IContainerModel { if (container.parent === null) { diff --git a/src/Components/Editor/PropertiesOperations.ts b/src/Components/Editor/PropertiesOperations.ts index e271776..ed5a4db 100644 --- a/src/Components/Editor/PropertiesOperations.ts +++ b/src/Components/Editor/PropertiesOperations.ts @@ -6,6 +6,7 @@ import { findContainerById } from '../../utils/itertools'; import { getCurrentHistory } from './Editor'; import { RecalculatePhysics } from './Behaviors/RigidBodyBehaviors'; import { INPUT_TYPES } from '../Properties/PropertiesInputTypes'; +import { ImposePosition } from './Behaviors/AnchorBehaviors'; /** * Handled the property change event in the properties form @@ -42,6 +43,10 @@ export function OnPropertyChange( (container.properties as any)[key] = value; } + if (container.properties.isAnchor) { + ImposePosition(container); + } + if (container.properties.isRigidBody) { RecalculatePhysics(container); }