From c18c70c2aface2a108bdab6cc44906f5d386383e Mon Sep 17 00:00:00 2001 From: Frank Skare Date: Tue, 16 Apr 2019 18:14:22 +0200 Subject: [PATCH] - --- README.md | 50 ++-- mpv.net/Command.cs | 28 ++- mpv.net/MainForm.cs | 186 ++++++++++++-- mpv.net/MediaInfo.cs | 46 +++- mpv.net/Menu.cs | 238 +++++++++--------- mpv.net/Resources/input.conf.txt | 26 +- mpv.net/mp.cs | 38 ++- mpvConfEdit/DynamicGUI/DynamicGUI.cs | 2 + mpvConfEdit/MainWindow.xaml.cs | 29 ++- mpvConfEdit/Properties/AssemblyInfo.cs | 4 +- mpvInputEdit/InputWindow.xaml.cs | 208 ++++++++------- mpvInputEdit/MainWindow.xaml.cs | 5 +- mpvInputEdit/Properties/AssemblyInfo.cs | 6 +- mpvInputEdit/SearchTextBoxUserControl.xaml.cs | 2 +- mpvInputEdit/mpvInputEdit.csproj | 3 + 15 files changed, 535 insertions(+), 336 deletions(-) diff --git a/README.md b/README.md index 8eaf12d..b35bd14 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ if it's missing mpv.net generates it with the following defaults: ### Scripting -Scripting is supported for Python, C#, Lua, JavaScript and PowerShell +Scripting is supported via Python, C#, Lua, JavaScript and PowerShell https://github.com/stax76/mpv.net/wiki/Scripting-(CSharp,-Python,-JavaScript,-Lua,-PowerShell) @@ -70,9 +70,29 @@ https://github.com/stax76/mpv.net/wiki/Scripting-(CSharp,-Python,-JavaScript,-Lu ### Changelog -### 2.9 (2019- soon +### 2.9 (2019-??-??) -- clicking the right top corner in fullscreen mode closes the player but it did not work on all displays +- clicking the right top corner in fullscreen mode + closes the player but it did not work on all displays +- the info display was changed to display the filename on top + so it's not diplayed in the middle of the screen +- on start up of the conf editor all text is now selected in the + search text box so it's ready for a new search to be typed +- the conf editor was changed to write the settings to disk + only if the settings were actually modified, also the message + that says that the settings will be available on next start + is now only shown if the settings were actually modified. +- there was an instance in the context menu where the sub menu + arrow was overlapping with the text +- in the input editor when only one character is entered in the + search text box the search is performed only in the input and + not in the command or menu +- in the input editor the routine that generates the input string + was completely rewritten because it was adding Shift where it + wasn't necessary (it took a huge amount of time to implement) +- the context menu has a new track menu where the active track + can be seen and selected, it shows video, audio and subtitle + tracks with various meta data [go to download page](https://github.com/stax76/mpv.net/releases) @@ -99,26 +119,4 @@ https://github.com/stax76/mpv.net/wiki/Scripting-(CSharp,-Python,-JavaScript,-Lu - in case the input conf don't contain a menu definition mpv.net creates the default menu instead no menu like before - all message boxes were migrated to use the TaskDialog API - an improvement in the previous release unfortunately introduced a bug - causing the conf editor not to save settings - -### 2.4 (2019-04-06) - -- new options added to the conf GUI editor: gpu-context, gpu-api, scale, cscale, - dscale, dither-depth, correct-downscaling, sigmoid-upscaling, deband -- the conf edit GUI has a 'Apply' feature added to write the conf to mpv.conf - without the need to close the conf edit GUI -- the input edit GUI shows a message box when a duplicate is detected and it has - a new feature to reduce the filter scope to eather of input, menu or command and - the editor writes always the same help on top of input.conf as it is found in the defaults -- the conf edit GUI was often starting out of working area bounds and is now starting with center screen -- the startup size was reduced and a issue was fixed that when the screen property - was defined for a screen that isn't connected the startup size wasn't applied -- added feature to load external audio and subtitle files in the menu under: - Open > Load external audio|subtitle files (default binding at: - [input.conf](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt)) -- previously the conf edit GUI removed settings from the conf file if the setting - was set to the default, the new behavior is not to remove anything -- the autofit mpv property was partly implemented, you can use 'autofit = 50%' in mpv.conf or - '--autofit=50%' on the command line, WxH isn't implemented and only percent values are accepted. - There is a new wiki page explaining the mpv.net limitations compared to the original mpv: - [Limitations](https://github.com/stax76/mpv.net/wiki/Limitations) \ No newline at end of file + causing the conf editor not to save settings \ No newline at end of file diff --git a/mpv.net/Command.cs b/mpv.net/Command.cs index 792b416..5d0089b 100644 --- a/mpv.net/Command.cs +++ b/mpv.net/Command.cs @@ -89,9 +89,9 @@ namespace mpvnet { try { - var fileInfo = new FileInfo(mp.get_property_string("path")); + FileInfo fileInfo = new FileInfo(mp.get_property_string("path")); - using (var mediaInfo = new MediaInfo(fileInfo.FullName)) + using (MediaInfo mediaInfo = new MediaInfo(fileInfo.FullName)) { string width = mediaInfo.GetInfo(MediaInfoStreamKind.Video, "Width"); @@ -107,11 +107,11 @@ namespace mpvnet string text = ""; if (performer != "") text += "Artist: " + performer + "\n"; - if (title != "") text += "Title: " + title + "\n"; - if (album != "") text += "Album: " + album + "\n"; - if (genre != "") text += "Genre: " + genre + "\n"; - if (date != "") text += "Year: " + date + "\n"; - if (duration != "") text += "Length: " + duration + "\n"; + if (title != "") text += "Title: " + title + "\n"; + if (album != "") text += "Album: " + album + "\n"; + if (genre != "") text += "Genre: " + genre + "\n"; + if (date != "") text += "Year: " + date + "\n"; + if (duration != "") text += "Length: " + duration + "\n"; mp.commandv("show-text", text, "5000"); } @@ -125,17 +125,19 @@ namespace mpvnet if (bitrate == "") bitrate = "0"; - var bitrate2 = Convert.ToDouble(bitrate) / 1000.0 / 1000.0; - var videoCodec = mp.get_property_string("video-format").ToUpper(); - var filename = fileInfo.Name; + double bitrate2 = Convert.ToDouble(bitrate) / 1000.0 / 1000.0; + string videoCodec = mp.get_property_string("video-format").ToUpper(); + string filename = fileInfo.Name; - var text = + string text = filename + "\n" + FormatTime(position.TotalMinutes) + ":" + FormatTime(position.Seconds) + " / " + FormatTime(duration.TotalMinutes) + ":" + FormatTime(duration.Seconds) + "\n" + - Convert.ToInt32(fileInfo.Length / 1024 / 1024).ToString() + - $" MB - {width} x {height}\n{videoCodec} - {bitrate2.ToString("f1")} Mb/s" + "\n" + filename; + $"{width} x {height}\n" + + $"{bitrate2.ToString("f1")} Mb/s\n" + + Convert.ToInt32(fileInfo.Length / 1024 / 1024).ToString() + " MB\n" + + $"{videoCodec}\n"; mp.commandv("show-text", text, "5000"); } diff --git a/mpv.net/MainForm.cs b/mpv.net/MainForm.cs index bf3dff1..9b0c6aa 100644 --- a/mpv.net/MainForm.cs +++ b/mpv.net/MainForm.cs @@ -8,6 +8,8 @@ using System.Linq; using System.Collections.Generic; using VBNET; +using System.Threading.Tasks; +using System.ComponentModel; namespace mpvnet { @@ -19,12 +21,17 @@ namespace mpvnet private Point LastCursorPosChanged; private int LastCursorChangedTickCount; private bool IgnoreDpiChanged = true; + private MenuItemEx TracksMenu; + private List MediaTracks = new List(); + public new ContextMenuStripEx ContextMenu; + private float MpvAutofit = 0.50f; private bool MpvFullscreen; private int MpvScreen = -1; private string MpvNetDarkMode = "system"; - - public ContextMenuStripEx CMS; + private string MpvSid = ""; + private string MpvAid = ""; + private string MpvVid = ""; public MainForm() { @@ -60,6 +67,52 @@ namespace mpvnet } } + private void ContextMenu_Opening(object sender, CancelEventArgs e) + { + lock (MediaTracks) + { + TracksMenu.DropDownItems.Clear(); + + MediaTrack[] audTracks = MediaTracks.Where(track => track.Type == "a").ToArray(); + MediaTrack[] subTracks = MediaTracks.Where(track => track.Type == "s").ToArray(); + MediaTrack[] vidTracks = MediaTracks.Where(track => track.Type == "v").ToArray(); + + foreach (MediaTrack track in vidTracks) + { + var mi = ContextMenu.Add("Track > " + track.Text); + mi.Action = () => { mp.commandv("set", "vid", track.ID.ToString()); }; + mi.Checked = MpvVid == track.ID.ToString(); + } + + if (vidTracks.Length > 0) + ContextMenu.Add("Track > -"); + + foreach (MediaTrack track in audTracks) + { + var mi = ContextMenu.Add("Track > " + track.Text); + mi.Action = () => { mp.commandv("set", "aid", track.ID.ToString()); }; + mi.Checked = MpvAid == track.ID.ToString(); + } + + if (subTracks.Length > 0) + ContextMenu.Add("Track > -"); + + foreach (MediaTrack track in subTracks) + { + var mi = ContextMenu.Add("Track > " + track.Text); + mi.Action = () => { mp.commandv("set", "sid", track.ID.ToString()); }; + mi.Checked = MpvSid == track.ID.ToString(); + } + + if (subTracks.Length > 0) + { + var mi = ContextMenu.Add("Track > S: No subtitles"); + mi.Action = () => { mp.commandv("set", "sid", "no"); }; + mi.Checked = MpvSid == "no"; + } + } + } + protected void SetScreen(int targetIndex) { Screen[] screens = Screen.AllScreens; @@ -210,7 +263,7 @@ namespace mpvnet else input = ""; - var menuItem = CMS.Add(path, () => { + MenuItemEx menuItem = ContextMenu.Add(path, () => { try { mp.command_string(command); } @@ -220,26 +273,113 @@ namespace mpvnet }); if (menuItem != null) - menuItem.ShortcutKeyDisplayString = input.Replace("_","") + " "; + { + menuItem.ShortcutKeyDisplayString = input.Replace("_", "") + " "; + + if (TracksMenu == null && menuItem.Text.StartsWith("Track ") && + menuItem.Text.Trim() == "Track") + + TracksMenu = menuItem; + } } } - private void CMS_Opened(object sender, EventArgs e) => CursorHelp.Show(); + private void ContextMenu_Opened(object sender, EventArgs e) => CursorHelp.Show(); private string LastHistory; private void mp_PlaybackRestart() { - var filename = mp.get_property_string("filename"); - BeginInvoke(new Action(() => { Text = filename + " - mpv.net " + Application.ProductVersion; })); - var historyFilepath = mp.mpvConfFolderPath + "history.txt"; + string filePath = mp.get_property_string("path"); + BeginInvoke(new Action(() => { Text = Path.GetFileName(filePath) + " - mpv.net " + Application.ProductVersion; })); - if (LastHistory != filename && File.Exists(historyFilepath)) - { - File.AppendAllText(historyFilepath, DateTime.Now.ToString() + " " + - Path.GetFileNameWithoutExtension(filename) + "\r\n"); - LastHistory = filename; - } + Task.Run(new Action(() => { + string historyFilepath = mp.mpvConfFolderPath + "history.txt"; + + if (LastHistory != filePath && File.Exists(historyFilepath)) + { + File.AppendAllText(historyFilepath, DateTime.Now.ToString() + " " + + Path.GetFileNameWithoutExtension(filePath) + "\r\n"); + LastHistory = filePath; + } + + lock (MediaTracks) + { + MediaTracks.Clear(); + + using (MediaInfo mi = new MediaInfo(filePath)) + { + int count = mi.GetCount(MediaInfoStreamKind.Video); + + for (int i = 0; i < count; i++) + { + MediaTrack track = new MediaTrack(); + Add(track, mi.GetVideo(i, "Format")); + Add(track, mi.GetVideo(i, "Format_Profile")); + Add(track, mi.GetVideo(i, "Width") + "x" + mi.GetVideo(i, "Height")); + Add(track, mi.GetVideo(i, "FrameRate") + " FPS"); + Add(track, mi.GetVideo(i, "Language/String")); + Add(track, mi.GetVideo(i, "Forced") == "Yes" ? "Forced" : ""); + Add(track, mi.GetVideo(i, "Default") == "Yes" ? "Default" : ""); + Add(track, mi.GetVideo(i, "Title")); + track.Text = "V: " + track.Text.Trim(" ,".ToCharArray()); + track.Type = "v"; + track.ID = i + 1; + MediaTracks.Add(track); + } + + count = mi.GetCount(MediaInfoStreamKind.Audio); + + for (int i = 0; i < count; i++) + { + MediaTrack track = new MediaTrack(); + Add(track, mi.GetAudio(i, "Language/String")); + Add(track, mi.GetAudio(i, "Format")); + Add(track, mi.GetAudio(i, "Format_Profile")); + Add(track, mi.GetAudio(i, "BitRate/String")); + Add(track, mi.GetAudio(i, "Channel(s)/String")); + Add(track, mi.GetAudio(i, "SamplingRate/String")); + Add(track, mi.GetAudio(i, "Forced") == "Yes" ? "Forced" : ""); + Add(track, mi.GetAudio(i, "Default") == "Yes" ? "Default" : ""); + Add(track, mi.GetAudio(i, "Title")); + track.Text = "A: " + track.Text.Trim(" ,".ToCharArray()); + track.Type = "a"; + track.ID = i + 1; + MediaTracks.Add(track); + } + + count = mi.GetCount(MediaInfoStreamKind.Text); + + for (int i = 0; i < count; i++) + { + MediaTrack track = new MediaTrack(); + Add(track, mi.GetText(i, "Language/String")); + Add(track, mi.GetText(i, "Format")); + Add(track, mi.GetText(i, "Format_Profile")); + Add(track, mi.GetText(i, "Forced") == "Yes" ? "Forced" : ""); + Add(track, mi.GetText(i, "Default") == "Yes" ? "Default" : ""); + Add(track, mi.GetText(i, "Title")); + track.Text = "S: " + track.Text.Trim(" ,".ToCharArray()); + track.Type = "s"; + track.ID = i + 1; + MediaTracks.Add(track); + } + + void Add(MediaTrack track, string val) + { + if (!string.IsNullOrEmpty(val) && !(track.Text != null && track.Text.Contains(val))) + track.Text += " " + val + ","; + } + } + } + })); + } + + class MediaTrack + { + public string Text { get; set; } + public string Type { get; set; } + public int ID { get; set; } } private void Mp_Idle() @@ -405,7 +545,7 @@ namespace mpvnet } else if (Environment.TickCount - LastCursorChangedTickCount > 1500 && !IsMouseInOSC() && ClientRectangle.Contains(PointToClient(MousePosition)) && - Form.ActiveForm == this && !CMS.Visible) + Form.ActiveForm == this && !ContextMenu.Visible) { CursorHelp.Hide(); } @@ -425,6 +565,9 @@ namespace mpvnet mp.Init(); mp.observe_property_bool("fullscreen", mpPropChangeFullscreen); mp.observe_property_bool("ontop", mpPropChangeOnTop); + mp.observe_property_string("sid", mpPropChangeSid); + mp.observe_property_string("aid", mpPropChangeAid); + mp.observe_property_string("vid", mpPropChangeVid); mp.Shutdown += mp_Shutdown; mp.VideoSizeChanged += mp_VideoSizeChanged; mp.PlaybackRestart += mp_PlaybackRestart; @@ -433,15 +576,22 @@ namespace mpvnet void mpPropChangeOnTop(bool value) => BeginInvoke(new Action(() => TopMost = value)); + void mpPropChangeAid(string value) => MpvAid = value; + + void mpPropChangeSid(string value) => MpvSid = value; + + void mpPropChangeVid(string value) => MpvVid = value; + protected override void OnShown(EventArgs e) { base.OnShown(e); if ((MpvNetDarkMode == "system" && Misc.IsDarkTheme) || MpvNetDarkMode == "always") ToolStripRendererEx.ColorTheme = Color.Black; - CMS = new ContextMenuStripEx(components); - CMS.Opened += CMS_Opened; - ContextMenuStrip = CMS; + ContextMenu = new ContextMenuStripEx(components); + ContextMenu.Opened += ContextMenu_Opened; + ContextMenu.Opening += ContextMenu_Opening; BuildMenu(); + ContextMenuStrip = ContextMenu; IgnoreDpiChanged = false; CheckYouTube(); } diff --git a/mpv.net/MediaInfo.cs b/mpv.net/MediaInfo.cs index b0dd48e..bc34f43 100644 --- a/mpv.net/MediaInfo.cs +++ b/mpv.net/MediaInfo.cs @@ -25,6 +25,23 @@ public class MediaInfo : IDisposable return Marshal.PtrToStringUni(MediaInfo_Get(Handle, streamKind, 0, parameter, MediaInfoInfoKind.Text, MediaInfoInfoKind.Name)); } + public int GetCount(MediaInfoStreamKind streamKind) => MediaInfo_Count_Get(Handle, streamKind, -1); + + public string GetVideo(int streamNumber, string parameter) + { + return Marshal.PtrToStringUni(MediaInfo_Get(Handle, MediaInfoStreamKind.Video, streamNumber, parameter, MediaInfoInfoKind.Text, MediaInfoInfoKind.Name)); + } + + public string GetAudio(int streamNumber, string parameter) + { + return Marshal.PtrToStringUni(MediaInfo_Get(Handle, MediaInfoStreamKind.Audio, streamNumber, parameter, MediaInfoInfoKind.Text, MediaInfoInfoKind.Name)); + } + + public string GetText(int streamNumber, string parameter) + { + return Marshal.PtrToStringUni(MediaInfo_Get(Handle, MediaInfoStreamKind.Text, streamNumber, parameter, MediaInfoInfoKind.Text, MediaInfoInfoKind.Name)); + } + private bool Disposed; public void Dispose() @@ -37,10 +54,7 @@ public class MediaInfo : IDisposable } } - ~MediaInfo() - { - Dispose(); - } + ~MediaInfo() { Dispose(); } [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] private static extern IntPtr LoadLibrary(string path); @@ -49,16 +63,26 @@ public class MediaInfo : IDisposable private static extern IntPtr MediaInfo_New(); [DllImport("MediaInfo.dll")] - private static extern void MediaInfo_Delete(IntPtr Handle); + private static extern void MediaInfo_Delete(IntPtr handle); [DllImport("MediaInfo.dll", CharSet = CharSet.Unicode)] - private static extern int MediaInfo_Open(IntPtr Handle, string FileName); + private static extern int MediaInfo_Open(IntPtr handle, string fileName); [DllImport("MediaInfo.dll")] - private static extern int MediaInfo_Close(IntPtr Handle); + private static extern int MediaInfo_Close(IntPtr handle); [DllImport("MediaInfo.dll", CharSet = CharSet.Unicode)] - private static extern IntPtr MediaInfo_Get(IntPtr Handle, MediaInfoStreamKind StreamKind, int StreamNumber, string Parameter, MediaInfoInfoKind KindOfInfo, MediaInfoInfoKind KindOfSearch); + private static extern IntPtr MediaInfo_Get(IntPtr handle, + MediaInfoStreamKind streamKind, + int streamNumber, + string parameter, + MediaInfoInfoKind kindOfInfo, + MediaInfoInfoKind kindOfSearch); + + [DllImport("MediaInfo.dll", CharSet = CharSet.Unicode)] + private static extern int MediaInfo_Count_Get(IntPtr handle, + MediaInfoStreamKind streamKind, + int streamNumber); } public enum MediaInfoStreamKind @@ -67,8 +91,10 @@ public enum MediaInfoStreamKind Video, Audio, Text, - Chapters, - Image + Other, + Image, + Menu, + Max, } public enum MediaInfoInfoKind diff --git a/mpv.net/Menu.cs b/mpv.net/Menu.cs index 73b3c6e..dbd1cd0 100644 --- a/mpv.net/Menu.cs +++ b/mpv.net/Menu.cs @@ -6,7 +6,6 @@ using System.Drawing.Text; using Microsoft.Win32; using System.Windows.Forms; using System.Drawing; -using System.Diagnostics; public class ContextMenuStripEx : ContextMenuStrip { @@ -24,110 +23,23 @@ public class ContextMenuStripEx : ContextMenuStrip Renderer = new ToolStripRendererEx(); } - public ActionMenuItem Add(string path) + public MenuItemEx Add(string path) { return Add(path, null); } - public ActionMenuItem Add(string path, Action action) + public MenuItemEx Add(string path, Action action, bool enabled = true) { - return Add(path, action, true); - } - - public ActionMenuItem Add(string path, Action action, bool enabled) - { - var ret = ActionMenuItem.Add(Items, path, action); - if (ret == null) - return null; + MenuItemEx ret = MenuItemEx.Add(Items, path, action); + if (ret == null) return null; ret.Enabled = enabled; return ret; } - - public ActionMenuItem Add(string path, Action action, Func enabledFunc) - { - var ret = ActionMenuItem.Add(Items, path, action); - return ret; - } -} - -public class ActionMenuItem : MenuItemEx -{ - private Action Action; - - public ActionMenuItem() - { - } - - public ActionMenuItem(string text, Action action) - { - this.Text = text; - this.Action = action; - } - - protected override void OnClick(EventArgs e) - { - Application.DoEvents(); - if (Action != null) - Action(); - base.OnClick(e); - } - - public static ActionMenuItem Add(ToolStripItemCollection items, string path, Action action, T value) - { - return Add(items, path, () => action(value)); - } - - public static ActionMenuItem Add(ToolStripItemCollection items, string path, Action action) - { - var a = path.Split(new[] { " > ", " | " }, StringSplitOptions.RemoveEmptyEntries); - var l = items; - - for (var x = 0; x <= a.Length - 1; x++) - { - var found = false; - - foreach (var i in l.OfType()) - { - if (x < a.Length - 1) - { - if (i.Text == a[x] + " ") - { - found = true; - l = i.DropDownItems; - } - } - } - - if (!found) - { - if (x == a.Length - 1) - { - if (a[x] == "-") - l.Add(new ToolStripSeparator()); - else - { - ActionMenuItem item = new ActionMenuItem(a[x] + " ", action); - l.Add(item); - l = item.DropDownItems; - return item; - } - } - else - { - ActionMenuItem item = new ActionMenuItem(); - item.Text = a[x] + " "; - l.Add(item); - l = item.DropDownItems; - } - } - } - return null; - } } public class MenuItemEx : ToolStripMenuItem { - public static bool UseTooltips { get; set; } + public Action Action { get; set; } public MenuItemEx() { @@ -137,20 +49,81 @@ public class MenuItemEx : ToolStripMenuItem { } + public MenuItemEx(string text, Action action) : base(text) + { + Action = action; + } + + protected override void OnClick(EventArgs e) + { + Application.DoEvents(); + Action?.Invoke(); + base.OnClick(e); + } + + public static MenuItemEx Add(ToolStripItemCollection items, string path, Action action, T value) + { + return Add(items, path, () => action(value)); + } + + public static MenuItemEx Add(ToolStripItemCollection items, string path, Action action) + { + string[] a = path.Split(new[] { " > ", " | " }, StringSplitOptions.RemoveEmptyEntries); + var itemsCollection = items; + + for (int x = 0; x < a.Length; x++) + { + bool found = false; + + foreach (var i in itemsCollection.OfType()) + { + if (x < a.Length - 1) + { + if (i.Text == a[x] + " ") + { + found = true; + itemsCollection = i.DropDownItems; + } + } + } + + if (!found) + { + if (x == a.Length - 1) + { + if (a[x] == "-") + itemsCollection.Add(new ToolStripSeparator()); + else + { + MenuItemEx item = new MenuItemEx(a[x] + " ", action); + itemsCollection.Add(item); + itemsCollection = item.DropDownItems; + return item; + } + } + else + { + MenuItemEx item = new MenuItemEx(); + item.Text = a[x] + " "; + itemsCollection.Add(item); + itemsCollection = item.DropDownItems; + } + } + } + return null; + } + public override Size GetPreferredSize(Size constrainingSize) { - var ret = base.GetPreferredSize(constrainingSize); - ret.Height = Convert.ToInt32(Font.Height * 1.4); - return ret; + Size size = base.GetPreferredSize(constrainingSize); + size.Height = Convert.ToInt32(Font.Height * 1.4); + return size; } public void CloseAll(object item) { if (item is ToolStripItem) - { - var d = (ToolStripItem)item; - CloseAll(d.Owner); - } + CloseAll(((ToolStripItem)item).Owner); if (item is ToolStripDropDown) { @@ -159,12 +132,6 @@ public class MenuItemEx : ToolStripMenuItem CloseAll(d.OwnerItem); } } - - protected override void OnClick(EventArgs e) - { - Application.DoEvents(); - base.OnClick(e); - } } public class ToolStripRendererEx : ToolStripSystemRenderer @@ -187,6 +154,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer public ToolStripRendererEx() { var argb = Convert.ToInt32(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", 0)); + if (argb == 0) argb = Color.LightBlue.ToArgb(); if (ColorTheme == Color.Empty) @@ -198,7 +166,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer public static void InitColors(Color c) { ColorBorder = HSLColor.Convert(c).ToColorSetLuminosity(100); - ColorChecked = HSLColor.Convert(c).ToColorSetLuminosity(200); + ColorChecked = HSLColor.Convert(c).ToColorSetLuminosity(160); ColorSelection = HSLColor.Convert(c).ToColorSetLuminosity(180); ColorBackground = HSLColor.Convert(c).ToColorSetLuminosity(210); ColorTop = HSLColor.Convert(c).ToColorSetLuminosity(240); @@ -209,6 +177,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer ColorBackground = Color.FromArgb(50, 50, 50); ColorSelection = Color.FromArgb(80, 80, 80); ColorForeground = Color.White; + ColorChecked = Color.FromArgb(90, 90, 90); } ColorToolStrip1 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 1))); @@ -259,20 +228,18 @@ public class ToolStripRendererEx : ToolStripSystemRenderer protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) { - e.Item.ForeColor = Color.Black; - var r = new Rectangle(Point.Empty, e.Item.Size); - var g = e.Graphics; + Rectangle rect = new Rectangle(Point.Empty, e.Item.Size); if (!(e.Item.Owner is MenuStrip)) - g.Clear(ColorBackground); + e.Graphics.Clear(ColorBackground); if (e.Item.Selected && e.Item.Enabled) { - g.SmoothingMode = SmoothingMode.AntiAlias; - var r2 = new Rectangle(r.X + 2, r.Y, r.Width - 4, r.Height - 1); - r2.Inflate(-1, -1); + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + rect = new Rectangle(rect.X + 2, rect.Y, rect.Width - 4, rect.Height - 1); + rect.Inflate(-1, -1); using (SolidBrush b = new SolidBrush(ColorSelection)) - g.FillRectangle(b, r2); + e.Graphics.FillRectangle(b, rect); } } @@ -299,8 +266,32 @@ public class ToolStripRendererEx : ToolStripSystemRenderer protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { - int x = Convert.ToInt32(e.ImageRectangle.Height * 0.2); - e.Graphics.DrawImage(e.Image, new Point(x, x)); + if (e.Item.GetType() != typeof(MenuItemEx)) + return; + + MenuItemEx item = e.Item as MenuItemEx; + + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + + if (!item.Checked) + return; + + Rectangle rect = new Rectangle(Point.Empty, e.Item.Size); + rect = new Rectangle(rect.X + 2, rect.Y, rect.Height - 1, rect.Height - 1); + rect.Inflate(-1, -1); + + using (Brush brush = new SolidBrush(ColorChecked)) + e.Graphics.FillRectangle(brush, rect); + + float ellipseWidth = rect.Height / 3f; + + RectangleF rectF = new RectangleF(rect.X + rect.Height / 2f - ellipseWidth / 2f, + rect.Y + rect.Height / 2f - ellipseWidth / 2f, + ellipseWidth, + ellipseWidth); + + using (Brush brush = new SolidBrush(ColorForeground)) + e.Graphics.FillEllipse(brush, rectF); } protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) @@ -332,24 +323,21 @@ public struct HSLColor private double hue; - public int Hue - { - get => System.Convert.ToInt32(hue * 240); + public int Hue { + get => System.Convert.ToInt32(hue * 240); set => hue = CheckRange(value / 240.0); } private double saturation; - public int Saturation - { + public int Saturation { get => System.Convert.ToInt32(saturation * 240); set => saturation = CheckRange(value / 240.0); } private double luminosity; - public int Luminosity - { + public int Luminosity { get => System.Convert.ToInt32(luminosity * 240); set => luminosity = CheckRange(value / 240.0); } @@ -399,7 +387,7 @@ public struct HSLColor return Color.FromArgb( System.Convert.ToInt32(255 * r), - System.Convert.ToInt32(255 * g), + System.Convert.ToInt32(255 * g), System.Convert.ToInt32(255 * b)); } diff --git a/mpv.net/Resources/input.conf.txt b/mpv.net/Resources/input.conf.txt index 5b98adb..befe422 100644 --- a/mpv.net/Resources/input.conf.txt +++ b/mpv.net/Resources/input.conf.txt @@ -41,18 +41,18 @@ _ ignore #menu: Navigate > - PGUP add chapter 1 #menu: Navigate > Next Chapter PGDWN add chapter -1 #menu: Navigate > Previous Chapter - - . frame-step #menu: Seek > Next Frame - , frame-back-step #menu: Seek > Previous Frame - _ ignore #menu: Seek > - - Right no-osd seek 7 #menu: Seek > 7 sec forward - Left no-osd seek -7 #menu: Seek > 7 sec backward - _ ignore #menu: Seek > - - Up no-osd seek 40 #menu: Seek > 40 sec forward - Down no-osd seek -40 #menu: Seek > 40 sec backward - _ ignore #menu: Seek > - - Ctrl+Right no-osd seek 300 #menu: Seek > 5 min forward - Ctrl+Left no-osd seek -300 #menu: Seek > 5 min backward + _ ignore #menu: Navigate > - + . frame-step #menu: Navigate > Jump Next Frame + , frame-back-step #menu: Navigate > Jump Previous Frame + _ ignore #menu: Navigate > - + Right no-osd seek 7 #menu: Navigate > Jump 7 sec forward + Left no-osd seek -7 #menu: Navigate > Jump 7 sec backward + _ ignore #menu: Navigate > - + Up no-osd seek 40 #menu: Navigate > Jump 40 sec forward + Down no-osd seek -40 #menu: Navigate > Jump 40 sec backward + _ ignore #menu: Navigate > - + Ctrl+Right no-osd seek 300 #menu: Navigate > Jump 5 min forward + Ctrl+Left no-osd seek -300 #menu: Navigate > Jump 5 min backward Ctrl++ add video-zoom 0.1 #menu: Pan & Scan > Increase Size Ctrl+- add video-zoom -0.1 #menu: Pan & Scan > Decrease Size @@ -101,6 +101,8 @@ _ add sub-scale -0.1 #menu: Subtitle > Decrease Subtitle Font Size _ add sub-scale 0.1 #menu: Subtitle > Increase Subtitle Font Size + _ ignore #menu: Track + + add volume 10 #menu: Volume > Up - add volume -10 #menu: Volume > Down _ ignore #menu: Volume > - diff --git a/mpv.net/mp.cs b/mpv.net/mp.cs index 21138af..8e23e6a 100644 --- a/mpv.net/mp.cs +++ b/mpv.net/mp.cs @@ -57,6 +57,7 @@ namespace mpvnet public static IntPtr MpvWindowHandle; public static Addon Addon; public static List>> BoolPropChangeActions = new List>>(); + public static List>> StringPropChangeActions = new List>>(); public static Size VideoSize = new Size(1920, 1080); public static string mpvConfFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\"; public static string InputConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\input.conf"; @@ -254,12 +255,17 @@ namespace mpvnet Seek?.Invoke(); break; case mpv_event_id.MPV_EVENT_PROPERTY_CHANGE: - var event_propertyData = (mpv_event_property)Marshal.PtrToStructure(evt.data, typeof(mpv_event_property)); + var propData = (mpv_event_property)Marshal.PtrToStructure(evt.data, typeof(mpv_event_property)); - if (event_propertyData.format == mpv_format.MPV_FORMAT_FLAG) + if (propData.format == mpv_format.MPV_FORMAT_FLAG) foreach (var i in BoolPropChangeActions) - if (i.Key== event_propertyData.name) - i.Value.Invoke(Marshal.PtrToStructure(event_propertyData.data) == 1); + if (i.Key== propData.name) + i.Value.Invoke(Marshal.PtrToStructure(propData.data) == 1); + + if (propData.format == mpv_format.MPV_FORMAT_STRING) + foreach (var i in StringPropChangeActions) + if (i.Key == propData.name) + i.Value.Invoke(StringFromNativeUtf8(Marshal.PtrToStructure(propData.data))); break; case mpv_event_id.MPV_EVENT_PLAYBACK_RESTART: PlaybackRestart?.Invoke(); @@ -379,7 +385,7 @@ namespace mpvnet if (err < 0 && throwOnException) throw new Exception($"{name}: {(mpv_error)err}"); - var ret = StringFromNativeUtf8(lpBuffer); + string ret = StringFromNativeUtf8(lpBuffer); mpv_free(lpBuffer); return ret; @@ -453,6 +459,28 @@ namespace mpvnet throw new Exception($"{name}: {(mpv_error)err}"); } + public static void observe_property_string(string name, Action action) + { + int err = mpv_observe_property(MpvHandle, (ulong)action.GetHashCode(), name, mpv_format.MPV_FORMAT_STRING); + + if (err < 0) + throw new Exception($"{name}: {(mpv_error)err}"); + else + StringPropChangeActions.Add(new KeyValuePair>(name, action)); + } + + public static void unobserve_property_string(string name, Action action) + { + foreach (var i in StringPropChangeActions.ToArray()) + if (i.Value == action) + StringPropChangeActions.Remove(i); + + int err = mpv_unobserve_property(MpvHandle, (ulong)action.GetHashCode()); + + if (err < 0) + throw new Exception($"{name}: {(mpv_error)err}"); + } + protected static void ProcessCommandLine() { var args = Environment.GetCommandLineArgs().Skip(1); diff --git a/mpvConfEdit/DynamicGUI/DynamicGUI.cs b/mpvConfEdit/DynamicGUI/DynamicGUI.cs index b4e48e4..80b9d98 100644 --- a/mpvConfEdit/DynamicGUI/DynamicGUI.cs +++ b/mpvConfEdit/DynamicGUI/DynamicGUI.cs @@ -27,6 +27,7 @@ namespace DynamicGUI baseSetting = optionSetting; optionSetting.Default = setting["default"]; optionSetting.Value = optionSetting.Default; + optionSetting.StartValue = optionSetting.Default; foreach (TomlTable option in setting["options"]) { @@ -65,6 +66,7 @@ namespace DynamicGUI { public string Name { get; set; } public string Value { get; set; } + public string StartValue { get; set; } public string Help { get; set; } public string Default { get; set; } public string HelpURL { get; set; } diff --git a/mpvConfEdit/MainWindow.xaml.cs b/mpvConfEdit/MainWindow.xaml.cs index 3f7d7a4..290a799 100644 --- a/mpvConfEdit/MainWindow.xaml.cs +++ b/mpvConfEdit/MainWindow.xaml.cs @@ -9,6 +9,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; + using DynamicGUI; using Microsoft.Win32; @@ -54,22 +55,9 @@ namespace mpvConfEdit if (!((darkMode == "system" && isDarkTheme) || darkMode == "always")) return; - //Background = new SolidColorBrush(Colors.Black); - Foreground = Brushes.White; Foreground2 = Brushes.Silver; Background = Brushes.Black; - - //foreach (var i in MainStackPanel.Children) - //{ - // switch (i) - // { - // case OptionSettingControl c: - // c.Foreground = Brushes.White; - // c.Background = Brushes.Black; - // break; - // } - //} } private void LoadSettings(List settingsDefinitions, @@ -85,6 +73,7 @@ namespace mpvConfEdit if (setting.Name == pair.Key) { setting.Value = pair.Value; + setting.StartValue = pair.Value; continue; } } @@ -162,6 +151,19 @@ namespace mpvConfEdit void WriteToDisk() { + bool isDirty = false; + + foreach (SettingBase i in MpvSettingsDefinitions) + if (i.StartValue != i.Value) + isDirty = true; + + foreach (SettingBase i in MpvNetSettingsDefinitions) + if (i.StartValue != i.Value) + isDirty = true; + + if (!isDirty) + return; + WriteToDisk(MpvConfPath, MpvConf, MpvSettingsDefinitions); WriteToDisk(MpvNetConfPath, MpvNetConf, MpvNetSettingsDefinitions); @@ -227,6 +229,7 @@ namespace mpvConfEdit private void MainWindow1_Loaded(object sender, RoutedEventArgs e) { + SearchControl.SearchTextBox.SelectAll(); Keyboard.Focus(SearchControl.SearchTextBox); } diff --git a/mpvConfEdit/Properties/AssemblyInfo.cs b/mpvConfEdit/Properties/AssemblyInfo.cs index 732db23..e2dff4f 100644 --- a/mpvConfEdit/Properties/AssemblyInfo.cs +++ b/mpvConfEdit/Properties/AssemblyInfo.cs @@ -51,5 +51,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] +[assembly: AssemblyVersion("1.8.0.0")] +[assembly: AssemblyFileVersion("1.8.0.0")] diff --git a/mpvInputEdit/InputWindow.xaml.cs b/mpvInputEdit/InputWindow.xaml.cs index b4f7ca4..65c7be7 100644 --- a/mpvInputEdit/InputWindow.xaml.cs +++ b/mpvInputEdit/InputWindow.xaml.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Input; @@ -10,7 +9,6 @@ namespace mpvInputEdit { public partial class InputWindow : Window { - string InputString = ""; public InputItem InputItem { get; set; } public string NewKey { get; set; } = ""; @@ -32,22 +30,21 @@ namespace mpvInputEdit void OnKeyUp(WF.KeyEventArgs e) { - if (e.KeyCode == WF.Keys.None) return; - char c = Convert.ToChar(e.KeyCode); - string text = InputString; - if (e.KeyCode == WF.Keys.ControlKey || e.KeyCode == WF.Keys.ShiftKey || - e.KeyCode == WF.Keys.Menu) - { - return; - } + e.KeyCode == WF.Keys.Menu || e.KeyCode == WF.Keys.None) - if (text == "") - { - text = e.KeyCode.ToString(); - if (text.Length == 1) - text = text.ToLowerInvariant(); - } + return; + + string text = ""; + uint charValue = MapVirtualKey((uint)e.KeyCode, 2); + + if (charValue == 0 || (charValue & 1 << 31) == 1 << 31) + text = e.KeyCode.ToString().Trim(); + else + try { + text = Convert.ToChar(charValue).ToString().ToLower().Trim(); + } + catch {} for (int i = 0; i < 13; i++) if ("D" + i.ToString() == text) @@ -90,14 +87,6 @@ namespace mpvInputEdit text = "Esc"; break; case WF.Keys.PrintScreen: text = "Print"; break; - case WF.Keys.Right: - text = "Right"; break; - case WF.Keys.Left: - text = "Left"; break; - case WF.Keys.Up: - text = "Up"; break; - case WF.Keys.Down: - text = "Down"; break; case WF.Keys.Play: text = "Play"; break; case WF.Keys.Pause: @@ -130,20 +119,24 @@ namespace mpvInputEdit text = "Cancel"; break; } - if (text == "#") - text = "Sharp"; + bool shiftWasHandled = false; - bool isAlt = GetKeyState(18) < (short)0; + bool isAlt = GetKeyState(18) < (short)0; bool isShift = GetKeyState(16) < (short)0; - bool isCtrl = GetKeyState(17) < (short)0; + bool isCtrl = GetKeyState(17) < (short)0; - if (!(isAlt && isCtrl && !isShift) && !(isShift && !isAlt && !isCtrl && !int.TryParse(text.Replace("F", ""), out int value))) + if (text.Length == 1 && isShift && text[0] != GetModifiedKey(text[0])) { - if (isAlt) text = "Alt+" + text; - if (isShift) text = "Shift+" + text; - if (isCtrl) text = "Ctrl+" + text; + text = GetModifiedKey(text[0]).ToString(); + shiftWasHandled = true; } + if (text == "#") text = "Sharp"; + + if (isAlt) text = "Alt+" + text; + if (isShift && !shiftWasHandled) text = "Shift+" + text; + if (isCtrl) text = "Ctrl+" + text; + if (!string.IsNullOrEmpty(text)) SetKey(text); } @@ -155,13 +148,8 @@ namespace mpvInputEdit KeyLabel.Content = key; } - void OnKeyPress(WF.KeyPressEventArgs e) - { - if (char.IsControl(e.KeyChar)) - InputString = ""; - else - InputString = e.KeyChar.ToString(); - } + [DllImport("user32.dll")] + static extern uint MapVirtualKey(uint uCode, uint uMapType); public static WF.Keys ModifierKeys { get { @@ -176,80 +164,78 @@ namespace mpvInputEdit } } + public static char GetModifiedKey(char c) + { + short vkKeyScanResult = VkKeyScan(c); + + if (vkKeyScanResult == -1) + return c; + + uint code = (uint)vkKeyScanResult & 0xff; + byte[] b = new byte[256]; + b[0x10] = 0x80; + uint r; + + if (1 != ToAscii(code, code, b, out r, 0)) + return c; + + return (char)r; + } + void ProcessKeyEventArgs(ref WF.Message m) { - int WM_CHAR = 258, WM_SYSCHAR = 262, /*WM_KEYDOWN = 256, WM_SYSKEYDOWN = 260,*/ - WM_KEYUP = 0x0101, WM_SYSKEYUP = 0x0105, WM_APPCOMMAND = 0x0319; + int WM_KEYUP = 0x0101, WM_SYSKEYUP = 0x0105, WM_APPCOMMAND = 0x0319; - IntPtr newWParam = IntPtr.Zero; - WF.KeyEventArgs ke = null; - WF.KeyPressEventArgs kpe = null; - - if (m.Msg == WM_CHAR || m.Msg == WM_SYSCHAR) + if (m.Msg == WM_KEYUP || m.Msg == WM_SYSKEYUP) + OnKeyUp(new WF.KeyEventArgs((WF.Keys)(unchecked((int)(long)m.WParam)) | ModifierKeys)); + else if (m.Msg == WM_APPCOMMAND) { - kpe = new WF.KeyPressEventArgs(unchecked((char)(long)m.WParam)); - OnKeyPress(kpe); - newWParam = (IntPtr)kpe.KeyChar; - } - else - { - ke = new WF.KeyEventArgs((WF.Keys)(unchecked((int)(long)m.WParam)) | ModifierKeys); - - if (m.Msg == WM_KEYUP || m.Msg == WM_SYSKEYUP) - OnKeyUp(ke); - - if (m.Msg == WM_APPCOMMAND) + switch ((AppCommand)(m.LParam.ToInt32() >> 16)) { - switch ((AppCommand)(m.LParam.ToInt32() >> 16)) - { - case AppCommand.MEDIA_CHANNEL_DOWN: - SetKey("Channel_Down"); - break; - case AppCommand.MEDIA_CHANNEL_UP: - SetKey("Channel_Up"); - break; - case AppCommand.MEDIA_FAST_FORWARD: - SetKey("Forward"); - break; - case AppCommand.MEDIA_REWIND: - SetKey("Rewind"); - break; - case AppCommand.MEDIA_PAUSE: - SetKey("Pause"); - break; - case AppCommand.MEDIA_PLAY: - SetKey("Play"); - break; - case AppCommand.MEDIA_PLAY_PAUSE: - SetKey("PlayPause"); - break; - case AppCommand.MEDIA_NEXTTRACK: - SetKey("Next"); - break; - case AppCommand.MEDIA_PREVIOUSTRACK: - SetKey("Prev"); - break; - case AppCommand.MEDIA_RECORD: - SetKey("Record"); - break; - case AppCommand.MEDIA_STOP: - SetKey("Stop"); - break; - case AppCommand.VolumeUp: - SetKey("Volume_Up"); - break; - case AppCommand.VolumeDown: - SetKey("Volume_Down"); - break; - case AppCommand.VolumeMute: - SetKey("Mute"); - break; - } + case AppCommand.MEDIA_CHANNEL_DOWN: + SetKey("Channel_Down"); + break; + case AppCommand.MEDIA_CHANNEL_UP: + SetKey("Channel_Up"); + break; + case AppCommand.MEDIA_FAST_FORWARD: + SetKey("Forward"); + break; + case AppCommand.MEDIA_REWIND: + SetKey("Rewind"); + break; + case AppCommand.MEDIA_PAUSE: + SetKey("Pause"); + break; + case AppCommand.MEDIA_PLAY: + SetKey("Play"); + break; + case AppCommand.MEDIA_PLAY_PAUSE: + SetKey("PlayPause"); + break; + case AppCommand.MEDIA_NEXTTRACK: + SetKey("Next"); + break; + case AppCommand.MEDIA_PREVIOUSTRACK: + SetKey("Prev"); + break; + case AppCommand.MEDIA_RECORD: + SetKey("Record"); + break; + case AppCommand.MEDIA_STOP: + SetKey("Stop"); + break; + case AppCommand.VolumeUp: + SetKey("Volume_Up"); + break; + case AppCommand.VolumeDown: + SetKey("Volume_Down"); + break; + case AppCommand.VolumeMute: + SetKey("Mute"); + break; } } - - if (kpe != null) - m.WParam = newWParam; } internal enum AppCommand @@ -273,6 +259,16 @@ namespace mpvInputEdit [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern short GetKeyState(int keyCode); + [DllImport("user32.dll")] + static extern short VkKeyScan(char c); + + [DllImport("user32.dll", SetLastError = true)] + static extern int ToAscii(uint uVirtKey, + uint uScanCode, + byte[] lpKeyState, + out uint lpChar, + uint flags); + private void Window_Loaded(object sender, RoutedEventArgs e) { HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); diff --git a/mpvInputEdit/MainWindow.xaml.cs b/mpvInputEdit/MainWindow.xaml.cs index 69a88d4..ebbf1d6 100644 --- a/mpvInputEdit/MainWindow.xaml.cs +++ b/mpvInputEdit/MainWindow.xaml.cs @@ -37,9 +37,10 @@ namespace mpvInputEdit string searchText = SearchControl.SearchTextBox.Text.ToLower(); if (searchText == "") return true; - if (searchText.StartsWith("i ") || searchText.StartsWith("i:")) + if (searchText.StartsWith("i ") || searchText.StartsWith("i:") || searchText.Length == 1) { - searchText = searchText.Substring(2).Trim(); + if (searchText.Length > 1) + searchText = searchText.Substring(2).Trim(); if (searchText.Length < 3) return item.Input.ToLower().Replace("ctrl+", "").Replace("shift+", "").Replace("alt+", "").Contains(searchText); diff --git a/mpvInputEdit/Properties/AssemblyInfo.cs b/mpvInputEdit/Properties/AssemblyInfo.cs index ec92cab..5979220 100644 --- a/mpvInputEdit/Properties/AssemblyInfo.cs +++ b/mpvInputEdit/Properties/AssemblyInfo.cs @@ -12,7 +12,7 @@ using System.Windows; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("mpv(.net) input edit")] -[assembly: AssemblyCopyright("Copyright © 2017 stax76")] +[assembly: AssemblyCopyright("Copyright © 2017-2019 stax76")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -51,5 +51,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.3.0.0")] -[assembly: AssemblyFileVersion("1.3.0.0")] +[assembly: AssemblyVersion("1.5.0.0")] +[assembly: AssemblyFileVersion("1.5.0.0")] diff --git a/mpvInputEdit/SearchTextBoxUserControl.xaml.cs b/mpvInputEdit/SearchTextBoxUserControl.xaml.cs index 41e55fe..5eda9f0 100644 --- a/mpvInputEdit/SearchTextBoxUserControl.xaml.cs +++ b/mpvInputEdit/SearchTextBoxUserControl.xaml.cs @@ -29,7 +29,7 @@ namespace Controls SearchClearButton.Visibility = Visibility.Visible; if (SearchTextBox.Text == "?") - MessageBox.Show("Filtering works by searching in the Input, Menu and Command but it's possible to reduce the filter scope to either of Input, Menu or Command by prefixing as follows:\n\ni \ni: \n\nm \nm: \n\nc \nc: ", "Filtering", MessageBoxButton.OK, MessageBoxImage.Information); + MessageBox.Show("Filtering works by searching in the Input, Menu and Command but it's possible to reduce the filter scope to either of Input, Menu or Command by prefixing as follows:\n\ni \ni: \n\nm \nm: \n\nc \nc: \n\nIf only one character is entered the search will be performed only in the input.", "Filtering", MessageBoxButton.OK, MessageBoxImage.Information); } } } \ No newline at end of file diff --git a/mpvInputEdit/mpvInputEdit.csproj b/mpvInputEdit/mpvInputEdit.csproj index 79cd487..ab32ae5 100644 --- a/mpvInputEdit/mpvInputEdit.csproj +++ b/mpvInputEdit/mpvInputEdit.csproj @@ -110,6 +110,9 @@ ResXFileCodeGenerator Resources.Designer.cs + + README.md + SettingsSingleFileGenerator