using System; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; namespace BaseGames.Editor { /// /// 详情区顶部标题行:显示资产名称,双击或按 ✏ 进入行内重命名。 /// public class DetailHeader : VisualElement { // ── 事件 ───────────────────────────────────────────────────────────── /// 用户确认重命名时触发,参数为新名称字符串。 public event Action RenameRequested; // ── 私有字段 ────────────────────────────────────────────────────────── private Label _nameLabel; private TextField _renameField; private bool _renaming; // ── 构造 ───────────────────────────────────────────────────────────── public DetailHeader() { style.flexDirection = FlexDirection.Row; style.alignItems = Align.Center; style.paddingLeft = 12; style.paddingRight = 8; style.paddingTop = 10; style.paddingBottom = 10; style.borderBottomWidth = 1; style.borderBottomColor = new StyleColor(new Color(0.5f, 0.5f, 0.5f, 0.2f)); // 名称 Label _nameLabel = new Label("(未选中)"); _nameLabel.style.flexGrow = 1; _nameLabel.style.fontSize = 15; _nameLabel.style.unityFontStyleAndWeight = FontStyle.Bold; _nameLabel.RegisterCallback(e => { if (e.clickCount == 2) BeginRename(); }); Add(_nameLabel); // 重命名输入框(默认隐藏) _renameField = new TextField(); _renameField.style.flexGrow = 1; _renameField.style.fontSize = 15; _renameField.style.display = DisplayStyle.None; _renameField.RegisterCallback(e => { if (e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter) { e.StopPropagation(); CommitRename(); } else if (e.keyCode == KeyCode.Escape) { e.StopPropagation(); CancelRename(); } }); _renameField.RegisterCallback(_ => CommitRename()); Add(_renameField); // 编辑按钮 var btnEdit = new Button(BeginRename) { text = "✏", tooltip = "重命名(双击名称也可触发)" }; btnEdit.style.width = 24; btnEdit.style.height = 24; btnEdit.style.marginLeft = 6; btnEdit.style.paddingLeft = 0; btnEdit.style.paddingRight = 0; btnEdit.style.fontSize = 13; Add(btnEdit); } // ── 公共 API ────────────────────────────────────────────────────────── /// 绑定新资产,更新标题显示。 public void SetAsset(UnityEngine.Object asset) { CancelRename(); _nameLabel.text = asset != null ? asset.name : "(未选中)"; } // ── 内部逻辑 ────────────────────────────────────────────────────────── private void BeginRename() { if (_renaming) return; _renaming = true; _renameField.value = _nameLabel.text; _nameLabel.style.display = DisplayStyle.None; _renameField.style.display = DisplayStyle.Flex; schedule.Execute(() => { _renameField.Focus(); _renameField.SelectAll(); }); } private void CommitRename() { if (!_renaming) return; _renaming = false; _nameLabel.style.display = DisplayStyle.Flex; _renameField.style.display = DisplayStyle.None; var newName = _renameField.value.Trim(); if (!string.IsNullOrEmpty(newName) && newName != _nameLabel.text) RenameRequested?.Invoke(newName); } private void CancelRename() { if (!_renaming) return; _renaming = false; _nameLabel.style.display = DisplayStyle.Flex; _renameField.style.display = DisplayStyle.None; } } }