修复插槽禁用功能

This commit is contained in:
ww-rm
2025-08-18 18:39:27 +08:00
parent 5bfa625868
commit 6dfd25b760
18 changed files with 135 additions and 21 deletions

View File

@@ -85,6 +85,8 @@ namespace SpineViewer.Models
public event EventHandler<SkinStatusChangedEventArgs>? SkinStatusChanged;
public event EventHandler<SlotVisibleChangedEventArgs>? SlotVisibleChanged;
public event EventHandler<SlotAttachmentChangedEventArgs>? SlotAttachmentChanged;
public event EventHandler<AnimationChangedEventArgs>? AnimationChanged;
@@ -200,6 +202,19 @@ namespace SpineViewer.Models
public FrozenDictionary<string, ImmutableArray<string>> SlotAttachments => _slotAttachments;
public bool GetSlotVisible(string slotName)
{
lock (_lock) return _spineObject.GetSlotVisible(slotName);
}
public bool SetSlotVisible(string slotName, bool visible)
{
bool changed = false;
lock (_lock) changed = _spineObject.SetSlotVisible(slotName, visible);
if (changed) SlotVisibleChanged?.Invoke(this, new(slotName, visible));
return changed;
}
public string? GetAttachment(string slotName)
{
lock (_lock) return _spineObject.GetAttachment(slotName);
@@ -390,6 +405,8 @@ namespace SpineViewer.Models
foreach (var slot in _spineObject.Skeleton.Slots) config.SlotAttachment[slot.Name] = slot.Attachment?.Name;
config.DisabledSlots = _spineObject.Skeleton.Slots.Where(it => it.Disabled).Select(it => it.Name).ToList();
// XXX: 处理空动画
config.Animations.AddRange(_spineObject.AnimationState.IterTracks().Select(tr => tr?.Animation.Name));
@@ -422,6 +439,10 @@ namespace SpineViewer.Models
if (_spineObject.SetAttachment(slotName, attachmentName))
SlotAttachmentChanged?.Invoke(this, new(slotName, attachmentName));
foreach (var slotName in value.DisabledSlots)
if (_spineObject.SetSlotVisible(slotName, false))
SlotVisibleChanged?.Invoke(this, new(slotName, false));
// XXX: 处理空动画
_spineObject.AnimationState.ClearTracks();
int trackIndex = 0;
@@ -507,6 +528,12 @@ namespace SpineViewer.Models
public bool Status { get; } = status;
}
public class SlotVisibleChangedEventArgs(string slotName, bool visible) : EventArgs
{
public string SlotName { get; } = slotName;
public bool Visible { get; } = visible;
}
public class SlotAttachmentChangedEventArgs(string slotName, string? attachmentName) : EventArgs
{
public string SlotName { get; } = slotName;