Merged PR 226: Implement associated container and default X, Y position for Symbol
Implement associated container and default X, Y position for Symbol Related work items: #7537, #7540
This commit is contained in:
parent
0a664752e9
commit
4ff2e0b7fb
9 changed files with 136 additions and 48 deletions
|
@ -6,7 +6,9 @@ import { GetDefaultSymbolModel } from '../../../utils/default';
|
|||
import { FindContainerById } from '../../../utils/itertools';
|
||||
import { RestoreX } from '../../../utils/svg';
|
||||
import { ApplyBehaviors, ApplyBehaviorsOnSiblingsChildren } from '../Behaviors/Behaviors';
|
||||
import { GetCurrentHistory, UpdateCounters } from '../Editor';
|
||||
import { GetCurrentHistory, GetCurrentHistoryState, UpdateCounters } from '../Editor';
|
||||
import { AddContainers } from './AddContainer';
|
||||
import { LinkSymbol } from './ContainerOperations';
|
||||
|
||||
export function AddSymbol(
|
||||
name: string,
|
||||
|
@ -14,7 +16,7 @@ export function AddSymbol(
|
|||
fullHistory: IHistoryState[],
|
||||
historyCurrentStep: number
|
||||
): IHistoryState[] {
|
||||
const history = GetCurrentHistory(fullHistory, historyCurrentStep);
|
||||
let history = GetCurrentHistory(fullHistory, historyCurrentStep);
|
||||
const current = history[history.length - 1];
|
||||
|
||||
const symbolConfig = configuration.AvailableSymbols
|
||||
|
@ -24,24 +26,48 @@ export function AddSymbol(
|
|||
throw new Error('[AddSymbol] Symbol could not be found in the config');
|
||||
}
|
||||
const type = `symbol-${name}`;
|
||||
const newCounters = structuredClone(current.typeCounters);
|
||||
UpdateCounters(newCounters, type);
|
||||
const typeCounters = structuredClone(current.typeCounters);
|
||||
UpdateCounters(typeCounters, type);
|
||||
|
||||
const newSymbols = structuredClone(current.symbols);
|
||||
const newSymbol: ISymbolModel = GetDefaultSymbolModel(name, newCounters, type, symbolConfig);
|
||||
const newSymbol: ISymbolModel = GetDefaultSymbolModel(name, typeCounters, type, symbolConfig);
|
||||
const containers = structuredClone(current.containers);
|
||||
newSymbol.x = RestoreX(newSymbol.x, newSymbol.width, newSymbol.config.PositionReference);
|
||||
|
||||
newSymbols.set(newSymbol.id, newSymbol);
|
||||
|
||||
history.push({
|
||||
lastAction: `Add ${name}`,
|
||||
mainContainer: structuredClone(current.mainContainer),
|
||||
containers: structuredClone(current.containers),
|
||||
mainContainer: current.mainContainer,
|
||||
containers,
|
||||
selectedContainerId: current.selectedContainerId,
|
||||
typeCounters: newCounters,
|
||||
typeCounters,
|
||||
symbols: newSymbols,
|
||||
selectedSymbolId: newSymbol.id
|
||||
});
|
||||
|
||||
if (symbolConfig.AssociatedContainer !== undefined) {
|
||||
const {
|
||||
history: newHistory,
|
||||
newContainers
|
||||
} = AddContainers(
|
||||
0,
|
||||
[symbolConfig.AssociatedContainer],
|
||||
current.mainContainer,
|
||||
configuration,
|
||||
history,
|
||||
historyCurrentStep + 1
|
||||
);
|
||||
|
||||
history = newHistory;
|
||||
const newCurrent = GetCurrentHistoryState(newHistory, historyCurrentStep + 2);
|
||||
const newerSymbol = newCurrent.symbols.get(newSymbol.id);
|
||||
|
||||
newContainers.forEach((newContainer) => {
|
||||
LinkContainer(newerSymbol, newContainer, newSymbols);
|
||||
});
|
||||
}
|
||||
|
||||
return history;
|
||||
}
|
||||
|
||||
|
@ -55,7 +81,7 @@ export function SelectSymbol(
|
|||
|
||||
history.push({
|
||||
lastAction: `Select ${symbolId}`,
|
||||
mainContainer: structuredClone(current.mainContainer),
|
||||
mainContainer: current.mainContainer,
|
||||
containers: structuredClone(current.containers),
|
||||
selectedContainerId: current.selectedContainerId,
|
||||
typeCounters: structuredClone(current.typeCounters),
|
||||
|
@ -166,3 +192,20 @@ export function OnPropertyChange(
|
|||
});
|
||||
return history;
|
||||
}
|
||||
|
||||
/**
|
||||
* Link a container to a symbol.
|
||||
* If symbol is undefined, unlink the previous symbol of the container
|
||||
* @param symbol
|
||||
* @param container
|
||||
* @param symbols
|
||||
*/
|
||||
function LinkContainer(
|
||||
symbol: ISymbolModel | undefined,
|
||||
container: IContainerModel,
|
||||
symbols: Map<string, ISymbolModel>
|
||||
): void {
|
||||
const oldSymbol = symbols.get(container.properties.linkedSymbolId);
|
||||
LinkSymbol(container.properties.id, oldSymbol, symbol);
|
||||
container.properties.linkedSymbolId = symbol !== undefined ? symbol.id : '';
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue