mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-14 17:25:50 +00:00
fixed duplicate
This commit is contained in:
@ -633,29 +633,37 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
|
|||||||
|
|
||||||
void _duplicateSpace(SpaceModel space) {
|
void _duplicateSpace(SpaceModel space) {
|
||||||
final Map<SpaceModel, SpaceModel> originalToDuplicate = {};
|
final Map<SpaceModel, SpaceModel> originalToDuplicate = {};
|
||||||
const double horizontalGap = 150.0;
|
const double horizontalGap = 200.0;
|
||||||
const double verticalGap = 100.0;
|
const double verticalGap = 100.0;
|
||||||
|
|
||||||
SpaceModel duplicateRecursive(SpaceModel original, Offset parentPosition) {
|
final Map<String, int> nameCounters = {};
|
||||||
// Find a new position for the duplicated space
|
|
||||||
|
String _generateCopyName(String originalName) {
|
||||||
|
final baseName = originalName.replaceAll(RegExp(r'\(\d+\)$'), '').trim();
|
||||||
|
nameCounters[baseName] = (nameCounters[baseName] ?? 0) + 1;
|
||||||
|
return "$baseName(${nameCounters[baseName]})";
|
||||||
|
}
|
||||||
|
|
||||||
|
SpaceModel duplicateRecursive(SpaceModel original, Offset parentPosition,
|
||||||
|
SpaceModel? duplicatedParent) {
|
||||||
Offset newPosition = parentPosition + Offset(horizontalGap, 0);
|
Offset newPosition = parentPosition + Offset(horizontalGap, 0);
|
||||||
|
|
||||||
// Avoid overlapping with existing spaces
|
|
||||||
while (spaces.any((s) =>
|
while (spaces.any((s) =>
|
||||||
(s.position - newPosition).distance < horizontalGap &&
|
(s.position - newPosition).distance < horizontalGap &&
|
||||||
s.status != SpaceStatus.deleted)) {
|
s.status != SpaceStatus.deleted)) {
|
||||||
newPosition += Offset(horizontalGap, 0);
|
newPosition += Offset(horizontalGap, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the duplicated space
|
final duplicatedName = _generateCopyName(original.name);
|
||||||
|
|
||||||
final duplicated = SpaceModel(
|
final duplicated = SpaceModel(
|
||||||
name: "${original.name} (Copy)",
|
name: duplicatedName,
|
||||||
icon: original.icon,
|
icon: original.icon,
|
||||||
position: newPosition,
|
position: newPosition,
|
||||||
isPrivate: original.isPrivate,
|
isPrivate: original.isPrivate,
|
||||||
children: [],
|
children: [],
|
||||||
status: SpaceStatus.newSpace,
|
status: SpaceStatus.newSpace,
|
||||||
parent: original.parent,
|
parent: duplicatedParent,
|
||||||
spaceModel: original.spaceModel,
|
spaceModel: original.spaceModel,
|
||||||
subspaces: original.subspaces,
|
subspaces: original.subspaces,
|
||||||
tags: original.tags,
|
tags: original.tags,
|
||||||
@ -663,62 +671,55 @@ class _CommunityStructureAreaState extends State<CommunityStructureArea> {
|
|||||||
|
|
||||||
originalToDuplicate[original] = duplicated;
|
originalToDuplicate[original] = duplicated;
|
||||||
|
|
||||||
// Copy the children of the original space to the duplicated space
|
setState(() {
|
||||||
|
spaces.add(duplicated);
|
||||||
|
_updateNodePosition(duplicated, duplicated.position);
|
||||||
|
|
||||||
|
if (duplicatedParent != null) {
|
||||||
|
final newConnection = Connection(
|
||||||
|
startSpace: duplicatedParent,
|
||||||
|
endSpace: duplicated,
|
||||||
|
direction: "down",
|
||||||
|
);
|
||||||
|
connections.add(newConnection);
|
||||||
|
duplicated.incomingConnection = newConnection;
|
||||||
|
duplicatedParent.addOutgoingConnection(newConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (original.parent != null && duplicatedParent == null) {
|
||||||
|
final originalParent = original.parent!;
|
||||||
|
final duplicatedParent =
|
||||||
|
originalToDuplicate[originalParent] ?? originalParent;
|
||||||
|
|
||||||
|
final parentConnection = Connection(
|
||||||
|
startSpace: duplicatedParent,
|
||||||
|
endSpace: duplicated,
|
||||||
|
direction: original.incomingConnection?.direction ?? "down",
|
||||||
|
);
|
||||||
|
|
||||||
|
connections.add(parentConnection);
|
||||||
|
duplicated.incomingConnection = parentConnection;
|
||||||
|
duplicatedParent.addOutgoingConnection(parentConnection);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Offset childStartPosition = newPosition + Offset(0, verticalGap);
|
Offset childStartPosition = newPosition + Offset(0, verticalGap);
|
||||||
for (final child in original.children) {
|
for (final child in original.children) {
|
||||||
final duplicatedChild = duplicateRecursive(child, childStartPosition);
|
final duplicatedChild =
|
||||||
|
duplicateRecursive(child, childStartPosition, duplicated);
|
||||||
duplicated.children.add(duplicatedChild);
|
duplicated.children.add(duplicatedChild);
|
||||||
duplicatedChild.parent =
|
|
||||||
duplicated; // Set the parent for the duplicated child
|
|
||||||
childStartPosition += Offset(0, verticalGap);
|
childStartPosition += Offset(0, verticalGap);
|
||||||
}
|
}
|
||||||
|
|
||||||
return duplicated;
|
return duplicated;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Duplicate the selected space and its children
|
if (space.parent == null) {
|
||||||
final duplicatedSpace = duplicateRecursive(space, space.position);
|
duplicateRecursive(space, space.position, null);
|
||||||
|
} else {
|
||||||
// Ensure the duplicated space has the same parent as the original
|
final duplicatedParent =
|
||||||
if (space.parent != null) {
|
originalToDuplicate[space.parent!] ?? space.parent!;
|
||||||
final parentSpace = space.parent!;
|
duplicateRecursive(space, space.position, duplicatedParent);
|
||||||
final duplicatedParent = originalToDuplicate[parentSpace] ?? parentSpace;
|
|
||||||
duplicatedSpace.parent = duplicatedParent;
|
|
||||||
duplicatedParent.children.add(duplicatedSpace);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flatten the hierarchy of the duplicated spaces
|
|
||||||
List<SpaceModel> flattenHierarchy(SpaceModel root) {
|
|
||||||
final List<SpaceModel> result = [];
|
|
||||||
void traverse(SpaceModel node) {
|
|
||||||
result.add(node);
|
|
||||||
for (final child in node.children) {
|
|
||||||
traverse(child);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
traverse(root);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
final duplicatedSpacesList = flattenHierarchy(duplicatedSpace);
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
spaces.addAll(duplicatedSpacesList);
|
|
||||||
|
|
||||||
// Duplicate the connections
|
|
||||||
for (final connection in connections) {
|
|
||||||
if (originalToDuplicate.containsKey(connection.startSpace) &&
|
|
||||||
originalToDuplicate.containsKey(connection.endSpace)) {
|
|
||||||
connections.add(
|
|
||||||
Connection(
|
|
||||||
startSpace: originalToDuplicate[connection.startSpace]!,
|
|
||||||
endSpace: originalToDuplicate[connection.endSpace]!,
|
|
||||||
direction: connection.direction,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user