Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b93972c7f7 | ||
|
|
1bae00051b | ||
|
|
b75bae3c38 | ||
|
|
2e435dcdc0 | ||
|
|
fec33056cb |
24
README.md
24
README.md
@@ -70,6 +70,26 @@ https://github.com/stax76/mpv.net/wiki/Scripting-(CSharp,-Python,-JavaScript,-Lu
|
|||||||
|
|
||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
|
### 2.8 (2019-04-12)
|
||||||
|
|
||||||
|
- Win 7 dark-mode render issue fix
|
||||||
|
|
||||||
|
### 2.7 (2019-04-12)
|
||||||
|
|
||||||
|
- the autofit mpv property was added to the conf editor
|
||||||
|
- the routine that writes the mpv.conf file in the conf editor was completely rewritten
|
||||||
|
- the conf editor has a dedicated page for mpv.net specific settings,
|
||||||
|
these settings are saved in the same folder as mpv.conf using mpvnet.conf as filename,
|
||||||
|
the first setting there is dark-mode
|
||||||
|
- new optional dark theme
|
||||||
|
|
||||||
|
[go to download page](https://github.com/stax76/mpv.net/releases)
|
||||||
|
|
||||||
|
### 2.6 (2019-04-09)
|
||||||
|
|
||||||
|
- on Win 7 controls in the conf editor were using a difficult too read too light color
|
||||||
|
- context menu renderer changed to look like Win 10 design, except colors are still system theme colors
|
||||||
|
|
||||||
### 2.5 (2019-04-08)
|
### 2.5 (2019-04-08)
|
||||||
|
|
||||||
- in case the input conf don't contain a menu definition mpv.net creates the default menu instead no menu like before
|
- in case the input conf don't contain a menu definition mpv.net creates the default menu instead no menu like before
|
||||||
@@ -97,6 +117,4 @@ https://github.com/stax76/mpv.net/wiki/Scripting-(CSharp,-Python,-JavaScript,-Lu
|
|||||||
- the autofit mpv property was partly implemented, you can use 'autofit = 50%' in mpv.conf or
|
- 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.
|
'--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:
|
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)
|
[Limitations](https://github.com/stax76/mpv.net/wiki/Limitations)
|
||||||
|
|
||||||
[go to download page](https://github.com/stax76/mpv.net/releases)
|
|
||||||
@@ -19,7 +19,8 @@
|
|||||||
<DefineDebug>true</DefineDebug>
|
<DefineDebug>true</DefineDebug>
|
||||||
<DefineTrace>true</DefineTrace>
|
<DefineTrace>true</DefineTrace>
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
<DocumentationFile>VBNET.xml</DocumentationFile>
|
<DocumentationFile>
|
||||||
|
</DocumentationFile>
|
||||||
<NoWarn>42353,42354,42355</NoWarn>
|
<NoWarn>42353,42354,42355</NoWarn>
|
||||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -29,7 +30,8 @@
|
|||||||
<DefineTrace>true</DefineTrace>
|
<DefineTrace>true</DefineTrace>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
<DocumentationFile>VBNET.xml</DocumentationFile>
|
<DocumentationFile>
|
||||||
|
</DocumentationFile>
|
||||||
<NoWarn>42353,42354,42355</NoWarn>
|
<NoWarn>42353,42354,42355</NoWarn>
|
||||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -83,33 +83,7 @@ namespace mpvnet
|
|||||||
File.WriteAllText(fp, "");
|
File.WriteAllText(fp, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void shell_execute(string[] args)
|
public static void shell_execute(string[] args) => Process.Start(args[0]);
|
||||||
{
|
|
||||||
Process.Start(args[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void set_setting(string[] args)
|
|
||||||
{
|
|
||||||
bool changed = false;
|
|
||||||
var lines = File.ReadAllLines(mp.mpvConfPath);
|
|
||||||
|
|
||||||
for (int i = 0; i < lines.Length; i++)
|
|
||||||
{
|
|
||||||
if (lines[i].Contains("=") &&
|
|
||||||
lines[i].Substring(0, lines[i].IndexOf("=")).Trim("# ".ToCharArray()) == args[0])
|
|
||||||
{
|
|
||||||
lines[i] = args[0] + " = " + args[1];
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (changed)
|
|
||||||
File.WriteAllText(mp.mpvConfPath, String.Join(Environment.NewLine, lines));
|
|
||||||
else
|
|
||||||
File.WriteAllText(mp.mpvConfPath, File.ReadAllText(mp.mpvConfPath) + Environment.NewLine + args[0] + " = " + args[1]);
|
|
||||||
|
|
||||||
Msg.Show("Changed settings are available on next startup.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void show_info(string[] args)
|
public static void show_info(string[] args)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,12 +16,13 @@ namespace mpvnet
|
|||||||
public static MainForm Instance { get; set; }
|
public static MainForm Instance { get; set; }
|
||||||
public static IntPtr Hwnd;
|
public static IntPtr Hwnd;
|
||||||
|
|
||||||
private Point LastCursorPosChanged;
|
private Point LastCursorPosChanged;
|
||||||
private int LastCursorChangedTickCount;
|
private int LastCursorChangedTickCount;
|
||||||
private bool IgnoreDpiChanged = true;
|
private bool IgnoreDpiChanged = true;
|
||||||
private float mpvAutofit = 0.42f;
|
private float MpvAutofit = 0.50f;
|
||||||
private bool mpvFullscreen;
|
private bool MpvFullscreen;
|
||||||
private int mpvScreen = -1;
|
private int MpvScreen = -1;
|
||||||
|
private string MpvNetDarkMode = "system";
|
||||||
|
|
||||||
public ContextMenuStripEx CMS;
|
public ContextMenuStripEx CMS;
|
||||||
|
|
||||||
@@ -43,12 +44,15 @@ namespace mpvnet
|
|||||||
foreach (var i in mp.mpvConf)
|
foreach (var i in mp.mpvConf)
|
||||||
ProcessMpvProperty(i.Key, i.Value);
|
ProcessMpvProperty(i.Key, i.Value);
|
||||||
|
|
||||||
|
foreach (var i in mp.mpvNetConf)
|
||||||
|
ProcessMpvNetProperty(i.Key, i.Value);
|
||||||
|
|
||||||
ProcessCommandLineEarly();
|
ProcessCommandLineEarly();
|
||||||
|
|
||||||
if (mpvScreen == -1) mpvScreen = Array.IndexOf(Screen.AllScreens, Screen.PrimaryScreen);
|
if (MpvScreen == -1) MpvScreen = Array.IndexOf(Screen.AllScreens, Screen.PrimaryScreen);
|
||||||
SetScreen(mpvScreen);
|
SetScreen(MpvScreen);
|
||||||
|
|
||||||
ChangeFullscreen(mpvFullscreen);
|
ChangeFullscreen(MpvFullscreen);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -76,7 +80,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
||||||
Screen screen = Screen.FromControl(this);
|
Screen screen = Screen.FromControl(this);
|
||||||
int height = Convert.ToInt32(screen.Bounds.Height * mpvAutofit);
|
int height = Convert.ToInt32(screen.Bounds.Height * MpvAutofit);
|
||||||
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
||||||
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
||||||
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
||||||
@@ -91,7 +95,7 @@ namespace mpvnet
|
|||||||
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
||||||
Screen screen = Screen.FromControl(this);
|
Screen screen = Screen.FromControl(this);
|
||||||
int height = ClientSize.Height;
|
int height = ClientSize.Height;
|
||||||
if (height > screen.Bounds.Height * 0.9) height = Convert.ToInt32(screen.Bounds.Height * mpvAutofit);
|
if (height > screen.Bounds.Height * 0.9) height = Convert.ToInt32(screen.Bounds.Height * MpvAutofit);
|
||||||
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
||||||
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
||||||
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
||||||
@@ -118,6 +122,7 @@ namespace mpvnet
|
|||||||
string left = i.Substring(2, i.IndexOf("=") - 2);
|
string left = i.Substring(2, i.IndexOf("=") - 2);
|
||||||
string right = i.Substring(left.Length + 3);
|
string right = i.Substring(left.Length + 3);
|
||||||
ProcessMpvProperty(left, right);
|
ProcessMpvProperty(left, right);
|
||||||
|
ProcessMpvNetProperty(left, right);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -127,7 +132,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
case "fs":
|
case "fs":
|
||||||
case "fullscreen":
|
case "fullscreen":
|
||||||
mpvFullscreen = true;
|
MpvFullscreen = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,14 +147,24 @@ namespace mpvnet
|
|||||||
case "autofit":
|
case "autofit":
|
||||||
if (value.Length == 3 && value.EndsWith("%"))
|
if (value.Length == 3 && value.EndsWith("%"))
|
||||||
if (int.TryParse(value.Substring(0, 2), out int result))
|
if (int.TryParse(value.Substring(0, 2), out int result))
|
||||||
mpvAutofit = result / 100f;
|
MpvAutofit = result / 100f;
|
||||||
break;
|
break;
|
||||||
case "fs":
|
case "fs":
|
||||||
case "fullscreen":
|
case "fullscreen":
|
||||||
mpvFullscreen = value == "yes";
|
MpvFullscreen = value == "yes";
|
||||||
break;
|
break;
|
||||||
case "screen":
|
case "screen":
|
||||||
mpvScreen = Convert.ToInt32(value);
|
MpvScreen = Convert.ToInt32(value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessMpvNetProperty(string name, string value)
|
||||||
|
{
|
||||||
|
switch (name)
|
||||||
|
{
|
||||||
|
case "dark-mode":
|
||||||
|
MpvNetDarkMode = value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -425,6 +440,8 @@ namespace mpvnet
|
|||||||
protected override void OnShown(EventArgs e)
|
protected override void OnShown(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnShown(e);
|
base.OnShown(e);
|
||||||
|
if ((MpvNetDarkMode == "system" && Misc.IsDarkTheme) || MpvNetDarkMode == "always")
|
||||||
|
ToolStripRendererEx.ColorTheme = Color.Black;
|
||||||
CMS = new ContextMenuStripEx(components);
|
CMS = new ContextMenuStripEx(components);
|
||||||
CMS.Opened += CMS_Opened;
|
CMS.Opened += CMS_Opened;
|
||||||
ContextMenuStrip = CMS;
|
ContextMenuStrip = CMS;
|
||||||
|
|||||||
140
mpv.net/Menu.cs
140
mpv.net/Menu.cs
@@ -6,6 +6,7 @@ using System.Drawing.Text;
|
|||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
public class ContextMenuStripEx : ContextMenuStrip
|
public class ContextMenuStripEx : ContextMenuStrip
|
||||||
{
|
{
|
||||||
@@ -168,10 +169,12 @@ public class MenuItemEx : ToolStripMenuItem
|
|||||||
|
|
||||||
public class ToolStripRendererEx : ToolStripSystemRenderer
|
public class ToolStripRendererEx : ToolStripSystemRenderer
|
||||||
{
|
{
|
||||||
|
public static Color ColorForeground { get; set; } = Color.Black;
|
||||||
|
public static Color ColorTheme { get; set; } = Color.Empty;
|
||||||
public static Color ColorChecked { get; set; }
|
public static Color ColorChecked { get; set; }
|
||||||
public static Color ColorBorder { get; set; }
|
public static Color ColorBorder { get; set; }
|
||||||
public static Color ColorTop { get; set; }
|
public static Color ColorTop { get; set; }
|
||||||
public static Color ColorBottom { get; set; }
|
public static Color ColorSelection { get; set; }
|
||||||
public static Color ColorBackground { get; set; }
|
public static Color ColorBackground { get; set; }
|
||||||
|
|
||||||
public static Color ColorToolStrip1 { get; set; }
|
public static Color ColorToolStrip1 { get; set; }
|
||||||
@@ -186,17 +189,28 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
var argb = Convert.ToInt32(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", 0));
|
var argb = Convert.ToInt32(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", 0));
|
||||||
if (argb == 0)
|
if (argb == 0)
|
||||||
argb = Color.LightBlue.ToArgb();
|
argb = Color.LightBlue.ToArgb();
|
||||||
InitColors(Color.FromArgb(argb));
|
if (ColorTheme == Color.Empty)
|
||||||
|
InitColors(Color.FromArgb(argb));
|
||||||
|
else
|
||||||
|
InitColors(ColorTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void InitColors(Color c)
|
public static void InitColors(Color c)
|
||||||
{
|
{
|
||||||
ColorBorder = HSLColor.Convert(c).ToColorSetLuminosity(100);
|
ColorBorder = HSLColor.Convert(c).ToColorSetLuminosity(100);
|
||||||
ColorChecked = HSLColor.Convert(c).ToColorSetLuminosity(200);
|
ColorChecked = HSLColor.Convert(c).ToColorSetLuminosity(200);
|
||||||
ColorBottom = HSLColor.Convert(c).ToColorSetLuminosity(220);
|
ColorSelection = HSLColor.Convert(c).ToColorSetLuminosity(180);
|
||||||
ColorBackground = HSLColor.Convert(c).ToColorSetLuminosity(230);
|
ColorBackground = HSLColor.Convert(c).ToColorSetLuminosity(210);
|
||||||
ColorTop = HSLColor.Convert(c).ToColorSetLuminosity(240);
|
ColorTop = HSLColor.Convert(c).ToColorSetLuminosity(240);
|
||||||
|
|
||||||
|
if (ColorTheme == Color.Black)
|
||||||
|
{
|
||||||
|
ColorBorder = Color.White;
|
||||||
|
ColorBackground = Color.FromArgb(50, 50, 50);
|
||||||
|
ColorSelection = Color.FromArgb(80, 80, 80);
|
||||||
|
ColorForeground = Color.White;
|
||||||
|
}
|
||||||
|
|
||||||
ColorToolStrip1 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 1)));
|
ColorToolStrip1 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 1)));
|
||||||
ColorToolStrip2 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.7f)));
|
ColorToolStrip2 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.7f)));
|
||||||
ColorToolStrip3 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.1f)));
|
ColorToolStrip3 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.1f)));
|
||||||
@@ -205,7 +219,10 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
|
|
||||||
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
|
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
|
||||||
{
|
{
|
||||||
ControlPaint.DrawBorder(e.Graphics, e.AffectedBounds, Color.FromArgb(160, 175, 195), ButtonBorderStyle.Solid);
|
Rectangle r = e.AffectedBounds;
|
||||||
|
r.Inflate(-1, -1);
|
||||||
|
ControlPaint.DrawBorder(e.Graphics, r, ColorBackground, ButtonBorderStyle.Solid);
|
||||||
|
ControlPaint.DrawBorder(e.Graphics, e.AffectedBounds, ColorBorder, ButtonBorderStyle.Solid);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
|
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
|
||||||
@@ -222,6 +239,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
else
|
else
|
||||||
TextOffset = Convert.ToInt32(e.Item.Height * 0.2);
|
TextOffset = Convert.ToInt32(e.Item.Height * 0.2);
|
||||||
|
|
||||||
|
e.TextColor = ColorForeground;
|
||||||
e.TextRectangle = new Rectangle(TextOffset, Convert.ToInt32((e.Item.Height - rect.Height) / 2.0), rect.Width, rect.Height);
|
e.TextRectangle = new Rectangle(TextOffset, Convert.ToInt32((e.Item.Height - rect.Height) / 2.0), rect.Width, rect.Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,16 +253,13 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
Rectangle r = new Rectangle(-1, -1, e.AffectedBounds.Width, e.AffectedBounds.Height);
|
Rectangle r = new Rectangle(-1, -1, e.AffectedBounds.Width, e.AffectedBounds.Height);
|
||||||
|
|
||||||
using (SolidBrush b = new SolidBrush(ColorToolStrip2))
|
using (SolidBrush b = new SolidBrush(ColorToolStrip2))
|
||||||
{
|
|
||||||
e.Graphics.FillRectangle(b, r);
|
e.Graphics.FillRectangle(b, r);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
|
protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
|
||||||
{
|
{
|
||||||
e.Item.ForeColor = Color.Black;
|
e.Item.ForeColor = Color.Black;
|
||||||
|
|
||||||
var r = new Rectangle(Point.Empty, e.Item.Size);
|
var r = new Rectangle(Point.Empty, e.Item.Size);
|
||||||
var g = e.Graphics;
|
var g = e.Graphics;
|
||||||
|
|
||||||
@@ -253,71 +268,33 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
|
|
||||||
if (e.Item.Selected && e.Item.Enabled)
|
if (e.Item.Selected && e.Item.Enabled)
|
||||||
{
|
{
|
||||||
if (e.Item.Owner is MenuStrip)
|
g.SmoothingMode = SmoothingMode.AntiAlias;
|
||||||
DrawButton(e);
|
var r2 = new Rectangle(r.X + 2, r.Y, r.Width - 4, r.Height - 1);
|
||||||
else
|
r2.Inflate(-1, -1);
|
||||||
{
|
using (SolidBrush b = new SolidBrush(ColorSelection))
|
||||||
g.SmoothingMode = SmoothingMode.AntiAlias;
|
g.FillRectangle(b, r2);
|
||||||
|
|
||||||
var r2 = new Rectangle(r.X + 2, r.Y, r.Width - 4, r.Height - 1);
|
|
||||||
|
|
||||||
using (Pen pen = new Pen(ColorBorder))
|
|
||||||
{
|
|
||||||
g.DrawRectangle(pen, r2);
|
|
||||||
}
|
|
||||||
|
|
||||||
r2.Inflate(-1, -1);
|
|
||||||
|
|
||||||
using (SolidBrush b = new SolidBrush(ColorBottom))
|
|
||||||
{
|
|
||||||
g.FillRectangle(b, r2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawButton(ToolStripItemRenderEventArgs e)
|
|
||||||
{
|
|
||||||
var gx = e.Graphics;
|
|
||||||
var rect = new Rectangle(Point.Empty, e.Item.Size);
|
|
||||||
var rect2 = new Rectangle(rect.X, rect.Y, rect.Width - 1, rect.Height - 1);
|
|
||||||
|
|
||||||
using (Pen pen = new Pen(ColorBorder))
|
|
||||||
gx.DrawRectangle(pen, rect2);
|
|
||||||
|
|
||||||
rect2.Inflate(-1, -1);
|
|
||||||
var tsb = e.Item as ToolStripButton;
|
|
||||||
|
|
||||||
if (tsb != null && tsb.Checked)
|
|
||||||
using (SolidBrush brush = new SolidBrush(ColorChecked))
|
|
||||||
gx.FillRectangle(brush, rect2);
|
|
||||||
else
|
|
||||||
using (SolidBrush brush = new SolidBrush(ColorBottom))
|
|
||||||
gx.FillRectangle(brush, rect2);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e)
|
|
||||||
{
|
|
||||||
if (e.Item.Selected)
|
|
||||||
DrawButton(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
|
|
||||||
{
|
|
||||||
var button = (ToolStripButton)e.Item;
|
|
||||||
if (e.Item.Selected || button.Checked)
|
|
||||||
DrawButton(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
|
protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
|
||||||
{
|
{
|
||||||
var value = e.Direction == ArrowDirection.Down ? 0x36 : 0x34;
|
if (e.Direction == ArrowDirection.Down) throw new NotImplementedException();
|
||||||
var s = Convert.ToChar(value).ToString();
|
float x1 = e.Item.Width - e.Item.Height * 0.6f;
|
||||||
var font = new Font("Marlett", e.Item.Font.Size - 2);
|
float y1 = e.Item.Height * 0.25f;
|
||||||
var size = e.Graphics.MeasureString(s, font);
|
float x2 = x1 + e.Item.Height * 0.25f;
|
||||||
var x = Convert.ToInt32(e.Item.Width - size.Width);
|
float y2 = e.Item.Height / 2f;
|
||||||
var y = Convert.ToInt32((e.Item.Height - size.Height) / 2.0) + 1;
|
float x3 = x1;
|
||||||
e.Graphics.DrawString(s, font, Brushes.Black, x, y);
|
float y3 = e.Item.Height * 0.75f;
|
||||||
|
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
|
||||||
|
|
||||||
|
using (Brush b = new SolidBrush(ColorForeground))
|
||||||
|
{
|
||||||
|
using (Pen p = new Pen(b, Control.DefaultFont.Height / 20f))
|
||||||
|
{
|
||||||
|
e.Graphics.DrawLine(p, x1, y1, x2, y2);
|
||||||
|
e.Graphics.DrawLine(p, x2, y2, x3, y3);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
|
protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
|
||||||
@@ -328,25 +305,14 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
|
|
||||||
protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
|
protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.Item.IsOnDropDown)
|
e.Graphics.Clear(ColorBackground);
|
||||||
{
|
int top = e.Item.Height / 2;
|
||||||
e.Graphics.Clear(ColorBackground);
|
top -= 1;
|
||||||
int right = e.Item.Width - Convert.ToInt32(TextOffset / 5.0);
|
int offset = Convert.ToInt32(e.Item.Font.Height * 0.7);
|
||||||
int top = e.Item.Height / 2;
|
using (Pen p = new Pen(ColorBorder))
|
||||||
top -= 1;
|
e.Graphics.DrawLine(p,
|
||||||
using (Pen p = new Pen(Color.Gray))
|
new Point(offset, top),
|
||||||
e.Graphics.DrawLine(p, new Point(TextOffset, top), new Point(right, top));
|
new Point(e.Item.Width - offset, top));
|
||||||
}
|
|
||||||
else if (e.Vertical)
|
|
||||||
{
|
|
||||||
var bounds = e.Item.Bounds;
|
|
||||||
using (Pen p = new Pen(SystemColors.ControlDarkDark))
|
|
||||||
e.Graphics.DrawLine(p,
|
|
||||||
Convert.ToInt32(bounds.Width / 2.0),
|
|
||||||
Convert.ToInt32(bounds.Height * 0.15),
|
|
||||||
Convert.ToInt32(bounds.Width / 2.0),
|
|
||||||
Convert.ToInt32(bounds.Height * 0.85));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,14 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static string GetFilter(IEnumerable<string> values) => "*." +
|
public static string GetFilter(IEnumerable<string> values) => "*." +
|
||||||
String.Join(";*.", values) + "|*." + String.Join(";*.", values) + "|All Files|*.*";
|
String.Join(";*.", values) + "|*." + String.Join(";*.", values) + "|All Files|*.*";
|
||||||
|
|
||||||
|
public static bool IsDarkTheme {
|
||||||
|
get {
|
||||||
|
object value = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1);
|
||||||
|
if (value is null) value = 1;
|
||||||
|
return (int)value == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StringLogicalComparer : IComparer, IComparer<string>
|
public class StringLogicalComparer : IComparer, IComparer<string>
|
||||||
@@ -28,16 +36,6 @@ namespace mpvnet
|
|||||||
int IComparer<string>.Compare(string x, string y) => IComparerOfString_Compare(x, y);
|
int IComparer<string>.Compare(string x, string y) => IComparerOfString_Compare(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class OSVersion
|
|
||||||
{
|
|
||||||
public static float Windows7 { get; } = 6.1f;
|
|
||||||
public static float Windows8 { get; } = 6.2f;
|
|
||||||
public static float Windows81 { get; } = 6.3f;
|
|
||||||
public static float Windows10 { get; } = 10f;
|
|
||||||
|
|
||||||
public static float Current => Environment.OSVersion.Version.Major + Environment.OSVersion.Version.Minor / 10f;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class FileAssociation
|
public class FileAssociation
|
||||||
{
|
{
|
||||||
static string ExePath = Application.ExecutablePath;
|
static string ExePath = Application.ExecutablePath;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("mpv.net")]
|
[assembly: AssemblyProduct("mpv.net")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017 stax76")]
|
[assembly: AssemblyCopyright("Copyright © 2017-2019 stax76")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("2.5.0.0")]
|
[assembly: AssemblyVersion("2.8.0.0")]
|
||||||
[assembly: AssemblyFileVersion("2.5.0.0")]
|
[assembly: AssemblyFileVersion("2.8.0.0")]
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
Space cycle pause #menu: Play/Pause
|
Space cycle pause #menu: Play/Pause
|
||||||
s stop #menu: Stop
|
s stop #menu: Stop
|
||||||
_ ignore #menu: -
|
_ ignore #menu: -
|
||||||
f cycle fullscreen #menu: Toggle Fullscreen
|
Enter cycle fullscreen #menu: Toggle Fullscreen
|
||||||
|
|
||||||
F11 playlist-prev #menu: Navigate > Previous
|
F11 playlist-prev #menu: Navigate > Previous
|
||||||
F12 playlist-next #menu: Navigate > Next
|
F12 playlist-next #menu: Navigate > Next
|
||||||
@@ -123,23 +123,21 @@
|
|||||||
|
|
||||||
Ctrl+t set ontop yes #menu: View > On Top > Enable
|
Ctrl+t set ontop yes #menu: View > On Top > Enable
|
||||||
Ctrl+T set ontop no #menu: View > On Top > Disable
|
Ctrl+T set ontop no #menu: View > On Top > Disable
|
||||||
i script-message mpv.net show-info #menu: View > File Info
|
i script-message mpv.net show-info #menu: View > File Info
|
||||||
t script-binding stats/display-stats #menu: View > Show Statistics
|
t script-binding stats/display-stats #menu: View > Show Statistics
|
||||||
T script-binding stats/display-stats-toggle #menu: View > Toggle Statistics
|
T script-binding stats/display-stats-toggle #menu: View > Toggle Statistics
|
||||||
|
Del script-binding osc/visibility #menu: View > Toggle OSC Visibility
|
||||||
|
F8 show-text ${playlist} 5000 #menu: View > Show Playlist
|
||||||
|
F9 show-text ${track-list} 5000 #menu: View > Show Audio/Video/Subtitle List
|
||||||
|
|
||||||
_ script-message mpv.net set-setting hwdec yes #menu: Settings > Hardware Decoding > Enable
|
|
||||||
_ script-message mpv.net set-setting hwdec no #menu: Settings > Hardware Decoding > Disable
|
|
||||||
Ctrl+c script-message mpv.net show-conf-editor #menu: Settings > Show Config Editor
|
Ctrl+c script-message mpv.net show-conf-editor #menu: Settings > Show Config Editor
|
||||||
Ctrl+i script-message mpv.net show-input-editor #menu: Settings > Show Input Editor
|
Ctrl+i script-message mpv.net show-input-editor #menu: Settings > Show Input Editor
|
||||||
Ctrl+f script-message mpv.net open-conf-folder #menu: Settings > Open Config Folder
|
Ctrl+f script-message mpv.net open-conf-folder #menu: Settings > Open Config Folder
|
||||||
|
|
||||||
h script-message mpv.net show-history #menu: Tools > Show History
|
h script-message mpv.net show-history #menu: Tools > Show History
|
||||||
l ab-loop #menu: Tools > Set/clear A-B loop points
|
l ab-loop #menu: Tools > Set/clear A-B loop points
|
||||||
L cycle-values loop-file "inf" "no" #menu: Tools > Toggle Infinite Looping
|
L cycle-values loop-file "inf" "no" #menu: Tools > Toggle infinite file looping
|
||||||
Del script-binding osc/visibility #menu: Tools > Toggle OSC Visibility
|
|
||||||
Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Cycle Hardware Decoding
|
Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Cycle Hardware Decoding
|
||||||
F8 show-text ${playlist} 5000 #menu: Tools > Show Playlist
|
|
||||||
F9 show-text ${track-list} 5000 #menu: Tools > Show Audio/Video/Subtitle List
|
|
||||||
_ script-message mpv.net execute-mpv-command #menu: Tools > Execute mpv command...
|
_ script-message mpv.net execute-mpv-command #menu: Tools > Execute mpv command...
|
||||||
|
|
||||||
_ script-message mpv.net shell-execute https://mpv.io/manual/stable/ #menu: Help > Show mpv manual
|
_ script-message mpv.net shell-execute https://mpv.io/manual/stable/ #menu: Help > Show mpv manual
|
||||||
@@ -152,7 +150,6 @@
|
|||||||
Q quit-watch-later #menu: Exit Watch Later
|
Q quit-watch-later #menu: Exit Watch Later
|
||||||
> playlist-next
|
> playlist-next
|
||||||
< playlist-prev
|
< playlist-prev
|
||||||
Enter cycle pause
|
|
||||||
Power quit
|
Power quit
|
||||||
Play cycle pause
|
Play cycle pause
|
||||||
Pause cycle pause
|
Pause cycle pause
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using System.Text;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
using VBNET;
|
using VBNET;
|
||||||
using static mpvnet.libmpv;
|
using static mpvnet.libmpv;
|
||||||
using static mpvnet.Native;
|
using static mpvnet.Native;
|
||||||
@@ -60,6 +61,7 @@ namespace mpvnet
|
|||||||
public static string mpvConfFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\";
|
public static string mpvConfFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\";
|
||||||
public static string InputConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\input.conf";
|
public static string InputConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\input.conf";
|
||||||
public static string mpvConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\mpv.conf";
|
public static string mpvConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\mpv.conf";
|
||||||
|
public static string mpvNetConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\mpvnet.conf";
|
||||||
public static List<PythonScript> PythonScripts => new List<PythonScript>();
|
public static List<PythonScript> PythonScripts => new List<PythonScript>();
|
||||||
public static AutoResetEvent AutoResetEvent = new AutoResetEvent(false);
|
public static AutoResetEvent AutoResetEvent = new AutoResetEvent(false);
|
||||||
|
|
||||||
@@ -80,6 +82,23 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Dictionary<string, string> _mpvNetConf;
|
||||||
|
|
||||||
|
public static Dictionary<string, string> mpvNetConf {
|
||||||
|
get {
|
||||||
|
if (_mpvNetConf == null)
|
||||||
|
{
|
||||||
|
_mpvNetConf = new Dictionary<string, string>();
|
||||||
|
|
||||||
|
if (File.Exists(mpvNetConfPath))
|
||||||
|
foreach (string i in File.ReadAllLines(mpvNetConfPath))
|
||||||
|
if (i.Contains("=") && !i.StartsWith("#"))
|
||||||
|
_mpvNetConf[i.Substring(0, i.IndexOf("=")).Trim()] = i.Substring(i.IndexOf("=") + 1).Trim();
|
||||||
|
}
|
||||||
|
return _mpvNetConf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
if (!Directory.Exists(mp.mpvConfFolderPath))
|
if (!Directory.Exists(mp.mpvConfFolderPath))
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Application x:Class="DynamicGUI.App"
|
<Application x:Class="mpvConfEdit.App"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:local="clr-namespace:DynamicGUI"
|
xmlns:Controls="clr-namespace:Controls"
|
||||||
StartupUri="MainWindow.xaml">
|
StartupUri="MainWindow.xaml">
|
||||||
<Application.Resources>
|
<Application.Resources>
|
||||||
<Style TargetType="TextBox">
|
<Style TargetType="TextBox">
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
|
<Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
|
||||||
</Trigger>
|
</Trigger>
|
||||||
<Trigger Property="IsFocused" Value="true">
|
<Trigger Property="IsFocused" Value="true">
|
||||||
<Setter Property="BorderBrush" TargetName="border" Value="{x:Static SystemParameters.WindowGlassBrush}"/>
|
<Setter Property="BorderBrush" TargetName="border" Value="{x:Static Controls:Controls.ThemeBrush}"/>
|
||||||
</Trigger>
|
</Trigger>
|
||||||
</ControlTemplate.Triggers>
|
</ControlTemplate.Triggers>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
|
||||||
namespace DynamicGUI
|
namespace mpvConfEdit
|
||||||
{
|
{
|
||||||
public partial class App : Application
|
public partial class App : Application
|
||||||
{
|
{
|
||||||
|
|||||||
18
mpvConfEdit/Controls.cs
Normal file
18
mpvConfEdit/Controls.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace Controls
|
||||||
|
{
|
||||||
|
class Controls
|
||||||
|
{
|
||||||
|
public static Brush ThemeBrush {
|
||||||
|
get {
|
||||||
|
if (Environment.OSVersion.Version.Major < 10)
|
||||||
|
return new SolidColorBrush(Colors.DimGray);
|
||||||
|
else
|
||||||
|
return SystemParameters.WindowGlassBrush;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -54,7 +54,6 @@ namespace DynamicGUI
|
|||||||
baseSetting.Filter = setting["filter"];
|
baseSetting.Filter = setting["filter"];
|
||||||
if (setting.HasKey("help")) baseSetting.Help = setting["help"];
|
if (setting.HasKey("help")) baseSetting.Help = setting["help"];
|
||||||
if (setting.HasKey("helpurl")) baseSetting.HelpURL = setting["helpurl"];
|
if (setting.HasKey("helpurl")) baseSetting.HelpURL = setting["helpurl"];
|
||||||
if (setting.HasKey("alias")) baseSetting.Alias = setting["alias"];
|
|
||||||
if (setting.HasKey("width")) baseSetting.Width = setting["width"];
|
if (setting.HasKey("width")) baseSetting.Width = setting["width"];
|
||||||
settingsList.Add(baseSetting);
|
settingsList.Add(baseSetting);
|
||||||
}
|
}
|
||||||
@@ -65,8 +64,9 @@ namespace DynamicGUI
|
|||||||
public abstract class SettingBase
|
public abstract class SettingBase
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Alias { get; set; }
|
public string Value { get; set; }
|
||||||
public string Help { get; set; }
|
public string Help { get; set; }
|
||||||
|
public string Default { get; set; }
|
||||||
public string HelpURL { get; set; }
|
public string HelpURL { get; set; }
|
||||||
public string Filter { get; set; }
|
public string Filter { get; set; }
|
||||||
public int Width { get; set; }
|
public int Width { get; set; }
|
||||||
@@ -74,15 +74,11 @@ namespace DynamicGUI
|
|||||||
|
|
||||||
public class StringSetting : SettingBase
|
public class StringSetting : SettingBase
|
||||||
{
|
{
|
||||||
public string Default { get; set; }
|
|
||||||
public string Value { get; set; }
|
|
||||||
public bool IsFolder { get; set; }
|
public bool IsFolder { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class OptionSetting : SettingBase
|
public class OptionSetting : SettingBase
|
||||||
{
|
{
|
||||||
public string Default { get; set; }
|
|
||||||
public string Value { get; set; }
|
|
||||||
public List<OptionSettingOption> Options = new List<OptionSettingOption>();
|
public List<OptionSettingOption> Options = new List<OptionSettingOption>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,18 +8,18 @@
|
|||||||
d:DesignHeight="450" d:DesignWidth="800">
|
d:DesignHeight="450" d:DesignWidth="800">
|
||||||
<Grid Margin="20,0">
|
<Grid Margin="20,0">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBox x:Name="TitleTextBox" FontSize="24" Margin="0,10" BorderThickness="0" IsReadOnly="True" Foreground="{x:Static SystemParameters.WindowGlassBrush}"></TextBox>
|
<TextBox x:Name="TitleTextBox" FontSize="24" Margin="0,10" BorderThickness="0" IsReadOnly="True" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
||||||
<ItemsControl x:Name="ItemsControl">
|
<ItemsControl x:Name="ItemsControl">
|
||||||
<ItemsControl.ItemTemplate>
|
<ItemsControl.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<WrapPanel Orientation="Vertical">
|
<WrapPanel Orientation="Vertical">
|
||||||
<RadioButton x:Name="RadioButton" VerticalContentAlignment="Center" IsChecked="{Binding IsChecked}" GroupName="{Binding OptionSetting.Name}" Content="{Binding Text}" FontSize="16" FontWeight="Normal" VerticalAlignment="Top"></RadioButton>
|
<RadioButton x:Name="RadioButton" VerticalContentAlignment="Center" IsChecked="{Binding IsChecked}" GroupName="{Binding OptionSetting.Name}" Content="{Binding Text}" FontSize="16" FontWeight="Normal" VerticalAlignment="Top" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></RadioButton>
|
||||||
<TextBox x:Name="ItemHelpTextBox" TextWrapping="WrapWithOverflow" Text="{Binding Help}" Margin="10,0,0,0" BorderThickness="0" IsReadOnly="True" Padding="7,0,0,0" MinHeight="0"></TextBox>
|
<TextBox x:Name="ItemHelpTextBox" TextWrapping="WrapWithOverflow" Text="{Binding Help}" Margin="10,0,0,0" BorderThickness="0" IsReadOnly="True" Padding="7,0,0,0" MinHeight="0" Foreground="{Binding Path=Foreground2, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ItemsControl.ItemTemplate>
|
</ItemsControl.ItemTemplate>
|
||||||
</ItemsControl>
|
</ItemsControl>
|
||||||
<TextBox x:Name="HelpTextBox" TextWrapping="WrapWithOverflow" BorderThickness="0" IsReadOnly="True" Margin="0,10,0,0"></TextBox>
|
<TextBox x:Name="HelpTextBox" TextWrapping="WrapWithOverflow" BorderThickness="0" IsReadOnly="True" Margin="0,10,0,0" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"></TextBox>
|
||||||
<TextBlock x:Name="LinkTextBlock" Margin="0,10">
|
<TextBlock x:Name="LinkTextBlock" Margin="0,10">
|
||||||
<local:HyperlinkEx x:Name="Link"></local:HyperlinkEx>
|
<local:HyperlinkEx x:Name="Link"></local:HyperlinkEx>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ namespace DynamicGUI
|
|||||||
HelpTextBox.Text = optionSetting.Help;
|
HelpTextBox.Text = optionSetting.Help;
|
||||||
ItemsControl.ItemsSource = optionSetting.Options;
|
ItemsControl.ItemsSource = optionSetting.Options;
|
||||||
Link.SetURL(optionSetting.HelpURL);
|
Link.SetURL(optionSetting.HelpURL);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(optionSetting.HelpURL))
|
if (string.IsNullOrEmpty(optionSetting.HelpURL))
|
||||||
LinkTextBlock.Visibility = Visibility.Collapsed;
|
LinkTextBlock.Visibility = Visibility.Collapsed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,16 +9,16 @@
|
|||||||
d:DesignWidth="800" >
|
d:DesignWidth="800" >
|
||||||
<Grid Margin="20,0">
|
<Grid Margin="20,0">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBox x:Name="TitleTextBox" FontSize="24" Margin="0,10" BorderThickness="0" IsReadOnly="True" Foreground="{x:Static SystemParameters.WindowGlassBrush}"></TextBox>
|
<TextBox x:Name="TitleTextBox" FontSize="24" Margin="0,10" BorderThickness="0" IsReadOnly="True" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
||||||
<Grid Margin="0,0,0,10">
|
<Grid Margin="0,0,0,10">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<TextBox x:Name="ValueTextBox" Text="{Binding Path=Text, ElementName=StringSettingControl1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="150" HorizontalAlignment="Left" Height="20"/>
|
<TextBox x:Name="ValueTextBox" Text="{Binding Path=Text, ElementName=StringSettingControl1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="150" HorizontalAlignment="Left" Height="20" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"/>
|
||||||
<Button x:Name="Button" Height="20" Grid.Column="1" Visibility="{Binding Path=Text, ElementName=StringSettingControl1}" Margin="5,0,0,0" Width="20" Click="Button_Click">...</Button>
|
<Button x:Name="Button" Height="20" Grid.Column="1" Visibility="{Binding Path=Text, ElementName=StringSettingControl1}" Margin="5,0,0,0" Width="20" Click="Button_Click">...</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
<TextBox x:Name="HelpTextBox" TextWrapping="WrapWithOverflow" Margin="0,0,0,10" BorderThickness="0" IsReadOnly="True"></TextBox>
|
<TextBox x:Name="HelpTextBox" TextWrapping="WrapWithOverflow" Margin="0,0,0,10" BorderThickness="0" IsReadOnly="True" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
||||||
<TextBlock x:Name="LinkTextBlock" Margin="0,10">
|
<TextBlock x:Name="LinkTextBlock" Margin="0,10">
|
||||||
<local:HyperlinkEx x:Name="Link"></local:HyperlinkEx>
|
<local:HyperlinkEx x:Name="Link"></local:HyperlinkEx>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ namespace DynamicGUI
|
|||||||
if (!StringSetting.IsFolder)
|
if (!StringSetting.IsFolder)
|
||||||
Button.Visibility = Visibility.Hidden;
|
Button.Visibility = Visibility.Hidden;
|
||||||
Link.SetURL(StringSetting.HelpURL);
|
Link.SetURL(StringSetting.HelpURL);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(stringSetting.HelpURL))
|
if (string.IsNullOrEmpty(stringSetting.HelpURL))
|
||||||
LinkTextBlock.Visibility = Visibility.Collapsed;
|
LinkTextBlock.Visibility = Visibility.Collapsed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Height="600" Width="800" Loaded="MainWindow1_Loaded" WindowStartupLocation="CenterScreen">
|
Height="500" Width="700" Loaded="MainWindow1_Loaded" WindowStartupLocation="CenterScreen">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
@@ -14,12 +14,12 @@
|
|||||||
<ColumnDefinition Width="10*" />
|
<ColumnDefinition Width="10*" />
|
||||||
<ColumnDefinition Width="60*" />
|
<ColumnDefinition Width="60*" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Controls:SearchTextBoxUserControl x:Name="SearchControl" Width="300" Margin="0,20,0,10" Grid.ColumnSpan="2" />
|
<Controls:SearchTextBoxUserControl x:Name="SearchControl" Width="250" Margin="0,20,0,10" Grid.ColumnSpan="2" />
|
||||||
<ScrollViewer x:Name="MainScrollViewer" VerticalScrollBarVisibility="Auto" Grid.Row="1" Grid.Column="1" Margin="0,0,0,10">
|
<ScrollViewer x:Name="MainScrollViewer" VerticalScrollBarVisibility="Auto" Grid.Row="1" Grid.Column="1" Margin="0,0,0,10">
|
||||||
<StackPanel x:Name="MainStackPanel"></StackPanel>
|
<StackPanel x:Name="MainStackPanel"></StackPanel>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
<StackPanel Margin="20,0,0,0" Grid.Row="1">
|
<StackPanel Margin="20,0,0,0" Grid.Row="1">
|
||||||
<ListBox x:Name="FilterListBox" ItemsSource="{Binding FilterStrings}" BorderThickness="0" SelectionChanged="ListBox_SelectionChanged" Foreground="{x:Static SystemParameters.WindowGlassBrush}">
|
<ListBox x:Name="FilterListBox" ItemsSource="{Binding FilterStrings}" BorderThickness="0" SelectionChanged="ListBox_SelectionChanged" Foreground="{x:Static Controls:Controls.ThemeBrush}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
|
||||||
<ListBox.ItemTemplate>
|
<ListBox.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
@@ -28,10 +28,10 @@
|
|||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ListBox.ItemTemplate>
|
</ListBox.ItemTemplate>
|
||||||
</ListBox>
|
</ListBox>
|
||||||
<TextBlock x:Name="OpenSettingsTextBlock" Margin="0,30,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="OpenSettingsTextBlock_MouseUp">Open settings folder</TextBlock>
|
<TextBlock x:Name="OpenSettingsTextBlock" Margin="0,30,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static Controls:Controls.ThemeBrush}" MouseUp="OpenSettingsTextBlock_MouseUp">Open config folder</TextBlock>
|
||||||
<TextBlock x:Name="ShowManualTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="ShowManualTextBlock_MouseUp">Show mpv manual</TextBlock>
|
<TextBlock x:Name="ShowManualTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static Controls:Controls.ThemeBrush}" MouseUp="ShowManualTextBlock_MouseUp">Show mpv manual</TextBlock>
|
||||||
<TextBlock x:Name="SupportTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="SupportTextBlock_MouseUp">Show support forum</TextBlock>
|
<TextBlock x:Name="SupportTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static Controls:Controls.ThemeBrush}" MouseUp="SupportTextBlock_MouseUp">Show support forum</TextBlock>
|
||||||
<TextBlock x:Name="ApplyTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="ApplyTextBlock_MouseUp">Write config to mpv.conf</TextBlock>
|
<TextBlock x:Name="ApplyTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static Controls:Controls.ThemeBrush}" MouseUp="ApplyTextBlock_MouseUp">Write config to disk</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
@@ -8,15 +8,20 @@ using System.Reflection;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
using DynamicGUI;
|
using DynamicGUI;
|
||||||
|
using Microsoft.Win32;
|
||||||
|
|
||||||
namespace mpvConfEdit
|
namespace mpvConfEdit
|
||||||
{
|
{
|
||||||
public partial class MainWindow : Window
|
public partial class MainWindow : Window
|
||||||
{
|
{
|
||||||
public string mpvConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\mpv.conf";
|
public string MpvConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\mpv.conf";
|
||||||
private List<SettingBase> DynamicSettings = Settings.LoadSettings(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\mpvConfEdit.toml");
|
public string MpvNetConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\mpvnet.conf";
|
||||||
|
private List<SettingBase> MpvSettingsDefinitions = Settings.LoadSettings(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\mpvConf.toml");
|
||||||
|
private List<SettingBase> MpvNetSettingsDefinitions = Settings.LoadSettings(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\mpvNetConf.toml");
|
||||||
|
public ObservableCollection<string> FilterStrings { get; } = new ObservableCollection<string>();
|
||||||
|
private Dictionary<string, Dictionary<string, string>> Comments = new Dictionary<string, Dictionary<string, string>>();
|
||||||
|
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
@@ -24,31 +29,77 @@ namespace mpvConfEdit
|
|||||||
DataContext = this;
|
DataContext = this;
|
||||||
Title = (Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), true)[0] as AssemblyProductAttribute).Product + " " + Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
Title = (Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), true)[0] as AssemblyProductAttribute).Product + " " + Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||||
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
||||||
|
LoadSettings(MpvSettingsDefinitions, MpvConf);
|
||||||
|
LoadSettings(MpvNetSettingsDefinitions, MpvNetConf);
|
||||||
|
SearchControl.Text = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Software\mpv.net", "conf editor search", "");
|
||||||
|
SetDarkTheme();
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var setting in DynamicSettings)
|
public Brush Foreground2 {
|
||||||
|
get { return (Brush)GetValue(Foreground2Property); }
|
||||||
|
set { SetValue(Foreground2Property, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty Foreground2Property =
|
||||||
|
DependencyProperty.Register("Foreground2", typeof(Brush), typeof(MainWindow), new PropertyMetadata(Brushes.DarkSlateGray));
|
||||||
|
|
||||||
|
void SetDarkTheme()
|
||||||
|
{
|
||||||
|
string darkMode = MpvNetSettingsDefinitions.Where(item => item.Name == "dark-mode").First().Value;
|
||||||
|
|
||||||
|
object value = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1);
|
||||||
|
if (value is null) value = 1;
|
||||||
|
bool isDarkTheme = (int)value == 0;
|
||||||
|
|
||||||
|
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<SettingBase> settingsDefinitions,
|
||||||
|
Dictionary<string, string> confSettings)
|
||||||
|
{
|
||||||
|
foreach (var setting in settingsDefinitions)
|
||||||
{
|
{
|
||||||
if (!FilterStrings.Contains(setting.Filter))
|
if (!FilterStrings.Contains(setting.Filter))
|
||||||
FilterStrings.Add(setting.Filter);
|
FilterStrings.Add(setting.Filter);
|
||||||
foreach (var pair in mpvConf)
|
|
||||||
|
foreach (var pair in confSettings)
|
||||||
{
|
{
|
||||||
if (setting.Name == pair.Key || setting.Alias == pair.Key)
|
if (setting.Name == pair.Key)
|
||||||
switch (setting)
|
{
|
||||||
{
|
setting.Value = pair.Value;
|
||||||
case StringSetting s:
|
continue;
|
||||||
s.Value = pair.Value;
|
}
|
||||||
continue;
|
|
||||||
case OptionSetting s:
|
|
||||||
s.Value = pair.Value;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (setting)
|
switch (setting)
|
||||||
{
|
{
|
||||||
case StringSetting s:
|
case StringSetting s:
|
||||||
MainStackPanel.Children.Add(new StringSettingControl(s));
|
var sc = new StringSettingControl(s);
|
||||||
|
sc.TitleTextBox.Foreground = Controls.Controls.ThemeBrush;
|
||||||
|
MainStackPanel.Children.Add(sc);
|
||||||
break;
|
break;
|
||||||
case OptionSetting s:
|
case OptionSetting s:
|
||||||
MainStackPanel.Children.Add(new OptionSettingControl(s));
|
var oc = new OptionSettingControl(s);
|
||||||
|
oc.TitleTextBox.Foreground = Controls.Controls.ThemeBrush;
|
||||||
|
MainStackPanel.Children.Add(oc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,103 +107,96 @@ namespace mpvConfEdit
|
|||||||
|
|
||||||
private Dictionary<string, string> _mpvConf;
|
private Dictionary<string, string> _mpvConf;
|
||||||
|
|
||||||
public Dictionary<string, string> mpvConf {
|
public Dictionary<string, string> MpvConf {
|
||||||
get {
|
get {
|
||||||
if (_mpvConf == null)
|
if (_mpvConf == null) _mpvConf = LoadConf(MpvConfPath);
|
||||||
{
|
|
||||||
_mpvConf = new Dictionary<string, string>();
|
|
||||||
|
|
||||||
if (File.Exists(mpvConfPath))
|
|
||||||
foreach (var i in File.ReadAllLines(mpvConfPath))
|
|
||||||
if (i.Contains("=") && !i.Trim().StartsWith("#"))
|
|
||||||
{
|
|
||||||
int pos = i.IndexOf("=");
|
|
||||||
_mpvConf[i.Substring(0, pos).Trim()] = i.Substring(pos + 1).Trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _mpvConf;
|
return _mpvConf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ObservableCollection<string> FilterStrings { get; } = new ObservableCollection<string>();
|
private Dictionary<string, string> _mpvNetConf;
|
||||||
|
|
||||||
|
public Dictionary<string, string> MpvNetConf {
|
||||||
|
get {
|
||||||
|
if (_mpvNetConf == null) _mpvNetConf = LoadConf(MpvNetConfPath);
|
||||||
|
return _mpvNetConf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<string, string> LoadConf(string filePath)
|
||||||
|
{
|
||||||
|
Dictionary<string, string> conf = new Dictionary<string, string>();
|
||||||
|
Comments[filePath] = new Dictionary<string, string>();
|
||||||
|
|
||||||
|
if (File.Exists(filePath))
|
||||||
|
{
|
||||||
|
foreach (string i in File.ReadAllLines(filePath))
|
||||||
|
{
|
||||||
|
if (i.Contains("="))
|
||||||
|
{
|
||||||
|
int pos = i.IndexOf("=");
|
||||||
|
string left = i.Substring(0, pos).Replace(" ", "").ToLower();
|
||||||
|
string right = i.Substring(pos + 1).Trim();
|
||||||
|
|
||||||
|
if (left.StartsWith("#"))
|
||||||
|
{
|
||||||
|
Comments[filePath][left.TrimStart("#".ToCharArray())] = right;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left == "fs") left = "fullscreen";
|
||||||
|
if (left == "loop") left = "loop-file";
|
||||||
|
conf[left] = right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void OnClosed(EventArgs e)
|
protected override void OnClosed(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnClosed(e);
|
base.OnClosed(e);
|
||||||
WriteToDisk();
|
WriteToDisk();
|
||||||
|
Registry.SetValue(@"HKEY_CURRENT_USER\Software\mpv.net", "conf editor search", SearchControl.Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteToDisk()
|
void WriteToDisk()
|
||||||
{
|
{
|
||||||
foreach (var mpvSetting in DynamicSettings)
|
WriteToDisk(MpvConfPath, MpvConf, MpvSettingsDefinitions);
|
||||||
{
|
WriteToDisk(MpvNetConfPath, MpvNetConf, MpvNetSettingsDefinitions);
|
||||||
switch (mpvSetting)
|
|
||||||
{
|
|
||||||
case StringSetting s:
|
|
||||||
if ((s.Value ?? "") != s.Default || mpvConf.ContainsKey(s.Name) || mpvConf.ContainsKey(s.Alias ?? ""))
|
|
||||||
mpvConf[s.Name] = s.Value;
|
|
||||||
break;
|
|
||||||
case OptionSetting s:
|
|
||||||
if ((s.Value ?? "") != s.Default || mpvConf.ContainsKey(s.Name) || mpvConf.ContainsKey(s.Alias ?? ""))
|
|
||||||
mpvConf[s.Name] = s.Value;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!File.Exists(mpvConfPath))
|
|
||||||
File.WriteAllText(mpvConfPath, "");
|
|
||||||
|
|
||||||
List<string> lines = File.ReadAllLines(mpvConfPath).ToList();
|
|
||||||
|
|
||||||
foreach (var mpvSetting in DynamicSettings)
|
|
||||||
{
|
|
||||||
foreach (var line in lines.ToArray())
|
|
||||||
{
|
|
||||||
string test = line.Replace("#", "").Replace(" ", "");
|
|
||||||
if (test.StartsWith(mpvSetting.Alias + "="))
|
|
||||||
{
|
|
||||||
lines.Remove(line);
|
|
||||||
foreach (var pair in mpvConf.ToArray())
|
|
||||||
if (test.StartsWith(pair.Key + "="))
|
|
||||||
mpvConf.Remove(pair.Key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var pair in mpvConf)
|
|
||||||
{
|
|
||||||
bool changed = false;
|
|
||||||
|
|
||||||
for (int i = 0; i < lines.Count; i++)
|
|
||||||
{
|
|
||||||
if (lines[i].Contains("=") &&
|
|
||||||
lines[i].Substring(0, lines[i].IndexOf("=")).Trim("# ".ToCharArray()) == pair.Key)
|
|
||||||
{
|
|
||||||
lines[i] = pair.Key + " = " + pair.Value;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!changed)
|
|
||||||
lines.Add(pair.Key + " = " + pair.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var mpvSetting in DynamicSettings)
|
|
||||||
{
|
|
||||||
foreach (var line in lines.ToArray())
|
|
||||||
{
|
|
||||||
string test = line.Replace("#", "").Replace(" ", "");
|
|
||||||
|
|
||||||
if (test.StartsWith(mpvSetting.Name + "=") && !mpvConf.ContainsKey(mpvSetting.Name))
|
|
||||||
lines.Remove(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
File.WriteAllText(mpvConfPath, String.Join(Environment.NewLine, lines));
|
|
||||||
MessageBox.Show("Changes will be available on next startup of mpv(.net).",
|
MessageBox.Show("Changes will be available on next startup of mpv(.net).",
|
||||||
Title, MessageBoxButton.OK, MessageBoxImage.Information);
|
Title, MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WriteToDisk(string filePath,
|
||||||
|
Dictionary<string, string> confSettings,
|
||||||
|
List<SettingBase> settings)
|
||||||
|
{
|
||||||
|
string content = "";
|
||||||
|
|
||||||
|
foreach (var i in Comments[filePath])
|
||||||
|
content += $"#{i.Key} = {i.Value}\r\n";
|
||||||
|
|
||||||
|
foreach (var setting in settings)
|
||||||
|
{
|
||||||
|
if ((setting.Value ?? "") != setting.Default)
|
||||||
|
confSettings[setting.Name] = setting.Value;
|
||||||
|
|
||||||
|
if (confSettings.ContainsKey(setting.Name) &&
|
||||||
|
(setting.Value ?? "") == setting.Default ||
|
||||||
|
(setting.Value ?? "") == "")
|
||||||
|
{
|
||||||
|
confSettings.Remove(setting.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var i in confSettings)
|
||||||
|
content = content + $"{i.Key} = {i.Value}\r\n";
|
||||||
|
|
||||||
|
File.WriteAllText(filePath, content);
|
||||||
|
}
|
||||||
|
|
||||||
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||||
{
|
{
|
||||||
string activeFilter = "";
|
string activeFilter = "";
|
||||||
@@ -194,7 +238,7 @@ namespace mpvConfEdit
|
|||||||
|
|
||||||
private void OpenSettingsTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
private void OpenSettingsTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||||
{
|
{
|
||||||
Process.Start(Path.GetDirectoryName(mpvConfPath));
|
Process.Start(Path.GetDirectoryName(MpvConfPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
private void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ using System.Windows;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("mpv(.net) conf edit")]
|
[assembly: AssemblyProduct("mpv(.net) conf edit")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017 stax76")]
|
[assembly: AssemblyCopyright("Copyright © 2017-2019 stax76")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -51,5 +51,5 @@ using System.Windows;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.3.0.0")]
|
[assembly: AssemblyVersion("1.7.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.3.0.0")]
|
[assembly: AssemblyFileVersion("1.7.0.0")]
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<UserControl x:Class="Controls.SearchTextBoxUserControl"
|
<UserControl x:Class="Controls.SearchTextBoxUserControl"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
d:DesignHeight="450" d:DesignWidth="800">
|
d:DesignHeight="450" d:DesignWidth="800">
|
||||||
<Grid x:Name="SearchTextBoxUserControl1" Background="White">
|
<Grid x:Name="SearchTextBoxUserControl1" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
|
||||||
<TextBlock x:Name="SearchTextBlock" Margin="5,2" Text="Find a setting" Foreground="LightSteelBlue" VerticalAlignment="Center" />
|
<TextBlock x:Name="HintTextBlock" Margin="5,2" Text="Find a setting" Foreground="LightSteelBlue" VerticalAlignment="Center" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
|
||||||
<TextBox Name="SearchTextBox" Height="25" Padding="1,2,0,0" BorderThickness="2" Background="Transparent" TextChanged="SearchTextBox_TextChanged" />
|
<TextBox Name="SearchTextBox" Height="25" Padding="1,2,0,0" BorderThickness="2" Background="Transparent" TextChanged="SearchTextBox_TextChanged" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" CaretBrush="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
|
||||||
<Button x:Name="SearchClearButton" Background="Transparent" HorizontalAlignment="Right" Margin="2,0,4,0" FontSize="5" Width="17" Height="17" Visibility="Hidden" Click="SearchClearButton_Click">╳</Button>
|
<Button x:Name="SearchClearButton" Background="Transparent" HorizontalAlignment="Right" Margin="2,0,4,0" FontSize="10" Width="17" Height="17" Visibility="Hidden" Click="SearchClearButton_Click" FontFamily="Marlett" Foreground="{Binding Path=Foreground2, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">r</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
@@ -21,7 +21,7 @@ namespace Controls
|
|||||||
|
|
||||||
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||||
{
|
{
|
||||||
SearchTextBlock.Text = SearchTextBox.Text == "" ? "Find a setting" : "";
|
HintTextBlock.Text = SearchTextBox.Text == "" ? "Find a setting" : "";
|
||||||
|
|
||||||
if (SearchTextBox.Text == "")
|
if (SearchTextBox.Text == "")
|
||||||
SearchClearButton.Visibility = Visibility.Hidden;
|
SearchClearButton.Visibility = Visibility.Hidden;
|
||||||
|
|||||||
38
mpvConfEdit/app.manifest
Normal file
38
mpvConfEdit/app.manifest
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<!--
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||||
|
-->
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- Windows 7 -->
|
||||||
|
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
|
||||||
|
|
||||||
|
<!-- Windows 8 -->
|
||||||
|
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
|
||||||
|
|
||||||
|
<!-- Windows 8.1 -->
|
||||||
|
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
|
||||||
|
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
|
||||||
|
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<windowsSettings>
|
||||||
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
|
||||||
|
</windowsSettings>
|
||||||
|
</application>
|
||||||
|
</assembly>
|
||||||
@@ -146,12 +146,38 @@ default = "100"
|
|||||||
filter = "Audio"
|
filter = "Audio"
|
||||||
help = "--volume=<integer> Set the startup volume. 0 means silence, 100 means no volume reduction or amplification. Negative values can be passed for compatibility, but are treated as 0. Since mpv 0.18.1, this always controls the internal mixer (aka \"softvol\"). Default: 100"
|
help = "--volume=<integer> Set the startup volume. 0 means silence, 100 means no volume reduction or amplification. Negative values can be passed for compatibility, but are treated as 0. Since mpv 0.18.1, this always controls the internal mixer (aka \"softvol\"). Default: 100"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "alang"
|
||||||
|
default = ""
|
||||||
|
filter = "Audio"
|
||||||
|
help = "--alang=<languagecode[,languagecode,...]> Specify a priority list of audio languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two-letter language codes, Matroska, MPEG-TS and NUT use ISO 639-2 three-letter language codes, while OGM uses a free-form identifier. See also --aid.\n\nExamples\n\nmpv dvd://1 --alang=hu,en chooses the Hungarian language track on a DVD and falls back on English if Hungarian is not available.\n\nmpv --alang=jpn example.mkv plays a Matroska file with Japanese audio."
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "audio-file-auto"
|
||||||
|
default = "no"
|
||||||
|
filter = "Audio"
|
||||||
|
help = "--audio-file-auto=<no|exact|fuzzy|all>, --no-audio-file-auto Load additional audio files matching the video filename. The parameter specifies how external audio files are matched."
|
||||||
|
options = [{ name = "no", help = "Don't automatically load external audio files (default)." },
|
||||||
|
{ name = "exact", help = "Load the media filename with audio file extension." },
|
||||||
|
{ name = "fuzzy", help = "Load all audio files containing media filename." },
|
||||||
|
{ name = "all", help = "Load all audio files in the current and --audio-file-paths directories." }]
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "slang"
|
name = "slang"
|
||||||
default = ""
|
default = ""
|
||||||
filter = "Subtitle"
|
filter = "Subtitle"
|
||||||
help = "--slang=<languagecode[,languagecode,...]> Specify a priority list of subtitle languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two letter language codes, Matroska uses ISO 639-2 three letter language codes while OGM uses a free-form identifier. See also --sid."
|
help = "--slang=<languagecode[,languagecode,...]> Specify a priority list of subtitle languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two letter language codes, Matroska uses ISO 639-2 three letter language codes while OGM uses a free-form identifier. See also --sid."
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "sub-auto"
|
||||||
|
default = "exact"
|
||||||
|
filter = "Subtitle"
|
||||||
|
help = "--sub-auto=<no|exact|fuzzy|all>, --no-sub-auto Load additional subtitle files matching the video filename. The parameter specifies how external subtitle files are matched. exact is enabled by default."
|
||||||
|
options = [{ name = "no", help = "Don't automatically load external subtitle files." },
|
||||||
|
{ name = "exact", help = "Load the media filename with subtitle file extension (Default)." },
|
||||||
|
{ name = "fuzzy", help = "Load all subs containing media filename." },
|
||||||
|
{ name = "all", help = "Load all subs in the current and --sub-file-paths directories." }]
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screen"
|
name = "screen"
|
||||||
default = ""
|
default = ""
|
||||||
@@ -163,18 +189,31 @@ name = "osd-playing-msg"
|
|||||||
default = ""
|
default = ""
|
||||||
width = 300
|
width = 300
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "--osd-playing-msg=<value> Show a message on OSD when playback starts. The string is expanded for properties, e.g. --osd-playing-msg='file: ${filename}' will show the message file: followed by a space and the currently played filename.\n\nFor more information visit:"
|
help = "--osd-playing-msg=<value> Show a message on OSD when playback starts. The string is expanded for properties, e.g. --osd-playing-msg='file: ${filename}' will show the message file: followed by a space and the currently played filename. For more information visit:"
|
||||||
helpurl = "https://mpv.io/manual/master/#property-expansion"
|
helpurl = "https://mpv.io/manual/master/#property-expansion"
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "fullscreen"
|
name = "fullscreen"
|
||||||
alias = "fs"
|
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "--fullscreen=<yes|no>, fs=<yes|no> Start the player in fullscreen mode. Default: no."
|
help = "--fullscreen=<yes|no>, fs=<yes|no> Start the player in fullscreen mode. Default: no."
|
||||||
options = [{ name = "yes" },
|
options = [{ name = "yes" },
|
||||||
{ name = "no" }]
|
{ name = "no" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "screenshot-directory"
|
||||||
|
default = ""
|
||||||
|
width = 500
|
||||||
|
folder = true
|
||||||
|
filter = "Screen"
|
||||||
|
help = "--screenshot-directory=<value> Store screenshots in this directory. This path is joined with the filename generated by --screenshot-template. If the template filename is already absolute, the directory is ignored.\n\nIf the directory does not exist, it is created on the first screenshot. If it is not a directory, an error is generated when trying to write a screenshot.\n\nThis option is not set by default, and thus will write screenshots to the directory from which mpv was started. In pseudo-gui mode (see PSEUDO GUI MODE), this is set to the desktop."
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "autofit"
|
||||||
|
default = "50%"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "--autofit=<percent value> Set the initial window size in percent. Please note that this setting is only partly implemented in mpv.net, accepted are only integer values with percent sign added. Default: 50%."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "keep-open-pause"
|
name = "keep-open-pause"
|
||||||
default = "yes"
|
default = "yes"
|
||||||
@@ -194,7 +233,6 @@ options = [{ name = "yes", help = "Don't terminate if the current file is the
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "loop-file"
|
name = "loop-file"
|
||||||
alias = "loop"
|
|
||||||
default = ""
|
default = ""
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "--loop-file=<N|inf|no>, loop=<N|inf|no> Loop a single file N times. inf means forever, no means normal playback. For compatibility, --loop-file and --loop-file=yes are also accepted, and are the same as --loop-file=inf.\n\nThe difference to --loop-playlist is that this doesn't loop the playlist, just the file itself. If the playlist contains only a single file, the difference between the two option is that this option performs a seek on loop, instead of reloading the file.\n\n--loop is an alias for this option."
|
help = "--loop-file=<N|inf|no>, loop=<N|inf|no> Loop a single file N times. inf means forever, no means normal playback. For compatibility, --loop-file and --loop-file=yes are also accepted, and are the same as --loop-file=inf.\n\nThe difference to --loop-playlist is that this doesn't loop the playlist, just the file itself. If the playlist contains only a single file, the difference between the two option is that this option performs a seek on loop, instead of reloading the file.\n\n--loop is an alias for this option."
|
||||||
@@ -207,14 +245,6 @@ help = "--save-position-on-quit=<yes|no> Always save the current playback positi
|
|||||||
options = [{ name = "yes" },
|
options = [{ name = "yes" },
|
||||||
{ name = "no" }]
|
{ name = "no" }]
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "screenshot-directory"
|
|
||||||
default = ""
|
|
||||||
width = 500
|
|
||||||
folder = true
|
|
||||||
filter = "Screen"
|
|
||||||
help = "--screenshot-directory=<value> Store screenshots in this directory. This path is joined with the filename generated by --screenshot-template. If the template filename is already absolute, the directory is ignored.\n\nIf the directory does not exist, it is created on the first screenshot. If it is not a directory, an error is generated when trying to write a screenshot.\n\nThis option is not set by default, and thus will write screenshots to the directory from which mpv was started. In pseudo-gui mode (see PSEUDO GUI MODE), this is set to the desktop."
|
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "input-ar-delay"
|
name = "input-ar-delay"
|
||||||
default = ""
|
default = ""
|
||||||
@@ -227,12 +257,6 @@ default = ""
|
|||||||
filter = "Input"
|
filter = "Input"
|
||||||
help = "--input-ar-rate=<integer> Number of key presses to generate per second on autorepeat."
|
help = "--input-ar-rate=<integer> Number of key presses to generate per second on autorepeat."
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "alang"
|
|
||||||
default = ""
|
|
||||||
filter = "Audio"
|
|
||||||
help = "--alang=<languagecode[,languagecode,...]> Specify a priority list of audio languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two-letter language codes, Matroska, MPEG-TS and NUT use ISO 639-2 three-letter language codes, while OGM uses a free-form identifier. See also --aid.\n\nExamples\n\nmpv dvd://1 --alang=hu,en chooses the Hungarian language track on a DVD and falls back on English if Hungarian is not available.\n\nmpv --alang=jpn example.mkv plays a Matroska file with Japanese audio."
|
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "hr-seek"
|
name = "hr-seek"
|
||||||
default = "absolute"
|
default = "absolute"
|
||||||
@@ -255,24 +279,4 @@ options = [{ name = "yes" },
|
|||||||
name = "loop-playlist"
|
name = "loop-playlist"
|
||||||
default = ""
|
default = ""
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "--loop-playlist=<N|inf|force|no>, --loop-playlist Loops playback N times. A value of 1 plays it one time (default), 2 two times, etc. inf means forever. no is the same as 1 and disables looping. If several files are specified on command line, the entire playlist is looped. --loop-playlist is the same as --loop-playlist=inf.\n\nThe force mode is like inf, but does not skip playlist entries which have been marked as failing. This means the player might waste CPU time trying to loop a file that doesn't exist. But it might be useful for playing webradios under very bad network conditions."
|
help = "--loop-playlist=<N|inf|force|no>, --loop-playlist Loops playback N times. A value of 1 plays it one time (default), 2 two times, etc. inf means forever. no is the same as 1 and disables looping. If several files are specified on command line, the entire playlist is looped. --loop-playlist is the same as --loop-playlist=inf.\n\nThe force mode is like inf, but does not skip playlist entries which have been marked as failing. This means the player might waste CPU time trying to loop a file that doesn't exist. But it might be useful for playing webradios under very bad network conditions."
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "audio-file-auto"
|
|
||||||
default = "no"
|
|
||||||
filter = "Audio"
|
|
||||||
help = "--audio-file-auto=<no|exact|fuzzy|all>, --no-audio-file-auto Load additional audio files matching the video filename. The parameter specifies how external audio files are matched."
|
|
||||||
options = [{ name = "no", help = "Don't automatically load external audio files (default)." },
|
|
||||||
{ name = "exact", help = "Load the media filename with audio file extension." },
|
|
||||||
{ name = "fuzzy", help = "Load all audio files containing media filename." },
|
|
||||||
{ name = "all", help = "Load all audio files in the current and --audio-file-paths directories." }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "sub-auto"
|
|
||||||
default = "exact"
|
|
||||||
filter = "Subtitle"
|
|
||||||
help = "--sub-auto=<no|exact|fuzzy|all>, --no-sub-auto Load additional subtitle files matching the video filename. The parameter specifies how external subtitle files are matched. exact is enabled by default."
|
|
||||||
options = [{ name = "no", help = "Don't automatically load external subtitle files." },
|
|
||||||
{ name = "exact", help = "Load the media filename with subtitle file extension (Default)." },
|
|
||||||
{ name = "fuzzy", help = "Load all subs containing media filename." },
|
|
||||||
{ name = "all", help = "Load all subs in the current and --sub-file-paths directories." }]
|
|
||||||
@@ -44,9 +44,13 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ApplicationIcon>mpv.ico</ApplicationIcon>
|
<ApplicationIcon>mpv.ico</ApplicationIcon>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
@@ -66,6 +70,7 @@
|
|||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</ApplicationDefinition>
|
</ApplicationDefinition>
|
||||||
|
<Compile Include="Controls.cs" />
|
||||||
<Compile Include="DynamicGUI\DynamicGUI.cs" />
|
<Compile Include="DynamicGUI\DynamicGUI.cs" />
|
||||||
<Compile Include="DynamicGUI\OptionSettingControl.xaml.cs">
|
<Compile Include="DynamicGUI\OptionSettingControl.xaml.cs">
|
||||||
<DependentUpon>OptionSettingControl.xaml</DependentUpon>
|
<DependentUpon>OptionSettingControl.xaml</DependentUpon>
|
||||||
@@ -120,6 +125,10 @@
|
|||||||
<Generator>ResXFileCodeGenerator</Generator>
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<None Include="app.manifest" />
|
||||||
|
<None Include="mpvNetConf.toml">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
<None Include="Properties\Settings.settings">
|
<None Include="Properties\Settings.settings">
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
@@ -129,7 +138,7 @@
|
|||||||
<None Include="App.config" />
|
<None Include="App.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="mpvConfEdit.toml">
|
<None Include="mpvConf.toml">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
8
mpvConfEdit/mpvNetConf.toml
Normal file
8
mpvConfEdit/mpvNetConf.toml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[[settings]]
|
||||||
|
name = "dark-mode"
|
||||||
|
default = "system"
|
||||||
|
filter = "mpv.net"
|
||||||
|
help = "Enables a dark theme."
|
||||||
|
options = [{ name = "always" },
|
||||||
|
{ name = "system" , help = "Windows 10+" },
|
||||||
|
{ name = "never" }]
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<Application x:Class="mpvInputEdit.App"
|
<Application x:Class="mpvInputEdit.App"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:local="clr-namespace:mpvInputEdit"
|
xmlns:Controls="clr-namespace:Controls"
|
||||||
StartupUri="MainWindow.xaml">
|
StartupUri="MainWindow.xaml">
|
||||||
<Application.Resources>
|
<Application.Resources>
|
||||||
<Style TargetType="TextBox">
|
<Style TargetType="TextBox">
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
|
<Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
|
||||||
</Trigger>
|
</Trigger>
|
||||||
<Trigger Property="IsFocused" Value="true">
|
<Trigger Property="IsFocused" Value="true">
|
||||||
<Setter Property="BorderBrush" TargetName="border" Value="{x:Static SystemParameters.WindowGlassBrush}"/>
|
<Setter Property="BorderBrush" TargetName="border" Value="{x:Static Controls:Controls.ThemeBrush}"/>
|
||||||
</Trigger>
|
</Trigger>
|
||||||
</ControlTemplate.Triggers>
|
</ControlTemplate.Triggers>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
|
|||||||
18
mpvInputEdit/Controls.cs
Normal file
18
mpvInputEdit/Controls.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace Controls
|
||||||
|
{
|
||||||
|
class Controls
|
||||||
|
{
|
||||||
|
public static Brush ThemeBrush {
|
||||||
|
get {
|
||||||
|
if (Environment.OSVersion.Version.Major < 10)
|
||||||
|
return new SolidColorBrush(Colors.DarkSlateGray);
|
||||||
|
else
|
||||||
|
return SystemParameters.WindowGlassBrush;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -45,7 +45,8 @@ namespace mpvInputEdit
|
|||||||
return item.Input.ToLower().Replace("ctrl+", "").Replace("shift+", "").Replace("alt+", "").Contains(searchText);
|
return item.Input.ToLower().Replace("ctrl+", "").Replace("shift+", "").Replace("alt+", "").Contains(searchText);
|
||||||
else
|
else
|
||||||
return item.Input.ToLower().Contains(searchText);
|
return item.Input.ToLower().Contains(searchText);
|
||||||
} else if (searchText.StartsWith("m ") || searchText.StartsWith("m:"))
|
}
|
||||||
|
else if (searchText.StartsWith("m ") || searchText.StartsWith("m:"))
|
||||||
return item.Menu.ToLower().Contains(searchText.Substring(2).Trim());
|
return item.Menu.ToLower().Contains(searchText.Substring(2).Trim());
|
||||||
else if (searchText.StartsWith("c ") || searchText.StartsWith("c:"))
|
else if (searchText.StartsWith("c ") || searchText.StartsWith("c:"))
|
||||||
return item.Command.ToLower().Contains(searchText.Substring(2).Trim());
|
return item.Command.ToLower().Contains(searchText.Substring(2).Trim());
|
||||||
@@ -86,7 +87,7 @@ namespace mpvInputEdit
|
|||||||
Directory.CreateDirectory(backupDir);
|
Directory.CreateDirectory(backupDir);
|
||||||
|
|
||||||
if (File.Exists(App.InputConfPath))
|
if (File.Exists(App.InputConfPath))
|
||||||
File.Copy(App.InputConfPath, backupDir + "input conf " + DateTime.Now.ToString("yyyy-MM-dd HH-mm") + ".conf");
|
File.Copy(App.InputConfPath, backupDir + "input conf " + DateTime.Now.ToString("yyyy-MM-dd HH-mm") + ".conf", true);
|
||||||
|
|
||||||
string text = "\r\n" + Properties.Settings.Default.input_conf_help + "\r\n\r\n";
|
string text = "\r\n" + Properties.Settings.Default.input_conf_help + "\r\n\r\n";
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using System.Windows;
|
|||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyTitle("mpv(.net) input edit")]
|
[assembly: AssemblyTitle("mpv(.net) input edit")]
|
||||||
[assembly: AssemblyDescription("mpv(.net) key bindings editor")]
|
[assembly: AssemblyDescription("mpv(.net) key and mouse bindings editor")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("mpv(.net) input edit")]
|
[assembly: AssemblyProduct("mpv(.net) input edit")]
|
||||||
@@ -51,5 +51,5 @@ using System.Windows;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0.0")]
|
[assembly: AssemblyVersion("1.3.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0.0")]
|
[assembly: AssemblyFileVersion("1.3.0.0")]
|
||||||
|
|||||||
38
mpvInputEdit/app.manifest
Normal file
38
mpvInputEdit/app.manifest
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<!--
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||||
|
-->
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- Windows 7 -->
|
||||||
|
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
|
||||||
|
|
||||||
|
<!-- Windows 8 -->
|
||||||
|
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
|
||||||
|
|
||||||
|
<!-- Windows 8.1 -->
|
||||||
|
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
|
||||||
|
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
|
||||||
|
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<windowsSettings>
|
||||||
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
|
||||||
|
</windowsSettings>
|
||||||
|
</application>
|
||||||
|
</assembly>
|
||||||
@@ -38,6 +38,9 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ApplicationIcon>mpv.ico</ApplicationIcon>
|
<ApplicationIcon>mpv.ico</ApplicationIcon>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
@@ -60,6 +63,7 @@
|
|||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</ApplicationDefinition>
|
</ApplicationDefinition>
|
||||||
|
<Compile Include="Controls.cs" />
|
||||||
<Compile Include="SearchTextBoxUserControl.xaml.cs">
|
<Compile Include="SearchTextBoxUserControl.xaml.cs">
|
||||||
<DependentUpon>SearchTextBoxUserControl.xaml</DependentUpon>
|
<DependentUpon>SearchTextBoxUserControl.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -106,6 +110,7 @@
|
|||||||
<Generator>ResXFileCodeGenerator</Generator>
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<None Include="app.manifest" />
|
||||||
<None Include="Properties\Settings.settings">
|
<None Include="Properties\Settings.settings">
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
|
|||||||
Reference in New Issue
Block a user