增加folder层面的QuickCopy

Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
2026-07-25 00:17:04 +08:00
parent dd4d4e0e03
commit eb7110ea77
19 changed files with 548153 additions and 1676 deletions

View File

@@ -1,4 +1,5 @@
using System.Collections;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor.Commands;
@@ -110,10 +111,11 @@ namespace Ichni.Editor
}
}
public class CopyPasteDeleteModule
{
public GameElement copiedElement;
public List<GameElement> pastedElementList;
public class CopyPasteDeleteModule
{
public GameElement copiedElement;
public List<GameElement> pastedElementList;
private Dictionary<Guid, GameElement> pastedElementBySourceGuid;
public void CopyElement(GameElement gameElement)
{
@@ -150,7 +152,9 @@ namespace Ichni.Editor
LogWindow.Log("Pasted element: " + sourceElement.elementName + " to " + parentElement.elementName);
pastedElementList = new List<GameElement>();
pastedElementBySourceGuid = new Dictionary<Guid, GameElement>();
AffiliatedPaste(sourceElement, parentElement);
ResolvePastedReferences();
// 粘贴完成后,对所有新生成的元素执行 AfterInitialize 和 Refresh
// 与 EditorManager.LoadProject 的加载后流程对齐,确保 Manager 注册等关键步骤不遗漏。
@@ -164,6 +168,19 @@ namespace Ichni.Editor
return pastedElementList.FirstOrDefault();
}
private void ResolvePastedReferences()
{
if (pastedElementBySourceGuid == null || pastedElementBySourceGuid.Count == 0) return;
foreach (GameElement pastedElement in pastedElementList)
{
if (pastedElement is IPastedReferenceResolver referenceResolver)
{
referenceResolver.ResolvePastedReferences(pastedElementBySourceGuid);
}
}
}
public void DeleteElement(GameElement gameElement)
{
if (gameElement == null)
@@ -229,9 +246,10 @@ namespace Ichni.Editor
LogWindow.Log("Paste failed: " + gameElement.elementName + " could not be duplicated.", Color.red);
return;
}
pastedElementList.Add(pastedElement);
pastedElementList.Add(pastedElement);
pastedElementBySourceGuid[gameElement.elementGuid] = pastedElement;
gameElement.submoduleList.ForEach(submodule =>
{
if (submodule == null) return;
@@ -254,7 +272,12 @@ namespace Ichni.Editor
AffiliatedPaste(Element, pastedElement);
}
}
}
}
}
}
}
}
public interface IPastedReferenceResolver
{
void ResolvePastedReferences(IReadOnlyDictionary<Guid, GameElement> pastedElementBySourceGuid);
}
}