This commit is contained in:
Nikolaj Olsson 2018-12-25 00:08:23 +01:00
parent 059df0c37d
commit 8cfb380d87
21 changed files with 897 additions and 26 deletions

View File

@ -2,7 +2,11 @@
3.5.9 (xth March 2019) BETA
* NEW:
* Bookmarks
* Auto save option
* Spell check - keep "Use always" replace list option
* Image export - option to have single lines top justified - thx joedmartin
* Add shortcut: Modify selection
* IMPROVED:
* Update Hungarian translation - thx Zityi
* FIXED:

View File

@ -1742,6 +1742,11 @@ can edit in same subtitle file (collaboration)</Information>
<SettingsName>Settings</SettingsName>
<Help>Help</Help>
<UnbreakNoSpace>Unbreak without space (CJK)</UnbreakNoSpace>
<ToggleBookmarks>Toggle bookmarks</ToggleBookmarks>
<ToggleBookmarksWithText>Toggle bookmarks - add text</ToggleBookmarksWithText>
<ClearBookmarks>Clear bookmarks</ClearBookmarks>
<GoToBookmark>Go to bookmark</GoToBookmark>
<GoToNextBookmark>Go to next bookmark</GoToNextBookmark>
<FontInUi>UI Font</FontInUi>
<ShowFrameRate>Show frame rate in toolbar</ShowFrameRate>
<DefaultFrameRate>Default frame rate</DefaultFrameRate>

View File

@ -2034,6 +2034,11 @@ can edit in same subtitle file (collaboration)",
SettingsName = "Settings",
Help = "Help",
UnbreakNoSpace = "Unbreak without space (CJK)",
ToggleBookmarks = "Toggle bookmarks",
ToggleBookmarksWithText = "Toggle bookmarks - add text",
ClearBookmarks = "Clear bookmarks",
GoToBookmark = "Go to bookmark",
GoToNextBookmark = "Go to next bookmark",
FontInUi = "UI Font",
ShowFrameRate = "Show frame rate in toolbar",
DefaultFrameRate = "Default frame rate",

View File

@ -4651,6 +4651,21 @@ namespace Nikse.SubtitleEdit.Core
case "Settings/UnbreakNoSpace":
language.Settings.UnbreakNoSpace = reader.Value;
break;
case "Settings/ToggleBookmarks":
language.Settings.ToggleBookmarks = reader.Value;
break;
case "Settings/ToggleBookmarksWithText":
language.Settings.ToggleBookmarksWithText = reader.Value;
break;
case "Settings/ClearBookmarks":
language.Settings.ClearBookmarks = reader.Value;
break;
case "Settings/GoToBookmark":
language.Settings.GoToBookmark = reader.Value;
break;
case "Settings/GoToNextBookmark":
language.Settings.GoToNextBookmark = reader.Value;
break;
case "Settings/FontInUi":
language.Settings.FontInUi = reader.Value;
break;

View File

@ -1903,6 +1903,11 @@
public string SettingsName { get; set; }
public string Help { get; set; }
public string UnbreakNoSpace { get; set; }
public string ToggleBookmarks { get; set; }
public string ToggleBookmarksWithText { get; set; }
public string ClearBookmarks { get; set; }
public string GoToBookmark { get; set; }
public string GoToNextBookmark { get; set; }
public string FontInUi { get; set; }
public string ShowFrameRate { get; set; }
public string DefaultFrameRate { get; set; }

View File

@ -49,6 +49,8 @@ namespace Nikse.SubtitleEdit.Core
public bool NewSection { get; set; }
public string Bookmark { get; set; }
private string GenerateId()
{
return Guid.NewGuid().ToString();
@ -92,6 +94,7 @@ namespace Nikse.SubtitleEdit.Core
Language = paragraph.Language;
Style = paragraph.Style;
NewSection = paragraph.NewSection;
Bookmark = paragraph.Bookmark;
}
public Paragraph(int startFrame, int endFrame, string text)

View File

