From 28664f6387d7ada1849f6bb66aaddce0082d19f5 Mon Sep 17 00:00:00 2001 From: ww-rm Date: Wed, 26 Mar 2025 20:30:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9A=90=E8=97=8F=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpineViewer/Controls/SpinePreviewer.cs | 40 +++++++++++++++----------- SpineViewer/MainForm.cs | 2 +- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/SpineViewer/Controls/SpinePreviewer.cs b/SpineViewer/Controls/SpinePreviewer.cs index 1bcb99f..527ebb8 100644 --- a/SpineViewer/Controls/SpinePreviewer.cs +++ b/SpineViewer/Controls/SpinePreviewer.cs @@ -371,6 +371,16 @@ namespace SpineViewer.Controls delta = Clock.ElapsedTime.AsSeconds(); Clock.Restart(); + // 停止更新的时候只是时间不前进, 但是坐标变换还是要更新, 否则无法移动对象 + if (!IsUpdating) delta = 0; + + // 加上要快进的量 + lock (_forwardDeltaLock) + { + delta += forwardDelta; + forwardDelta = 0; + } + RenderWindow.Clear(BackgroundColor); if (ShowAxis) @@ -389,24 +399,14 @@ namespace SpineViewer.Controls { lock (SpineListView.Spines) { - var spines = SpineListView.Spines; - for (int i = spines.Count - 1; i >= 0; i--) + var spines = SpineListView.Spines.Where(sp => !sp.IsHidden).ToArray(); + for (int i = spines.Length - 1; i >= 0; i--) { if (cancelToken is not null && cancelToken.IsCancellationRequested) break; // 提前中止 var spine = spines[i]; - // 停止更新的时候只是时间不前进, 但是坐标变换还是要更新, 否则无法移动对象 - if (!IsUpdating) delta = 0; - - // 加上要快进的量 - lock (_forwardDeltaLock) - { - delta += forwardDelta; - forwardDelta = 0; - } - spine.Update(delta); if (RenderSelectedOnly && !spine.IsSelected) @@ -487,9 +487,11 @@ namespace SpineViewer.Controls // 仅渲染选中模式禁止在画面里选择对象 if (RenderSelectedOnly) { + // 只在被选中的对象里判断是否有效命中 bool hit = false; foreach (int i in SpineListView.SelectedIndices) { + if (spines[i].IsHidden) continue; if (!spines[i].Bounds.Contains(src)) continue; hit = true; break; @@ -500,12 +502,13 @@ namespace SpineViewer.Controls } else { - // 没有按下 Ctrl 键就只选中点击的那个, 所以先清空选中列表 if ((ModifierKeys & Keys.Control) == 0) { + // 没按 Ctrl 的情况下, 如果命中了已选中对象, 则就算普通命中 bool hit = false; for (int i = 0; i < spines.Count; i++) { + if (spines[i].IsHidden) continue; if (!spines[i].Bounds.Contains(src)) continue; hit = true; @@ -524,10 +527,11 @@ namespace SpineViewer.Controls } else { + // 按下 Ctrl 的情况就执行多选, 并且点空白处也不会清空选中 for (int i = 0; i < spines.Count; i++) { - if (!spines[i].Bounds.Contains(src)) - continue; + if (spines[i].IsHidden) continue; + if (!spines[i].Bounds.Contains(src)) continue; SpineListView.SelectedIndices.Add(i); break; @@ -558,8 +562,12 @@ namespace SpineViewer.Controls { lock (SpineListView.Spines) { + var spines = SpineListView.Spines; foreach (int i in SpineListView.SelectedIndices) - SpineListView.Spines[i].Position += delta; + { + if (spines[i].IsHidden) continue; + spines[i].Position += delta; + } } } draggingSrc = dst; diff --git a/SpineViewer/MainForm.cs b/SpineViewer/MainForm.cs index ac80f8e..99b0e56 100644 --- a/SpineViewer/MainForm.cs +++ b/SpineViewer/MainForm.cs @@ -147,7 +147,7 @@ namespace SpineViewer var worker = (BackgroundWorker)sender; var exporter = (Exporter.Exporter)e.Argument; spinePreviewer.StopRender(); - lock (spineListView.Spines) { exporter.Export(spineListView.Spines.ToArray(), (BackgroundWorker)sender); } + lock (spineListView.Spines) { exporter.Export(spineListView.Spines.Where(sp => !sp.IsHidden).ToArray(), (BackgroundWorker)sender); } e.Cancel = worker.CancellationPending; spinePreviewer.StartRender(); }