From 443d88d1959c1d100392c28c3af9d3d4af09aceb Mon Sep 17 00:00:00 2001 From: Nikolaj Olsson Date: Sun, 28 Apr 2024 18:33:49 +0200 Subject: [PATCH] Allow sort/move for "Add end time of prev" in "Join subtitles" - thx Leon :) Work on #8257 --- src/ui/Forms/JoinSubtitles.Designer.cs | 58 +++++++ src/ui/Forms/JoinSubtitles.cs | 204 +++++++++++++++++++++++++ src/ui/Forms/JoinSubtitles.resx | 3 + src/ui/Logic/ListViewSorter.cs | 2 +- 4 files changed, 266 insertions(+), 1 deletion(-) diff --git a/src/ui/Forms/JoinSubtitles.Designer.cs b/src/ui/Forms/JoinSubtitles.Designer.cs index 69208c17e..b04b216ac 100644 --- a/src/ui/Forms/JoinSubtitles.Designer.cs +++ b/src/ui/Forms/JoinSubtitles.Designer.cs @@ -28,6 +28,7 @@ /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); this.buttonCancel = new System.Windows.Forms.Button(); this.buttonJoin = new System.Windows.Forms.Button(); this.listViewParts = new System.Windows.Forms.ListView(); @@ -45,7 +46,13 @@ this.numericUpDownAddMs = new Nikse.SubtitleEdit.Controls.NikseUpDown(); this.radioButtonJoinAddTime = new System.Windows.Forms.RadioButton(); this.labelAddTime = new Nikse.SubtitleEdit.Controls.NikseLabel(); + this.contextMenuStripParts = new System.Windows.Forms.ContextMenuStrip(this.components); + this.moveUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveBottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.groupBoxPreview.SuspendLayout(); + this.contextMenuStripParts.SuspendLayout(); this.SuspendLayout(); // // buttonCancel @@ -83,6 +90,7 @@ this.columnHeaderStartTime, this.columnHeaderEndTime, this.columnHeaderFileName}); + this.listViewParts.ContextMenuStrip = this.contextMenuStripParts; this.listViewParts.FullRowSelect = true; this.listViewParts.HideSelection = false; this.listViewParts.Location = new System.Drawing.Point(6, 19); @@ -91,6 +99,7 @@ this.listViewParts.TabIndex = 101; this.listViewParts.UseCompatibleStateImageBehavior = false; this.listViewParts.View = System.Windows.Forms.View.Details; + this.listViewParts.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewParts_ColumnClick); this.listViewParts.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewParts_DragDrop); this.listViewParts.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewParts_DragEnter); // @@ -252,6 +261,49 @@ this.labelAddTime.TabIndex = 34; this.labelAddTime.Text = "Add milliseconds after each file"; // + // contextMenuStripParts + // + this.contextMenuStripParts.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.moveUpToolStripMenuItem, + this.moveDownToolStripMenuItem, + this.moveTopToolStripMenuItem, + this.moveBottomToolStripMenuItem}); + this.contextMenuStripParts.Name = "contextMenuStrip1"; + this.contextMenuStripParts.Size = new System.Drawing.Size(216, 92); + this.contextMenuStripParts.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripParts_Opening); + // + // moveUpToolStripMenuItem + // + this.moveUpToolStripMenuItem.Name = "moveUpToolStripMenuItem"; + this.moveUpToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); + this.moveUpToolStripMenuItem.Size = new System.Drawing.Size(215, 22); + this.moveUpToolStripMenuItem.Text = "Move up"; + this.moveUpToolStripMenuItem.Click += new System.EventHandler(this.moveUpToolStripMenuItem_Click); + // + // moveDownToolStripMenuItem + // + this.moveDownToolStripMenuItem.Name = "moveDownToolStripMenuItem"; + this.moveDownToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); + this.moveDownToolStripMenuItem.Size = new System.Drawing.Size(215, 22); + this.moveDownToolStripMenuItem.Text = "Move down"; + this.moveDownToolStripMenuItem.Click += new System.EventHandler(this.moveDownToolStripMenuItem_Click); + // + // moveTopToolStripMenuItem + // + this.moveTopToolStripMenuItem.Name = "moveTopToolStripMenuItem"; + this.moveTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Home))); + this.moveTopToolStripMenuItem.Size = new System.Drawing.Size(215, 22); + this.moveTopToolStripMenuItem.Text = "Move to top"; + this.moveTopToolStripMenuItem.Click += new System.EventHandler(this.moveTopToolStripMenuItem_Click); + // + // moveBottomToolStripMenuItem + // + this.moveBottomToolStripMenuItem.Name = "moveBottomToolStripMenuItem"; + this.moveBottomToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.End))); + this.moveBottomToolStripMenuItem.Size = new System.Drawing.Size(215, 22); + this.moveBottomToolStripMenuItem.Text = "Move to bottom"; + this.moveBottomToolStripMenuItem.Click += new System.EventHandler(this.moveBottomToolStripMenuItem_Click); + // // JoinSubtitles // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -279,6 +331,7 @@ this.Resize += new System.EventHandler(this.JoinSubtitles_Resize); this.groupBoxPreview.ResumeLayout(false); this.groupBoxPreview.PerformLayout(); + this.contextMenuStripParts.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -303,5 +356,10 @@ private Nikse.SubtitleEdit.Controls.NikseUpDown numericUpDownAddMs; private System.Windows.Forms.RadioButton radioButtonJoinAddTime; private Nikse.SubtitleEdit.Controls.NikseLabel labelAddTime; + private System.Windows.Forms.ContextMenuStrip contextMenuStripParts; + private System.Windows.Forms.ToolStripMenuItem moveUpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveDownToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveTopToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveBottomToolStripMenuItem; } } \ No newline at end of file diff --git a/src/ui/Forms/JoinSubtitles.cs b/src/ui/Forms/JoinSubtitles.cs index 823bf5d55..79e3b69ae 100644 --- a/src/ui/Forms/JoinSubtitles.cs +++ b/src/ui/Forms/JoinSubtitles.cs @@ -30,6 +30,11 @@ namespace Nikse.SubtitleEdit.Forms listViewParts.Columns[2].Text = LanguageSettings.Current.JoinSubtitles.EndTime; listViewParts.Columns[3].Text = LanguageSettings.Current.JoinSubtitles.FileName; + moveUpToolStripMenuItem.Text = LanguageSettings.Current.DvdSubRip.MoveUp; + moveDownToolStripMenuItem.Text = LanguageSettings.Current.DvdSubRip.MoveDown; + moveTopToolStripMenuItem.Text = LanguageSettings.Current.MultipleReplace.MoveToTop; + moveBottomToolStripMenuItem.Text = LanguageSettings.Current.MultipleReplace.MoveToBottom; + buttonAddFile.Text = LanguageSettings.Current.DvdSubRip.Add; buttonRemoveFile.Text = LanguageSettings.Current.DvdSubRip.Remove; buttonClear.Text = LanguageSettings.Current.DvdSubRip.Clear; @@ -388,6 +393,7 @@ namespace Nikse.SubtitleEdit.Forms { MessageBox.Show(sb.ToString()); } + JoinSubtitles_Resize(sender, e); } } @@ -438,5 +444,203 @@ namespace Nikse.SubtitleEdit.Forms labelAddTime.Enabled = radioButtonJoinAddTime.Checked; SortAndLoad(); } + + private void contextMenuStripParts_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + if (radioButtonJoinPlain.Checked) + { + e.Cancel = true; + } + } + + private void MoveUp(ListView listView) + { + if (listView.SelectedItems.Count != 1) + { + return; + } + + var idx = listView.SelectedItems[0].Index; + if (idx == 0) + { + return; + } + + var item = listView.SelectedItems[0]; + listView.Items.RemoveAt(idx); + var style = _fileNamesToJoin[idx]; + _fileNamesToJoin.RemoveAt(idx); + _fileNamesToJoin.Insert(idx - 1, style); + + idx--; + listView.Items.Insert(idx, item); + UpdateSelectedIndices(listView, idx); + } + + private void MoveDown(ListView listView) + { + if (listView.SelectedItems.Count != 1) + { + return; + } + + var idx = listView.SelectedItems[0].Index; + if (idx >= listView.Items.Count - 1) + { + return; + } + + var item = listView.SelectedItems[0]; + listView.Items.RemoveAt(idx); + var style = _fileNamesToJoin[idx]; + _fileNamesToJoin.RemoveAt(idx); + _fileNamesToJoin.Insert(idx + 1, style); + + idx++; + listView.Items.Insert(idx, item); + UpdateSelectedIndices(listView, idx); + } + + private void MoveToTop(ListView listView) + { + if (listView.SelectedItems.Count != 1) + { + return; + } + + var idx = listView.SelectedItems[0].Index; + if (idx == 0) + { + return; + } + + var item = listView.SelectedItems[0]; + listView.Items.RemoveAt(idx); + var style = _fileNamesToJoin[idx]; + _fileNamesToJoin.RemoveAt(idx); + _fileNamesToJoin.Insert(0, style); + + idx = 0; + listView.Items.Insert(idx, item); + UpdateSelectedIndices(listView, idx); + } + + private void MoveToBottom(ListView listView) + { + if (listView.SelectedItems.Count != 1) + { + return; + } + + var idx = listView.SelectedItems[0].Index; + if (idx == listView.Items.Count - 1) + { + return; + } + + var item = listView.SelectedItems[0]; + listView.Items.RemoveAt(idx); + var style = _fileNamesToJoin[idx]; + _fileNamesToJoin.RemoveAt(idx); + _fileNamesToJoin.Add(style); + + listView.Items.Add(item); + UpdateSelectedIndices(listView); + } + + private static void UpdateSelectedIndices(ListView listView, int startingIndex = -1, int numberOfSelectedItems = 1) + { + if (numberOfSelectedItems == 0) + { + return; + } + + if (startingIndex == -1 || startingIndex >= listView.Items.Count) + { + startingIndex = listView.Items.Count - 1; + } + + if (startingIndex - numberOfSelectedItems < -1) + { + return; + } + + listView.SelectedItems.Clear(); + for (var i = 0; i < numberOfSelectedItems; i++) + { + listView.Items[startingIndex - i].Selected = true; + listView.Items[startingIndex - i].EnsureVisible(); + listView.Items[startingIndex - i].Focused = true; + } + } + + private void moveUpToolStripMenuItem_Click(object sender, EventArgs e) + { + if (radioButtonJoinPlain.Checked) + { + return; + } + + MoveUp(listViewParts); + } + + private void moveDownToolStripMenuItem_Click(object sender, EventArgs e) + { + if (radioButtonJoinPlain.Checked) + { + return; + } + + MoveDown(listViewParts); + } + + private void moveTopToolStripMenuItem_Click(object sender, EventArgs e) + { + if (radioButtonJoinPlain.Checked) + { + return; + } + + MoveToTop(listViewParts); + } + + private void moveBottomToolStripMenuItem_Click(object sender, EventArgs e) + { + if (radioButtonJoinPlain.Checked) + { + return; + } + + MoveToBottom(listViewParts); + } + + private void listViewParts_ColumnClick(object sender, ColumnClickEventArgs e) + { + if (radioButtonJoinPlain.Checked || e.Column != 3) + { + return; + } + + var lv = (ListView)sender; + if (!(lv.ListViewItemSorter is ListViewSorter sorter)) + { + sorter = new ListViewSorter + { + ColumnNumber = e.Column, + }; + lv.ListViewItemSorter = sorter; + } + + if (e.Column == sorter.ColumnNumber) + { + sorter.Descending = !sorter.Descending; // inverse sort direction + } + else + { + sorter.ColumnNumber = e.Column; + } + + lv.Sort(); + } } } diff --git a/src/ui/Forms/JoinSubtitles.resx b/src/ui/Forms/JoinSubtitles.resx index 9bad2f599..55f72738c 100644 --- a/src/ui/Forms/JoinSubtitles.resx +++ b/src/ui/Forms/JoinSubtitles.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 159, 22 + 17, 17 diff --git a/src/ui/Logic/ListViewSorter.cs b/src/ui/Logic/ListViewSorter.cs index f9c2a8a92..c56b210f5 100644 --- a/src/ui/Logic/ListViewSorter.cs +++ b/src/ui/Logic/ListViewSorter.cs @@ -13,7 +13,7 @@ namespace Nikse.SubtitleEdit.Logic public bool IsDisplayFileSize { get; set; } public bool Descending { get; set; } - private Regex _invariantNumber = new Regex(@"\d+\.{1,2}", RegexOptions.Compiled); + private readonly Regex _invariantNumber = new Regex(@"\d+\.{1,2}", RegexOptions.Compiled); public int Compare(object o1, object o2) {