@ -1008,6 +1008,11 @@ $HorzAlign = Center
public string GeneralPlayFirstSelected { get; set; }
public string GeneralHelp { get; set; }
public string GeneralUnbrekNoSpace { get; set; }
public string GeneralToggleBookmarks { get; set; }
public string GeneralToggleBookmarksWithText { get; set; }
public string GeneralClearBookmarks { get; set; }
public string GeneralGoToBookmark { get; set; }
public string GeneralGoToNextBookmark { get; set; }
public string MainFileNew { get; set; }
public string MainFileOpen { get; set; }
public string MainFileOpenKeepVideo { get; set; }
@ -2967,6 +2972,21 @@ $HorzAlign = Center
subNode = node.SelectSingleNode("GeneralUnbrekNoSpace");
if (subNode != null)
settings.Shortcuts.GeneralUnbrekNoSpace = subNode.InnerText;
subNode = node.SelectSingleNode("GeneralToggleBookmarks");
if (subNode != null)
settings.Shortcuts.GeneralToggleBookmarks = subNode.InnerText;
subNode = node.SelectSingleNode("GeneralToggleBookmarksWithText");
if (subNode != null)
settings.Shortcuts.GeneralToggleBookmarksWithText = subNode.InnerText;
subNode = node.SelectSingleNode("GeneralClearBookmarks");
if (subNode != null)
settings.Shortcuts.GeneralClearBookmarks = subNode.InnerText;
subNode = node.SelectSingleNode("GeneralGoToBookmark");
if (subNode != null)
settings.Shortcuts.GeneralGoToBookmark = subNode.InnerText;
subNode = node.SelectSingleNode("GeneralGoToNextBookmark");
if (subNode != null)
settings.Shortcuts.GeneralGoToNextBookmark = subNode.InnerText;
subNode = node.SelectSingleNode("MainFileNew");
if (subNode != null)
settings.Shortcuts.MainFileNew = subNode.InnerText;
@ -4083,6 +4103,11 @@ $HorzAlign = Center
textWriter.WriteElementString("GeneralPlayFirstSelected", settings.Shortcuts.GeneralPlayFirstSelected);
textWriter.WriteElementString("GeneralHelp", settings.Shortcuts.GeneralHelp);
textWriter.WriteElementString("GeneralUnbrekNoSpace", settings.Shortcuts.GeneralUnbrekNoSpace);
textWriter.WriteElementString("GeneralToggleBookmarks", settings.Shortcuts.GeneralToggleBookmarks);
textWriter.WriteElementString("GeneralToggleBookmarksWithText", settings.Shortcuts.GeneralToggleBookmarksWithText);
textWriter.WriteElementString("GeneralClearBookmarks", settings.Shortcuts.GeneralClearBookmarks);
textWriter.WriteElementString("GeneralGoToBookmark", settings.Shortcuts.GeneralGoToBookmark);
textWriter.WriteElementString("GeneralGoToNextBookmark", settings.Shortcuts.GeneralGoToNextBookmark);
textWriter.WriteElementString("MainFileNew", settings.Shortcuts.MainFileNew);
textWriter.WriteElementString("MainFileOpen", settings.Shortcuts.MainFileOpen);
textWriter.WriteElementString("MainFileOpenKeepVideo", settings.Shortcuts.MainFileOpenKeepVideo);

View File

@ -743,6 +743,32 @@ namespace Nikse.SubtitleEdit.Controls
const int padding = 3;
double n = _zoomFactor * _wavePeaks.SampleRate;
// bookmark text
if (paragraph.Bookmark != null)
{
using (var bookmarkTextBrush = new SolidBrush(Color.DodgerBlue))
{
var x = currentRegionLeft + padding;
var y = Height / 2 - (int)graphics.MeasureString("xx", font).Height / 2;
graphics.FillPolygon(bookmarkTextBrush, new PointF[]
{
new PointF(x, y),
new PointF(x + 14, y),
new PointF(x + 14, y + 24),
new PointF(x + 7, y + 14),
new PointF(x, y + 24),
new PointF(x, y),
});
x += 16;
// poor mans outline + text
graphics.DrawString(paragraph.Bookmark, font, outlineBrush, new PointF(x, y - 1));
graphics.DrawString(paragraph.Bookmark, font, outlineBrush, new PointF(x, y + 1));
graphics.DrawString(paragraph.Bookmark, font, outlineBrush, new PointF(x - 1, y));
graphics.DrawString(paragraph.Bookmark, font, outlineBrush, new PointF(x + 1, y));
graphics.DrawString(paragraph.Bookmark, font, bookmarkTextBrush, new PointF(x, y));
}
}
// paragraph text
if (n > 80)
{

View File

@ -365,6 +365,7 @@ namespace Nikse.SubtitleEdit.Controls
if (e.Item.Selected)
{
Rectangle rect = e.Bounds;
if (Configuration.Settings != null)
{
@ -376,6 +377,14 @@ namespace Nikse.SubtitleEdit.Controls
{
e.Graphics.FillRectangle(Brushes.LightBlue, rect);
}
int addX = 0;
if (e.ColumnIndex == 0 && e.Item.StateImageIndex >= 0)
{
e.Graphics.DrawImage(StateImageList.Images[e.Item.StateImageIndex], new Rectangle(rect.X + 4, rect.Y + 2, 16, 16));
addX = 18;
}
if (Columns[e.ColumnIndex].TextAlign == HorizontalAlignment.Right)
{
var stringWidth = (int)e.Graphics.MeasureString(e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont).Width;
@ -383,7 +392,7 @@ namespace Nikse.SubtitleEdit.Controls
}
else
{
TextRenderer.DrawText(e.Graphics, e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont, new Point(e.Bounds.Left + 3, e.Bounds.Top + 2), e.Item.ForeColor, TextFormatFlags.NoPrefix);
TextRenderer.DrawText(e.Graphics, e.Item.SubItems[e.ColumnIndex].Text, _subtitleFont, new Point(e.Bounds.Left + 3 + addX, e.Bounds.Top + 2), e.Item.ForeColor, TextFormatFlags.NoPrefix);
}
}
else
@ -1276,6 +1285,8 @@ namespace Nikse.SubtitleEdit.Controls
break;
}
}
item.StateImageIndex = paragraph.Bookmark != null ? 0 : -1;
item.Font = new Font(_subtitleFontName, SubtitleFontSize, GetFontStyle());
Items.Add(item);
}
@ -1598,7 +1609,7 @@ namespace Nikse.SubtitleEdit.Controls
Items[index].SubItems[ColumnIndexWpm].BackColor = color;
if (ColumnIndexText >= 0)
Items[index].SubItems[ColumnIndexText].BackColor = color;
if (ColumnIndexTextAlternate>= 0)
if (ColumnIndexTextAlternate >= 0)
Items[index].SubItems[ColumnIndexTextAlternate].BackColor = color;
}
}
@ -1661,5 +1672,13 @@ namespace Nikse.SubtitleEdit.Controls
}
private FontStyle GetFontStyle() => SubtitleFontBold ? FontStyle.Bold : FontStyle.Regular;
public void ShowState(int index, Paragraph paragraph)
{
if (IsValidIndex(index))
{
Items[index].StateImageIndex = paragraph.Bookmark != null ? 0 : -1;
}
}
}
}

