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;
}
}
}