SHA256
Add Two-Step Confirmation for Preset Deletion in RenderConfigWindow
This commit is contained in:
3 files changed
+76
-18
No files matched your search
@@ -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",
|
||||||
|
|||||||
@@ -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": "프리셋 삭제",
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user