View File

@ -29,6 +29,7 @@
//
// buttonOK
//
this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonOK.Location = new System.Drawing.Point(97, 129);
this.buttonOK.Name = "buttonOK";
@ -40,6 +41,7 @@
//
// 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(181, 129);

99
src/Forms/BookmarkAdd.Designer.cs generated Normal file
View File

@ -0,0 +1,99 @@
namespace Nikse.SubtitleEdit.Forms
{
sealed partial class BookmarkAdd
{
/// <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.textBoxBookmarkComment = new System.Windows.Forms.TextBox();
this.buttonOK = new System.Windows.Forms.Button();
this.buttonCancel = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// textBoxBookmarkComment
//
this.textBoxBookmarkComment.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBoxBookmarkComment.Location = new System.Drawing.Point(13, 13);
this.textBoxBookmarkComment.Multiline = true;
this.textBoxBookmarkComment.Name = "textBoxBookmarkComment";
this.textBoxBookmarkComment.Size = new System.Drawing.Size(462, 66);
this.textBoxBookmarkComment.TabIndex = 0;
//
// buttonOK
//
this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonOK.Location = new System.Drawing.Point(319, 89);
this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(75, 21);
this.buttonOK.TabIndex = 4;
this.buttonOK.Text = "&OK";
this.buttonOK.UseVisualStyleBackColor = true;
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//
// 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(400, 89);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(75, 21);
this.buttonCancel.TabIndex = 5;
this.buttonCancel.Text = "C&ancel";
this.buttonCancel.UseVisualStyleBackColor = true;
//
// BookmarkAdd
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(487, 118);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.textBoxBookmarkComment);
this.KeyPreview = true;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "BookmarkAdd";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Add bookmark with comment";
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.BookmarkAdd_KeyDown);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBoxBookmarkComment;
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.Button buttonCancel;
}
}

38
src/Forms/BookmarkAdd.cs Normal file
View File

@ -0,0 +1,38 @@
using System.Windows.Forms;
using Nikse.SubtitleEdit.Core;
using Nikse.SubtitleEdit.Logic;
namespace Nikse.SubtitleEdit.Forms
{
public sealed partial class BookmarkAdd : Form
{
public BookmarkAdd()
{
UiUtil.PreInitialize(this);
InitializeComponent();
UiUtil.FixFonts(this);
// Text = Configuration.Settings.Language.AddToNames.Title;
buttonCancel.Text = Configuration.Settings.Language.General.Cancel;
buttonOK.Text = Configuration.Settings.Language.General.Ok;
}
public string Comment => textBoxBookmarkComment.Text;
private void buttonOK_Click(object sender, System.EventArgs e)
{
DialogResult = DialogResult.OK;
}
private void BookmarkAdd_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
DialogResult = DialogResult.Cancel;
}
else if (e.Modifiers == Keys.None && e.KeyCode == Keys.Enter)
{
DialogResult = DialogResult.OK;
}
}
}
}

