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