diff --git a/SpineViewer/src/SpineListView.Designer.cs b/SpineViewer/src/SpineListView.Designer.cs
index 6d3cc7e..ee84afc 100644
--- a/SpineViewer/src/SpineListView.Designer.cs
+++ b/SpineViewer/src/SpineListView.Designer.cs
@@ -28,16 +28,20 @@
///
private void InitializeComponent()
{
+ components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SpineListView));
tableLayoutPanel = new TableLayoutPanel();
flowLayoutPanel_Buttons = new FlowLayoutPanel();
button_Add = new Button();
- button_Insert = new Button();
button_Remove = new Button();
button_MoveUp = new Button();
button_MoveDown = new Button();
+ button_Insert = new Button();
+ button_RemoveAll = new Button();
listView = new ListView();
columnHeader_Name = new ColumnHeader();
columnHeader_Version = new ColumnHeader();
+ toolTip = new ToolTip(components);
tableLayoutPanel.SuspendLayout();
flowLayoutPanel_Buttons.SuspendLayout();
SuspendLayout();
@@ -62,10 +66,11 @@
//
flowLayoutPanel_Buttons.AutoSize = true;
flowLayoutPanel_Buttons.Controls.Add(button_Add);
- flowLayoutPanel_Buttons.Controls.Add(button_Insert);
flowLayoutPanel_Buttons.Controls.Add(button_Remove);
flowLayoutPanel_Buttons.Controls.Add(button_MoveUp);
flowLayoutPanel_Buttons.Controls.Add(button_MoveDown);
+ flowLayoutPanel_Buttons.Controls.Add(button_Insert);
+ flowLayoutPanel_Buttons.Controls.Add(button_RemoveAll);
flowLayoutPanel_Buttons.Dock = DockStyle.Fill;
flowLayoutPanel_Buttons.Location = new Point(3, 3);
flowLayoutPanel_Buttons.Name = "flowLayoutPanel_Buttons";
@@ -76,37 +81,28 @@
//
button_Add.Anchor = AnchorStyles.None;
button_Add.AutoSize = true;
+ button_Add.AutoSizeMode = AutoSizeMode.GrowAndShrink;
+ button_Add.Image = (Image)resources.GetObject("button_Add.Image");
button_Add.Location = new Point(3, 3);
button_Add.Name = "button_Add";
- button_Add.Size = new Size(56, 34);
+ button_Add.Size = new Size(34, 34);
button_Add.TabIndex = 0;
- button_Add.Text = "添加";
+ toolTip.SetToolTip(button_Add, "在末尾添加项");
button_Add.UseVisualStyleBackColor = true;
button_Add.Click += button_Add_Click;
//
- // button_Insert
- //
- button_Insert.Anchor = AnchorStyles.None;
- button_Insert.AutoSize = true;
- button_Insert.Enabled = false;
- button_Insert.Location = new Point(65, 3);
- button_Insert.Name = "button_Insert";
- button_Insert.Size = new Size(56, 34);
- button_Insert.TabIndex = 4;
- button_Insert.Text = "插入";
- button_Insert.UseVisualStyleBackColor = true;
- button_Insert.Click += button_Insert_Click;
- //
// button_Remove
//
button_Remove.Anchor = AnchorStyles.None;
button_Remove.AutoSize = true;
+ button_Remove.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_Remove.Enabled = false;
- button_Remove.Location = new Point(127, 3);
+ button_Remove.Image = (Image)resources.GetObject("button_Remove.Image");
+ button_Remove.Location = new Point(43, 3);
button_Remove.Name = "button_Remove";
- button_Remove.Size = new Size(56, 34);
+ button_Remove.Size = new Size(34, 34);
button_Remove.TabIndex = 1;
- button_Remove.Text = "移除";
+ toolTip.SetToolTip(button_Remove, "移除选中项");
button_Remove.UseVisualStyleBackColor = true;
button_Remove.Click += button_Remove_Click;
//
@@ -116,11 +112,12 @@
button_MoveUp.AutoSize = true;
button_MoveUp.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_MoveUp.Enabled = false;
- button_MoveUp.Location = new Point(189, 3);
+ button_MoveUp.Image = (Image)resources.GetObject("button_MoveUp.Image");
+ button_MoveUp.Location = new Point(83, 3);
button_MoveUp.Name = "button_MoveUp";
- button_MoveUp.Size = new Size(56, 34);
+ button_MoveUp.Size = new Size(34, 34);
button_MoveUp.TabIndex = 2;
- button_MoveUp.Text = "上移";
+ toolTip.SetToolTip(button_MoveUp, "上移选中项");
button_MoveUp.UseVisualStyleBackColor = true;
button_MoveUp.Click += button_MoveUp_Click;
//
@@ -130,16 +127,47 @@
button_MoveDown.AutoSize = true;
button_MoveDown.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_MoveDown.Enabled = false;
- button_MoveDown.Location = new Point(251, 3);
+ button_MoveDown.Image = (Image)resources.GetObject("button_MoveDown.Image");
+ button_MoveDown.Location = new Point(123, 3);
button_MoveDown.Name = "button_MoveDown";
- button_MoveDown.Size = new Size(56, 34);
+ button_MoveDown.Size = new Size(34, 34);
button_MoveDown.TabIndex = 3;
- button_MoveDown.Text = "下移";
+ toolTip.SetToolTip(button_MoveDown, "下移选中项");
button_MoveDown.UseVisualStyleBackColor = true;
button_MoveDown.Click += button_MoveDown_Click;
//
+ // button_Insert
+ //
+ button_Insert.Anchor = AnchorStyles.None;
+ button_Insert.AutoSize = true;
+ button_Insert.AutoSizeMode = AutoSizeMode.GrowAndShrink;
+ button_Insert.Enabled = false;
+ button_Insert.Image = (Image)resources.GetObject("button_Insert.Image");
+ button_Insert.Location = new Point(163, 3);
+ button_Insert.Name = "button_Insert";
+ button_Insert.Size = new Size(34, 34);
+ button_Insert.TabIndex = 4;
+ toolTip.SetToolTip(button_Insert, "在选中项之前插入项");
+ button_Insert.UseVisualStyleBackColor = true;
+ button_Insert.Click += button_Insert_Click;
+ //
+ // button_RemoveAll
+ //
+ button_RemoveAll.Anchor = AnchorStyles.None;
+ button_RemoveAll.AutoSize = true;
+ button_RemoveAll.AutoSizeMode = AutoSizeMode.GrowAndShrink;
+ button_RemoveAll.Image = (Image)resources.GetObject("button_RemoveAll.Image");
+ button_RemoveAll.Location = new Point(203, 3);
+ button_RemoveAll.Name = "button_RemoveAll";
+ button_RemoveAll.Size = new Size(34, 34);
+ button_RemoveAll.TabIndex = 5;
+ toolTip.SetToolTip(button_RemoveAll, "移除所有项");
+ button_RemoveAll.UseVisualStyleBackColor = true;
+ button_RemoveAll.Click += button_RemoveAll_Click;
+ //
// listView
//
+ listView.AllowDrop = true;
listView.Columns.AddRange(new ColumnHeader[] { columnHeader_Name, columnHeader_Version });
listView.Dock = DockStyle.Fill;
listView.FullRowSelect = true;
@@ -151,7 +179,11 @@
listView.TabIndex = 1;
listView.UseCompatibleStateImageBehavior = false;
listView.View = View.Details;
+ listView.ItemDrag += listView_ItemDrag;
listView.SelectedIndexChanged += listView_SelectedIndexChanged;
+ listView.DragDrop += listView_DragDrop;
+ listView.DragOver += listView_DragOver;
+ listView.KeyDown += listView_KeyDown;
//
// columnHeader_Name
//
@@ -163,12 +195,12 @@
columnHeader_Version.Text = "版本";
columnHeader_Version.Width = 150;
//
- // ListViewSkel
+ // SpineListView
//
AutoScaleDimensions = new SizeF(11F, 24F);
AutoScaleMode = AutoScaleMode.Font;
Controls.Add(tableLayoutPanel);
- Name = "ListViewSkel";
+ Name = "SpineListView";
Size = new Size(336, 445);
tableLayoutPanel.ResumeLayout(false);
tableLayoutPanel.PerformLayout();
@@ -189,5 +221,7 @@
private ColumnHeader columnHeader_Name;
private ColumnHeader columnHeader_Version;
private Button button_Add;
+ private Button button_RemoveAll;
+ private ToolTip toolTip;
}
}
diff --git a/SpineViewer/src/SpineListView.cs b/SpineViewer/src/SpineListView.cs
index 3b636d1..e44a134 100644
--- a/SpineViewer/src/SpineListView.cs
+++ b/SpineViewer/src/SpineListView.cs
@@ -10,6 +10,8 @@ using System.Windows.Forms;
using System.Collections.ObjectModel;
using SpineViewer.Spine;
using System.Reflection;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+using System.Diagnostics;
namespace SpineViewer
{
@@ -130,6 +132,15 @@ namespace SpineViewer
}
}
+ private void button_RemoveAll_Click(object sender, EventArgs e)
+ {
+ if (MessageBox.Show("确认移除所有项吗?", "操作确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
+ {
+ spines.Clear();
+ listView.Items.Clear();
+ }
+ }
+
private void listView_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView.SelectedIndices.Count <= 0)
@@ -160,5 +171,76 @@ namespace SpineViewer
PropertyGrid.SelectedObject = null;
}
}
+
+ private void listView_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Control && e.KeyCode == Keys.A)
+ {
+ listView.BeginUpdate();
+ foreach (ListViewItem item in listView.Items)
+ {
+ item.Selected = true;
+ }
+ listView.EndUpdate();
+ }
+ }
+
+ private void listView_ItemDrag(object sender, ItemDragEventArgs e)
+ {
+ DoDragDrop(e.Item, DragDropEffects.Move);
+ }
+
+ private void listView_DragOver(object sender, DragEventArgs e)
+ {
+ // 检查拖放目标是否有效
+ e.Effect = DragDropEffects.Move;
+
+ // 获取鼠标位置并确定目标索引
+ var point = listView.PointToClient(new(e.X, e.Y));
+ var targetItem = listView.GetItemAt(point.X, point.Y);
+
+ // 高亮目标项
+ if (targetItem != null)
+ {
+ foreach (ListViewItem item in listView.Items)
+ {
+ item.BackColor = listView.BackColor;
+ }
+ targetItem.BackColor = Color.LightGray;
+ }
+ }
+
+ private void listView_DragDrop(object sender, DragEventArgs e)
+ {
+ // 获取拖放源项和目标项
+ var draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
+ int draggedIndex = draggedItem.Index;
+ var draggedSpine = spines[draggedIndex];
+
+ var point = listView.PointToClient(new Point(e.X, e.Y));
+ var targetItem = listView.GetItemAt(point.X, point.Y);
+ int targetIndex = targetItem is null ? listView.Items.Count : targetItem.Index;
+
+ if (targetIndex <= draggedIndex)
+ {
+ spines.RemoveAt(draggedIndex);
+ spines.Insert(targetIndex, draggedSpine);
+ listView.Items.RemoveAt(draggedIndex);
+ listView.Items.Insert(targetIndex, draggedItem);
+ }
+ else
+ {
+ spines.RemoveAt(draggedIndex);
+ spines.Insert(targetIndex - 1, draggedSpine);
+ listView.Items.RemoveAt(draggedIndex);
+ listView.Items.Insert(targetIndex - 1, draggedItem);
+ }
+
+ // 重置背景颜色
+ foreach (ListViewItem item in listView.Items)
+ {
+ item.BackColor = listView.BackColor;
+ }
+ }
}
}
diff --git a/SpineViewer/src/SpineListView.resx b/SpineViewer/src/SpineListView.resx
index 8b2ff64..a590340 100644
--- a/SpineViewer/src/SpineListView.resx
+++ b/SpineViewer/src/SpineListView.resx
@@ -117,4 +117,58 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAAGdJREFUSEvt
+ 0TEKgDAQRNG9/6VXItrsBL4JbqopnsWI+RAjM2NVRIxH1v0LGcgb243KQBwkMhAHiQzEQSID+SVYD+ny
+ tPRFMxl6Hb/S+lPJ7JAVMhAHiQzEQSIDcZDIQI4H7482Y8MFq6iYyveKOvcAAAAASUVORK5CYII=
+
+
+
+ 17, 17
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAADJJREFUSEtj
+ YBgFo2AUjIJRQDH4//8/mKIHhtqFKUFjjCFAWzwQQToKRsEoGAWjgDIAAEamd4nzZfPwAAAAAElFTkSu
+ QmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAAKtJREFUSEvt
+ jUEOxCAMA/n/p6m6aqV2nGBIpT1xGA5jB7fee1ultXY+nX4GEY57rDoqYgTHKqMiMjhC2M8QEcHPM3gX
+ IYLwUwfviYgvYzOjIkZjkY/caFSE+2DWZ6MqzOFKxlwGWQ4PFnN2potZj3nUefZsgVR7dzcNMr50L+Y/
+ iD5hTth/SZYj+AHziGdXQkdl8HVP4diDDhGOPegQ4diDDhGOvw/+jopjJwdgSnDyI6KwtwAAAABJRU5E
+ rkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAAKZJREFUSEvt
+ jTEOwDAIA/n/p1M1UqXW4BhIxwyXwTE+G2NYFTO7n4F5BhcoHllX6gLFESpcoDhChQsUR6hwgeIXYeW4
+ I3x3ywO7/ShYjux0J+wDj9kI/rPe05UFpNN599JF1lH/2PmUUweFP/wPheowm0cyKlwNZDImWwrZUAbc
+ SQs7UrxHXBCBowy8i3ABA8cR7DNcsAIlVdncwECxI5v3GGToym4u8Ptw8siITo4AAAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAALNJREFUSEvt
+ kUsKgDAMRHP/S1esCjrJNJ9SQXDxupjMB1Raa5JFRPanoR5BCR7XWHVUCR7/oIcSPL45mAlXBu/edMGs
+ 3xKGJTPeDjtgmJXgnfkur2tAKp67L2xkHu+Onoc5FEjc8G4OesGobo3RwVFBRGNjw0FWFAF7woOVUcwj
+ SrDAUgbmLJTAwHIE/QwljMCR7FjvQMFjZqznUYhQHetZFFZzPMZ/WcG5pQ+LUcJa3v6kGyUxwZMRgqWr
+ AAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAAPdJREFUSEu1
+ klsOwyAMBDlCjtL7X44qFiAyrA1E5GOqdr0PJWrKOaeU0v2R7+9f0Pe3H1+Nsl8Jx0bZa3gHhndhX+2c
+ Gt7AnsJltwXjj4URIt/GhkEvQI8HcxwzD0NekB5CvxozH4VJgXy9wifHwkGvaMXjjZmfAhFlbZT6bMwy
+ FBSiVMKcYhA8WC4In6z1UIgQI1tj1kHB4/6HiiGD3ohBUERju6ODoGC5B3OKQcCQfLLu7t48BmF1rPNN
+ PQ8/hZ2x4r3o87xycGcMuaUMQ6/Guvw0e2ysdExf77GxR2nQNTW8hX210z2cgL2Fb8Yq7H+INJ+i7/8D
+ i+nyJVO3bVgAAAAASUVORK5CYII=
+
+
\ No newline at end of file