120
src/Forms/BookmarkAdd.resx Normal file
View 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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

111
src/Forms/BookmarksGoTo.Designer.cs generated Normal file
View File

@ -0,0 +1,111 @@
namespace Nikse.SubtitleEdit.Forms
{
partial class BookmarksGoTo
{
/// <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.buttonCancel = new System.Windows.Forms.Button();
this.listViewBookmarks = new System.Windows.Forms.ListView();
this.columnHeaderText = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.buttonOK = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// 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(555, 308);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(75, 21);
this.buttonCancel.TabIndex = 6;
this.buttonCancel.Text = "C&ancel";
this.buttonCancel.UseVisualStyleBackColor = true;
//
// listViewBookmarks
//
this.listViewBookmarks.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listViewBookmarks.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeaderText});
this.listViewBookmarks.FullRowSelect = true;
this.listViewBookmarks.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
this.listViewBookmarks.HideSelection = false;
this.listViewBookmarks.Location = new System.Drawing.Point(13, 13);
this.listViewBookmarks.Name = "listViewBookmarks";
this.listViewBookmarks.Size = new System.Drawing.Size(617, 289);
this.listViewBookmarks.TabIndex = 7;
this.listViewBookmarks.UseCompatibleStateImageBehavior = false;
this.listViewBookmarks.View = System.Windows.Forms.View.Details;
this.listViewBookmarks.DoubleClick += new System.EventHandler(this.listViewBookmarks_DoubleClick);
//
// columnHeaderText
//
this.columnHeaderText.Width = 500;
//
// buttonOK
//
this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonOK.Location = new System.Drawing.Point(474, 308);
this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(75, 21);
this.buttonOK.TabIndex = 8;
this.buttonOK.Text = "&OK";
this.buttonOK.UseVisualStyleBackColor = true;
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//
// BookmarksGoTo
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(642, 341);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.listViewBookmarks);
this.Controls.Add(this.buttonCancel);
this.KeyPreview = true;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "BookmarksGoTo";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "BookmarksGoTo";
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.BookmarksGoTo_KeyDown);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button buttonCancel;
private System.Windows.Forms.ListView listViewBookmarks;
private System.Windows.Forms.ColumnHeader columnHeaderText;
private System.Windows.Forms.Button buttonOK;
}
}

View File

@ -0,0 +1,65 @@
using System;
using System.Windows.Forms;
using Nikse.SubtitleEdit.Core;
using Nikse.SubtitleEdit.Logic;
namespace Nikse.SubtitleEdit.Forms
{
public partial class BookmarksGoTo : Form
{
private readonly Subtitle _subtitle;
public BookmarksGoTo(Subtitle subtitle)
{
UiUtil.PreInitialize(this);
InitializeComponent();
UiUtil.FixFonts(this);
// Text = Configuration.Settings.Language.AddToNames.Title;
buttonCancel.Text = Configuration.Settings.Language.General.Cancel;
_subtitle = subtitle;
foreach (var p in subtitle.Paragraphs)
{
if (p.Bookmark != null)
{
ListViewItem item = new ListViewItem(p.Number + ": " + p.StartTime.ToShortDisplayString() + " - " + p.Bookmark.Replace(Environment.NewLine, " ")) { Tag = p };
listViewBookmarks.Items.Add(item);
}
}
}
public int BookmarkIndex { get; private set; }
private void listViewBookmarks_DoubleClick(object sender, EventArgs e)
{
if (listViewBookmarks.SelectedItems.Count > 0)
{
var p = (Paragraph)listViewBookmarks.SelectedItems[0].Tag;
BookmarkIndex = _subtitle.Paragraphs.IndexOf(p);
DialogResult = DialogResult.OK;
}
}
private void buttonOK_Click(object sender, EventArgs e)
{
if (listViewBookmarks.SelectedItems.Count > 0)
{
var p = (Paragraph)listViewBookmarks.SelectedItems[0].Tag;
BookmarkIndex = _subtitle.Paragraphs.IndexOf(p);
DialogResult = DialogResult.OK;
}
}
private void BookmarksGoTo_KeyDown(object sender, KeyEventArgs e)
{
if (listViewBookmarks.Focused && e.KeyCode == Keys.Enter)
{
buttonOK_Click(sender, e);
}
else if (e.KeyCode == Keys.Escape)
{
DialogResult = DialogResult.Cancel;
}
}
}
}

