fixed duplicate

This commit is contained in:
hannathkadher
2025-01-27 01:19:08 +04:00
parent 4907eebc42
commit 812dc4792b

View File

@ -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,
),
);
}
}
});
} }
} }