增加画面和列表联动

This commit is contained in:
ww-rm
2025-03-11 00:01:54 +08:00
parent fd524891aa
commit 342778c56e

View File

@@ -47,9 +47,6 @@ namespace SpineViewer.Controls
[Category("预览"), DisplayName("显示坐标轴")] [Category("预览"), DisplayName("显示坐标轴")]
public bool ShowAxis { get => previewer.ShowAxis; set => previewer.ShowAxis = value; } public bool ShowAxis { get => previewer.ShowAxis; set => previewer.ShowAxis = value; }
[Category("预览"), DisplayName("显示包围盒")]
public bool ShowBounds { get => previewer.ShowBounds; set => previewer.ShowBounds = value; }
[Category("预览"), DisplayName("最大帧率")] [Category("预览"), DisplayName("最大帧率")]
public uint MaxFps { get => previewer.MaxFps; set => previewer.MaxFps = value; } public uint MaxFps { get => previewer.MaxFps; set => previewer.MaxFps = value; }
} }
@@ -84,7 +81,6 @@ namespace SpineViewer.Controls
private readonly SFML.Graphics.RenderWindow RenderWindow; private readonly SFML.Graphics.RenderWindow RenderWindow;
private readonly SFML.System.Clock Clock = new(); private readonly SFML.System.Clock Clock = new();
private SFML.System.Vector2f? draggingSrc = null; private SFML.System.Vector2f? draggingSrc = null;
private Spine.Spine? draggingSpine = null;
private Task? task = null; private Task? task = null;
private CancellationTokenSource? cancelToken = null; private CancellationTokenSource? cancelToken = null;
@@ -236,13 +232,6 @@ namespace SpineViewer.Controls
[Browsable(false)] [Browsable(false)]
public bool ShowAxis { get; set; } = true; public bool ShowAxis { get; set; } = true;
/// <summary>
/// 显示包围盒
/// </summary>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
public bool ShowBounds { get; set; } = true;
/// <summary> /// <summary>
/// 最大帧率 /// 最大帧率
/// </summary> /// </summary>
@@ -328,7 +317,6 @@ namespace SpineViewer.Controls
// 右键优先级高, 进入画面拖动模式, 需要重新记录源点 // 右键优先级高, 进入画面拖动模式, 需要重新记录源点
if ((e.Button & MouseButtons.Right) != 0) if ((e.Button & MouseButtons.Right) != 0)
{ {
draggingSpine = null;
draggingSrc = RenderWindow.MapPixelToCoords(new(e.X, e.Y)); draggingSrc = RenderWindow.MapPixelToCoords(new(e.X, e.Y));
Cursor = Cursors.Hand; Cursor = Cursors.Hand;
} }
@@ -342,14 +330,43 @@ namespace SpineViewer.Controls
{ {
lock (SpineListView.Spines) lock (SpineListView.Spines)
{ {
foreach (var spine in SpineListView.Spines) var spines = SpineListView.Spines;
// 没有按下 Ctrl 键就只选中点击的那个, 所以先清空选中列表
if ((ModifierKeys & Keys.Control) == 0)
{ {
if (spine.Bounds.Contains(src)) bool hit = false;
for (int i = 0; i < spines.Count; i++)
{ {
draggingSpine = spine; if (spines[i].Bounds.Contains(src))
{
hit = true;
// 如果点到了没被选中的东西, 则清空原先选中的, 改为只选中这一次点的
if (!SpineListView.SelectedIndices.Contains(i))
{
SpineListView.SelectedIndices.Clear();
SpineListView.SelectedIndices.Add(i);
}
break; break;
} }
} }
// 如果点了空白的地方, 就清空选中列表
if (!hit)
SpineListView.SelectedIndices.Clear();
}
else
{
for (int i = 0; i < spines.Count; i++)
{
if (spines[i].Bounds.Contains(src))
{
SpineListView.SelectedIndices.Add(i);
break;
}
}
}
} }
} }
} }
@@ -371,8 +388,17 @@ namespace SpineViewer.Controls
} }
else if ((e.Button & MouseButtons.Left) != 0) else if ((e.Button & MouseButtons.Left) != 0)
{ {
if (draggingSpine is not null) if (SpineListView is not null)
draggingSpine.Position += delta; {
lock (SpineListView.Spines)
{
foreach (var spine in SpineListView.Spines)
{
if (spine.IsSelected)
spine.Position += delta;
}
}
}
draggingSrc = dst; draggingSrc = dst;
} }
} }
@@ -382,7 +408,6 @@ namespace SpineViewer.Controls
// 右键高优先级, 结束画面拖动模式 // 右键高优先级, 结束画面拖动模式
if ((e.Button & MouseButtons.Right) != 0) if ((e.Button & MouseButtons.Right) != 0)
{ {
draggingSpine = null;
SpineListView?.PropertyGrid?.Refresh(); SpineListView?.PropertyGrid?.Refresh();
draggingSrc = null; draggingSrc = null;
@@ -393,7 +418,6 @@ namespace SpineViewer.Controls
else if ((e.Button & MouseButtons.Left) != 0 && (MouseButtons & MouseButtons.Right) == 0) else if ((e.Button & MouseButtons.Left) != 0 && (MouseButtons & MouseButtons.Right) == 0)
{ {
draggingSrc = null; draggingSrc = null;
draggingSpine = null;
SpineListView?.PropertyGrid?.Refresh(); SpineListView?.PropertyGrid?.Refresh();
} }
} }
@@ -439,7 +463,7 @@ namespace SpineViewer.Controls
spine.Update(delta); spine.Update(delta);
RenderWindow.Draw(spine); RenderWindow.Draw(spine);
if (ShowBounds) if (spine.IsSelected)
{ {
var bounds = spine.Bounds; var bounds = spine.Bounds;
BoundsRect[0] = BoundsRect[4] = new(new(bounds.Left, bounds.Top), BoundsColor); BoundsRect[0] = BoundsRect[4] = new(new(bounds.Left, bounds.Top), BoundsColor);