View 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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -418,6 +418,7 @@
this.tabPage1 = new System.Windows.Forms.TabPage();
this.splitContainerListViewAndText = new System.Windows.Forms.SplitContainer();
this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView();
this.imageListBookmarks = new System.Windows.Forms.ImageList(this.components);
this.groupBoxEdit = new System.Windows.Forms.GroupBox();
this.labelSingleLine = new System.Windows.Forms.Label();
this.labelAlternateSingleLine = new System.Windows.Forms.Label();
@ -2402,7 +2403,7 @@
this.changeCasingForSelectedLinesToolStripMenuItem,
this.toolStripMenuItemSaveSelectedLines});
this.contextMenuStripListview.Name = "contextMenuStripListview";
this.contextMenuStripListview.Size = new System.Drawing.Size(285, 892);
this.contextMenuStripListview.Size = new System.Drawing.Size(285, 870);
this.contextMenuStripListview.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.MenuClosed);
this.contextMenuStripListview.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripListviewOpening);
this.contextMenuStripListview.Opened += new System.EventHandler(this.MenuOpened);
@ -4003,6 +4004,7 @@
this.SubtitleListview1.Name = "SubtitleListview1";
this.SubtitleListview1.OwnerDraw = true;
this.SubtitleListview1.Size = new System.Drawing.Size(724, 91);
this.SubtitleListview1.StateImageList = this.imageListBookmarks;
this.SubtitleListview1.SubtitleFontBold = false;
this.SubtitleListview1.SubtitleFontName = "Tahoma";
this.SubtitleListview1.SubtitleFontSize = 8;
@ -4017,6 +4019,12 @@
this.SubtitleListview1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubtitleListview1_MouseDoubleClick);
this.SubtitleListview1.MouseEnter += new System.EventHandler(this.SubtitleListview1_MouseEnter);
//
// imageListBookmarks
//
this.imageListBookmarks.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListBookmarks.ImageStream")));
this.imageListBookmarks.TransparentColor = System.Drawing.Color.Transparent;
this.imageListBookmarks.Images.SetKeyName(0, "bookmark.png");
//
// groupBoxEdit
//
this.groupBoxEdit.Controls.Add(this.labelSingleLine);
@ -5191,5 +5199,6 @@
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSplitViaWaveform;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemEbuProperties;
private System.Windows.Forms.ToolStripMenuItem boxToolStripMenuItem;
private System.Windows.Forms.ImageList imageListBookmarks;
}
}

View File

