Add Two-Step Confirmation for Preset Deletion in RenderConfigWindow

This commit is contained in:
copecone committed 2026-10-10 16:28:00 +09:00
1 parent 6f4c632b41
commit 723f4446f5
3 files changed
+76 -18

No files matched your search

+1
View File
@@ -5,6 +5,7 @@
"ui.render_config.preset_name_placeholder": "New preset name...", "ui.render_config.preset_name_placeholder": "New preset name...",
"ui.render_config.preset_save": "Save", "ui.render_config.preset_save": "Save",
"ui.render_config.preset_delete": "Delete", "ui.render_config.preset_delete": "Delete",
"ui.render_config.preset_delete_confirm": "Confirm?",
"ui.render_config.preset_overwrite_title": "Overwrite Preset", "ui.render_config.preset_overwrite_title": "Overwrite Preset",
"ui.render_config.preset_overwrite_desc": "A preset named '{0}' already exists. Do you want to overwrite it?", "ui.render_config.preset_overwrite_desc": "A preset named '{0}' already exists. Do you want to overwrite it?",
"ui.render_config.preset_delete_title": "Delete Preset", "ui.render_config.preset_delete_title": "Delete Preset",
+1
View File
@@ -5,6 +5,7 @@
"ui.render_config.preset_name_placeholder": "새 프리셋 이름...", "ui.render_config.preset_name_placeholder": "새 프리셋 이름...",
"ui.render_config.preset_save": "저장", "ui.render_config.preset_save": "저장",
"ui.render_config.preset_delete": "삭제", "ui.render_config.preset_delete": "삭제",
"ui.render_config.preset_delete_confirm": "삭제 확인",
"ui.render_config.preset_overwrite_title": "프리셋 덮어쓰기", "ui.render_config.preset_overwrite_title": "프리셋 덮어쓰기",
"ui.render_config.preset_overwrite_desc": "'{0}' 프리셋이 이미 존재합니다. 덮어쓰시겠습니까?", "ui.render_config.preset_overwrite_desc": "'{0}' 프리셋이 이미 존재합니다. 덮어쓰시겠습니까?",
"ui.render_config.preset_delete_title": "프리셋 삭제", "ui.render_config.preset_delete_title": "프리셋 삭제",
+74 -18
View File
@@ -26,6 +26,10 @@ internal static class RenderConfigWindow
private static O5InputField? _presetNameInput; private static O5InputField? _presetNameInput;
private static O5Button? _savePresetButton; private static O5Button? _savePresetButton;
private static O5Button? _deletePresetButton; private static O5Button? _deletePresetButton;
// ReSharper disable once InconsistentNaming
private static LayoutElement? _deletePresetButtonLE;
private static bool _isDeletePending;
private static Coroutine? _deleteResetCoroutine;
private static string? _lastLoadedPresetName; private static string? _lastLoadedPresetName;
// Controls cache for validation & sync // Controls cache for validation & sync
@@ -95,6 +99,7 @@ internal static class RenderConfigWindow
_configWindow.CloseRequested += win => _configWindow.CloseRequested += win =>
{ {
CloseAllPickers(); CloseAllPickers();
ResetDeletePendingState();
win.Rect.gameObject.SetActive(false); win.Rect.gameObject.SetActive(false);
}; };
@@ -255,10 +260,17 @@ internal static class RenderConfigWindow
onClick: () => OnDeletePresetClicked(config), onClick: () => OnDeletePresetClicked(config),
height: 40f height: 40f
); );
var deleteLE = _deletePresetButton.Rect.GetComponent<LayoutElement>() ?? _deletePresetButton.Rect.gameObject.AddComponent<LayoutElement>(); if (_deletePresetButton.Label != null)
deleteLE.preferredWidth = 90f; {
deleteLE.flexibleWidth = 0f; LocalizedText.Bind(_deletePresetButton.Label, () =>
deleteLE.preferredHeight = 40f; _isDeletePending
? LocalizationManager.Get("ui.render_config.preset_delete_confirm")
: LocalizationManager.Get("ui.render_config.preset_delete"));
}
_deletePresetButtonLE = _deletePresetButton.Rect.GetComponent<LayoutElement>() ?? _deletePresetButton.Rect.gameObject.AddComponent<LayoutElement>();
_deletePresetButtonLE.preferredWidth = 90f;
_deletePresetButtonLE.flexibleWidth = 0f;
_deletePresetButtonLE.preferredHeight = 40f;
UpdateDeleteButtonState(); UpdateDeleteButtonState();
@@ -907,6 +919,7 @@ internal static class RenderConfigWindow
private static void OnPresetSelected(string? selectedName, RenderConfig config) private static void OnPresetSelected(string? selectedName, RenderConfig config)
{ {
ResetDeletePendingState();
if (string.IsNullOrEmpty(selectedName) || selectedName == CustomPresetLabel) return; if (string.IsNullOrEmpty(selectedName) || selectedName == CustomPresetLabel) return;
var preset = PresetManager.GetPresets().FirstOrDefault(p => string.Equals(p.Name, selectedName, StringComparison.OrdinalIgnoreCase)); var preset = PresetManager.GetPresets().FirstOrDefault(p => string.Equals(p.Name, selectedName, StringComparison.OrdinalIgnoreCase));
if (preset == null) return; if (preset == null) return;
@@ -991,20 +1004,62 @@ internal static class RenderConfigWindow
} }
} }
var ctx = RendererUIManager.Context; if (!_isDeletePending)
CommonWarningDialogUI.ShowDialog( {
LocalizationManager.Get("ui.render_config.preset_delete_title"), _isDeletePending = true;
LocalizationManager.Get("ui.render_config.preset_delete_desc", targetPresetName), if (_deletePresetButtonLE != null) _deletePresetButtonLE.preferredWidth = 110f;
new DialogButton( if (_deletePresetButton != null)
LocalizationManager.Get("ui.render_config.confirm"), {
() => DoDeletePreset(targetPresetName, config), if (_deletePresetButton.Label != null)
ctx.Theme.SoftRed {
), _deletePresetButton.Label.text = LocalizationManager.Get("ui.render_config.preset_delete_confirm");
new DialogButton( }
LocalizationManager.Get("ui.render_config.cancel"), _deletePresetButton.NormalColor = new Color(0.95f, 0.25f, 0.25f, 1f);
() => { } _deletePresetButton.UpdateVisual();
) }
);
if (_deleteResetCoroutine != null)
{
RendererUIManager.Instance.StopCoroutine(_deleteResetCoroutine);
}
_deleteResetCoroutine = RendererUIManager.Instance.StartCoroutine(ResetDeletePendingAfterDelay());
return;
}
ResetDeletePendingState();
DoDeletePreset(targetPresetName, config);
}
private static System.Collections.IEnumerator ResetDeletePendingAfterDelay()
{
yield return new WaitForSeconds(3f);
ResetDeletePendingState();
}
private static void ResetDeletePendingState()
{
if (_deleteResetCoroutine != null)
{
RendererUIManager.Instance.StopCoroutine(_deleteResetCoroutine);
_deleteResetCoroutine = null;
}
if (!_isDeletePending && (_deletePresetButton == null || _deletePresetButton.Label?.text == LocalizationManager.Get("ui.render_config.preset_delete")))
{
return;
}
_isDeletePending = false;
if (_deletePresetButtonLE) _deletePresetButtonLE.preferredWidth = 90f;
if (_deletePresetButton != null)
{
if (_deletePresetButton.Label != null)
{
_deletePresetButton.Label.text = LocalizationManager.Get("ui.render_config.preset_delete");
}
_deletePresetButton.NormalColor = RendererUIManager.Context.Theme.SoftRed;
_deletePresetButton.UpdateVisual();
}
} }
private static void DoDeletePreset(string name, RenderConfig config) private static void DoDeletePreset(string name, RenderConfig config)
@@ -1029,6 +1084,7 @@ internal static class RenderConfigWindow
private static void ReloadPresetDropdown(string? selectName = null) private static void ReloadPresetDropdown(string? selectName = null)
{ {
ResetDeletePendingState();
var presets = PresetManager.GetPresets(); var presets = PresetManager.GetPresets();
var names = presets.Select(p => p.Name).ToList(); var names = presets.Select(p => p.Name).ToList();
if (names.Count == 0) if (names.Count == 0)