using System; using Age.Engine.Sys4; using Godot; /// Godot presentation for AGERc command 10's blocking INPUTNAME editor. public partial class FullwidthTextEditorDialog : Window { private readonly LineEdit _edit = new() { MaxLength = 255 }; private readonly Label _error = new() { AutowrapMode = TextServer.AutowrapMode.WordSmart, CustomMinimumSize = new Vector2(0, 28), }; private bool _completed; public event Action? EditCompleted; public FullwidthTextEditorDialog() { Title = "文字入力"; Exclusive = true; Transient = true; Unresizable = true; var margin = new MarginContainer(); margin.AddThemeConstantOverride("margin_left", 16); margin.AddThemeConstantOverride("margin_top", 16); margin.AddThemeConstantOverride("margin_right", 16); margin.AddThemeConstantOverride("margin_bottom", 16); AddChild(margin); margin.SetAnchorsAndOffsetsPreset(Control.LayoutPreset.FullRect); var column = new VBoxContainer(); margin.AddChild(column); column.AddChild(new Label { Text = "全角文字で名前を入力してください。" }); _edit.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill; column.AddChild(_edit); _error.AddThemeColorOverride("font_color", new Color(1.0f, 0.35f, 0.35f)); column.AddChild(_error); var actions = new HBoxContainer { Alignment = BoxContainer.AlignmentMode.End }; var cancel = new Button { Text = "キャンセル" }; var accept = new Button { Text = "決定" }; actions.AddChild(cancel); actions.AddChild(accept); column.AddChild(actions); accept.Pressed += TryAccept; cancel.Pressed += Cancel; _edit.TextSubmitted += _ => TryAccept(); CloseRequested += Cancel; } public void Open(string initialText) { _completed = false; _error.Text = ""; _edit.Text = initialText; PopupCentered(new Vector2I(430, 160)); _edit.GrabFocus(); _edit.SelectAll(); } private void TryAccept() { FullwidthTextValidationError error = Cp932Text.ValidateFullwidthName(_edit.Text); if (error != FullwidthTextValidationError.None) { _error.Text = error == FullwidthTextValidationError.TooLong ? "字数オーバーです" : "半角文字は使用できません"; _edit.GrabFocus(); return; } Complete(true); } private void Cancel() => Complete(false); private void Complete(bool accepted) { if (_completed) return; _completed = true; Hide(); EditCompleted?.Invoke(accepted, _edit.Text); } }