@ -176,6 +176,11 @@ namespace Nikse.SubtitleEdit.Forms
private Keys _mainAdjustExtendCurrentSubtitle = Keys.None;
private Keys _mainAutoCalcCurrentDuration = Keys.None;
private Keys _mainUnbreakNoSpace = Keys.None;
private Keys _mainGeneralToggleBookmarks = Keys.None;
private Keys _mainGeneralToggleBookmarksWithText = Keys.None;
private Keys _mainGeneralClearBookmarks = Keys.None;
private Keys _mainGeneralGoToBookmark = Keys.None;
private Keys _mainGeneralGoToNextBookmark = Keys.None;
private Keys _mainTextBoxSplitAtCursor = Keys.None;
private Keys _mainTextBoxSplitAtCursorAndVideoPos = Keys.None;
private Keys _mainTextBoxSplitSelectedLineBilingual = Keys.None;
@ -4034,6 +4039,7 @@ namespace Nikse.SubtitleEdit.Forms
textBoxListViewText.RightToLeft = RightToLeft.No;
textBoxSource.RightToLeft = RightToLeft.No;
}
SubtitleListview1.StateImageList = _subtitle != null && _subtitle.Paragraphs.Any(p => p.Bookmark != null) ? imageListBookmarks : null;
}
private void ResetShowEarlierOrLater()
@ -12536,6 +12542,48 @@ namespace Nikse.SubtitleEdit.Forms
else if (_mainUnbreakNoSpace == e.KeyData)
{
Unbreak(true);
e.Handled = true;
e.SuppressKeyPress = true;
}
else if (_mainGeneralToggleBookmarks == e.KeyData)
{
ToggleBookmarks(false);
e.Handled = true;
e.SuppressKeyPress = true;
}
else if (_mainGeneralToggleBookmarksWithText == e.KeyData)
{
ToggleBookmarks(true);
e.Handled = true;
e.SuppressKeyPress = true;
}
else if (_mainGeneralClearBookmarks == e.KeyData)
{
ClearBookmarks();
e.Handled = true;
e.SuppressKeyPress = true;
}
else if (_mainGeneralGoToBookmark == e.KeyData)
{
e.Handled = true;
e.SuppressKeyPress = true;
using (var form = new BookmarksGoTo(_subtitle))
{
if (form.ShowDialog(this) == DialogResult.OK)
{
SubtitleListview1.SelectIndexAndEnsureVisible(form.BookmarkIndex, true);
if (mediaPlayer.VideoPlayer != null)
{
mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[form.BookmarkIndex].StartTime.TotalSeconds;
}
}
}
}
else if (_mainGeneralGoToNextBookmark == e.KeyData)
{
GoToNextBookmark();
e.Handled = true;
e.SuppressKeyPress = true;
}
else if (_mainGeneralFileSaveAll == e.KeyData)
{
@ -13466,6 +13514,85 @@ namespace Nikse.SubtitleEdit.Forms
// put new entries above tabs
}
private void GoToNextBookmark()
{
int idx = FirstSelectedIndex + 1;
try
{
for (int i = idx; i < _subtitle.Paragraphs.Count; i++)
{
var p = _subtitle.Paragraphs[i];
if (p.Bookmark != null)
{
SubtitleListview1.SelectIndexAndEnsureVisible(i, true);
if (mediaPlayer.VideoPlayer != null)
{
mediaPlayer.VideoPlayer.CurrentPosition = _subtitle.Paragraphs[i].StartTime.TotalSeconds;
}
return;
}
}
}
catch
{
}
}
private void ToggleBookmarks(bool setText)
{
bool first = true;
string newValue = null;
foreach (int index in SubtitleListview1.SelectedIndices)
{
var p = _subtitle.Paragraphs[index];
if (first)
{
if (p.Bookmark == null)
{
if (setText)
{
using (var form = new BookmarkAdd())
{
var result = form.ShowDialog(this);
if (result != DialogResult.OK)
{
return;
}
newValue = form.Comment;
}
}
else
{
newValue = string.Empty;
}
}
else
{
newValue = null;
}
first = false;
if (newValue == string.Empty)
{
SubtitleListview1.StateImageList = imageListBookmarks;
}
}
p.Bookmark = newValue;
SubtitleListview1.ShowState(index, p);
}
SubtitleListview1.StateImageList = _subtitle != null && _subtitle.Paragraphs.Any(p => p.Bookmark != null) ? imageListBookmarks : null;
}
private void ClearBookmarks()
{
SubtitleListview1.StateImageList = null;
for (var index = 0; index < _subtitle.Paragraphs.Count; index++)
{
var paragraph = _subtitle.Paragraphs[index];
paragraph.Bookmark = null;
}
}
private void MoveWordUpDownInCurrent(bool down)
{
int firstIndex = FirstSelectedIndex;
@ -17527,6 +17654,11 @@ namespace Nikse.SubtitleEdit.Forms
_mainAdjustExtendCurrentSubtitle = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralExtendCurrentSubtitle);
_mainAutoCalcCurrentDuration = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralAutoCalcCurrentDuration);
_mainUnbreakNoSpace = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralUnbrekNoSpace);
_mainGeneralToggleBookmarks = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralToggleBookmarks);
_mainGeneralToggleBookmarksWithText = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralToggleBookmarksWithText);
_mainGeneralClearBookmarks = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralClearBookmarks);
_mainGeneralGoToBookmark = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToBookmark);
_mainGeneralGoToNextBookmark = UiUtil.GetKeys(Configuration.Settings.Shortcuts.GeneralGoToNextBookmark);
_mainVideoFullscreen = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoFullscreen);
_mainVideoSlower = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoSlower);
_mainVideoFaster = UiUtil.GetKeys(Configuration.Settings.Shortcuts.MainVideoFaster);

View File

