Bookmarks are now saved in separate file (e.g. file.srt.bookmarks)

Work on #3255
This commit is contained in:
Nikolaj Olsson 2018-12-30 09:38:35 +01:00
parent 5f963a7c54
commit 79b2cce66c
10 changed files with 86 additions and 36 deletions

View File

@ -2019,6 +2019,7 @@ can edit in same subtitle file (collaboration)</Information>
<ListViewColumnTextDown>Column, text down</ListViewColumnTextDown>
<ListViewFocusWaveform>Focus waveform/spectrogram</ListViewFocusWaveform>
<ListViewGoToNextError>Go to next error</ListViewGoToNextError>
<ListViewAutoBalance2PlusLines>Auto balance selected lines (even 2+ lines)</ListViewAutoBalance2PlusLines>
<ShowBeamer>Start subtitle fullscreen beamer</ShowBeamer>
<MainTextBoxMoveLastWordDown>Move last word to next subtitle</MainTextBoxMoveLastWordDown>
<MainTextBoxMoveFirstWordFromNextUp>Fetch first word from next subtitle</MainTextBoxMoveFirstWordFromNextUp>

View File

@ -1,5 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using Nikse.SubtitleEdit.Core.SubtitleFormats;
@ -8,22 +8,49 @@ namespace Nikse.SubtitleEdit.Core
public class BookmarkPersistance
{
private readonly Subtitle _subtitle;
private readonly string _fileName;
public BookmarkPersistance(Subtitle subtitle)
public BookmarkPersistance(Subtitle subtitle, string fileName)
{
_subtitle = subtitle;
_fileName = fileName;
}
public void SaveToFirstLine()
private string GetBookmarksFileName()
{
return _fileName + ".bookmarks";
}
public bool Save()
{
if (_fileName == null)
return false;
var fileName = GetBookmarksFileName();
var b = SerializeBookmarks();
if (b != null)
{
var first = _subtitle.Paragraphs.FirstOrDefault(p => p.StartTime.TotalMilliseconds == 0 && p.EndTime.TotalMilliseconds == 0 && p.Text.Contains("\"bookmarks\""));
if (first != null)
_subtitle.Paragraphs.Remove(first);
_subtitle.Paragraphs.Insert(0, new Paragraph(b, 0, 0));
try
{
File.WriteAllText(fileName, b, Encoding.UTF8);
}
catch
{
return false;
}
}
else if (File.Exists(fileName))
{
try
{
File.Delete(fileName);
}
catch
{
return false;
}
}
return true;
}
private string SerializeBookmarks()
@ -53,14 +80,17 @@ namespace Nikse.SubtitleEdit.Core
return null;
}
public void LoadFromFirstLine()
public bool Load()
{
var first = _subtitle.Paragraphs.FirstOrDefault(p => p.StartTime.TotalMilliseconds == 0 && p.EndTime.TotalMilliseconds == 0 && p.Text.Contains("\"bookmarks\""));
if (first == null)
return;
if (_fileName == null)
return false;
var dic = DeserializeBookmarks(first.Text);
_subtitle.Paragraphs.Remove(first);
var fileName = GetBookmarksFileName();
if (File.Exists(fileName))
{
try
{
var dic = DeserializeBookmarks(File.ReadAllText(fileName, Encoding.UTF8));
foreach (var kvp in dic)
{
var p = _subtitle.GetParagraphOrDefault(kvp.Key);
@ -69,11 +99,21 @@ namespace Nikse.SubtitleEdit.Core
p.Bookmark = kvp.Value;
}
}
}
catch
{
return false;
}
}
return true;
}
private Dictionary<int, string> DeserializeBookmarks(string s)
{
var dic = new Dictionary<int, string>();
s = s.Trim();
var bookmarks = Json.ReadObjectArray(s.Substring(s.IndexOf('[')).TrimEnd('}'));
if (bookmarks == null || bookmarks.Count == 0)
{
@ -84,8 +124,7 @@ namespace Nikse.SubtitleEdit.Core
{
var idx = Json.ReadTag(bm, "idx");
var txt = Json.ReadTag(bm, "txt");
int number;
if (int.TryParse(idx, out number))
if (int.TryParse(idx, out var number))
{
dic.Add(number, txt);
}

View File

@ -2309,6 +2309,7 @@ can edit in same subtitle file (collaboration)",
ListViewColumnTextDown = "Column, text down",
ListViewFocusWaveform = "Focus waveform/spectrogram",
ListViewGoToNextError = "Go to next error",
ListViewAutoBalance2PlusLines = "Auto balance selected lines (even 2+ lines)",
ShowBeamer = "Start subtitle fullscreen beamer",
MainTextBoxMoveLastWordDown = "Move last word to next subtitle",
MainTextBoxMoveFirstWordFromNextUp = "Fetch first word from next subtitle",

View File

@ -5482,6 +5482,9 @@ namespace Nikse.SubtitleEdit.Core
case "Settings/ListViewGoToNextError":
language.Settings.ListViewGoToNextError = reader.Value;
break;
case "Settings/ListViewAutoBalance2PlusLines":
language.Settings.ListViewAutoBalance2PlusLines = reader.Value;
break;
case "Settings/ShowBeamer":
language.Settings.ShowBeamer = reader.Value;
break;

View File

@ -2184,6 +2184,7 @@
public string ListViewColumnTextDown { get; set; }
public string ListViewFocusWaveform { get; set; }
public string ListViewGoToNextError { get; set; }
public string ListViewAutoBalance2PlusLines { get; set; }
public string ShowBeamer { get; set; }
public string MainTextBoxMoveLastWordDown { get; set; }
public string MainTextBoxMoveFirstWordFromNextUp { get; set; }

View File

@ -1113,6 +1113,7 @@ $HorzAlign = Center
public string MainListViewColumnTextDown { get; set; }
public string MainListViewFocusWaveform { get; set; }
public string MainListViewGoToNextError { get; set; }
public string MainListViewAutoBalance2PlusLines { get; set; }
public string MainTextBoxItalic { get; set; }
public string MainTextBoxSplitAtCursor { get; set; }
public string MainTextBoxSplitAtCursorAndVideoPos { get; set; }
@ -3287,6 +3288,9 @@ $HorzAlign = Center
subNode = node.SelectSingleNode("MainListViewGoToNextError");
if (subNode != null)
settings.Shortcuts.MainListViewGoToNextError = subNode.InnerText;
subNode = node.SelectSingleNode("MainListViewAutoBalance2PlusLines");
if (subNode != null)
settings.Shortcuts.MainListViewAutoBalance2PlusLines = subNode.InnerText;
subNode = node.SelectSingleNode("MainEditReverseStartAndEndingForRTL");
if (subNode != null)
settings.Shortcuts.MainEditReverseStartAndEndingForRTL = subNode.InnerText;
@ -4211,6 +4215,7 @@ $HorzAlign = Center
textWriter.WriteElementString("MainListViewColumnTextDown", settings.Shortcuts.MainListViewColumnTextDown);
textWriter.WriteElementString("MainListViewFocusWaveform", settings.Shortcuts.MainListViewFocusWaveform);
textWriter.WriteElementString("MainListViewGoToNextError", settings.Shortcuts.MainListViewGoToNextError);
textWriter.WriteElementString("MainListViewAutoBalance2PlusLines", settings.Shortcuts.MainListViewAutoBalance2PlusLines);
textWriter.WriteElementString("MainEditReverseStartAndEndingForRTL", settings.Shortcuts.MainEditReverseStartAndEndingForRTL);
textWriter.WriteElementString("MainTextBoxItalic", settings.Shortcuts.MainTextBoxItalic);
textWriter.WriteElementString("MainTextBoxSplitAtCursor", settings.Shortcuts.MainTextBoxSplitAtCursor);

View File

@ -612,8 +612,6 @@ namespace Nikse.SubtitleEdit.Core
sb.Append((p.StartTime.TotalMilliseconds + Configuration.Settings.General.CurrentVideoOffsetInMs).GetHashCode());
sb.Append((p.EndTime.TotalMilliseconds + Configuration.Settings.General.CurrentVideoOffsetInMs).GetHashCode());
sb.Append(p.Text);
if (p.Bookmark != null)
sb.Append("*" + p.Bookmark);
}
return sb.ToString().TrimEnd();
}

View File

@ -244,13 +244,13 @@ namespace Nikse.SubtitleEdit.Core
public static string AutoBreakLineMoreThanTwoLines(string text, int maximumLineLength, string language)
{
if (text == null || text.Length < 3)
if (text == null || text.Length < 3 || !text.Contains(" "))
return text;
string s = AutoBreakLine(text, 0, 0, language);
string s = AutoBreakLine(text, 0, Configuration.Settings.Tools.MergeLinesShorterThan, language);
var arr = s.SplitToLines();
if ((arr.Count < 2 && arr[0].Length <= maximumLineLength) || (arr[0].Length <= maximumLineLength && arr[1].Length <= maximumLineLength))
if (arr.Count < 2 && arr[0].Length <= maximumLineLength || arr[0].Length <= maximumLineLength && arr[1].Length <= maximumLineLength)
return s;
s = RemoveLineBreaks(s);
@ -350,7 +350,7 @@ namespace Nikse.SubtitleEdit.Core
public static string AutoBreakLine(string text, int maximumLength, int mergeLinesShorterThan, string language)
{
if (text == null || text.Length < 3)
if (text == null || text.Length < 3 || !text.Contains(" "))
return text;
// do not autobreak dialogs or music symbol

View File

@ -235,6 +235,7 @@ namespace Nikse.SubtitleEdit.Forms
private Keys _mainListViewAlignmentN9 = Keys.None;
private Keys _mainListViewFocusWaveform = Keys.None;
private Keys _mainListViewGoToNextError = Keys.None;
private Keys _mainListViewAutoBalance2PlusLines = Keys.None;
private Keys _mainListViewCopyText = Keys.None;
private Keys _mainEditReverseStartAndEndingForRTL = Keys.None;
private Keys _waveformVerticalZoom = Keys.None;
@ -3032,7 +3033,7 @@ namespace Nikse.SubtitleEdit.Forms
if (format != null)
{
new BookmarkPersistance(_subtitle).LoadFromFirstLine();
new BookmarkPersistance(_subtitle, fileName).Load();
if (Configuration.Settings.General.RemoveBlankLinesWhenOpening)
{
@ -12367,10 +12368,11 @@ namespace Nikse.SubtitleEdit.Forms
{
_cancelWordSpellCheck = true;
}
else if (inListView && (Keys.Shift | Keys.Control) == e.Modifiers && e.KeyCode == Keys.B)
else if (inListView && e.KeyData == _mainListViewAutoBalance2PlusLines)
{
AutoBalanceLinesAndAllow2PlusLines();
e.SuppressKeyPress = true;
e.Handled = true;
}
else if (audioVisualizer.Visible && e.KeyData == _waveformVerticalZoom)
{
@ -12382,17 +12384,17 @@ namespace Nikse.SubtitleEdit.Forms
audioVisualizer.VerticalZoomFactor /= 1.1;
e.SuppressKeyPress = true;
}
if (audioVisualizer.Visible && e.KeyData == _waveformZoomIn)
else if (audioVisualizer.Visible && e.KeyData == _waveformZoomIn)
{
audioVisualizer.ZoomIn();
e.SuppressKeyPress = true;
}
if (audioVisualizer.Visible && e.KeyData == _waveformZoomOut)
else if (audioVisualizer.Visible && e.KeyData == _waveformZoomOut)
{
audioVisualizer.ZoomOut();
e.SuppressKeyPress = true;
}
if (audioVisualizer.Visible && e.KeyData == _waveformSplit)
else if (audioVisualizer.Visible && e.KeyData == _waveformSplit)
{
if (mediaPlayer.IsPaused)
{
@ -13625,6 +13627,7 @@ namespace Nikse.SubtitleEdit.Forms
ShowHideBookmark(p);
}
SubtitleListview1.StateImageList = _subtitle != null && _subtitle.Paragraphs.Any(p => p.Bookmark != null) ? imageListBookmarks : null;
new BookmarkPersistance(_subtitle, _fileName).Save();
}
private void ClearBookmarks()
@ -13642,6 +13645,7 @@ namespace Nikse.SubtitleEdit.Forms
var p = _subtitle.GetParagraphOrDefault(_subtitleListViewIndex);
if (p != null)
ShowHideBookmark(p);
new BookmarkPersistance(_subtitle, _fileName).Save();
}
private void MoveWordUpDownInCurrent(bool down)
@ -17750,6 +17754,7 @@ namespace Nikse.SubtitleEdit.Forms
_mainListViewAlignmentN9 = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewAlignmentN9);
_mainListViewFocusWaveform = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewFocusWaveform);
_mainListViewGoToNextError = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewGoToNextError);
_mainListViewAutoBalance2PlusLines = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewAutoBalance2PlusLines);
_mainEditReverseStartAndEndingForRTL = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainEditReverseStartAndEndingForRTL);
_mainListViewCopyText = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewCopyText);
copyOriginalTextToCurrentToolStripMenuItem.ShortcutKeys = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainListViewCopyTextFromOriginalToCurrent);
@ -22592,7 +22597,6 @@ namespace Nikse.SubtitleEdit.Forms
{
sub.AddTimeToAllParagraphs(TimeSpan.FromMilliseconds(Configuration.Settings.General.CurrentVideoOffsetInMs));
}
new BookmarkPersistance(sub).SaveToFirstLine();
return sub;
}
@ -23573,11 +23577,6 @@ namespace Nikse.SubtitleEdit.Forms
ListViewToggleTag("box");
}
private void pictureBoxBookmark_Click(object sender, EventArgs e)
{
}
private void ShowHideBookmark(Paragraph p)
{
if (!string.IsNullOrWhiteSpace(p.Bookmark))
@ -23659,6 +23658,7 @@ namespace Nikse.SubtitleEdit.Forms
SubtitleListview1.ShowState(_subtitleListViewIndex, p1);
ShowHideBookmark(p1);
SubtitleListview1.StateImageList = _subtitle != null && _subtitle.Paragraphs.Any(p => p.Bookmark != null) ? imageListBookmarks : null;
new BookmarkPersistance(_subtitle, _fileName).Save();
}
}
}
@ -23676,6 +23676,7 @@ namespace Nikse.SubtitleEdit.Forms
SubtitleListview1.ShowState(_subtitleListViewIndex, p2);
ShowHideBookmark(p2);
SubtitleListview1.StateImageList = _subtitle != null && _subtitle.Paragraphs.Any(p => p.Bookmark != null) ? imageListBookmarks : null;
new BookmarkPersistance(_subtitle, _fileName).Save();
}
};
_bookmarkContextMenu.MenuItems.Add(menuItem);

View File

@ -938,6 +938,7 @@ namespace Nikse.SubtitleEdit.Forms
AddNode(listViewNode, language.ListViewColumnTextDown, nameof(Configuration.Settings.Shortcuts.MainListViewColumnTextDown), true);
AddNode(listViewNode, language.ListViewFocusWaveform, nameof(Configuration.Settings.Shortcuts.MainListViewFocusWaveform));
AddNode(listViewNode, language.ListViewGoToNextError, nameof(Configuration.Settings.Shortcuts.MainListViewGoToNextError));
AddNode(listViewNode, language.ListViewAutoBalance2PlusLines, nameof(Configuration.Settings.Shortcuts.MainListViewAutoBalance2PlusLines));
if (listViewNode.Nodes.Count > 0)
_shortcuts.Nodes.Add(listViewNode);