Files
2026-07-13 13:13:17 +08:00

134 lines
4.8 KiB
C#

#nullable enable
using ImGuiNET;
using T3.Editor.Gui.Graph.Dialogs;
using T3.Editor.Gui.Input;
using T3.Editor.Gui.Styling;
using T3.Editor.Gui.UiHelpers;
using T3.Editor.UiModel;
using T3.Editor.UiModel.Modification;
namespace T3.Editor.Gui.Dialogs;
internal sealed class DuplicateSymbolDialog : ModalDialog
{
internal DuplicateSymbolDialog()
{
Flags = ImGuiWindowFlags.NoScrollWithMouse;
DialogSize = new Vector2(500, 450);
}
public event Action? Closed;
/** returns true if modified */
public ChangeSymbol.SymbolModificationResults Draw(Guid symbolGuid, IEnumerable<SymbolUi.Child> selectedChildUis2, ref string nameSpace, ref string newTypeName, ref string description, bool isReload = false)
{
//DialogSize = new Vector2(500, 450) * T3Ui.UiScaleFactor;
var result = ChangeSymbol.SymbolModificationResults.Nothing;
if(isReload && !_completedReloadPrompt)
{
//DialogSize = new Vector2(400, 200);
if (BeginDialog("Changes made to readonly operator"))
{
ImGui.TextWrapped("You've made changes to a read-only operator.\nDo you want to save your changes as a new operator?");
if(ImGui.Button("Yes"))
{
_completedReloadPrompt = true;
}
ImGui.SameLine();
if(ImGui.Button("No"))
{
ImGui.CloseCurrentPopup();
Closed?.Invoke();
}
EndDialogContent();
}
EndDialog();
return ChangeSymbol.SymbolModificationResults.Nothing;
}
DialogSize = new Vector2(600, 400);
if (BeginDialog("Duplicate as new symbol"))
{
var selectedChildUis = selectedChildUis2.ToList();
if(selectedChildUis.Count != 1)
return result;
if (selectedChildUis[0]?.SymbolChild?.Symbol == null)
{
return result;
}
var s = selectedChildUis[0].SymbolChild.Symbol;
var selectionChanged = _selectedSymbolId != s.Id;
if (selectionChanged)
{
_projectToCopyTo = s.SymbolPackage as EditableSymbolProject;
_selectedSymbolId = s.Id;
}
_ = SymbolModificationInputs.DrawProjectDropdown(ref nameSpace, ref _projectToCopyTo);
if (_projectToCopyTo != null)
{
_ = SymbolModificationInputs.DrawSymbolNameAndNamespaceInputs(ref newTypeName, ref nameSpace, _projectToCopyTo, out var symbolNamesValid);
ImGui.Spacing();
FormInputs.DrawInputLabel("Description");
ImGui.InputTextMultiline("##description", ref description, 1024, new Vector2(450, 60));
FormInputs.AddHint("Duplicating creates a new operator and can't be undone — this clears the undo history.");
if (CustomComponents.DrawCtaButton("Duplicate", symbolNamesValid))
{
if(!SymbolUiRegistry.TryGetSymbolUi(symbolGuid, out var compositionSymbolUi))
throw new InvalidOperationException($"Failed to find symbol ui for {symbolGuid}");
var position = selectedChildUis.First().PosOnCanvas + new Vector2(0, 100);
Duplicate.DuplicateAsNewType(compositionSymbolUi, _projectToCopyTo,
selectedChildUis.First().SymbolChild.Symbol.Id, newTypeName, nameSpace, description,
position);
result = ChangeSymbol.SymbolModificationResults.StructureChanged;
T3Ui.Save(false);
ImGui.CloseCurrentPopup();
_completedReloadPrompt = false;
Closed?.Invoke();
}
ImGui.SameLine();
}
if (CustomComponents.DrawCtaButton("Cancel", Icon.None, CustomComponents.ButtonStates.Emphasized))
{
ImGui.CloseCurrentPopup();
_completedReloadPrompt = false;
Closed?.Invoke();
}
EndDialogContent();
}
else
{
_completedReloadPrompt = false;
Closed?.Invoke();
}
EndDialog();
return result;
}
private EditableSymbolProject? _projectToCopyTo;
private bool _completedReloadPrompt;
private Guid _selectedSymbolId;
}