@ -462,20 +462,20 @@
<data name="toolStripButtonNetflixQualityCheck.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALoSURBVFhHtZfLaxRBEMZbd17tbmZ2ZjpHwasePHvQuxfv
HvwDvHj3IOjNKEYEhSyYgIZg4iPZXaKgGFw8hRAFhSSERNzsPAQP4iUi+MhYtfQuk54KuI/54Dt11dRv
q6Z7etlBWre8JOYi45ZWPiNDSNUNJ6F8lTFNhvyf3phlEiAy/XkZQooqju4ZYBEAti0/A7DGxZ+m6RyT
YRlRxdE9A1wznL0lg+5CyP1xGZYRVRzdF8CsZictoguxKb6vMVaSoftEFUf3BVDV7aRhuFkAcGCOXpKh
+0QVR/cFgIlTBZsEiC13Cx56WIZ3pRbuuG+ASRjDqumREJFRPifDu1ILd9w3wGMYw7TmkACBJZZkeFdq
4Y77BkDfLIwkG8TB9JyLvVAvn5QpbaWLpj0QwIQ2kizodBdCy5+UKW2li6Y9EMA0vAe3oAufqS3JnZ9b
rDQq0/IBwO04BgCvDjiYIktckWnsKcSmC3c8EAD6DgDcBUPBXypArDtf4GAyMO8BdCud1/HAALgdsQsh
92YzAODQKl/AvHsQk87reGAA3I5tAM07RQKY4h3m3YCYBWIMAwOgcTviWmz4yxRES3NPIyS+tGruUABw
O+JaoIvzFADcFZ4hAMapuUMBwF+Gaw14WMz9QAXAuwK+A9gp3Dnp3KEA4EPlMgst97IKgH4NWxW7MJMH
AFous4DZ3iYv/VABduCwwkOrooxh6ACo2BIVFQBd08vJOECk83IBaBrecfwgqQCb0AXcjo9SY8gFABVZ
/ksVAD0Dn/D7qTHkBhAccc9SAO/hEnM7NYbcAECHQi42KIgKbNs5OYY8AVjE/YsUwFu40OI3BPNyBfjA
WBGu6t9UgABexgk5hlwBUBEXYyoA+gVsyScwhvwBmHu0ycVvFeATdOEhjCF3ABT8ZZtTAdA1uE/2DDBv
FHfrhWKzrjsrNd1erBr2VFV3rstlUjuGd2LFcJZX4U/LR939us6Lu9vQlQYXf2kAxv4BaletSXszqpgA
AAAASUVORK5CYII=
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALnSURBVFhHtZfPaxNBFMdHs7/GpPsjOz0KXvXg2YPevXj3
4B/gxbsHoUerWBEUGrAFLcVWa5uEIigWg6dSqqDQltKKaXazggfxUhH80fW9MAnb2Vcw2ewXvqd5b98n
b/bNTthR2rTKccRFyi3NvSBDSNUNJ6Y8xpgmQ/5Pb0yXBGib/qIMIUUVR/cNsAwAu5afAtjg4k/TdE7J
sJSo4ui+AcYM52DFoLsQcn9ChqVEFUcPBDCn2XGL6EJkiu8bjJVk6CFRxdEDAVR1O24YXhoAHJij12To
IVHF0QMBYOJ0wSYBIsvbgYcel+E9qYW7HhhgCrZh3aRHsm24l2R4T2rhrgcGeArbMKM5JEBgiRUZ3pNa
uOuBAdC3CyPxFnEw1bk4CHX3rEzpKFk06UwAk9pIvKTTXQgtf0qmdJQsmnQmgBl4D+5AFz5TI8mdnzus
NCrT8gHAcRwHgFdHHExtS9yQaWwBYpOFu84EgL4HAPfBUPCXChDpzhc4mAzMewTdSuZ1nRkAxxG7EPLy
XAoAHFruFcx7ADHJvK4zA+A4dgC08jkSwBTvMO8WxCwR25AZAI3jiGuR4a9SEC3NO4+Q+NKquUMBwHHE
tUAXlykAuCs8RwCMU3OHAoC/DNca8LCI+4EKgHcFfAewUzg5ydyhAOBD5TILLe+6CoB+DaOKXZjNAwAt
l1nA7PI2L/1QAfbgsMJDq6Jsw9ABUJElKioAuqa78QRAJPNyAWga5dP4QVIBtqELOI5PEtuQCwCqbfkv
VQD0LHzCHya2ITeA4IR3kQJ4D5eYu4ltyA0AdCzkYouCqMDYzsttyBOAtbl/lQJ4Cxda/IZgXq4AHxgr
wlX9mwoQwMs4KbchVwBUm4txFQD9AkbyGWxD/gDMO9nk4rcK8Am68Bi2IXcAFPxlm1cB0DW4T/YNsGgU
9+uFYrOuO2s13V6uGvZ0VXduymVSe0b5zJrhrK7Dn5aPuvd1kxf3d6ErDS7+0gCM/QNh6a0n3oUwOwAA
AABJRU5ErkJggg==
</value>
</data>
<data name="toolStripButtonSettings.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -754,6 +754,50 @@
<metadata name="contextMenuStripWaveform.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>167, 56</value>
</metadata>
<metadata name="imageListBookmarks.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>1095, 56</value>
</metadata>
<data name="imageListBookmarks.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC4
BwAAAk1TRnQBSQFMAwEBAAEYAQABGAEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8BAAT/ARkB9AX/AhkD/zAA
BP8BGQHaARkD/wEZAdoBGQP/MAAE/wEZAtoBGQH/ARkC2gEZA/8wAAT/ARkD2gEZA9oBGQP/MAAE/wEZ
B9oBGQP/MAAE/wEZB9oBGQP/MAAE/wEZB9oBGQP/MAAE/wEZB9oBGQP/MAAE/wEZB9oBGQP/MAAE/wEZ
B9oBGQP/MAAE/wEZB9oBGQP/MAAE/wEZB9oBGQP/MAAE/wEZB9oBGQP/MAAE/wEZB9oBGQP/MAAE/wEZ
B9oBGQP/MAAE/wEZB9wB9AP/MAABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/4EA
Cw==
</value>
</data>
<metadata name="contextMenuStripTextBoxListView.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>437, 17</value>
</metadata>
@ -768,7 +812,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2
CAAAAk1TRnQBSQFMAgEBAgEAATABJQEwASUBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAAUgBJQFIASUBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -816,6 +860,6 @@
<value>916, 95</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>26</value>
<value>115</value>
</metadata>
</root>

