From 08a35cc5d1cce67aea70eece0cf2bc44c967d234 Mon Sep 17 00:00:00 2001 From: ww-rm Date: Fri, 21 Mar 2025 11:14:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ctrlV=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controls/SpineListView.Designer.cs | 14 +++- SpineViewer/Controls/SpineListView.cs | 68 ++++++++++++------- 2 files changed, 54 insertions(+), 28 deletions(-) diff --git a/SpineViewer/Controls/SpineListView.Designer.cs b/SpineViewer/Controls/SpineListView.Designer.cs index 886a86a..dee88a2 100644 --- a/SpineViewer/Controls/SpineListView.Designer.cs +++ b/SpineViewer/Controls/SpineListView.Designer.cs @@ -53,6 +53,7 @@ toolStripMenuItem_DetailsView = new ToolStripMenuItem(); imageList_LargeIcon = new ImageList(components); imageList_SmallIcon = new ImageList(components); + toolStripMenuItem_AddFromClipboard = new ToolStripMenuItem(); contextMenuStrip.SuspendLayout(); SuspendLayout(); // @@ -88,9 +89,9 @@ // contextMenuStrip // contextMenuStrip.ImageScalingSize = new Size(24, 24); - 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.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_CopyPreview, toolStripMenuItem_AddFromClipboard, toolStripMenuItem_SelectAll, toolStripSeparator4, toolStripMenuItem_ChangeView }); contextMenuStrip.Name = "contextMenuStrip"; - contextMenuStrip.Size = new Size(329, 388); + contextMenuStrip.Size = new Size(329, 451); contextMenuStrip.Closed += contextMenuStrip_Closed; contextMenuStrip.Opening += contextMenuStrip_Opening; // @@ -241,6 +242,14 @@ imageList_SmallIcon.ImageSize = new Size(48, 48); imageList_SmallIcon.TransparentColor = Color.Transparent; // + // toolStripMenuItem_AddFromClipboard + // + toolStripMenuItem_AddFromClipboard.Name = "toolStripMenuItem_AddFromClipboard"; + toolStripMenuItem_AddFromClipboard.ShortcutKeys = Keys.Control | Keys.V; + toolStripMenuItem_AddFromClipboard.Size = new Size(328, 30); + toolStripMenuItem_AddFromClipboard.Text = "从剪贴板添加"; + toolStripMenuItem_AddFromClipboard.Click += toolStripMenuItem_AddFromClipboard_Click; + // // SpineListView // AutoScaleDimensions = new SizeF(11F, 24F); @@ -277,5 +286,6 @@ private ToolStripMenuItem toolStripMenuItem_CopyPreview; private ToolStripMenuItem toolStripMenuItem_SelectAll; private ToolStripSeparator toolStripSeparator4; + private ToolStripMenuItem toolStripMenuItem_AddFromClipboard; } } diff --git a/SpineViewer/Controls/SpineListView.cs b/SpineViewer/Controls/SpineListView.cs index b8fe7e1..b10114c 100644 --- a/SpineViewer/Controls/SpineListView.cs +++ b/SpineViewer/Controls/SpineListView.cs @@ -138,7 +138,7 @@ namespace SpineViewer.Controls private void listView_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Serializable)) - { + { // 获取鼠标位置并确定目标索引 var point = listView.PointToClient(new(e.X, e.Y)); var targetItem = listView.GetItemAt(point.X, point.Y); @@ -197,23 +197,7 @@ namespace SpineViewer.Controls } else if (e.Data.GetDataPresent(DataFormats.FileDrop)) { - var validPaths = ((string[])e.Data.GetData(DataFormats.FileDrop)).Where( - path => File.Exists(path) && - (Path.GetExtension(path).Equals(".skel", StringComparison.OrdinalIgnoreCase) || - Path.GetExtension(path).Equals(".json", StringComparison.OrdinalIgnoreCase)) - ).ToArray(); - - if (validPaths.Length > 1) - { - var progressDialog = new Dialogs.ProgressDialog(); - progressDialog.DoWork += BatchAdd_Work; - progressDialog.RunWorkerAsync(new Dialogs.BatchOpenSpineDialogResult(Spine.Version.Auto, validPaths)); - progressDialog.ShowDialog(); - } - else if (validPaths.Length > 0) - { - Insert(new Dialogs.OpenSpineDialogResult(Spine.Version.Auto, validPaths[0])); - } + AddFromFileDrop((string[])e.Data.GetData(DataFormats.FileDrop)); } } @@ -383,14 +367,6 @@ 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(); @@ -411,6 +387,25 @@ namespace SpineViewer.Controls Clipboard.SetFileDropList(fileDropList); } + private void toolStripMenuItem_AddFromClipboard_Click(object sender, EventArgs e) + { + if (Clipboard.ContainsFileDropList()) + { + var fileDropList = Clipboard.GetFileDropList(); + var paths = new string[fileDropList.Count]; + fileDropList.CopyTo(paths, 0); + AddFromFileDrop(paths); + } + } + + 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_LargeIconView_Click(object sender, EventArgs e) { listView.View = View.LargeIcon; @@ -528,6 +523,27 @@ namespace SpineViewer.Controls Program.Logger.Info($"Current memory usage: {Program.Process.WorkingSet64 / 1024.0 / 1024.0:F2} MB"); } + private void AddFromFileDrop(string[] paths) + { + var validPaths = paths.Where( + path => File.Exists(path) && + (Path.GetExtension(path).Equals(".skel", StringComparison.OrdinalIgnoreCase) || + Path.GetExtension(path).Equals(".json", StringComparison.OrdinalIgnoreCase)) + ).ToArray(); + + if (validPaths.Length > 1) + { + var progressDialog = new Dialogs.ProgressDialog(); + progressDialog.DoWork += BatchAdd_Work; + progressDialog.RunWorkerAsync(new Dialogs.BatchOpenSpineDialogResult(Spine.Version.Auto, validPaths)); + progressDialog.ShowDialog(); + } + else if (validPaths.Length > 0) + { + Insert(new Dialogs.OpenSpineDialogResult(Spine.Version.Auto, validPaths[0])); + } + } + private void ExportPreview_Work(object? sender, DoWorkEventArgs e) { var worker = sender as BackgroundWorker;