diff --git a/SpineViewer/Controls/SpineListView.Designer.cs b/SpineViewer/Controls/SpineListView.Designer.cs index b4dbc48..734fe06 100644 --- a/SpineViewer/Controls/SpineListView.Designer.cs +++ b/SpineViewer/Controls/SpineListView.Designer.cs @@ -36,19 +36,23 @@ toolStripMenuItem_Insert = new ToolStripMenuItem(); toolStripMenuItem_Remove = new ToolStripMenuItem(); toolStripSeparator1 = new ToolStripSeparator(); - toolStripMenuItem_MoveUp = new ToolStripMenuItem(); - toolStripMenuItem_MoveDown = new ToolStripMenuItem(); - toolStripSeparator2 = new ToolStripSeparator(); toolStripMenuItem_BatchAdd = 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(); + toolStripMenuItem_CopyPreview = new ToolStripMenuItem(); toolStripMenuItem_ChangeView = new ToolStripMenuItem(); toolStripMenuItem_LargeIconView = new ToolStripMenuItem(); toolStripMenuItem_SmallIconView = new ToolStripMenuItem(); toolStripMenuItem_DetailsView = new ToolStripMenuItem(); imageList_LargeIcon = new ImageList(components); imageList_SmallIcon = new ImageList(components); - toolStripMenuItem_MoveTop = new ToolStripMenuItem(); + toolStripSeparator4 = new ToolStripSeparator(); + toolStripMenuItem_SelectAll = new ToolStripMenuItem(); contextMenuStrip.SuspendLayout(); SuspendLayout(); // @@ -73,7 +77,6 @@ listView.SelectedIndexChanged += listView_SelectedIndexChanged; listView.DragDrop += listView_DragDrop; listView.DragOver += listView_DragOver; - listView.KeyDown += listView_KeyDown; // // columnHeader_Name // @@ -83,103 +86,130 @@ // contextMenuStrip // 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.Size = new Size(241, 325); + contextMenuStrip.Size = new Size(329, 421); + contextMenuStrip.Closed += contextMenuStrip_Closed; contextMenuStrip.Opening += contextMenuStrip_Opening; // // toolStripMenuItem_Add // toolStripMenuItem_Add.Name = "toolStripMenuItem_Add"; - toolStripMenuItem_Add.Size = new Size(240, 30); - toolStripMenuItem_Add.Text = "添加(&A)..."; + toolStripMenuItem_Add.Size = new Size(328, 30); + toolStripMenuItem_Add.Text = "添加..."; toolStripMenuItem_Add.Click += toolStripMenuItem_Add_Click; // // toolStripMenuItem_Insert // - toolStripMenuItem_Insert.Enabled = false; toolStripMenuItem_Insert.Name = "toolStripMenuItem_Insert"; - toolStripMenuItem_Insert.Size = new Size(240, 30); - toolStripMenuItem_Insert.Text = "插入(&I)..."; + toolStripMenuItem_Insert.Size = new Size(328, 30); + toolStripMenuItem_Insert.Text = "插入..."; toolStripMenuItem_Insert.Click += toolStripMenuItem_Insert_Click; // // toolStripMenuItem_Remove // - toolStripMenuItem_Remove.Enabled = false; toolStripMenuItem_Remove.Name = "toolStripMenuItem_Remove"; - toolStripMenuItem_Remove.Size = new Size(240, 30); - toolStripMenuItem_Remove.Text = "移除(&R)"; + toolStripMenuItem_Remove.Size = new Size(328, 30); + toolStripMenuItem_Remove.Text = "移除"; toolStripMenuItem_Remove.Click += toolStripMenuItem_Remove_Click; // // 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.Name = "toolStripMenuItem_MoveUp"; - toolStripMenuItem_MoveUp.Size = new Size(240, 30); - toolStripMenuItem_MoveUp.Text = "上移(&U)"; + toolStripMenuItem_MoveUp.ShortcutKeys = Keys.Alt | Keys.W; + toolStripMenuItem_MoveUp.Size = new Size(328, 30); + toolStripMenuItem_MoveUp.Text = "上移"; toolStripMenuItem_MoveUp.Click += toolStripMenuItem_MoveUp_Click; // // toolStripMenuItem_MoveDown // toolStripMenuItem_MoveDown.Name = "toolStripMenuItem_MoveDown"; - toolStripMenuItem_MoveDown.Size = new Size(240, 30); - toolStripMenuItem_MoveDown.Text = "下移(&D)"; + toolStripMenuItem_MoveDown.ShortcutKeys = Keys.Alt | Keys.S; + toolStripMenuItem_MoveDown.Size = new Size(328, 30); + toolStripMenuItem_MoveDown.Text = "下移"; toolStripMenuItem_MoveDown.Click += toolStripMenuItem_MoveDown_Click; // - // toolStripSeparator2 + // toolStripMenuItem_MoveTop // - toolStripSeparator2.Name = "toolStripSeparator2"; - toolStripSeparator2.Size = new Size(237, 6); + toolStripMenuItem_MoveTop.Name = "toolStripMenuItem_MoveTop"; + 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_BatchAdd.Size = new Size(240, 30); - toolStripMenuItem_BatchAdd.Text = "批量添加(&B)..."; - toolStripMenuItem_BatchAdd.Click += toolStripMenuItem_BatchAdd_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; + toolStripMenuItem_MoveBottom.Name = "toolStripMenuItem_MoveBottom"; + toolStripMenuItem_MoveBottom.ShortcutKeys = Keys.Alt | Keys.Shift | Keys.S; + toolStripMenuItem_MoveBottom.Size = new Size(328, 30); + toolStripMenuItem_MoveBottom.Text = "置底"; + toolStripMenuItem_MoveBottom.Click += toolStripMenuItem_MoveBottom_Click; // // 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.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItem_LargeIconView, toolStripMenuItem_SmallIconView, toolStripMenuItem_DetailsView }); toolStripMenuItem_ChangeView.Name = "toolStripMenuItem_ChangeView"; - toolStripMenuItem_ChangeView.Size = new Size(240, 30); + toolStripMenuItem_ChangeView.Size = new Size(328, 30); toolStripMenuItem_ChangeView.Text = "切换视图"; // // 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.Click += toolStripMenuItem_LargeIconView_Click; // // 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.Click += toolStripMenuItem_SmallIconView_Click; // // 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.Click += toolStripMenuItem_DetailsView_Click; // @@ -195,12 +225,18 @@ imageList_SmallIcon.ImageSize = new Size(48, 48); imageList_SmallIcon.TransparentColor = Color.Transparent; // - // toolStripMenuItem_MoveTop + // toolStripSeparator4 // - toolStripMenuItem_MoveTop.Name = "toolStripMenuItem_MoveTop"; - toolStripMenuItem_MoveTop.Size = new Size(240, 30); - toolStripMenuItem_MoveTop.Text = "置顶(&T)"; - toolStripMenuItem_MoveTop.Click += toolStripMenuItem_MoveTop_Click; + toolStripSeparator4.Name = "toolStripSeparator4"; + toolStripSeparator4.Size = new Size(325, 6); + // + // 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 // @@ -234,5 +270,9 @@ private ToolStripMenuItem toolStripMenuItem_SmallIconView; private ToolStripMenuItem toolStripMenuItem_DetailsView; private ToolStripMenuItem toolStripMenuItem_MoveTop; + private ToolStripMenuItem toolStripMenuItem_MoveBottom; + private ToolStripMenuItem toolStripMenuItem_CopyPreview; + private ToolStripMenuItem toolStripMenuItem_SelectAll; + private ToolStripSeparator toolStripSeparator4; } } diff --git a/SpineViewer/Controls/SpineListView.cs b/SpineViewer/Controls/SpineListView.cs index eb43210..b56c00e 100644 --- a/SpineViewer/Controls/SpineListView.cs +++ b/SpineViewer/Controls/SpineListView.cs @@ -11,6 +11,7 @@ using System.Collections.ObjectModel; using SpineViewer.Spine; using System.Reflection; using System.Diagnostics; +using System.Collections.Specialized; namespace SpineViewer.Controls { @@ -63,6 +64,9 @@ namespace SpineViewer.Controls progressDialog.ShowDialog(); } + /// + /// 弹出对话框导出列表预览图 + /// public void ExportPreviews() { 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) { DoDragDrop(e.Item, DragDropEffects.Move); @@ -191,6 +182,7 @@ namespace SpineViewer.Controls toolStripMenuItem_MoveTop.Enabled = selectedCount == 1 && selectedIndices[0] != 0; toolStripMenuItem_MoveUp.Enabled = selectedCount == 1 && selectedIndices[0] != 0; toolStripMenuItem_MoveDown.Enabled = selectedCount == 1 && selectedIndices[0] != itemsCount - 1; + toolStripMenuItem_MoveBottom.Enabled = selectedCount == 1 && selectedIndices[0] != itemsCount - 1; toolStripMenuItem_RemoveAll.Enabled = itemsCount > 0; // 视图选项 @@ -199,6 +191,14 @@ namespace SpineViewer.Controls 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) { Insert(); @@ -248,7 +248,12 @@ namespace SpineViewer.Controls var index = listView.SelectedIndices[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]; listView.Items.RemoveAt(index); listView.Items.Insert(0, item); @@ -279,9 +284,32 @@ namespace SpineViewer.Controls if (index < listView.Items.Count - 1) { lock (Spines) { (spines[index], spines[index + 1]) = (spines[index + 1], spines[index]); } - var item = listView.Items[index + 1]; - listView.Items.RemoveAt(index + 1); - listView.Items.Insert(index, item); + var item = listView.Items[index]; + listView.Items.RemoveAt(index); + 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; } + 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) { listView.View = View.LargeIcon; diff --git a/SpineViewer/Program.cs b/SpineViewer/Program.cs index caac445..0d668ed 100644 --- a/SpineViewer/Program.cs +++ b/SpineViewer/Program.cs @@ -5,6 +5,8 @@ namespace SpineViewer { 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 Logger Logger = LogManager.GetCurrentClassLogger();