优化列表右键菜单功能

This commit is contained in:
ww-rm
2025-03-20 00:10:09 +08:00
parent 5cf30f391b
commit 914d02e754
3 changed files with 161 additions and 63 deletions

View File

@@ -36,19 +36,23 @@
toolStripMenuItem_Insert = new ToolStripMenuItem(); toolStripMenuItem_Insert = new ToolStripMenuItem();
toolStripMenuItem_Remove = new ToolStripMenuItem(); toolStripMenuItem_Remove = new ToolStripMenuItem();
toolStripSeparator1 = new ToolStripSeparator(); toolStripSeparator1 = new ToolStripSeparator();
toolStripMenuItem_MoveUp = new ToolStripMenuItem();
toolStripMenuItem_MoveDown = new ToolStripMenuItem();
toolStripSeparator2 = new ToolStripSeparator();
toolStripMenuItem_BatchAdd = new ToolStripMenuItem(); toolStripMenuItem_BatchAdd = new ToolStripMenuItem();
toolStripMenuItem_RemoveAll = new ToolStripMenuItem(); toolStripMenuItem_RemoveAll = new ToolStripMenuItem();
toolStripSeparator2 = new ToolStripSeparator();
toolStripMenuItem_MoveUp = new ToolStripMenuItem();
toolStripMenuItem_MoveDown = new ToolStripMenuItem();
toolStripMenuItem_MoveTop = new ToolStripMenuItem();
toolStripMenuItem_MoveBottom = new ToolStripMenuItem();
toolStripSeparator3 = new ToolStripSeparator(); toolStripSeparator3 = new ToolStripSeparator();
toolStripMenuItem_CopyPreview = new ToolStripMenuItem();
toolStripMenuItem_ChangeView = new ToolStripMenuItem(); toolStripMenuItem_ChangeView = new ToolStripMenuItem();
toolStripMenuItem_LargeIconView = new ToolStripMenuItem(); toolStripMenuItem_LargeIconView = new ToolStripMenuItem();
toolStripMenuItem_SmallIconView = new ToolStripMenuItem(); toolStripMenuItem_SmallIconView = new ToolStripMenuItem();
toolStripMenuItem_DetailsView = new ToolStripMenuItem(); toolStripMenuItem_DetailsView = new ToolStripMenuItem();
imageList_LargeIcon = new ImageList(components); imageList_LargeIcon = new ImageList(components);
imageList_SmallIcon = new ImageList(components); imageList_SmallIcon = new ImageList(components);
toolStripMenuItem_MoveTop = new ToolStripMenuItem(); toolStripSeparator4 = new ToolStripSeparator();
toolStripMenuItem_SelectAll = new ToolStripMenuItem();
contextMenuStrip.SuspendLayout(); contextMenuStrip.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
@@ -73,7 +77,6 @@
listView.SelectedIndexChanged += listView_SelectedIndexChanged; listView.SelectedIndexChanged += listView_SelectedIndexChanged;
listView.DragDrop += listView_DragDrop; listView.DragDrop += listView_DragDrop;
listView.DragOver += listView_DragOver; listView.DragOver += listView_DragOver;
listView.KeyDown += listView_KeyDown;
// //
// columnHeader_Name // columnHeader_Name
// //
@@ -83,103 +86,130 @@
// contextMenuStrip // contextMenuStrip
// //
contextMenuStrip.ImageScalingSize = new Size(24, 24); contextMenuStrip.ImageScalingSize = new Size(24, 24);
contextMenuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem_Add, toolStripMenuItem_Insert, toolStripMenuItem_Remove, toolStripSeparator1, toolStripMenuItem_MoveTop, toolStripMenuItem_MoveUp, toolStripMenuItem_MoveDown, toolStripSeparator2, toolStripMenuItem_BatchAdd, toolStripMenuItem_RemoveAll, toolStripSeparator3, toolStripMenuItem_ChangeView }); contextMenuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem_Add, toolStripMenuItem_Insert, toolStripMenuItem_Remove, toolStripSeparator1, toolStripMenuItem_BatchAdd, toolStripMenuItem_RemoveAll, toolStripSeparator2, toolStripMenuItem_MoveUp, toolStripMenuItem_MoveDown, toolStripMenuItem_MoveTop, toolStripMenuItem_MoveBottom, toolStripSeparator3, toolStripMenuItem_SelectAll, toolStripMenuItem_CopyPreview, toolStripSeparator4, toolStripMenuItem_ChangeView });
contextMenuStrip.Name = "contextMenuStrip"; contextMenuStrip.Name = "contextMenuStrip";
contextMenuStrip.Size = new Size(241, 325); contextMenuStrip.Size = new Size(329, 421);
contextMenuStrip.Closed += contextMenuStrip_Closed;
contextMenuStrip.Opening += contextMenuStrip_Opening; contextMenuStrip.Opening += contextMenuStrip_Opening;
// //
// toolStripMenuItem_Add // toolStripMenuItem_Add
// //
toolStripMenuItem_Add.Name = "toolStripMenuItem_Add"; toolStripMenuItem_Add.Name = "toolStripMenuItem_Add";
toolStripMenuItem_Add.Size = new Size(240, 30); toolStripMenuItem_Add.Size = new Size(328, 30);
toolStripMenuItem_Add.Text = "添加(&A)..."; toolStripMenuItem_Add.Text = "添加...";
toolStripMenuItem_Add.Click += toolStripMenuItem_Add_Click; toolStripMenuItem_Add.Click += toolStripMenuItem_Add_Click;
// //
// toolStripMenuItem_Insert // toolStripMenuItem_Insert
// //
toolStripMenuItem_Insert.Enabled = false;
toolStripMenuItem_Insert.Name = "toolStripMenuItem_Insert"; toolStripMenuItem_Insert.Name = "toolStripMenuItem_Insert";
toolStripMenuItem_Insert.Size = new Size(240, 30); toolStripMenuItem_Insert.Size = new Size(328, 30);
toolStripMenuItem_Insert.Text = "插入(&I)..."; toolStripMenuItem_Insert.Text = "插入...";
toolStripMenuItem_Insert.Click += toolStripMenuItem_Insert_Click; toolStripMenuItem_Insert.Click += toolStripMenuItem_Insert_Click;
// //
// toolStripMenuItem_Remove // toolStripMenuItem_Remove
// //
toolStripMenuItem_Remove.Enabled = false;
toolStripMenuItem_Remove.Name = "toolStripMenuItem_Remove"; toolStripMenuItem_Remove.Name = "toolStripMenuItem_Remove";
toolStripMenuItem_Remove.Size = new Size(240, 30); toolStripMenuItem_Remove.Size = new Size(328, 30);
toolStripMenuItem_Remove.Text = "移除(&R)"; toolStripMenuItem_Remove.Text = "移除";
toolStripMenuItem_Remove.Click += toolStripMenuItem_Remove_Click; toolStripMenuItem_Remove.Click += toolStripMenuItem_Remove_Click;
// //
// toolStripSeparator1 // toolStripSeparator1
// //
toolStripSeparator1.Name = "toolStripSeparator1"; toolStripSeparator1.Name = "toolStripSeparator1";
toolStripSeparator1.Size = new Size(237, 6); toolStripSeparator1.Size = new Size(325, 6);
//
// toolStripMenuItem_BatchAdd
//
toolStripMenuItem_BatchAdd.Name = "toolStripMenuItem_BatchAdd";
toolStripMenuItem_BatchAdd.Size = new Size(328, 30);
toolStripMenuItem_BatchAdd.Text = "批量添加...";
toolStripMenuItem_BatchAdd.Click += toolStripMenuItem_BatchAdd_Click;
//
// toolStripMenuItem_RemoveAll
//
toolStripMenuItem_RemoveAll.Name = "toolStripMenuItem_RemoveAll";
toolStripMenuItem_RemoveAll.Size = new Size(328, 30);
toolStripMenuItem_RemoveAll.Text = "移除全部";
toolStripMenuItem_RemoveAll.Click += toolStripMenuItem_RemoveAll_Click;
//
// toolStripSeparator2
//
toolStripSeparator2.Name = "toolStripSeparator2";
toolStripSeparator2.Size = new Size(325, 6);
// //
// toolStripMenuItem_MoveUp // toolStripMenuItem_MoveUp
// //
toolStripMenuItem_MoveUp.Name = "toolStripMenuItem_MoveUp"; toolStripMenuItem_MoveUp.Name = "toolStripMenuItem_MoveUp";
toolStripMenuItem_MoveUp.Size = new Size(240, 30); toolStripMenuItem_MoveUp.ShortcutKeys = Keys.Alt | Keys.W;
toolStripMenuItem_MoveUp.Text = "上移(&U)"; toolStripMenuItem_MoveUp.Size = new Size(328, 30);
toolStripMenuItem_MoveUp.Text = "上移";
toolStripMenuItem_MoveUp.Click += toolStripMenuItem_MoveUp_Click; toolStripMenuItem_MoveUp.Click += toolStripMenuItem_MoveUp_Click;
// //
// toolStripMenuItem_MoveDown // toolStripMenuItem_MoveDown
// //
toolStripMenuItem_MoveDown.Name = "toolStripMenuItem_MoveDown"; toolStripMenuItem_MoveDown.Name = "toolStripMenuItem_MoveDown";
toolStripMenuItem_MoveDown.Size = new Size(240, 30); toolStripMenuItem_MoveDown.ShortcutKeys = Keys.Alt | Keys.S;
toolStripMenuItem_MoveDown.Text = "下移(&D)"; toolStripMenuItem_MoveDown.Size = new Size(328, 30);
toolStripMenuItem_MoveDown.Text = "下移";
toolStripMenuItem_MoveDown.Click += toolStripMenuItem_MoveDown_Click; toolStripMenuItem_MoveDown.Click += toolStripMenuItem_MoveDown_Click;
// //
// toolStripSeparator2 // toolStripMenuItem_MoveTop
// //
toolStripSeparator2.Name = "toolStripSeparator2"; toolStripMenuItem_MoveTop.Name = "toolStripMenuItem_MoveTop";
toolStripSeparator2.Size = new Size(237, 6); toolStripMenuItem_MoveTop.ShortcutKeys = Keys.Alt | Keys.Shift | Keys.W;
toolStripMenuItem_MoveTop.Size = new Size(328, 30);
toolStripMenuItem_MoveTop.Text = "置顶";
toolStripMenuItem_MoveTop.Click += toolStripMenuItem_MoveTop_Click;
// //
// toolStripMenuItem_BatchAdd // toolStripMenuItem_MoveBottom
// //
toolStripMenuItem_BatchAdd.Name = "toolStripMenuItem_BatchAdd"; toolStripMenuItem_MoveBottom.Name = "toolStripMenuItem_MoveBottom";
toolStripMenuItem_BatchAdd.Size = new Size(240, 30); toolStripMenuItem_MoveBottom.ShortcutKeys = Keys.Alt | Keys.Shift | Keys.S;
toolStripMenuItem_BatchAdd.Text = "批量添加(&B)..."; toolStripMenuItem_MoveBottom.Size = new Size(328, 30);
toolStripMenuItem_BatchAdd.Click += toolStripMenuItem_BatchAdd_Click; toolStripMenuItem_MoveBottom.Text = "置底";
// toolStripMenuItem_MoveBottom.Click += toolStripMenuItem_MoveBottom_Click;
// toolStripMenuItem_RemoveAll
//
toolStripMenuItem_RemoveAll.Enabled = false;
toolStripMenuItem_RemoveAll.Name = "toolStripMenuItem_RemoveAll";
toolStripMenuItem_RemoveAll.Size = new Size(240, 30);
toolStripMenuItem_RemoveAll.Text = "移除全部(&X)";
toolStripMenuItem_RemoveAll.Click += toolStripMenuItem_RemoveAll_Click;
// //
// toolStripSeparator3 // toolStripSeparator3
// //
toolStripSeparator3.Name = "toolStripSeparator3"; toolStripSeparator3.Name = "toolStripSeparator3";
toolStripSeparator3.Size = new Size(237, 6); toolStripSeparator3.Size = new Size(325, 6);
//
// toolStripMenuItem_CopyPreview
//
toolStripMenuItem_CopyPreview.Name = "toolStripMenuItem_CopyPreview";
toolStripMenuItem_CopyPreview.ShortcutKeys = Keys.Control | Keys.C;
toolStripMenuItem_CopyPreview.Size = new Size(328, 30);
toolStripMenuItem_CopyPreview.Text = "复制预览图 (256x256)";
toolStripMenuItem_CopyPreview.Click += toolStripMenuItem_CopyPreview_Click;
// //
// toolStripMenuItem_ChangeView // toolStripMenuItem_ChangeView
// //
toolStripMenuItem_ChangeView.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItem_LargeIconView, toolStripMenuItem_SmallIconView, toolStripMenuItem_DetailsView }); toolStripMenuItem_ChangeView.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItem_LargeIconView, toolStripMenuItem_SmallIconView, toolStripMenuItem_DetailsView });
toolStripMenuItem_ChangeView.Name = "toolStripMenuItem_ChangeView"; toolStripMenuItem_ChangeView.Name = "toolStripMenuItem_ChangeView";
toolStripMenuItem_ChangeView.Size = new Size(240, 30); toolStripMenuItem_ChangeView.Size = new Size(328, 30);
toolStripMenuItem_ChangeView.Text = "切换视图"; toolStripMenuItem_ChangeView.Text = "切换视图";
// //
// toolStripMenuItem_LargeIconView // toolStripMenuItem_LargeIconView
// //
toolStripMenuItem_LargeIconView.Name = "toolStripMenuItem_LargeIconView"; toolStripMenuItem_LargeIconView.Name = "toolStripMenuItem_LargeIconView";
toolStripMenuItem_LargeIconView.Size = new Size(164, 34); toolStripMenuItem_LargeIconView.ShortcutKeys = Keys.Alt | Keys.D1;
toolStripMenuItem_LargeIconView.Size = new Size(270, 34);
toolStripMenuItem_LargeIconView.Text = "大图标"; toolStripMenuItem_LargeIconView.Text = "大图标";
toolStripMenuItem_LargeIconView.Click += toolStripMenuItem_LargeIconView_Click; toolStripMenuItem_LargeIconView.Click += toolStripMenuItem_LargeIconView_Click;
// //
// toolStripMenuItem_SmallIconView // toolStripMenuItem_SmallIconView
// //
toolStripMenuItem_SmallIconView.Name = "toolStripMenuItem_SmallIconView"; toolStripMenuItem_SmallIconView.Name = "toolStripMenuItem_SmallIconView";
toolStripMenuItem_SmallIconView.Size = new Size(164, 34); toolStripMenuItem_SmallIconView.ShortcutKeys = Keys.Alt | Keys.D2;
toolStripMenuItem_SmallIconView.Size = new Size(270, 34);
toolStripMenuItem_SmallIconView.Text = "小图标"; toolStripMenuItem_SmallIconView.Text = "小图标";
toolStripMenuItem_SmallIconView.Click += toolStripMenuItem_SmallIconView_Click; toolStripMenuItem_SmallIconView.Click += toolStripMenuItem_SmallIconView_Click;
// //
// toolStripMenuItem_DetailsView // toolStripMenuItem_DetailsView
// //
toolStripMenuItem_DetailsView.Name = "toolStripMenuItem_DetailsView"; toolStripMenuItem_DetailsView.Name = "toolStripMenuItem_DetailsView";
toolStripMenuItem_DetailsView.Size = new Size(164, 34); toolStripMenuItem_DetailsView.ShortcutKeys = Keys.Alt | Keys.D3;
toolStripMenuItem_DetailsView.Size = new Size(270, 34);
toolStripMenuItem_DetailsView.Text = "列表"; toolStripMenuItem_DetailsView.Text = "列表";
toolStripMenuItem_DetailsView.Click += toolStripMenuItem_DetailsView_Click; toolStripMenuItem_DetailsView.Click += toolStripMenuItem_DetailsView_Click;
// //
@@ -195,12 +225,18 @@
imageList_SmallIcon.ImageSize = new Size(48, 48); imageList_SmallIcon.ImageSize = new Size(48, 48);
imageList_SmallIcon.TransparentColor = Color.Transparent; imageList_SmallIcon.TransparentColor = Color.Transparent;
// //
// toolStripMenuItem_MoveTop // toolStripSeparator4
// //
toolStripMenuItem_MoveTop.Name = "toolStripMenuItem_MoveTop"; toolStripSeparator4.Name = "toolStripSeparator4";
toolStripMenuItem_MoveTop.Size = new Size(240, 30); toolStripSeparator4.Size = new Size(325, 6);
toolStripMenuItem_MoveTop.Text = "置顶(&T)"; //
toolStripMenuItem_MoveTop.Click += toolStripMenuItem_MoveTop_Click; // toolStripMenuItem_SelectAll
//
toolStripMenuItem_SelectAll.Name = "toolStripMenuItem_SelectAll";
toolStripMenuItem_SelectAll.ShortcutKeys = Keys.Control | Keys.A;
toolStripMenuItem_SelectAll.Size = new Size(328, 30);
toolStripMenuItem_SelectAll.Text = "全选";
toolStripMenuItem_SelectAll.Click += toolStripMenuItem_SelectAll_Click;
// //
// SpineListView // SpineListView
// //
@@ -234,5 +270,9 @@
private ToolStripMenuItem toolStripMenuItem_SmallIconView; private ToolStripMenuItem toolStripMenuItem_SmallIconView;
private ToolStripMenuItem toolStripMenuItem_DetailsView; private ToolStripMenuItem toolStripMenuItem_DetailsView;
private ToolStripMenuItem toolStripMenuItem_MoveTop; private ToolStripMenuItem toolStripMenuItem_MoveTop;
private ToolStripMenuItem toolStripMenuItem_MoveBottom;
private ToolStripMenuItem toolStripMenuItem_CopyPreview;
private ToolStripMenuItem toolStripMenuItem_SelectAll;
private ToolStripSeparator toolStripSeparator4;
} }
} }