View File

@ -799,6 +799,11 @@ namespace Nikse.SubtitleEdit.Forms
AddNode(generalNode, language.GoToNextSubtitleAndFocusVideo, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextSubtitleAndFocusVideo));
AddNode(generalNode, language.Help, nameof(Configuration.Settings.Shortcuts.GeneralHelp));
AddNode(generalNode, language.UnbreakNoSpace, nameof(Configuration.Settings.Shortcuts.GeneralUnbrekNoSpace));
AddNode(generalNode, language.ToggleBookmarks, nameof(Configuration.Settings.Shortcuts.GeneralToggleBookmarks));
AddNode(generalNode, language.ToggleBookmarksWithText, nameof(Configuration.Settings.Shortcuts.GeneralToggleBookmarksWithText));
AddNode(generalNode, language.ClearBookmarks, nameof(Configuration.Settings.Shortcuts.GeneralClearBookmarks));
AddNode(generalNode, language.GoToBookmark, nameof(Configuration.Settings.Shortcuts.GeneralGoToBookmark));
AddNode(generalNode, language.GoToNextBookmark, nameof(Configuration.Settings.Shortcuts.GeneralGoToNextBookmark));
if (generalNode.Nodes.Count > 0)
_shortcuts.Nodes.Add(generalNode);
@ -827,6 +832,7 @@ namespace Nikse.SubtitleEdit.Forms
AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.FindNext, nameof(Configuration.Settings.Shortcuts.MainEditFindNext), true);
AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.Replace, nameof(Configuration.Settings.Shortcuts.MainEditReplace), true);
AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.MultipleReplace, nameof(Configuration.Settings.Shortcuts.MainEditMultipleReplace), true);
AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.ModifySelection, nameof(Configuration.Settings.Shortcuts.MainEditModifySelection), true);
AddNode(editNode, Configuration.Settings.Language.Main.Menu.Edit.GoToSubtitleNumber, nameof(Configuration.Settings.Shortcuts.MainEditGoToLineNumber), true);
AddNode(editNode, Configuration.Settings.Language.VobSubOcr.RightToLeft, nameof(Configuration.Settings.Shortcuts.MainEditRightToLeft), true);
AddNode(editNode, language.ReverseStartAndEndingForRTL, nameof(Configuration.Settings.Shortcuts.MainEditReverseStartAndEndingForRTL), true);

View File

@ -86,6 +86,12 @@
<Compile Include="Controls\AudioVisualizer.Designer.cs">
<DependentUpon>AudioVisualizer.cs</DependentUpon>
</Compile>
<Compile Include="Forms\BookmarkAdd.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\BookmarkAdd.Designer.cs">
<DependentUpon>BookmarkAdd.cs</DependentUpon>
</Compile>
<Compile Include="Forms\AddWaveformBatch.cs">
<SubType>Form</SubType>
</Compile>
@ -104,6 +110,12 @@
<Compile Include="Forms\BatchConvertFixRtl.Designer.cs">
<DependentUpon>BatchConvertFixRtl.cs</DependentUpon>
</Compile>
<Compile Include="Forms\BookmarksGoTo.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\BookmarksGoTo.Designer.cs">
<DependentUpon>BookmarksGoTo.cs</DependentUpon>
</Compile>
<Compile Include="Forms\Cavena890SaveOptions.cs">
<SubType>Form</SubType>
</Compile>
@ -1027,6 +1039,9 @@
<EmbeddedResource Include="Controls\AudioVisualizer.resx">
<DependentUpon>AudioVisualizer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\BookmarkAdd.resx">
<DependentUpon>BookmarkAdd.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\AddWaveformBatch.resx">
<DependentUpon>AddWaveformBatch.cs</DependentUpon>
</EmbeddedResource>
@ -1036,6 +1051,9 @@
<EmbeddedResource Include="Forms\BatchConvertFixRtl.resx">
<DependentUpon>BatchConvertFixRtl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\BookmarksGoTo.resx">
<DependentUpon>BookmarksGoTo.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\Cavena890SaveOptions.resx">
<DependentUpon>Cavena890SaveOptions.cs</DependentUpon>
</EmbeddedResource>