mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-11-22 03:02:35 +01:00
Show earlier/later + a few minor improvements/fixes
git-svn-id: https://subtitleedit.googlecode.com/svn/trunk@185 99eadd0c-20b8-1223-b5c4-2a2b2df33de2
This commit is contained in:
parent
6f0cc104c6
commit
7f284aa267
@ -101,6 +101,8 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
public bool DrawGridLines { get; set; }
|
||||
public bool AllowNewSelection { get; set; }
|
||||
|
||||
public bool Locked { get; set; }
|
||||
|
||||
public double EndPositionSeconds
|
||||
{
|
||||
get
|
||||
@ -952,19 +954,19 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
|
||||
private void WaveForm_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Add)
|
||||
if (e.Modifiers == Keys.None && e.KeyCode == Keys.Add)
|
||||
{
|
||||
ZoomFactor = ZoomFactor + 0.1;
|
||||
if (OnZoomedChanged != null)
|
||||
OnZoomedChanged.Invoke(null, null);
|
||||
}
|
||||
else if (e.KeyCode == Keys.Subtract)
|
||||
else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Subtract)
|
||||
{
|
||||
ZoomFactor = ZoomFactor - 0.1;
|
||||
if (OnZoomedChanged != null)
|
||||
OnZoomedChanged.Invoke(null, null);
|
||||
}
|
||||
else if (e.Control == false && e.KeyCode == Keys.Z)
|
||||
else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Z)
|
||||
{
|
||||
if (StartPositionSeconds > 0.1)
|
||||
{
|
||||
@ -974,7 +976,7 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
else if (e.Control == false && e.KeyCode == Keys.X)
|
||||
else if (e.Modifiers == Keys.None && e.KeyCode == Keys.X)
|
||||
{
|
||||
if (StartPositionSeconds + 0.1 < _wavePeaks.Header.LengthInSeconds)
|
||||
{
|
||||
@ -984,15 +986,28 @@ namespace Nikse.SubtitleEdit.Controls
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.C)
|
||||
{
|
||||
Locked = !Locked;
|
||||
Invalidate();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
|
||||
void WaveForm_MouseWheel(object sender, MouseEventArgs e)
|
||||
{
|
||||
int delta = e.Delta;
|
||||
{
|
||||
StartPositionSeconds -= delta / 256.0;
|
||||
if (_currentVideoPositionSeconds < StartPositionSeconds || _currentVideoPositionSeconds >= EndPositionSeconds)
|
||||
OnPositionSelected.Invoke(StartPositionSeconds, null);
|
||||
if (Locked)
|
||||
{
|
||||
OnPositionSelected.Invoke(_currentVideoPositionSeconds + (-delta / 256.0), null);
|
||||
}
|
||||
else
|
||||
{
|
||||
StartPositionSeconds -= delta / 256.0;
|
||||
if (_currentVideoPositionSeconds < StartPositionSeconds || _currentVideoPositionSeconds >= EndPositionSeconds)
|
||||
OnPositionSelected.Invoke(StartPositionSeconds, null);
|
||||
}
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
11
src/Forms/Main.Designer.cs
generated
11
src/Forms/Main.Designer.cs
generated
@ -1219,7 +1219,8 @@
|
||||
// toolStripMenuItemAdjustAllTimes
|
||||
//
|
||||
this.toolStripMenuItemAdjustAllTimes.Name = "toolStripMenuItemAdjustAllTimes";
|
||||
this.toolStripMenuItemAdjustAllTimes.Size = new System.Drawing.Size(276, 22);
|
||||
this.toolStripMenuItemAdjustAllTimes.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D)));
|
||||
this.toolStripMenuItemAdjustAllTimes.Size = new System.Drawing.Size(317, 22);
|
||||
this.toolStripMenuItemAdjustAllTimes.Text = "Adjust all times (show earlier/later)...";
|
||||
this.toolStripMenuItemAdjustAllTimes.Click += new System.EventHandler(this.toolStripMenuItemAdjustAllTimes_Click);
|
||||
//
|
||||
@ -1228,7 +1229,7 @@
|
||||
this.visualSyncToolStripMenuItem.Name = "visualSyncToolStripMenuItem";
|
||||
this.visualSyncToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
|
||||
| System.Windows.Forms.Keys.V)));
|
||||
this.visualSyncToolStripMenuItem.Size = new System.Drawing.Size(276, 22);
|
||||
this.visualSyncToolStripMenuItem.Size = new System.Drawing.Size(317, 22);
|
||||
this.visualSyncToolStripMenuItem.Text = "Visual sync...";
|
||||
this.visualSyncToolStripMenuItem.Click += new System.EventHandler(this.VisualSyncToolStripMenuItemClick);
|
||||
//
|
||||
@ -1237,7 +1238,7 @@
|
||||
this.toolStripMenuItemPointSync.Name = "toolStripMenuItemPointSync";
|
||||
this.toolStripMenuItemPointSync.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
|
||||
| System.Windows.Forms.Keys.P)));
|
||||
this.toolStripMenuItemPointSync.Size = new System.Drawing.Size(276, 22);
|
||||
this.toolStripMenuItemPointSync.Size = new System.Drawing.Size(317, 22);
|
||||
this.toolStripMenuItemPointSync.Text = "Point sync...";
|
||||
this.toolStripMenuItemPointSync.Click += new System.EventHandler(this.toolStripMenuItemPointSync_Click);
|
||||
//
|
||||
@ -1358,14 +1359,14 @@
|
||||
//
|
||||
this.helpToolStripMenuItem1.Name = "helpToolStripMenuItem1";
|
||||
this.helpToolStripMenuItem1.ShortcutKeys = System.Windows.Forms.Keys.F1;
|
||||
this.helpToolStripMenuItem1.Size = new System.Drawing.Size(152, 22);
|
||||
this.helpToolStripMenuItem1.Size = new System.Drawing.Size(118, 22);
|
||||
this.helpToolStripMenuItem1.Text = "Help";
|
||||
this.helpToolStripMenuItem1.Click += new System.EventHandler(this.HelpToolStripMenuItem1Click);
|
||||
//
|
||||
// aboutToolStripMenuItem
|
||||
//
|
||||
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
|
||||
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(118, 22);
|
||||
this.aboutToolStripMenuItem.Text = "About";
|
||||
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.AboutToolStripMenuItemClick);
|
||||
//
|
||||
|
@ -11,10 +11,10 @@ using Nikse.SubtitleEdit.Controls;
|
||||
using Nikse.SubtitleEdit.Logic;
|
||||
using Nikse.SubtitleEdit.Logic.BluRaySup;
|
||||
using Nikse.SubtitleEdit.Logic.Enums;
|
||||
using Nikse.SubtitleEdit.Logic.Networking;
|
||||
using Nikse.SubtitleEdit.Logic.SubtitleFormats;
|
||||
using Nikse.SubtitleEdit.Logic.VideoPlayers;
|
||||
using Nikse.SubtitleEdit.Logic.VobSub;
|
||||
using Nikse.SubtitleEdit.Logic.Networking;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
@ -75,6 +75,8 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
NikseWebServiceSession _networkSession;
|
||||
NetworkChat _networkChat = null;
|
||||
|
||||
ShowEarlierLater _showEarlierOrLater = null;
|
||||
|
||||
private bool AutoRepeatContinueOn
|
||||
{
|
||||
get
|
||||
@ -2675,7 +2677,15 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
textBoxListViewText.Text = string.Empty;
|
||||
MakeHistoryForUndo(_language.BeforeUndo);
|
||||
string subtitleFormatFriendlyName;
|
||||
|
||||
string oldFileName = _fileName;
|
||||
DateTime oldFileDateTime = _fileDateTime;
|
||||
|
||||
_fileName = _subtitle.UndoHistory(showHistory.SelectedIndex, out subtitleFormatFriendlyName, out _fileDateTime);
|
||||
|
||||
if (string.Compare(oldFileName, _fileName, true) == 0)
|
||||
_fileDateTime = oldFileDateTime; // undo will not give overwrite-newer-file warning
|
||||
|
||||
Text = Title + " - " + _fileName;
|
||||
ShowStatus(_language.UndoPerformed);
|
||||
|
||||
@ -3227,7 +3237,10 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
|
||||
private void UpdateListViewTextCharactersPerSeconds(Paragraph paragraph)
|
||||
{
|
||||
string s = Utilities.RemoveHtmlTags(paragraph.Text).Replace(" ", string.Empty).Replace(Environment.NewLine, string.Empty);
|
||||
const string zeroWhiteSpace = "\u200B";
|
||||
const string zeroWidthNoBreakSpace = "\uFEFF";
|
||||
|
||||
string s = Utilities.RemoveHtmlTags(paragraph.Text).Replace(" ", string.Empty).Replace(Environment.NewLine, string.Empty).Replace(zeroWhiteSpace, string.Empty).Replace(zeroWidthNoBreakSpace, string.Empty);
|
||||
if (paragraph.Duration.TotalSeconds > 0)
|
||||
{
|
||||
double charactersPerSecond = s.Length / paragraph.Duration.TotalSeconds;
|
||||
@ -3360,6 +3373,38 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.R)
|
||||
{
|
||||
ButtonAutoBreakClick(null, null);
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.R)
|
||||
{
|
||||
ButtonUnBreakClick(null, null);
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.I)
|
||||
{
|
||||
if (textBoxListViewText.SelectionLength == 0)
|
||||
{
|
||||
string tag = "i";
|
||||
if (textBoxListViewText.Text.Contains("<" + tag + ">"))
|
||||
{
|
||||
textBoxListViewText.Text = textBoxListViewText.Text.Replace("<" + tag + ">", string.Empty);
|
||||
textBoxListViewText.Text = textBoxListViewText.Text.Replace("</" + tag + ">", string.Empty);
|
||||
}
|
||||
else
|
||||
{
|
||||
textBoxListViewText.Text = string.Format("<{0}>{1}</{0}>", tag, textBoxListViewText.Text);
|
||||
}
|
||||
//SubtitleListview1.SetText(i, textBoxListViewText.Text);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
TextBoxListViewToogleTag("i");
|
||||
}
|
||||
}
|
||||
|
||||
// last key down in text
|
||||
_lastTextKeyDownTicks = DateTime.Now.Ticks;
|
||||
@ -3940,7 +3985,21 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
|
||||
SubtitleFormat format;
|
||||
|
||||
if (matroskaSubtitleInfo.CodecPrivate.ToLower().Contains("[script info]"))
|
||||
if (matroskaSubtitleInfo.CodecId.ToUpper() == "S_VOBSUB")
|
||||
{
|
||||
MessageBox.Show("VobSub subtitles inside Matroska not supported - sorry!");
|
||||
if (_fileName == "123")
|
||||
LoadVobSubFromMatroska(matroskaSubtitleInfo, fileName);
|
||||
return;
|
||||
}
|
||||
if (matroskaSubtitleInfo.CodecId.ToUpper() == "S_HDMV/PGS")
|
||||
{
|
||||
MessageBox.Show("Blu-ray subtitles inside Matroska not supported - sorry!");
|
||||
if (_fileName == "123")
|
||||
LoadBluRaySubFromMatroska(matroskaSubtitleInfo, fileName);
|
||||
return;
|
||||
}
|
||||
else if (matroskaSubtitleInfo.CodecPrivate.ToLower().Contains("[script info]"))
|
||||
{
|
||||
format = new SubStationAlpha();
|
||||
isSsa = true;
|
||||
@ -3957,7 +4016,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
ShowStatus(_language.ParsingMatroskaFile);
|
||||
Refresh();
|
||||
Cursor.Current = Cursors.WaitCursor;
|
||||
Subtitle sub = matroska.GetMatroskaSubtitle(fileName, (int)matroskaSubtitleInfo.TrackNumber, out isValid);
|
||||
List<SubtitleSequence> sub = matroska.GetMatroskaSubtitle(fileName, (int)matroskaSubtitleInfo.TrackNumber, out isValid);
|
||||
Cursor.Current = Cursors.Default;
|
||||
if (isValid)
|
||||
{
|
||||
@ -3970,7 +4029,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
int commaCount = 100;
|
||||
|
||||
foreach (Paragraph p in sub.Paragraphs)
|
||||
foreach (SubtitleSequence p in sub)
|
||||
{
|
||||
string s1 = p.Text;
|
||||
if (s1.Contains(@"{\"))
|
||||
@ -3980,7 +4039,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
commaCount = temp;
|
||||
}
|
||||
|
||||
foreach (Paragraph p in sub.Paragraphs)
|
||||
foreach (SubtitleSequence p in sub)
|
||||
{
|
||||
string s = string.Empty;
|
||||
string[] arr = p.Text.Split(',');
|
||||
@ -3993,15 +4052,14 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
s += arr[i-1];
|
||||
}
|
||||
}
|
||||
p.Text = s;
|
||||
_subtitle.Paragraphs.Add(p);
|
||||
_subtitle.Paragraphs.Add(new Paragraph(s, p.StartMilliseconds, p.EndMilliseconds));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (Paragraph p in sub.Paragraphs)
|
||||
foreach (SubtitleSequence p in sub)
|
||||
{
|
||||
_subtitle.Paragraphs.Add(p);
|
||||
_subtitle.Paragraphs.Add(new Paragraph(p.Text, p.StartMilliseconds, p.EndMilliseconds));
|
||||
}
|
||||
}
|
||||
|
||||
@ -4024,6 +4082,128 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadVobSubFromMatroska(MatroskaSubtitleInfo matroskaSubtitleInfo, string fileName)
|
||||
{
|
||||
bool isValid;
|
||||
var matroska = new Matroska();
|
||||
|
||||
ShowStatus(_language.ParsingMatroskaFile);
|
||||
Refresh();
|
||||
Cursor.Current = Cursors.WaitCursor;
|
||||
List<SubtitleSequence> sub = matroska.GetMatroskaSubtitle(fileName, (int)matroskaSubtitleInfo.TrackNumber, out isValid);
|
||||
Cursor.Current = Cursors.Default;
|
||||
|
||||
|
||||
if (isValid)
|
||||
{
|
||||
MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile);
|
||||
_subtitleListViewIndex = -1;
|
||||
|
||||
_subtitle.Paragraphs.Clear();
|
||||
|
||||
List<VobSubMergedPack> mergedVobSubPacks = new List<VobSubMergedPack>();
|
||||
List<VobSubPack> vobSubPacks = new List<VobSubPack>();
|
||||
List<Color> palette = new List<Color>();
|
||||
|
||||
palette = null;
|
||||
foreach (SubtitleSequence p in sub)
|
||||
|
||||
{
|
||||
SubPicture sp = new SubPicture(p.BinaryData);
|
||||
MessageBox.Show(sp.SubPictureDateSize.ToString());
|
||||
MessageBox.Show(sp.ImageDisplayArea.ToString());
|
||||
|
||||
int length = p.BinaryData.Length;
|
||||
if (length > 5000)
|
||||
MessageBox.Show("Large");
|
||||
mergedVobSubPacks.Add(new VobSubMergedPack(p.BinaryData, TimeSpan.FromMilliseconds(p.StartMilliseconds), 32, null));
|
||||
}
|
||||
|
||||
var formSubOcr = new VobSubOcr();
|
||||
formSubOcr.Initialize(mergedVobSubPacks, palette, Configuration.Settings.VobSubOcr);
|
||||
if (formSubOcr.ShowDialog(this) == DialogResult.OK)
|
||||
{
|
||||
MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle);
|
||||
|
||||
_subtitle.Paragraphs.Clear();
|
||||
SetCurrentFormat(new SubRip().FriendlyName);
|
||||
_subtitle.WasLoadedWithFrameNumbers = false;
|
||||
_subtitle.CalculateFrameNumbersFromTimeCodes(CurrentFrameRate);
|
||||
foreach (Paragraph p in formSubOcr.SubtitleFromOcr.Paragraphs)
|
||||
{
|
||||
_subtitle.Paragraphs.Add(p);
|
||||
}
|
||||
|
||||
ShowSource();
|
||||
SubtitleListview1.Fill(_subtitle, _subtitleAlternate);
|
||||
_change = true;
|
||||
_subtitleListViewIndex = -1;
|
||||
SubtitleListview1.FirstVisibleIndex = -1;
|
||||
SubtitleListview1.SelectIndexAndEnsureVisible(0);
|
||||
|
||||
_fileName = string.Empty;
|
||||
Text = Title;
|
||||
|
||||
Configuration.Settings.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadBluRaySubFromMatroska(MatroskaSubtitleInfo matroskaSubtitleInfo, string fileName)
|
||||
{
|
||||
bool isValid;
|
||||
var matroska = new Matroska();
|
||||
|
||||
ShowStatus(_language.ParsingMatroskaFile);
|
||||
Refresh();
|
||||
Cursor.Current = Cursors.WaitCursor;
|
||||
List<SubtitleSequence> sub = matroska.GetMatroskaSubtitle(fileName, (int)matroskaSubtitleInfo.TrackNumber, out isValid);
|
||||
Cursor.Current = Cursors.Default;
|
||||
|
||||
|
||||
if (isValid)
|
||||
{
|
||||
MakeHistoryForUndo(_language.BeforeImportFromMatroskaFile);
|
||||
_subtitleListViewIndex = -1;
|
||||
_subtitle.Paragraphs.Clear();
|
||||
|
||||
foreach (SubtitleSequence p in sub)
|
||||
{
|
||||
int length = p.BinaryData.Length;
|
||||
if (length > 5000)
|
||||
MessageBox.Show("Large");
|
||||
}
|
||||
|
||||
var formSubOcr = new VobSubOcr();
|
||||
// formSubOcr.Initialize(mergedVobSubPacks, palette, Configuration.Settings.VobSubOcr);
|
||||
if (formSubOcr.ShowDialog(this) == DialogResult.OK)
|
||||
{
|
||||
MakeHistoryForUndo(_language.BeforeImportingDvdSubtitle);
|
||||
|
||||
_subtitle.Paragraphs.Clear();
|
||||
SetCurrentFormat(new SubRip().FriendlyName);
|
||||
_subtitle.WasLoadedWithFrameNumbers = false;
|
||||
_subtitle.CalculateFrameNumbersFromTimeCodes(CurrentFrameRate);
|
||||
foreach (Paragraph p in formSubOcr.SubtitleFromOcr.Paragraphs)
|
||||
{
|
||||
_subtitle.Paragraphs.Add(p);
|
||||
}
|
||||
|
||||
ShowSource();
|
||||
SubtitleListview1.Fill(_subtitle, _subtitleAlternate);
|
||||
_change = true;
|
||||
_subtitleListViewIndex = -1;
|
||||
SubtitleListview1.FirstVisibleIndex = -1;
|
||||
SubtitleListview1.SelectIndexAndEnsureVisible(0);
|
||||
|
||||
_fileName = string.Empty;
|
||||
Text = Title;
|
||||
|
||||
Configuration.Settings.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SubtitleListview1_DragEnter(object sender, DragEventArgs e)
|
||||
{
|
||||
// make sure they're actually dropping files (not text or anything else)
|
||||
@ -4352,34 +4532,22 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
if (_subtitle != null && _subtitle.Paragraphs.Count > 1)
|
||||
{
|
||||
var showEarlierOrLater = new ShowEarlierLater();
|
||||
SaveSubtitleListviewIndexes();
|
||||
bool waveFormEnabled = timerWaveForm.Enabled;
|
||||
timerWaveForm.Stop();
|
||||
bool videoTimerEnabled = videoTimer.Enabled;
|
||||
videoTimer.Stop();
|
||||
timer1.Stop();
|
||||
|
||||
var selectedLines = new Subtitle { WasLoadedWithFrameNumbers = _subtitle.WasLoadedWithFrameNumbers };
|
||||
foreach (int index in SubtitleListview1.SelectedIndices)
|
||||
selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]);
|
||||
showEarlierOrLater.Initialize(selectedLines, _videoFileName);
|
||||
_showEarlierOrLater = new ShowEarlierLater();
|
||||
_showEarlierOrLater.Initialize(ShowEarlierOrLaterSelectedLinesOnly, true);
|
||||
MakeHistoryForUndo(_language.BeforeShowSelectedLinesEarlierLater);
|
||||
_showEarlierOrLater.ShowDialog(this);
|
||||
|
||||
if (showEarlierOrLater.ShowDialog(this) == DialogResult.OK)
|
||||
{
|
||||
MakeHistoryForUndo(_language.BeforeShowSelectedLinesEarlierLater);
|
||||
timerWaveForm.Enabled = waveFormEnabled;
|
||||
videoTimer.Enabled = videoTimerEnabled;
|
||||
timer1.Start();
|
||||
|
||||
// we only update selected lines
|
||||
int i = 0;
|
||||
double frameRate = CurrentFrameRate;
|
||||
foreach (int index in SubtitleListview1.SelectedIndices)
|
||||
{
|
||||
_subtitle.Paragraphs[index] = new Paragraph(showEarlierOrLater.Paragraphs[i]);
|
||||
if (_subtitle.WasLoadedWithFrameNumbers)
|
||||
_subtitle.Paragraphs[index].CalculateFrameNumbersFromTimeCodes(frameRate);
|
||||
i++;
|
||||
}
|
||||
ShowStatus(_language.ShowSelectedLinesEarlierLaterPerformed);
|
||||
ShowSource();
|
||||
SubtitleListview1.Fill(_subtitle, _subtitleAlternate);
|
||||
RestoreSubtitleListviewIndexes();
|
||||
}
|
||||
showEarlierOrLater.Dispose();
|
||||
RefreshSelectedParagraph();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4670,6 +4838,50 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
else if (e.Modifiers == (Keys.Control | Keys.Alt | Keys.Shift) && e.KeyCode == Keys.W) // watermak
|
||||
{
|
||||
if (comboBoxEncoding.Text.StartsWith("ANSI - "))
|
||||
{
|
||||
MessageBox.Show("Watermark only works with unicode file encoding");
|
||||
}
|
||||
else
|
||||
{
|
||||
Watermark watermarkForm = new Watermark();
|
||||
watermarkForm.Initialize(_subtitle, FirstSelectedIndex);
|
||||
if (watermarkForm.ShowDialog(this) == DialogResult.OK)
|
||||
{
|
||||
watermarkForm.AddOrRemove(_subtitle);
|
||||
RefreshSelectedParagraph();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (e.Modifiers == Keys.Shift && e.KeyCode == Keys.Insert)
|
||||
{
|
||||
InsertBefore();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.Insert)
|
||||
{
|
||||
InsertAfter();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
//else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.D)
|
||||
//{
|
||||
// InsertAfter();
|
||||
// e.SuppressKeyPress = true;
|
||||
//}
|
||||
|
||||
//else if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.C)
|
||||
//{
|
||||
// buttonSetStartTime_Click(null, null);
|
||||
// e.SuppressKeyPress = true;
|
||||
//}
|
||||
//else if (e.Modifiers == Keys.None && e.KeyCode == Keys.B)
|
||||
//{
|
||||
// StopAutoDuration();
|
||||
// buttonSetEnd_Click(null, null);
|
||||
// e.SuppressKeyPress = true;
|
||||
//}
|
||||
}
|
||||
|
||||
private void SubtitleListview1_KeyDown(object sender, KeyEventArgs e)
|
||||
@ -5352,6 +5564,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
if (File.Exists(peakWaveFileName))
|
||||
{
|
||||
AudioWaveForm.WavePeaks = new WavePeakGenerator(peakWaveFileName);
|
||||
toolStripComboBoxWaveForm_SelectedIndexChanged(null, null);
|
||||
AudioWaveForm.WavePeaks.GenerateAllSamples();
|
||||
AudioWaveForm.WavePeaks.Close();
|
||||
|
||||
@ -5887,36 +6100,51 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
Refresh();
|
||||
}
|
||||
|
||||
public void ShowEarlierOrLater(double adjustMilliseconds)
|
||||
{
|
||||
double frameRate = CurrentFrameRate;
|
||||
_subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(adjustMilliseconds));
|
||||
SubtitleListview1.BeginUpdate();
|
||||
for (int i = 0; i < _subtitle.Paragraphs.Count; i++)
|
||||
{
|
||||
Paragraph p = _subtitle.GetParagraphOrDefault(i);
|
||||
if (p != null)
|
||||
SubtitleListview1.SetStartTime(i, p);
|
||||
if (_subtitle.WasLoadedWithFrameNumbers)
|
||||
p.CalculateFrameNumbersFromTimeCodes(frameRate);
|
||||
}
|
||||
SubtitleListview1.EndUpdate();
|
||||
RefreshSelectedParagraph();
|
||||
}
|
||||
|
||||
public void ShowEarlierOrLaterSelectedLinesOnly(double adjustMilliseconds)
|
||||
{
|
||||
double frameRate = CurrentFrameRate;
|
||||
_subtitle.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(adjustMilliseconds));
|
||||
SubtitleListview1.BeginUpdate();
|
||||
for (int i = 0; i < _subtitle.Paragraphs.Count; i++)
|
||||
{
|
||||
if (SubtitleListview1.Items[i].Selected)
|
||||
{
|
||||
Paragraph p = _subtitle.GetParagraphOrDefault(i);
|
||||
if (p != null)
|
||||
SubtitleListview1.SetStartTime(i, p);
|
||||
if (_subtitle.WasLoadedWithFrameNumbers)
|
||||
p.CalculateFrameNumbersFromTimeCodes(frameRate);
|
||||
}
|
||||
}
|
||||
SubtitleListview1.EndUpdate();
|
||||
}
|
||||
|
||||
private void toolStripMenuItemAdjustAllTimes_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (_subtitle != null && _subtitle.Paragraphs.Count > 1)
|
||||
{
|
||||
mediaPlayer.Pause();
|
||||
var showEarlierOrLater = new ShowEarlierLater();
|
||||
_showEarlierOrLater = new ShowEarlierLater();
|
||||
SaveSubtitleListviewIndexes();
|
||||
|
||||
showEarlierOrLater.Initialize(_subtitle, _videoFileName);
|
||||
|
||||
if (showEarlierOrLater.ShowDialog(this) == DialogResult.OK)
|
||||
{
|
||||
MakeHistoryForUndo(_language.BeforeShowSelectedLinesEarlierLater);
|
||||
|
||||
// we only update selected lines
|
||||
int i = 0;
|
||||
double frameRate = CurrentFrameRate;
|
||||
for (int index = 0; i < _subtitle.Paragraphs.Count; index++)
|
||||
{
|
||||
_subtitle.Paragraphs[index] = new Paragraph(showEarlierOrLater.Paragraphs[i]);
|
||||
if (_subtitle.WasLoadedWithFrameNumbers)
|
||||
_subtitle.Paragraphs[index].CalculateFrameNumbersFromTimeCodes(frameRate);
|
||||
i++;
|
||||
}
|
||||
ShowStatus(_language.ShowSelectedLinesEarlierLaterPerformed);
|
||||
ShowSource();
|
||||
SubtitleListview1.Fill(_subtitle, _subtitleAlternate);
|
||||
RestoreSubtitleListviewIndexes();
|
||||
}
|
||||
showEarlierOrLater.Dispose();
|
||||
_showEarlierOrLater.Initialize(ShowEarlierOrLater, false);
|
||||
_showEarlierOrLater.Show(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -6385,7 +6613,15 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
int index = -1;
|
||||
if (SubtitleListview1.SelectedItems.Count > 0)
|
||||
index = SubtitleListview1.SelectedItems[0].Index;
|
||||
if (mediaPlayer.CurrentPosition > AudioWaveForm.EndPositionSeconds || mediaPlayer.CurrentPosition < AudioWaveForm.StartPositionSeconds)
|
||||
|
||||
if (AudioWaveForm.Locked)
|
||||
{
|
||||
double startPos = mediaPlayer.CurrentPosition - ((AudioWaveForm.EndPositionSeconds - AudioWaveForm.StartPositionSeconds) / 2.0);
|
||||
if (startPos < 0)
|
||||
startPos = 0;
|
||||
AudioWaveForm.SetPosition(startPos, _subtitle, mediaPlayer.CurrentPosition, index);
|
||||
}
|
||||
else if (mediaPlayer.CurrentPosition > AudioWaveForm.EndPositionSeconds || mediaPlayer.CurrentPosition < AudioWaveForm.StartPositionSeconds)
|
||||
{
|
||||
double startPos = mediaPlayer.CurrentPosition - 0.01;
|
||||
if (startPos < 0)
|
||||
|
@ -95,6 +95,10 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
if (File.Exists(fileName))
|
||||
{
|
||||
FileInfo fi = new FileInfo(fileName);
|
||||
if (fi.Length < 1000)
|
||||
return;
|
||||
|
||||
labelVideoFileName.Text = fileName;
|
||||
VideoFileName = fileName;
|
||||
if (videoPlayerContainer1.VideoPlayer != null)
|
||||
|
93
src/Forms/ShowEarlierLater.Designer.cs
generated
93
src/Forms/ShowEarlierLater.Designer.cs
generated
@ -34,12 +34,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
this.labelHoursMinSecsMilliSecs = new System.Windows.Forms.Label();
|
||||
this.buttonShowLater = new System.Windows.Forms.Button();
|
||||
this.buttonShowEarlier = new System.Windows.Forms.Button();
|
||||
this.buttonCancel = new System.Windows.Forms.Button();
|
||||
this.buttonOK = new System.Windows.Forms.Button();
|
||||
this.subtitleListView1 = new Nikse.SubtitleEdit.Controls.SubtitleListView();
|
||||
this.labelTotalAdjustment = new System.Windows.Forms.Label();
|
||||
this.labelSubtitle = new System.Windows.Forms.Label();
|
||||
this.mediaPlayer = new Nikse.SubtitleEdit.Controls.VideoPlayerContainer();
|
||||
this.timer1 = new System.Windows.Forms.Timer(this.components);
|
||||
this.timeUpDownAdjust = new Nikse.SubtitleEdit.Controls.TimeUpDown();
|
||||
this.SuspendLayout();
|
||||
@ -47,7 +42,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
// labelHoursMinSecsMilliSecs
|
||||
//
|
||||
this.labelHoursMinSecsMilliSecs.AutoSize = true;
|
||||
this.labelHoursMinSecsMilliSecs.Location = new System.Drawing.Point(11, 383);
|
||||
this.labelHoursMinSecsMilliSecs.Location = new System.Drawing.Point(11, 7);
|
||||
this.labelHoursMinSecsMilliSecs.Name = "labelHoursMinSecsMilliSecs";
|
||||
this.labelHoursMinSecsMilliSecs.Size = new System.Drawing.Size(108, 13);
|
||||
this.labelHoursMinSecsMilliSecs.TabIndex = 18;
|
||||
@ -55,7 +50,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
//
|
||||
// buttonShowLater
|
||||
//
|
||||
this.buttonShowLater.Location = new System.Drawing.Point(14, 456);
|
||||
this.buttonShowLater.Location = new System.Drawing.Point(110, 54);
|
||||
this.buttonShowLater.Name = "buttonShowLater";
|
||||
this.buttonShowLater.Size = new System.Drawing.Size(119, 21);
|
||||
this.buttonShowLater.TabIndex = 20;
|
||||
@ -65,7 +60,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
//
|
||||
// buttonShowEarlier
|
||||
//
|
||||
this.buttonShowEarlier.Location = new System.Drawing.Point(14, 429);
|
||||
this.buttonShowEarlier.Location = new System.Drawing.Point(110, 27);
|
||||
this.buttonShowEarlier.Name = "buttonShowEarlier";
|
||||
this.buttonShowEarlier.Size = new System.Drawing.Size(120, 21);
|
||||
this.buttonShowEarlier.TabIndex = 19;
|
||||
@ -73,102 +68,34 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
this.buttonShowEarlier.UseVisualStyleBackColor = true;
|
||||
this.buttonShowEarlier.Click += new System.EventHandler(this.ButtonShowEarlierClick);
|
||||
//
|
||||
// buttonCancel
|
||||
//
|
||||
this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
|
||||
this.buttonCancel.Location = new System.Drawing.Point(715, 630);
|
||||
this.buttonCancel.Name = "buttonCancel";
|
||||
this.buttonCancel.Size = new System.Drawing.Size(75, 21);
|
||||
this.buttonCancel.TabIndex = 37;
|
||||
this.buttonCancel.Text = "C&ancel";
|
||||
this.buttonCancel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// buttonOK
|
||||
//
|
||||
this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl;
|
||||
this.buttonOK.Location = new System.Drawing.Point(634, 630);
|
||||
this.buttonOK.Name = "buttonOK";
|
||||
this.buttonOK.Size = new System.Drawing.Size(75, 21);
|
||||
this.buttonOK.TabIndex = 36;
|
||||
this.buttonOK.Text = "&OK";
|
||||
this.buttonOK.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// subtitleListView1
|
||||
//
|
||||
this.subtitleListView1.FirstVisibleIndex = -1;
|
||||
this.subtitleListView1.FullRowSelect = true;
|
||||
this.subtitleListView1.GridLines = true;
|
||||
this.subtitleListView1.HideSelection = false;
|
||||
this.subtitleListView1.Location = new System.Drawing.Point(14, 13);
|
||||
this.subtitleListView1.Name = "subtitleListView1";
|
||||
this.subtitleListView1.Size = new System.Drawing.Size(776, 329);
|
||||
this.subtitleListView1.TabIndex = 35;
|
||||
this.subtitleListView1.UseCompatibleStateImageBehavior = false;
|
||||
this.subtitleListView1.View = System.Windows.Forms.View.Details;
|
||||
this.subtitleListView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.subtitleListView1_MouseDoubleClick);
|
||||
//
|
||||
// labelTotalAdjustment
|
||||
//
|
||||
this.labelTotalAdjustment.AutoSize = true;
|
||||
this.labelTotalAdjustment.Location = new System.Drawing.Point(11, 348);
|
||||
this.labelTotalAdjustment.Location = new System.Drawing.Point(12, 90);
|
||||
this.labelTotalAdjustment.Name = "labelTotalAdjustment";
|
||||
this.labelTotalAdjustment.Size = new System.Drawing.Size(108, 13);
|
||||
this.labelTotalAdjustment.TabIndex = 38;
|
||||
this.labelTotalAdjustment.Text = "labelTotalAdjustment";
|
||||
//
|
||||
// labelSubtitle
|
||||
//
|
||||
this.labelSubtitle.BackColor = System.Drawing.Color.Black;
|
||||
this.labelSubtitle.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.labelSubtitle.ForeColor = System.Drawing.Color.White;
|
||||
this.labelSubtitle.Location = new System.Drawing.Point(387, 582);
|
||||
this.labelSubtitle.Name = "labelSubtitle";
|
||||
this.labelSubtitle.Size = new System.Drawing.Size(403, 28);
|
||||
this.labelSubtitle.TabIndex = 39;
|
||||
this.labelSubtitle.Text = "labelSubtitle";
|
||||
this.labelSubtitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// mediaPlayer
|
||||
//
|
||||
this.mediaPlayer.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18)))));
|
||||
this.mediaPlayer.CurrentPosition = 0D;
|
||||
this.mediaPlayer.Location = new System.Drawing.Point(387, 348);
|
||||
this.mediaPlayer.Name = "mediaPlayer";
|
||||
this.mediaPlayer.ShowStopButton = true;
|
||||
this.mediaPlayer.Size = new System.Drawing.Size(403, 234);
|
||||
this.mediaPlayer.TabIndex = 40;
|
||||
this.mediaPlayer.VideoPlayer = null;
|
||||
this.mediaPlayer.Volume = 0D;
|
||||
//
|
||||
// timer1
|
||||
//
|
||||
this.timer1.Interval = 250;
|
||||
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
|
||||
//
|
||||
// timeUpDownAdjust
|
||||
//
|
||||
this.timeUpDownAdjust.AutoSize = true;
|
||||
this.timeUpDownAdjust.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
|
||||
this.timeUpDownAdjust.Location = new System.Drawing.Point(12, 399);
|
||||
this.timeUpDownAdjust.Location = new System.Drawing.Point(12, 23);
|
||||
this.timeUpDownAdjust.Name = "timeUpDownAdjust";
|
||||
this.timeUpDownAdjust.Size = new System.Drawing.Size(89, 25);
|
||||
this.timeUpDownAdjust.Size = new System.Drawing.Size(92, 25);
|
||||
this.timeUpDownAdjust.TabIndex = 21;
|
||||
//
|
||||
// ShowEarlierLater
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(804, 663);
|
||||
this.Controls.Add(this.labelSubtitle);
|
||||
this.Controls.Add(this.mediaPlayer);
|
||||
this.ClientSize = new System.Drawing.Size(243, 113);
|
||||
this.Controls.Add(this.labelTotalAdjustment);
|
||||
this.Controls.Add(this.subtitleListView1);
|
||||
this.Controls.Add(this.buttonCancel);
|
||||
this.Controls.Add(this.buttonOK);
|
||||
this.Controls.Add(this.timeUpDownAdjust);
|
||||
this.Controls.Add(this.labelHoursMinSecsMilliSecs);
|
||||
this.Controls.Add(this.buttonShowLater);
|
||||
@ -180,7 +107,6 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "ShowEarlierLater";
|
||||
this.Text = "Show selected lines earlier/later";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ShowEarlierLater_FormClosing);
|
||||
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ShowEarlierLater_KeyDown);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
@ -193,12 +119,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
private System.Windows.Forms.Label labelHoursMinSecsMilliSecs;
|
||||
private System.Windows.Forms.Button buttonShowLater;
|
||||
private System.Windows.Forms.Button buttonShowEarlier;
|
||||
private SubtitleListView subtitleListView1;
|
||||
private System.Windows.Forms.Button buttonCancel;
|
||||
private System.Windows.Forms.Button buttonOK;
|
||||
private System.Windows.Forms.Label labelTotalAdjustment;
|
||||
private System.Windows.Forms.Label labelSubtitle;
|
||||
private VideoPlayerContainer mediaPlayer;
|
||||
private System.Windows.Forms.Timer timer1;
|
||||
}
|
||||
}
|
@ -8,35 +8,21 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
public sealed partial class ShowEarlierLater : Form
|
||||
{
|
||||
Subtitle _subtitle;
|
||||
public delegate void AdjustEventHandler(double adjustMilliseconds);
|
||||
|
||||
TimeSpan _totalAdjustment = TimeSpan.FromMilliseconds(0);
|
||||
VideoInfo _videoInfo;
|
||||
|
||||
public List<Paragraph> Paragraphs
|
||||
{
|
||||
get
|
||||
{
|
||||
return _subtitle.Paragraphs;
|
||||
}
|
||||
}
|
||||
|
||||
public string VideoFileName { get; set; }
|
||||
AdjustEventHandler _adjustCallback;
|
||||
|
||||
public ShowEarlierLater()
|
||||
{
|
||||
InitializeComponent();
|
||||
labelTotalAdjustment.Text = string.Empty;
|
||||
timeUpDownAdjust.MaskedTextBox.Text = "000000000";
|
||||
labelSubtitle.Text = string.Empty;
|
||||
|
||||
Text = Configuration.Settings.Language.ShowEarlierLater.Title;
|
||||
labelHoursMinSecsMilliSecs.Text = Configuration.Settings.Language.General.HourMinutesSecondsMilliseconds;
|
||||
buttonShowEarlier.Text = Configuration.Settings.Language.ShowEarlierLater.ShowEarlier;
|
||||
buttonShowLater.Text = Configuration.Settings.Language.ShowEarlierLater.ShowLater;
|
||||
buttonOK.Text = Configuration.Settings.Language.General.OK;
|
||||
buttonCancel.Text = Configuration.Settings.Language.General.Cancel;
|
||||
|
||||
subtitleListView1.InitializeLanguage(Configuration.Settings.Language.General, Configuration.Settings);
|
||||
}
|
||||
|
||||
private void ShowEarlierLater_KeyDown(object sender, KeyEventArgs e)
|
||||
@ -45,93 +31,17 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
DialogResult = DialogResult.Cancel;
|
||||
}
|
||||
else if (e.KeyCode == Keys.Right && e.Modifiers == Keys.Control)
|
||||
{
|
||||
mediaPlayer.CurrentPosition += 0.10;
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
else if (e.KeyCode == Keys.Left && e.Modifiers == Keys.Control)
|
||||
{
|
||||
mediaPlayer.CurrentPosition -= 0.10;
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
else if (e.KeyCode == Keys.Right && e.Modifiers == Keys.Alt)
|
||||
{
|
||||
if (mediaPlayer.VideoPlayer != null)
|
||||
{
|
||||
mediaPlayer.CurrentPosition += 0.5;
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
else if (e.KeyCode == Keys.Left && e.Modifiers == Keys.Alt)
|
||||
{
|
||||
if (mediaPlayer.VideoPlayer != null)
|
||||
{
|
||||
mediaPlayer.CurrentPosition -= 0.5;
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Space)
|
||||
{
|
||||
mediaPlayer.TooglePlayPause();
|
||||
e.SuppressKeyPress = true;
|
||||
}
|
||||
}
|
||||
|
||||
internal void Initialize(Subtitle subtitle, string videoFileName)
|
||||
internal void Initialize(AdjustEventHandler adjustCallback, bool onlySelected)
|
||||
{
|
||||
_subtitle = subtitle;
|
||||
subtitleListView1.Fill(subtitle);
|
||||
|
||||
timeUpDownAdjust.TimeCode = new TimeCode(TimeSpan.FromMilliseconds(Configuration.Settings.General.DefaultAdjustMilliseconds));
|
||||
|
||||
VideoFileName = videoFileName;
|
||||
OpenVideo(videoFileName);
|
||||
}
|
||||
|
||||
private void OpenVideo(string fileName)
|
||||
{
|
||||
if (File.Exists(fileName))
|
||||
{
|
||||
FileInfo fi = new FileInfo(fileName);
|
||||
if (fi.Length < 1000)
|
||||
return;
|
||||
|
||||
VideoFileName = fileName;
|
||||
if (mediaPlayer.VideoPlayer != null)
|
||||
{
|
||||
mediaPlayer.Pause();
|
||||
mediaPlayer.VideoPlayer.DisposeVideoPlayer();
|
||||
}
|
||||
VideoInfo videoInfo = ShowVideoInfo(fileName);
|
||||
Utilities.InitializeVideoPlayerAndContainer(fileName, videoInfo, mediaPlayer, VideoLoaded, VideoEnded);
|
||||
}
|
||||
if (onlySelected)
|
||||
Text = Configuration.Settings.Language.ShowEarlierLater.Title;
|
||||
else
|
||||
{
|
||||
Height = buttonShowLater.Top + buttonShowLater.Height + 40;
|
||||
mediaPlayer.Visible = false;
|
||||
labelSubtitle.Visible = false;
|
||||
}
|
||||
}
|
||||
Text = Configuration.Settings.Language.ShowEarlierLater.TitleAll;
|
||||
|
||||
private VideoInfo ShowVideoInfo(string fileName)
|
||||
{
|
||||
_videoInfo = Utilities.GetVideoInfo(fileName, delegate { Application.DoEvents(); });
|
||||
var info = new FileInfo(fileName);
|
||||
long fileSizeInBytes = info.Length;
|
||||
return _videoInfo;
|
||||
}
|
||||
|
||||
|
||||
void VideoLoaded(object sender, EventArgs e)
|
||||
{
|
||||
mediaPlayer.Stop();
|
||||
timer1.Start();
|
||||
}
|
||||
|
||||
void VideoEnded(object sender, EventArgs e)
|
||||
{
|
||||
mediaPlayer.Pause();
|
||||
_adjustCallback = adjustCallback;
|
||||
timeUpDownAdjust.TimeCode = new TimeCode(TimeSpan.FromMilliseconds(Configuration.Settings.General.DefaultAdjustMilliseconds));
|
||||
}
|
||||
|
||||
private void ButtonShowEarlierClick(object sender, EventArgs e)
|
||||
@ -139,10 +49,10 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
TimeCode tc = timeUpDownAdjust.TimeCode;
|
||||
if (tc != null && tc.TotalMilliseconds > 0)
|
||||
{
|
||||
_adjustCallback.Invoke(-tc.TotalMilliseconds);
|
||||
_totalAdjustment = TimeSpan.FromMilliseconds(_totalAdjustment.TotalMilliseconds - tc.TotalMilliseconds);
|
||||
ShowTotalAdjustMent();
|
||||
_subtitle.AddTimeToAllParagraphs(-tc.TimeSpan);
|
||||
subtitleListView1.Fill(_subtitle);
|
||||
Configuration.Settings.General.DefaultAdjustMilliseconds = (int)tc.TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
@ -157,47 +67,10 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
TimeCode tc = timeUpDownAdjust.TimeCode;
|
||||
if (tc != null && tc.TotalMilliseconds > 0)
|
||||
{
|
||||
_adjustCallback.Invoke(tc.TotalMilliseconds);
|
||||
_totalAdjustment = TimeSpan.FromMilliseconds(_totalAdjustment.TotalMilliseconds + tc.TotalMilliseconds);
|
||||
ShowTotalAdjustMent();
|
||||
_subtitle.AddTimeToAllParagraphs(tc.TimeSpan);
|
||||
subtitleListView1.Fill(_subtitle);
|
||||
}
|
||||
}
|
||||
|
||||
private void timer1_Tick(object sender, EventArgs e)
|
||||
{
|
||||
if (mediaPlayer != null && mediaPlayer.VideoPlayer != null)
|
||||
{
|
||||
if (!mediaPlayer.IsPaused)
|
||||
{
|
||||
mediaPlayer.RefreshProgressBar();
|
||||
int index = Utilities.ShowSubtitle(_subtitle.Paragraphs, labelSubtitle, mediaPlayer.VideoPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void subtitleListView1_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (subtitleListView1.SelectedItems.Count > 0 && VideoFileName != null)
|
||||
{
|
||||
int index = subtitleListView1.SelectedItems[0].Index;
|
||||
|
||||
mediaPlayer.Pause();
|
||||
double pos = _subtitle.Paragraphs[index].StartTime.TotalSeconds;
|
||||
if (pos > 1)
|
||||
mediaPlayer.CurrentPosition = (_subtitle.Paragraphs[index].StartTime.TotalSeconds) - 0.5;
|
||||
else
|
||||
mediaPlayer.CurrentPosition = _subtitle.Paragraphs[index].StartTime.TotalSeconds;
|
||||
mediaPlayer.Play();
|
||||
}
|
||||
}
|
||||
|
||||
private void ShowEarlierLater_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
if (mediaPlayer.VideoPlayer != null)
|
||||
{
|
||||
mediaPlayer.VideoPlayer.Pause();
|
||||
mediaPlayer.VideoPlayer.DisposeVideoPlayer();
|
||||
Configuration.Settings.General.DefaultAdjustMilliseconds = (int)tc.TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -114,6 +114,10 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
VideoFileName = fileName;
|
||||
|
||||
FileInfo fi = new FileInfo(fileName);
|
||||
if (fi.Length < 1000)
|
||||
return;
|
||||
|
||||
if (MediaPlayerStart.VideoPlayer != null)
|
||||
{
|
||||
MediaPlayerStart.Pause();
|
||||
|
158
src/Forms/Watermark.Designer.cs
generated
Normal file
158
src/Forms/Watermark.Designer.cs
generated
Normal file
@ -0,0 +1,158 @@
|
||||
namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
partial class Watermark
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.LabelWatermark = new System.Windows.Forms.Label();
|
||||
this.groupBoxGenerate = new System.Windows.Forms.GroupBox();
|
||||
this.textBoxWatermark = new System.Windows.Forms.TextBox();
|
||||
this.radioButtonSpread = new System.Windows.Forms.RadioButton();
|
||||
this.radioButtonCurrentLine = new System.Windows.Forms.RadioButton();
|
||||
this.buttonGenerate = new System.Windows.Forms.Button();
|
||||
this.buttonRemove = new System.Windows.Forms.Button();
|
||||
this.buttonOK = new System.Windows.Forms.Button();
|
||||
this.groupBoxGenerate.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// LabelWatermark
|
||||
//
|
||||
this.LabelWatermark.AutoSize = true;
|
||||
this.LabelWatermark.Location = new System.Drawing.Point(4, 19);
|
||||
this.LabelWatermark.Name = "LabelWatermark";
|
||||
this.LabelWatermark.Size = new System.Drawing.Size(62, 13);
|
||||
this.LabelWatermark.TabIndex = 0;
|
||||
this.LabelWatermark.Text = "Watermark:";
|
||||
//
|
||||
// groupBoxGenerate
|
||||
//
|
||||
this.groupBoxGenerate.Controls.Add(this.textBoxWatermark);
|
||||
this.groupBoxGenerate.Controls.Add(this.radioButtonSpread);
|
||||
this.groupBoxGenerate.Controls.Add(this.radioButtonCurrentLine);
|
||||
this.groupBoxGenerate.Controls.Add(this.buttonGenerate);
|
||||
this.groupBoxGenerate.Location = new System.Drawing.Point(7, 69);
|
||||
this.groupBoxGenerate.Name = "groupBoxGenerate";
|
||||
this.groupBoxGenerate.Size = new System.Drawing.Size(344, 100);
|
||||
this.groupBoxGenerate.TabIndex = 1;
|
||||
this.groupBoxGenerate.TabStop = false;
|
||||
this.groupBoxGenerate.Text = "Generate watermark";
|
||||
//
|
||||
// textBoxWatermark
|
||||
//
|
||||
this.textBoxWatermark.Location = new System.Drawing.Point(87, 68);
|
||||
this.textBoxWatermark.MaxLength = 50;
|
||||
this.textBoxWatermark.Name = "textBoxWatermark";
|
||||
this.textBoxWatermark.Size = new System.Drawing.Size(195, 20);
|
||||
this.textBoxWatermark.TabIndex = 1;
|
||||
//
|
||||
// radioButtonSpread
|
||||
//
|
||||
this.radioButtonSpread.AutoSize = true;
|
||||
this.radioButtonSpread.Checked = true;
|
||||
this.radioButtonSpread.Location = new System.Drawing.Point(6, 19);
|
||||
this.radioButtonSpread.Name = "radioButtonSpread";
|
||||
this.radioButtonSpread.Size = new System.Drawing.Size(148, 17);
|
||||
this.radioButtonSpread.TabIndex = 2;
|
||||
this.radioButtonSpread.TabStop = true;
|
||||
this.radioButtonSpread.Text = "Spread over entire subtitle";
|
||||
this.radioButtonSpread.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// radioButtonCurrentLine
|
||||
//
|
||||
this.radioButtonCurrentLine.AutoSize = true;
|
||||
this.radioButtonCurrentLine.Location = new System.Drawing.Point(6, 42);
|
||||
this.radioButtonCurrentLine.Name = "radioButtonCurrentLine";
|
||||
this.radioButtonCurrentLine.Size = new System.Drawing.Size(122, 17);
|
||||
this.radioButtonCurrentLine.TabIndex = 1;
|
||||
this.radioButtonCurrentLine.Text = "Only on current line: ";
|
||||
this.radioButtonCurrentLine.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// buttonGenerate
|
||||
//
|
||||
this.buttonGenerate.Location = new System.Drawing.Point(6, 65);
|
||||
this.buttonGenerate.Name = "buttonGenerate";
|
||||
this.buttonGenerate.Size = new System.Drawing.Size(75, 21);
|
||||
this.buttonGenerate.TabIndex = 0;
|
||||
this.buttonGenerate.Text = "Generate";
|
||||
this.buttonGenerate.UseVisualStyleBackColor = true;
|
||||
this.buttonGenerate.Click += new System.EventHandler(this.buttonGenerate_Click);
|
||||
//
|
||||
// buttonRemove
|
||||
//
|
||||
this.buttonRemove.Location = new System.Drawing.Point(7, 38);
|
||||
this.buttonRemove.Name = "buttonRemove";
|
||||
this.buttonRemove.Size = new System.Drawing.Size(75, 21);
|
||||
this.buttonRemove.TabIndex = 0;
|
||||
this.buttonRemove.Text = "Remove";
|
||||
this.buttonRemove.UseVisualStyleBackColor = true;
|
||||
this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click);
|
||||
//
|
||||
// buttonOK
|
||||
//
|
||||
this.buttonOK.Location = new System.Drawing.Point(276, 175);
|
||||
this.buttonOK.Name = "buttonOK";
|
||||
this.buttonOK.Size = new System.Drawing.Size(75, 21);
|
||||
this.buttonOK.TabIndex = 1;
|
||||
this.buttonOK.Text = "&OK";
|
||||
this.buttonOK.UseVisualStyleBackColor = true;
|
||||
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
|
||||
//
|
||||
// Watermark
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(356, 202);
|
||||
this.Controls.Add(this.buttonOK);
|
||||
this.Controls.Add(this.buttonRemove);
|
||||
this.Controls.Add(this.groupBoxGenerate);
|
||||
this.Controls.Add(this.LabelWatermark);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.KeyPreview = true;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "Watermark";
|
||||
this.Text = "Watermark";
|
||||
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Watermark_KeyDown);
|
||||
this.groupBoxGenerate.ResumeLayout(false);
|
||||
this.groupBoxGenerate.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label LabelWatermark;
|
||||
private System.Windows.Forms.GroupBox groupBoxGenerate;
|
||||
private System.Windows.Forms.RadioButton radioButtonSpread;
|
||||
private System.Windows.Forms.RadioButton radioButtonCurrentLine;
|
||||
private System.Windows.Forms.Button buttonGenerate;
|
||||
private System.Windows.Forms.Button buttonRemove;
|
||||
private System.Windows.Forms.Button buttonOK;
|
||||
private System.Windows.Forms.TextBox textBoxWatermark;
|
||||
}
|
||||
}
|
169
src/Forms/Watermark.cs
Normal file
169
src/Forms/Watermark.cs
Normal file
@ -0,0 +1,169 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using Nikse.SubtitleEdit.Logic;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
public sealed partial class Watermark : Form
|
||||
{
|
||||
const string zeroWhiteSpace = "\u200B";
|
||||
const string zeroWidthNoBreakSpace = "\uFEFF";
|
||||
|
||||
int _firstSelectedIndex;
|
||||
|
||||
public Watermark()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
internal void Initialize(Logic.Subtitle subtitle, int firstSelectedIndex)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
foreach (Paragraph p in subtitle.Paragraphs)
|
||||
sb.AppendLine(p.Text);
|
||||
|
||||
string watermark = ReadWaterMark(sb.ToString().Trim());
|
||||
LabelWatermark.Text = string.Format("Watermark: {0}", watermark);
|
||||
if (watermark.Length == 0)
|
||||
{
|
||||
buttonRemove.Enabled = false;
|
||||
textBoxWatermark.Focus();
|
||||
}
|
||||
else
|
||||
{
|
||||
groupBoxGenerate.Enabled = false;
|
||||
buttonOK.Focus();
|
||||
}
|
||||
|
||||
_firstSelectedIndex = firstSelectedIndex;
|
||||
Paragraph current = subtitle.GetParagraphOrDefault(_firstSelectedIndex);
|
||||
if (current != null)
|
||||
radioButtonCurrentLine.Text = radioButtonCurrentLine.Text + " " + current.Text.Replace(Environment.NewLine, Configuration.Settings.General.ListViewLineSeparatorString);
|
||||
else
|
||||
radioButtonCurrentLine.Enabled = false;
|
||||
}
|
||||
|
||||
private string ReadWaterMark(string input)
|
||||
{
|
||||
int i = 0;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
bool letterOn = false;
|
||||
int letter = 0;
|
||||
while (i < input.Length)
|
||||
{
|
||||
string s = input.Substring(i, 1);
|
||||
if (s == zeroWhiteSpace)
|
||||
{
|
||||
if (letter > 0)
|
||||
sb.Append(Encoding.ASCII.GetString(new byte[] { (byte)letter }));
|
||||
letterOn = true;
|
||||
letter = 0;
|
||||
}
|
||||
else if (s == zeroWidthNoBreakSpace && letterOn)
|
||||
{
|
||||
letter++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (letter > 0)
|
||||
sb.Append(Encoding.ASCII.GetString(new byte[] { (byte)letter }));
|
||||
letterOn = false;
|
||||
letter = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
private void AddWaterMark(Subtitle subtitle, string input)
|
||||
{
|
||||
byte[] buffer = Encoding.ASCII.GetBytes(input);
|
||||
|
||||
if (radioButtonCurrentLine.Checked)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
foreach (byte b in buffer)
|
||||
{
|
||||
sb.Append(zeroWhiteSpace);
|
||||
for (int i = 0; i < b; i++)
|
||||
sb.Append(zeroWidthNoBreakSpace);
|
||||
}
|
||||
Paragraph p = subtitle.GetParagraphOrDefault(_firstSelectedIndex);
|
||||
if (p != null)
|
||||
{
|
||||
if (p.Text.Length > 1)
|
||||
p.Text = p.Text.Insert(p.Text.Length / 2, sb.ToString());
|
||||
else
|
||||
p.Text = sb.ToString() + p.Text;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Random r = new Random();
|
||||
List<int> indices = new List<int>();
|
||||
foreach (byte b in buffer)
|
||||
{
|
||||
int number = r.Next(subtitle.Paragraphs.Count - 1);
|
||||
if (indices.Contains(number))
|
||||
number = r.Next(subtitle.Paragraphs.Count - 1);
|
||||
if (indices.Contains(number))
|
||||
number = r.Next(subtitle.Paragraphs.Count - 1);
|
||||
indices.Add(number);
|
||||
}
|
||||
|
||||
indices.Sort();
|
||||
int j = 0;
|
||||
foreach (byte b in buffer)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
Paragraph p = subtitle.Paragraphs[indices[j]];
|
||||
sb.Append(zeroWhiteSpace);
|
||||
for (int i = 0; i < b; i++)
|
||||
sb.Append(zeroWidthNoBreakSpace);
|
||||
if (p.Text.Length > 1)
|
||||
p.Text = p.Text.Insert(p.Text.Length / 2, sb.ToString());
|
||||
else
|
||||
p.Text = sb.ToString() + p.Text;
|
||||
j++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void buttonOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
DialogResult = DialogResult.Cancel;
|
||||
}
|
||||
|
||||
internal void AddOrRemove(Subtitle subtitle)
|
||||
{
|
||||
if (groupBoxGenerate.Enabled)
|
||||
AddWaterMark(subtitle, textBoxWatermark.Text);
|
||||
else
|
||||
RemoveWaterMark(subtitle);
|
||||
}
|
||||
|
||||
private void RemoveWaterMark(Subtitle subtitle)
|
||||
{
|
||||
foreach (Paragraph p in subtitle.Paragraphs)
|
||||
p.Text = p.Text.Replace(zeroWhiteSpace, string.Empty).Replace(zeroWidthNoBreakSpace, string.Empty);
|
||||
}
|
||||
|
||||
private void buttonGenerate_Click(object sender, EventArgs e)
|
||||
{
|
||||
DialogResult = DialogResult.OK;
|
||||
}
|
||||
|
||||
private void buttonRemove_Click(object sender, EventArgs e)
|
||||
{
|
||||
DialogResult = DialogResult.OK;
|
||||
}
|
||||
|
||||
private void Watermark_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Escape)
|
||||
DialogResult = DialogResult.Cancel;
|
||||
}
|
||||
}
|
||||
}
|
120
src/Forms/Watermark.resx
Normal file
120
src/Forms/Watermark.resx
Normal file
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
@ -1069,6 +1069,7 @@ namespace Nikse.SubtitleEdit.Logic
|
||||
ShowEarlierLater = new LanguageStructure.ShowEarlierLater
|
||||
{
|
||||
Title = "Show selected lines earlier/later",
|
||||
TitleAll = "Show all lines earlier/later",
|
||||
ShowEarlier = "Show earlier",
|
||||
ShowLater = "Show later",
|
||||
TotalAdjustmentX = "Total adjustment: {0}",
|
||||
|
@ -1006,6 +1006,7 @@
|
||||
public class ShowEarlierLater
|
||||
{
|
||||
public string Title { get; set; }
|
||||
public string TitleAll { get; set; }
|
||||
public string ShowEarlier { get; set; }
|
||||
public string ShowLater { get; set; }
|
||||
public string TotalAdjustmentX { get; set; }
|
||||
|
@ -4,6 +4,30 @@ using System.IO;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Logic
|
||||
{
|
||||
public class SubtitleSequence
|
||||
{
|
||||
public long StartMilliseconds { get; set; }
|
||||
public long EndMilliseconds { get; set; }
|
||||
public byte[] BinaryData { get; set; }
|
||||
|
||||
public SubtitleSequence(byte[] data, long startMilliseconds, long endMilliseconds)
|
||||
{
|
||||
BinaryData = data;
|
||||
StartMilliseconds = startMilliseconds;
|
||||
EndMilliseconds = endMilliseconds;
|
||||
}
|
||||
|
||||
public string Text
|
||||
{
|
||||
get
|
||||
{
|
||||
if (BinaryData != null)
|
||||
return System.Text.Encoding.UTF8.GetString(BinaryData).Replace("\\N", Environment.NewLine);
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class MatroskaSubtitleInfo
|
||||
{
|
||||
public long TrackNumber { get; set; }
|
||||
@ -92,7 +116,8 @@ namespace Nikse.SubtitleEdit.Logic
|
||||
|
||||
List<MatroskaSubtitleInfo> _subtitleList;
|
||||
int _subtitleRipTrackNumber = 0;
|
||||
Subtitle _subtitleRip = new Subtitle();
|
||||
List<SubtitleSequence> _subtitleRip = new List<SubtitleSequence>();
|
||||
//Subtitle _subtitleRip = new Subtitle();
|
||||
|
||||
|
||||
private static int GetMatroskaVariableIntLength(byte b)
|
||||
@ -953,16 +978,17 @@ namespace Nikse.SubtitleEdit.Logic
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// save subtitle data
|
||||
if (trackNo == _subtitleRipTrackNumber)
|
||||
{
|
||||
long sublength = afterPosition - f.Position;
|
||||
if (sublength > 0)
|
||||
{
|
||||
string s = GetMatroskaString(sublength);
|
||||
s = s.Replace("\\N", Environment.NewLine);
|
||||
byte[] buffer = new byte[sublength];
|
||||
f.Read(buffer, 0, (int)sublength);
|
||||
|
||||
//string s = GetMatroskaString(sublength);
|
||||
//s = s.Replace("\\N", Environment.NewLine);
|
||||
|
||||
f.Seek(afterPosition, SeekOrigin.Begin);
|
||||
b = (byte)f.ReadByte();
|
||||
@ -974,7 +1000,7 @@ namespace Nikse.SubtitleEdit.Logic
|
||||
duration = GetMatroskaVariableSizeUnsignedInt(dataSize);
|
||||
}
|
||||
|
||||
_subtitleRip.Paragraphs.Add(new Paragraph(s, timeCode + clusterTimeCode, timeCode + clusterTimeCode + duration));
|
||||
_subtitleRip.Add(new SubtitleSequence(buffer, timeCode + clusterTimeCode, timeCode + clusterTimeCode + duration));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1061,7 +1087,7 @@ namespace Nikse.SubtitleEdit.Logic
|
||||
return _subtitleList;
|
||||
}
|
||||
|
||||
public Subtitle GetMatroskaSubtitle(string fileName, int trackNumber, out bool isValid)
|
||||
public List<SubtitleSequence> GetMatroskaSubtitle(string fileName, int trackNumber, out bool isValid)
|
||||
{
|
||||
byte b;
|
||||
bool done;
|
||||
|
@ -35,6 +35,7 @@
|
||||
<ApplicationRevision>3</ApplicationRevision>
|
||||
<ApplicationVersion>2.0.1.%2a</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
@ -76,7 +77,10 @@
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
<HintPath>DLLs\Interop.QuartzTypeLib.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHunspell, Version=0.6.3.0, Culture=neutral, processorArchitecture=MSIL" />
|
||||
<Reference Include="NHunspell, Version=0.9.6.0, Culture=neutral, PublicKeyToken=1ac793ea843b4366, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>DLLs\NHunspell.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
@ -393,6 +397,12 @@
|
||||
<Compile Include="Forms\VobSubOcrNewFolder.Designer.cs">
|
||||
<DependentUpon>VobSubOcrNewFolder.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Watermark.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Forms\Watermark.Designer.cs">
|
||||
<DependentUpon>Watermark.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Logic\BluRaySup\BluRaySupPalette.cs" />
|
||||
<Compile Include="Logic\BluRaySup\BluRaySupParser.cs" />
|
||||
<Compile Include="Logic\BluRaySup\BluRaySupPicture.cs" />
|
||||
@ -688,6 +698,9 @@
|
||||
<DependentUpon>VobSubOcrNewFolder.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\Watermark.resx">
|
||||
<DependentUpon>Watermark.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
|
Loading…
Reference in New Issue
Block a user