View File

@@ -11,6 +11,7 @@ using System.Collections.ObjectModel;
using SpineViewer.Spine; using SpineViewer.Spine;
using System.Reflection; using System.Reflection;
using System.Diagnostics; using System.Diagnostics;
using System.Collections.Specialized;
namespace SpineViewer.Controls namespace SpineViewer.Controls
{ {
@@ -63,6 +64,9 @@ namespace SpineViewer.Controls
progressDialog.ShowDialog(); progressDialog.ShowDialog();
} }
/// <summary>
/// 弹出对话框导出列表预览图
/// </summary>
public void ExportPreviews() public void ExportPreviews()
{ {
lock (Spines) lock (Spines)
@@ -104,19 +108,6 @@ namespace SpineViewer.Controls
} }
} }
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) private void listView_ItemDrag(object sender, ItemDragEventArgs e)
{ {
DoDragDrop(e.Item, DragDropEffects.Move); DoDragDrop(e.Item, DragDropEffects.Move);
@@ -191,6 +182,7 @@ namespace SpineViewer.Controls
toolStripMenuItem_MoveTop.Enabled = selectedCount == 1 && selectedIndices[0] != 0; toolStripMenuItem_MoveTop.Enabled = selectedCount == 1 && selectedIndices[0] != 0;
toolStripMenuItem_MoveUp.Enabled = selectedCount == 1 && selectedIndices[0] != 0; toolStripMenuItem_MoveUp.Enabled = selectedCount == 1 && selectedIndices[0] != 0;
toolStripMenuItem_MoveDown.Enabled = selectedCount == 1 && selectedIndices[0] != itemsCount - 1; toolStripMenuItem_MoveDown.Enabled = selectedCount == 1 && selectedIndices[0] != itemsCount - 1;
toolStripMenuItem_MoveBottom.Enabled = selectedCount == 1 && selectedIndices[0] != itemsCount - 1;
toolStripMenuItem_RemoveAll.Enabled = itemsCount > 0; toolStripMenuItem_RemoveAll.Enabled = itemsCount > 0;
// 视图选项 // 视图选项
@@ -199,6 +191,14 @@ namespace SpineViewer.Controls
toolStripMenuItem_DetailsView.Checked = listView.View == View.Details; toolStripMenuItem_DetailsView.Checked = listView.View == View.Details;
} }
private void contextMenuStrip_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
// 不显示菜单的时候需要把菜单的各项功能启用, 这样才能正常捕获快捷键
foreach (var item in contextMenuStrip.Items)
if (item is ToolStripMenuItem tsmi)
tsmi.Enabled = true;
}
private void toolStripMenuItem_Add_Click(object sender, EventArgs e) private void toolStripMenuItem_Add_Click(object sender, EventArgs e)
{ {
Insert(); Insert();
@@ -248,7 +248,12 @@ namespace SpineViewer.Controls
var index = listView.SelectedIndices[0]; var index = listView.SelectedIndices[0];
if (index > 0) if (index > 0)
{ {
lock (Spines) { (spines[0], spines[index]) = (spines[index], spines[0]); } lock (Spines)
{
var spine = spines[index];
spines.RemoveAt(index);
spines.Insert(0, spine);
}
var item = listView.Items[index]; var item = listView.Items[index];
listView.Items.RemoveAt(index); listView.Items.RemoveAt(index);
listView.Items.Insert(0, item); listView.Items.Insert(0, item);
@@ -279,9 +284,32 @@ namespace SpineViewer.Controls
if (index < listView.Items.Count - 1) if (index < listView.Items.Count - 1)
{ {
lock (Spines) { (spines[index], spines[index + 1]) = (spines[index + 1], spines[index]); } lock (Spines) { (spines[index], spines[index + 1]) = (spines[index + 1], spines[index]); }
var item = listView.Items[index + 1]; var item = listView.Items[index];
listView.Items.RemoveAt(index + 1); listView.Items.RemoveAt(index);
listView.Items.Insert(index, item); listView.Items.Insert(index + 1, item);
}
}
private void toolStripMenuItem_MoveBottom_Click(object sender, EventArgs e)
{
if (listView.SelectedIndices.Count != 1)
return;
var index = listView.SelectedIndices[0];
if (index < listView.Items.Count - 1)
{
lock (Spines)
{
lock (Spines)
{
var spine = spines[index];
spines.RemoveAt(index);
spines.Add(spine);
}
}
var item = listView.Items[index];
listView.Items.RemoveAt(index);
listView.Items.Add(item);
} }
} }
@@ -306,6 +334,34 @@ namespace SpineViewer.Controls
PropertyGrid.SelectedObject = null; PropertyGrid.SelectedObject = null;
} }
private void toolStripMenuItem_SelectAll_Click(object sender, EventArgs e)
{
listView.BeginUpdate();
foreach (ListViewItem item in listView.Items)
item.Selected = true;
listView.EndUpdate();
}
private void toolStripMenuItem_CopyPreview_Click(object sender, EventArgs e)
{
var fileDropList = new StringCollection();
lock (Spines)
{
foreach (int i in listView.SelectedIndices)
{
var spine = spines[i];
var image = spine.Preview;
var path = Path.Combine(Program.TempDir, $"{spine.ID}.png");
using (var clone = new Bitmap(image))
clone.Save(path);
fileDropList.Add(path);
}
}
if (fileDropList.Count > 0)
Clipboard.SetFileDropList(fileDropList);
}
private void toolStripMenuItem_LargeIconView_Click(object sender, EventArgs e) private void toolStripMenuItem_LargeIconView_Click(object sender, EventArgs e)
{ {
listView.View = View.LargeIcon; listView.View = View.LargeIcon;

View File

@@ -5,6 +5,8 @@ namespace SpineViewer
{ {
internal static class Program internal static class Program
{ {
public const string Name = "SpineViewer";
public static readonly string TempDir = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Name)).FullName;
public static readonly Process Process = Process.GetCurrentProcess(); public static readonly Process Process = Process.GetCurrentProcess();
public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public static readonly Logger Logger = LogManager.GetCurrentClassLogger();