- Implemented SkillModule to manage FormSkillSO assets with a detailed UI for editing and displaying skill properties. - Implemented WeaponModule to manage WeaponSO assets with a detailed UI for editing and displaying weapon properties. - Created AssetOperations class for centralized CRUD operations on ScriptableObject assets, including create, rename, delete, and clone functionalities. - Added DetailHeader for displaying and renaming asset names in the UI. - Introduced SoListPane for a reusable ScriptableObject list panel with search functionality and context menus. - Added meta files for all new scripts to ensure proper asset management in Unity.
124 lines
5.0 KiB
C#
124 lines
5.0 KiB
C#
using System;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.UIElements;
|
|
|
|
namespace BaseGames.Editor
|
|
{
|
|
/// <summary>
|
|
/// 详情区顶部标题行:显示资产名称,双击或按 ✏ 进入行内重命名。
|
|
/// </summary>
|
|
public class DetailHeader : VisualElement
|
|
{
|
|
// ── 事件 ─────────────────────────────────────────────────────────────
|
|
/// <summary>用户确认重命名时触发,参数为新名称字符串。</summary>
|
|
public event Action<string> 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<MouseDownEvent>(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<KeyDownEvent>(e =>
|
|
{
|
|
if (e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter)
|
|
{
|
|
e.StopPropagation();
|
|
CommitRename();
|
|
}
|
|
else if (e.keyCode == KeyCode.Escape)
|
|
{
|
|
e.StopPropagation();
|
|
CancelRename();
|
|
}
|
|
});
|
|
_renameField.RegisterCallback<FocusOutEvent>(_ => 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 ──────────────────────────────────────────────────────────
|
|
|
|
/// <summary>绑定新资产,更新标题显示。</summary>
|
|
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;
|
|
}
|
|
}
|
|
}
|