diff --git a/SpineViewer/Controls/SpineListView.Designer.cs b/SpineViewer/Controls/SpineListView.Designer.cs index 734fe06..18e460e 100644 --- a/SpineViewer/Controls/SpineListView.Designer.cs +++ b/SpineViewer/Controls/SpineListView.Designer.cs @@ -44,15 +44,15 @@ toolStripMenuItem_MoveTop = new ToolStripMenuItem(); toolStripMenuItem_MoveBottom = new ToolStripMenuItem(); toolStripSeparator3 = new ToolStripSeparator(); + toolStripMenuItem_SelectAll = new ToolStripMenuItem(); toolStripMenuItem_CopyPreview = new ToolStripMenuItem(); + toolStripSeparator4 = new ToolStripSeparator(); 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); - toolStripSeparator4 = new ToolStripSeparator(); - toolStripMenuItem_SelectAll = new ToolStripMenuItem(); contextMenuStrip.SuspendLayout(); SuspendLayout(); // @@ -76,6 +76,7 @@ listView.ItemDrag += listView_ItemDrag; listView.SelectedIndexChanged += listView_SelectedIndexChanged; listView.DragDrop += listView_DragDrop; + listView.DragEnter += listView_DragEnter; listView.DragOver += listView_DragOver; // // columnHeader_Name @@ -88,7 +89,7 @@ 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.Name = "contextMenuStrip"; - contextMenuStrip.Size = new Size(329, 421); + contextMenuStrip.Size = new Size(329, 388); contextMenuStrip.Closed += contextMenuStrip_Closed; contextMenuStrip.Opening += contextMenuStrip_Opening; // @@ -174,6 +175,14 @@ toolStripSeparator3.Name = "toolStripSeparator3"; toolStripSeparator3.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; + // // toolStripMenuItem_CopyPreview // toolStripMenuItem_CopyPreview.Name = "toolStripMenuItem_CopyPreview"; @@ -182,6 +191,11 @@ toolStripMenuItem_CopyPreview.Text = "复制预览图 (256x256)"; toolStripMenuItem_CopyPreview.Click += toolStripMenuItem_CopyPreview_Click; // + // toolStripSeparator4 + // + toolStripSeparator4.Name = "toolStripSeparator4"; + toolStripSeparator4.Size = new Size(325, 6); + // // toolStripMenuItem_ChangeView // toolStripMenuItem_ChangeView.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItem_LargeIconView, toolStripMenuItem_SmallIconView, toolStripMenuItem_DetailsView }); @@ -193,7 +207,7 @@ // toolStripMenuItem_LargeIconView.Name = "toolStripMenuItem_LargeIconView"; toolStripMenuItem_LargeIconView.ShortcutKeys = Keys.Alt | Keys.D1; - toolStripMenuItem_LargeIconView.Size = new Size(270, 34); + toolStripMenuItem_LargeIconView.Size = new Size(223, 34); toolStripMenuItem_LargeIconView.Text = "大图标"; toolStripMenuItem_LargeIconView.Click += toolStripMenuItem_LargeIconView_Click; // @@ -201,7 +215,7 @@ // toolStripMenuItem_SmallIconView.Name = "toolStripMenuItem_SmallIconView"; toolStripMenuItem_SmallIconView.ShortcutKeys = Keys.Alt | Keys.D2; - toolStripMenuItem_SmallIconView.Size = new Size(270, 34); + toolStripMenuItem_SmallIconView.Size = new Size(223, 34); toolStripMenuItem_SmallIconView.Text = "小图标"; toolStripMenuItem_SmallIconView.Click += toolStripMenuItem_SmallIconView_Click; // @@ -209,7 +223,7 @@ // toolStripMenuItem_DetailsView.Name = "toolStripMenuItem_DetailsView"; toolStripMenuItem_DetailsView.ShortcutKeys = Keys.Alt | Keys.D3; - toolStripMenuItem_DetailsView.Size = new Size(270, 34); + toolStripMenuItem_DetailsView.Size = new Size(223, 34); toolStripMenuItem_DetailsView.Text = "列表"; toolStripMenuItem_DetailsView.Click += toolStripMenuItem_DetailsView_Click; // @@ -225,19 +239,6 @@ imageList_SmallIcon.ImageSize = new Size(48, 48); imageList_SmallIcon.TransparentColor = Color.Transparent; // - // toolStripSeparator4 - // - 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 // AutoScaleDimensions = new SizeF(11F, 24F); diff --git a/SpineViewer/Controls/SpineListView.cs b/SpineViewer/Controls/SpineListView.cs index b56c00e..a3ba932 100644 --- a/SpineViewer/Controls/SpineListView.cs +++ b/SpineViewer/Controls/SpineListView.cs @@ -60,7 +60,7 @@ namespace SpineViewer.Controls var progressDialog = new Dialogs.ProgressDialog(); progressDialog.DoWork += BatchAdd_Work; - progressDialog.RunWorkerAsync(openDialog); + progressDialog.RunWorkerAsync(openDialog.Result); progressDialog.ShowDialog(); } @@ -113,62 +113,95 @@ namespace SpineViewer.Controls DoDragDrop(e.Item, DragDropEffects.Move); } + private void listView_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.Serializable)) + e.Effect = DragDropEffects.Move; + else if (e.Data.GetDataPresent(DataFormats.FileDrop)) + e.Effect = DragDropEffects.Copy; + else + e.Effect = DragDropEffects.None; + } + private void listView_DragOver(object sender, DragEventArgs e) { - // 检查拖放目标是否有效 - e.Effect = DragDropEffects.Move; + if (e.Data.GetDataPresent(DataFormats.Serializable)) + { + // 获取鼠标位置并确定目标索引 + var point = listView.PointToClient(new(e.X, e.Y)); + var targetItem = listView.GetItemAt(point.X, point.Y); - // 获取鼠标位置并确定目标索引 - 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) + // 高亮目标项 + if (targetItem != null) { - item.BackColor = listView.BackColor; + foreach (ListViewItem item in listView.Items) + { + item.BackColor = listView.BackColor; + } + targetItem.BackColor = Color.LightGray; } - 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 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 (e.Data.GetDataPresent(DataFormats.Serializable)) + { + // 获取拖放源项和目标项 + var draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); + int draggedIndex = draggedItem.Index; + 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) - { - lock (Spines) + if (targetIndex <= draggedIndex) { - var draggedSpine = spines[draggedIndex]; - spines.RemoveAt(draggedIndex); - spines.Insert(targetIndex, draggedSpine); + lock (Spines) + { + var draggedSpine = spines[draggedIndex]; + spines.RemoveAt(draggedIndex); + spines.Insert(targetIndex, draggedSpine); + } + listView.Items.RemoveAt(draggedIndex); + listView.Items.Insert(targetIndex, draggedItem); } - listView.Items.RemoveAt(draggedIndex); - listView.Items.Insert(targetIndex, draggedItem); - } - else - { - lock (Spines) + else { - var draggedSpine = spines[draggedIndex]; - spines.RemoveAt(draggedIndex); - spines.Insert(targetIndex - 1, draggedSpine); + lock (Spines) + { + var draggedSpine = spines[draggedIndex]; + spines.RemoveAt(draggedIndex); + spines.Insert(targetIndex - 1, draggedSpine); + } + listView.Items.RemoveAt(draggedIndex); + listView.Items.Insert(targetIndex - 1, draggedItem); } - listView.Items.RemoveAt(draggedIndex); - listView.Items.Insert(targetIndex - 1, draggedItem); - } - // 重置背景颜色 - foreach (ListViewItem item in listView.Items) + // 重置背景颜色 + foreach (ListViewItem item in listView.Items) + { + item.BackColor = listView.BackColor; + } + } + else if (e.Data.GetDataPresent(DataFormats.FileDrop)) { - item.BackColor = listView.BackColor; + 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])); + } } } @@ -386,9 +419,14 @@ namespace SpineViewer.Controls if (dialog.ShowDialog() != DialogResult.OK) return; + Insert(dialog.Result, index); + } + + private void Insert(Dialogs.OpenSpineDialogResult result, int index = -1) + { try { - var spine = Spine.Spine.New(dialog.Version, dialog.SkelPath, dialog.AtlasPath); + var spine = Spine.Spine.New(result.Version, result.SkelPath, result.AtlasPath); // 如果索引无效则在末尾添加 if (index < 0 || index > listView.Items.Count) @@ -410,7 +448,7 @@ namespace SpineViewer.Controls catch (Exception ex) { Program.Logger.Error(ex.ToString()); - Program.Logger.Error("Failed to load {} {}", dialog.SkelPath, dialog.AtlasPath); + Program.Logger.Error("Failed to load {} {}", result.SkelPath, result.AtlasPath); MessageBox.Show(ex.ToString(), "骨骼加载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -420,7 +458,7 @@ namespace SpineViewer.Controls private void BatchAdd_Work(object? sender, DoWorkEventArgs e) { var worker = sender as BackgroundWorker; - var arguments = e.Argument as Dialogs.BatchOpenSpineDialog; + var arguments = e.Argument as Dialogs.BatchOpenSpineDialogResult; var skelPaths = arguments.SkelPaths; var version = arguments.Version;