removal of TaskDialog usage...
This commit is contained in:
@@ -5,15 +5,20 @@
|
|||||||
- There is an issue with the `window-scale` mpv property, it does not
|
- There is an issue with the `window-scale` mpv property, it does not
|
||||||
work correctly in mpv either, so I've removed support for it and
|
work correctly in mpv either, so I've removed support for it and
|
||||||
added my own implementation `script-message mpv.net window-scale`.
|
added my own implementation `script-message mpv.net window-scale`.
|
||||||
- The previous Beta replaced the CS-Script library with my own
|
- The CS-Script library was replaced with my own C# scripting implementation.
|
||||||
C# scripting implementation.
|
|
||||||
- If a player window border is near to a screen border and the window size
|
- If a player window border is near to a screen border and the window size
|
||||||
changes, the player windows sticks to that near screen border location.
|
changes, the player windows sticks to that near screen border location.
|
||||||
Furthermore the `remember-position` option remembers a near screen border
|
Furthermore the `remember-position` option remembers a near screen border
|
||||||
position instead of remembering the window center position.
|
position instead of remembering the window center position.
|
||||||
- High DPI multi monitor fix.
|
- High DPI multi monitor fix.
|
||||||
- `start-size` option has new options, see in config editor and manual.
|
- `start-size` option has new options, see config editor and manual.
|
||||||
- Improved `cycle-audio` OSD info.
|
- Improved `script-message mpv.net cycle-audio` OSD info.
|
||||||
|
- The logic for finding the config directory has changed, see manual.
|
||||||
|
- The native TaskDialog/MessageBox was replaced with the themed VB.NET
|
||||||
|
implementation of StaxRip.
|
||||||
|
- The dotnet script and extension host was redesigned, existing scripts
|
||||||
|
and extensions must be fixed. All example scripts were updated and
|
||||||
|
a new script delete-current-file.cs was added.
|
||||||
|
|
||||||
|
|
||||||
5.4.8.8 Beta (2021-05-09)
|
5.4.8.8 Beta (2021-05-09)
|
||||||
|
|||||||
@@ -108,21 +108,28 @@ Or use the [support thread](https://forum.videohelp.com/threads/392514-mpv-net-a
|
|||||||
Settings
|
Settings
|
||||||
--------
|
--------
|
||||||
|
|
||||||
When mpv.net finds no config folder on startup it will ask for a location.
|
mpv.net searches the config folder at:
|
||||||
|
|
||||||
If a folder named portable_config next to the mpvnet.exe exists,
|
1. startup\portable_config
|
||||||
all config will be loaded from this folder only.
|
2. %APPDATA%\mpv.net
|
||||||
|
|
||||||
```Text
|
In order to use a custom directory create following file:
|
||||||
<startup>\portable_config\
|
|
||||||
```
|
startup\settings-directory.txt
|
||||||
|
|
||||||
|
Put your custom directory in that file.
|
||||||
|
|
||||||
|
The custom directory path can be relative to the startup directory path.
|
||||||
|
|
||||||
|
This custom directory is only used if the portable_config and %APPDATA% directory does not exist.
|
||||||
|
|
||||||
mpv specific settings are stored in the file mpv.conf, if no mpv.conf file exists
|
mpv specific settings are stored in the file mpv.conf, if no mpv.conf file exists
|
||||||
mpv.net generates it with the following defaults:
|
mpv.net generates it with the following defaults:
|
||||||
|
|
||||||
[mpv.conf defaults](../../../tree/master/src/Resources/mpv.conf.txt)
|
[mpv.conf defaults](../../../tree/master/src/Resources/mpv.conf.txt)
|
||||||
|
|
||||||
mpv.net specific settings are stored in the file mpvnet.conf.
|
mpv.net specific settings are stored in the file mpvnet.conf,
|
||||||
|
these options are documented [here](#mpvnet-specific-options).
|
||||||
|
|
||||||
|
|
||||||
Input and context menu
|
Input and context menu
|
||||||
|
|||||||
@@ -18,16 +18,19 @@ using System.ComponentModel.Composition;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
using Microsoft.VisualBasic.FileIO;
|
using Microsoft.VisualBasic.FileIO;
|
||||||
|
|
||||||
using mpvnet;
|
using mpvnet;
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
|
|
||||||
namespace RatingExtension // the assembly name must end with 'Extension'
|
namespace RatingExtension // the assembly name must end with 'Extension'!
|
||||||
{
|
{
|
||||||
[Export(typeof(IExtension))]
|
[Export(typeof(IExtension))]
|
||||||
public class RatingExtension : IExtension
|
public class RatingExtension : IExtension
|
||||||
{
|
{
|
||||||
|
//Script script = new Script();
|
||||||
|
|
||||||
// dictionory to store the filename and the rating
|
// dictionory to store the filename and the rating
|
||||||
Dictionary<string, int> Dic = new Dictionary<string, int>();
|
Dictionary<string, int> Dic = new Dictionary<string, int>();
|
||||||
|
|
||||||
@@ -36,8 +39,8 @@ namespace RatingExtension // the assembly name must end with 'Extension'
|
|||||||
|
|
||||||
public RatingExtension() // plugin initialization
|
public RatingExtension() // plugin initialization
|
||||||
{
|
{
|
||||||
core.ClientMessage += ClientMessage; //handles keys defined in input.conf
|
Core.ClientMessage += ClientMessage; //handles keys defined in input.conf
|
||||||
core.Shutdown += Shutdown; // handles MPV_EVENT_SHUTDOWN
|
Core.Shutdown += Shutdown; // handles MPV_EVENT_SHUTDOWN
|
||||||
}
|
}
|
||||||
|
|
||||||
// handles MPV_EVENT_SHUTDOWN
|
// handles MPV_EVENT_SHUTDOWN
|
||||||
@@ -48,7 +51,7 @@ namespace RatingExtension // the assembly name must end with 'Extension'
|
|||||||
string filepath = i.Key;
|
string filepath = i.Key;
|
||||||
int rating = i.Value;
|
int rating = i.Value;
|
||||||
|
|
||||||
if (String.IsNullOrEmpty(filepath) || !File.Exists(filepath))
|
if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
string basename = Path.GetFileNameWithoutExtension(filepath);
|
string basename = Path.GetFileNameWithoutExtension(filepath);
|
||||||
@@ -77,7 +80,7 @@ namespace RatingExtension // the assembly name must end with 'Extension'
|
|||||||
|
|
||||||
if (int.TryParse(args[1], out int rating))
|
if (int.TryParse(args[1], out int rating))
|
||||||
{
|
{
|
||||||
string path = core.get_property_string("path");
|
string path = Core.get_property_string("path");
|
||||||
|
|
||||||
if (!File.Exists(path))
|
if (!File.Exists(path))
|
||||||
return;
|
return;
|
||||||
@@ -87,7 +90,7 @@ namespace RatingExtension // the assembly name must end with 'Extension'
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Dic[path] = rating;
|
Dic[path] = rating;
|
||||||
core.commandv("show-text", $"Rating: {rating}");
|
Core.commandv("show-text", $"Rating: {rating}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (args[1] == "about")
|
else if (args[1] == "about")
|
||||||
@@ -99,26 +102,26 @@ namespace RatingExtension // the assembly name must end with 'Extension'
|
|||||||
{
|
{
|
||||||
if (rating == 0)
|
if (rating == 0)
|
||||||
{
|
{
|
||||||
FileToDelete = core.get_property_string("path");
|
FileToDelete = Core.get_property_string("path");
|
||||||
DeleteTime = DateTime.Now;
|
DeleteTime = DateTime.Now;
|
||||||
core.commandv("show-text", "Press 1 to delete file", "5000");
|
Core.commandv("show-text", "Press 1 to delete file", "5000");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TimeSpan ts = DateTime.Now - DeleteTime;
|
TimeSpan ts = DateTime.Now - DeleteTime;
|
||||||
string path = core.get_property_string("path");
|
string path = Core.get_property_string("path");
|
||||||
|
|
||||||
if (FileToDelete == path && ts.TotalSeconds < 5 && File.Exists(FileToDelete))
|
if (FileToDelete == path && ts.TotalSeconds < 5 && File.Exists(FileToDelete))
|
||||||
{
|
{
|
||||||
core.command("playlist-remove current");
|
Core.command("playlist-remove current");
|
||||||
int pos = core.get_property_int("playlist-pos");
|
int pos = Core.get_property_int("playlist-pos");
|
||||||
|
|
||||||
if (pos == -1)
|
if (pos == -1)
|
||||||
{
|
{
|
||||||
int count = core.get_property_int("playlist-count");
|
int count = Core.get_property_int("playlist-count");
|
||||||
|
|
||||||
if (count > 0)
|
if (count > 0)
|
||||||
core.set_property_int("playlist-pos", count - 1);
|
Core.set_property_int("playlist-pos", count - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.Sleep(2000);
|
Thread.Sleep(2000);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<OutputPath>C:\Users\frank\OneDrive\Settings\mpv.net\extensions\RatingExtension\</OutputPath>
|
<OutputPath>bin\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
|
||||||
<OutputPath>C:\Users\frank\OneDrive\Settings\mpv.net\extensions\RatingExtension\</OutputPath>
|
<OutputPath>bin\</OutputPath>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.ComponentModel.Composition" />
|
<Reference Include="System.ComponentModel.Composition" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
@@ -49,6 +50,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="RatingExtension.cs" />
|
<Compile Include="RatingExtension.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="ScriptDevelopment.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\mpv.net.csproj">
|
<ProjectReference Include="..\..\mpv.net.csproj">
|
||||||
|
|||||||
42
src/Extensions/RatingExtension/ScriptDevelopment.cs
Normal file
42
src/Extensions/RatingExtension/ScriptDevelopment.cs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
//// This script adds dynamic menu items for profile switching.
|
||||||
|
|
||||||
|
//// In input.conf add a menu item called 'Profiles'
|
||||||
|
|
||||||
|
//using mpvnet;
|
||||||
|
//using System.ComponentModel;
|
||||||
|
//using System.Linq;
|
||||||
|
|
||||||
|
//class Script
|
||||||
|
//{
|
||||||
|
// MainForm MainForm;
|
||||||
|
// CorePlayer Core;
|
||||||
|
|
||||||
|
// public Script()
|
||||||
|
// {
|
||||||
|
// Core = Global.Core;
|
||||||
|
// MainForm = MainForm.Instance;
|
||||||
|
// MainForm.ContextMenu.Opening += ContextMenu_Opening;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void ContextMenu_Opening(object sender, CancelEventArgs e)
|
||||||
|
// {
|
||||||
|
// MenuItem menuItem = MainForm.FindMenuItem("My Menu");
|
||||||
|
|
||||||
|
// if (menuItem == null)
|
||||||
|
// {
|
||||||
|
// Terminal.WriteError("Profiles menu item not found.", "switch-profile-context-menu.cs");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// menuItem.DropDownItems.Clear();
|
||||||
|
// var editionTracks = Core.MediaTracks.Where(track => track.Type == "e");
|
||||||
|
|
||||||
|
// foreach (int i in new[] {1, 2, 3})
|
||||||
|
// {
|
||||||
|
// MenuItem mi = new MenuItem(i.ToString());
|
||||||
|
// mi.Action = () => { Core.commandv("show-text", i.ToString()); };
|
||||||
|
// menuItem.DropDownItems.Add(mi);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
@@ -6,15 +6,13 @@ using System.IO;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
using static TaskDialog.Msg;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
public static class App
|
public static class App
|
||||||
{
|
{
|
||||||
public static string RegPath { get; } = @"HKCU\Software\" + Application.ProductName;
|
public static string ConfPath { get => Core.ConfigFolder + "mpvnet.conf"; }
|
||||||
public static string ConfPath { get => core.ConfigFolder + "mpvnet.conf"; }
|
|
||||||
public static string ProcessInstance { get; set; } = "single";
|
public static string ProcessInstance { get; set; } = "single";
|
||||||
public static string DarkMode { get; set; } = "always";
|
public static string DarkMode { get; set; } = "always";
|
||||||
public static string DarkTheme { get; set; } = "dark";
|
public static string DarkTheme { get; set; } = "dark";
|
||||||
@@ -43,8 +41,8 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
string dummy = core.ConfigFolder;
|
string dummy = Core.ConfigFolder;
|
||||||
var dummy2 = core.Conf;
|
var dummy2 = Core.Conf;
|
||||||
|
|
||||||
foreach (var i in Conf)
|
foreach (var i in Conf)
|
||||||
ProcessProperty(i.Key, i.Value, true);
|
ProcessProperty(i.Key, i.Value, true);
|
||||||
@@ -53,7 +51,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string filePath = core.ConfigFolder + "mpvnet-debug.log";
|
string filePath = Core.ConfigFolder + "mpvnet-debug.log";
|
||||||
|
|
||||||
if (File.Exists(filePath))
|
if (File.Exists(filePath))
|
||||||
File.Delete(filePath);
|
File.Delete(filePath);
|
||||||
@@ -72,16 +70,16 @@ namespace mpvnet
|
|||||||
|
|
||||||
string themeContent = null;
|
string themeContent = null;
|
||||||
|
|
||||||
if (File.Exists(core.ConfigFolder + "theme.conf"))
|
if (File.Exists(Core.ConfigFolder + "theme.conf"))
|
||||||
themeContent = File.ReadAllText(core.ConfigFolder + "theme.conf");
|
themeContent = File.ReadAllText(Core.ConfigFolder + "theme.conf");
|
||||||
|
|
||||||
Theme.Init(
|
Theme.Init(
|
||||||
themeContent,
|
themeContent,
|
||||||
Properties.Resources.theme,
|
Properties.Resources.theme,
|
||||||
IsDarkMode ? DarkTheme : LightTheme);
|
IsDarkMode ? DarkTheme : LightTheme);
|
||||||
|
|
||||||
core.Shutdown += Shutdown;
|
Core.Shutdown += Shutdown;
|
||||||
core.Initialized += Initialized;
|
Core.Initialized += Initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RunTask(Action action)
|
public static void RunTask(Action action)
|
||||||
@@ -99,34 +97,32 @@ namespace mpvnet
|
|||||||
get {
|
get {
|
||||||
return "Copyright (C) 2000-2021 mpv.net/mpv/mplayer\n" +
|
return "Copyright (C) 2000-2021 mpv.net/mpv/mplayer\n" +
|
||||||
$"mpv.net {Application.ProductVersion} ({File.GetLastWriteTime(Application.ExecutablePath).ToShortDateString()})\n" +
|
$"mpv.net {Application.ProductVersion} ({File.GetLastWriteTime(Application.ExecutablePath).ToShortDateString()})\n" +
|
||||||
$"{core.get_property_string("mpv-version")} ({File.GetLastWriteTime(Folder.Startup + "mpv-1.dll").ToShortDateString()})\nffmpeg {core.get_property_string("ffmpeg-version")}\nMIT License";
|
$"{Core.get_property_string("mpv-version")} ({File.GetLastWriteTime(Folder.Startup + "mpv-1.dll").ToShortDateString()})\nffmpeg {Core.get_property_string("ffmpeg-version")}\nMIT License";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ShowException(object obj)
|
public static void ShowException(object obj)
|
||||||
|
{
|
||||||
|
if (IsStartedFromTerminal)
|
||||||
|
Terminal.WriteError(obj.ToString());
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (obj is Exception e)
|
if (obj is Exception e)
|
||||||
{
|
|
||||||
if (IsStartedFromTerminal)
|
|
||||||
ConsoleHelp.WriteError(e.ToString());
|
|
||||||
else
|
|
||||||
Msg.ShowException(e);
|
Msg.ShowException(e);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
Msg.ShowError(obj.ToString());
|
||||||
if (IsStartedFromTerminal)
|
|
||||||
ConsoleHelp.WriteError(obj.ToString());
|
|
||||||
else
|
|
||||||
MsgError(obj.ToString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ShowError(string title, string msg)
|
public static void ShowError(string title, string msg = null)
|
||||||
{
|
{
|
||||||
if (IsStartedFromTerminal)
|
if (IsStartedFromTerminal)
|
||||||
{
|
{
|
||||||
ConsoleHelp.WriteError(title);
|
if (title != null)
|
||||||
ConsoleHelp.WriteError(msg);
|
Terminal.WriteError(title);
|
||||||
|
|
||||||
|
if (msg != null)
|
||||||
|
Terminal.WriteError(msg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Msg.ShowError(title, msg);
|
Msg.ShowError(title, msg);
|
||||||
@@ -136,8 +132,8 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (RememberVolume)
|
if (RememberVolume)
|
||||||
{
|
{
|
||||||
core.set_property_int("volume", RegistryHelp.GetInt("Volume", 70));
|
Core.set_property_int("volume", RegistryHelp.GetInt("volume", 70));
|
||||||
core.set_property_string("mute", RegistryHelp.GetString("Mute", "no"));
|
Core.set_property_string("mute", RegistryHelp.GetString("mute", "no"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,8 +141,8 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (RememberVolume)
|
if (RememberVolume)
|
||||||
{
|
{
|
||||||
RegistryHelp.SetValue(RegPath, "Volume", core.get_property_int("volume"));
|
RegistryHelp.SetInt("volume", Core.get_property_int("volume"));
|
||||||
RegistryHelp.SetValue(RegPath, "Mute", core.get_property_string("mute"));
|
RegistryHelp.SetString("mute", Core.get_property_string("mute"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,31 +181,31 @@ namespace mpvnet
|
|||||||
case "minimum-aspect-ratio": MinimumAspectRatio = value.ToFloat(); return true;
|
case "minimum-aspect-ratio": MinimumAspectRatio = value.ToFloat(); return true;
|
||||||
case "dark-theme": DarkTheme = value.Trim('\'', '"'); return true;
|
case "dark-theme": DarkTheme = value.Trim('\'', '"'); return true;
|
||||||
case "light-theme": LightTheme = value.Trim('\'', '"'); return true;
|
case "light-theme": LightTheme = value.Trim('\'', '"'); return true;
|
||||||
case "video-file-extensions": VideoTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
case "video-file-extensions": CorePlayer.VideoTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
||||||
case "audio-file-extensions": AudioTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
case "audio-file-extensions": CorePlayer.AudioTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
||||||
case "image-file-extensions": ImageTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
case "image-file-extensions": CorePlayer.ImageTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
||||||
default:
|
default:
|
||||||
if (writeError)
|
if (writeError)
|
||||||
ConsoleHelp.WriteError($"unknown mpvnet.conf property: {name}");
|
Terminal.WriteError($"unknown mpvnet.conf property: {name}");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ShowSetup()
|
public static void ShowSetup()
|
||||||
{
|
{
|
||||||
int value = RegistryHelp.GetInt(Folder.Startup);
|
int value = RegistryHelp.GetInt("location: " + Folder.Startup);
|
||||||
|
|
||||||
if (value != 1)
|
if (value != 1)
|
||||||
{
|
{
|
||||||
if (Msg.ShowQuestion("Would you like to setup mpv.net?",
|
if (Msg.ShowQuestion("Would you like to setup mpv.net?",
|
||||||
"The setup allows to create a start menu shortcut, file associations and " +
|
"The setup allows to create a start menu shortcut, file associations and " +
|
||||||
"adding mpv.net to the Path environment variable.") == MsgResult.OK)
|
"adding mpv.net to the Path environment variable.") == DialogResult.OK)
|
||||||
|
|
||||||
Commands.Execute("show-setup-dialog");
|
Commands.Execute("show-setup-dialog");
|
||||||
else
|
else
|
||||||
MsgInfo("The setup dialog can be found in the context menu at:\n\nTools > Setup");
|
Msg.ShowInfo("The setup dialog can be found at:\n\nContext Menu > Tools > Setup");
|
||||||
|
|
||||||
RegistryHelp.SetValue(RegistryHelp.ApplicationKey, Folder.Startup, 1);
|
RegistryHelp.SetInt("location: " + Folder.Startup, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,14 @@ namespace mpvnet
|
|||||||
Compile(outputFile, file);
|
Compile(outputFile, file);
|
||||||
|
|
||||||
if (File.Exists(outputFile))
|
if (File.Exists(outputFile))
|
||||||
References.Add(Assembly.LoadFile(outputFile).CreateInstance("Script"));
|
{
|
||||||
|
object instance = Assembly.LoadFile(outputFile).CreateInstance("Script");
|
||||||
|
|
||||||
|
if (instance != null)
|
||||||
|
References.Add(instance);
|
||||||
|
else
|
||||||
|
Terminal.WriteError("Failed to initialize script.", outputFile.FileName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Compile(string outputFile, string file)
|
public static void Compile(string outputFile, string file)
|
||||||
@@ -42,6 +49,7 @@ namespace mpvnet
|
|||||||
CompilerParameters parameters = new CompilerParameters();
|
CompilerParameters parameters = new CompilerParameters();
|
||||||
|
|
||||||
string[] dependencies = {
|
string[] dependencies = {
|
||||||
|
Folder.Startup + "mpvnet.exe",
|
||||||
"Microsoft.VisualBasic.dll",
|
"Microsoft.VisualBasic.dll",
|
||||||
"System.Core.dll", "System.Data.dll", "System.dll", "System.Drawing.dll", "System.Web.dll",
|
"System.Core.dll", "System.Data.dll", "System.dll", "System.Drawing.dll", "System.Web.dll",
|
||||||
"System.Windows.Forms.dll", "System.Xaml.dll", "System.Xml.dll", "System.Xml.Linq.dll",
|
"System.Windows.Forms.dll", "System.Xaml.dll", "System.Xml.dll", "System.Xml.Linq.dll",
|
||||||
@@ -55,10 +63,10 @@ namespace mpvnet
|
|||||||
CompilerResults results = provider.CompileAssemblyFromFile(parameters, file);
|
CompilerResults results = provider.CompileAssemblyFromFile(parameters, file);
|
||||||
|
|
||||||
var errors = results.Errors.Cast<CompilerError>().Select(i => "Line Number " +
|
var errors = results.Errors.Cast<CompilerError>().Select(i => "Line Number " +
|
||||||
i.Line + "\r\n" + "Error Number: " + i.ErrorNumber + "\r\n" + i.ErrorText);
|
i.Line + "\n" + "Error Number: " + i.ErrorNumber + "\n" + i.ErrorText);
|
||||||
|
|
||||||
if (errors.Count() > 0)
|
if (errors.Count() > 0)
|
||||||
ConsoleHelp.WriteError(string.Join("\r\n\r\n", errors), Path.GetFileName(file));
|
Terminal.WriteError(string.Join("\n\n", errors), Path.GetFileName(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
static string GetMD5(string code)
|
static string GetMD5(string code)
|
||||||
|
|||||||
@@ -10,8 +10,7 @@ using System.Windows;
|
|||||||
|
|
||||||
using VB = Microsoft.VisualBasic;
|
using VB = Microsoft.VisualBasic;
|
||||||
|
|
||||||
using static mpvnet.NewLine;
|
using static mpvnet.Global;
|
||||||
using static mpvnet.Core;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -23,21 +22,19 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
case "add-files-to-playlist": OpenFiles("append"); break; // deprecated 2019
|
case "add-files-to-playlist": OpenFiles("append"); break; // deprecated 2019
|
||||||
case "cycle-audio": CycleAudio(); break;
|
case "cycle-audio": CycleAudio(); break;
|
||||||
case "execute-mpv-command": ExecuteMpvCommand(); break;
|
case "execute-mpv-command": Msg.ShowError("Command was removed, reset input.conf."); break;
|
||||||
case "load-audio": LoadAudio(); break;
|
case "load-audio": LoadAudio(); break;
|
||||||
case "load-sub": LoadSubtitle(); break;
|
case "load-sub": LoadSubtitle(); break;
|
||||||
case "manage-file-associations": // deprecated 2019
|
case "open-conf-folder": ProcessHelp.ShellExecute(Core.ConfigFolder); break;
|
||||||
case "open-conf-folder": ProcessHelp.ShellExecute(core.ConfigFolder); break;
|
|
||||||
case "open-files": OpenFiles(args); break;
|
case "open-files": OpenFiles(args); break;
|
||||||
case "open-optical-media": Open_DVD_Or_BD_Folder(); break;
|
case "open-optical-media": Open_DVD_Or_BD_Folder(); break;
|
||||||
case "open-url": OpenURL(); break;
|
case "open-url": OpenURL(); break;
|
||||||
case "playlist-first": PlaylistFirst(); break;
|
case "playlist-first": PlaylistFirst(); break;
|
||||||
case "playlist-last": PlaylistLast(); break;
|
case "playlist-last": PlaylistLast(); break;
|
||||||
case "scale-window": ScaleWindow(float.Parse(args[0], CultureInfo.InvariantCulture)); break;
|
case "scale-window": ScaleWindow(float.Parse(args[0], CultureInfo.InvariantCulture)); break;
|
||||||
case "window-scale": WindowScale(float.Parse(args[0], CultureInfo.InvariantCulture)); break;
|
|
||||||
case "shell-execute": ProcessHelp.ShellExecute(args[0]); break;
|
case "shell-execute": ProcessHelp.ShellExecute(args[0]); break;
|
||||||
case "show-about": ShowDialog(typeof(AboutWindow)); break;
|
case "show-about": ShowDialog(typeof(AboutWindow)); break;
|
||||||
case "show-audio-devices": ShowTextWithEditor("audio-device-list", core.get_property_osd_string("audio-device-list")); break;
|
case "show-audio-devices": ShowTextWithEditor("audio-device-list", Core.get_property_osd_string("audio-device-list")); break;
|
||||||
case "show-command-palette": ShowDialog(typeof(CommandPaletteWindow)); break;
|
case "show-command-palette": ShowDialog(typeof(CommandPaletteWindow)); break;
|
||||||
case "show-commands": ShowCommands(); break;
|
case "show-commands": ShowCommands(); break;
|
||||||
case "show-conf-editor": ShowDialog(typeof(ConfWindow)); break;
|
case "show-conf-editor": ShowDialog(typeof(ConfWindow)); break;
|
||||||
@@ -46,15 +43,16 @@ namespace mpvnet
|
|||||||
case "show-history": ShowHistory(); break;
|
case "show-history": ShowHistory(); break;
|
||||||
case "show-info": ShowInfo(); break;
|
case "show-info": ShowInfo(); break;
|
||||||
case "show-input-editor": ShowDialog(typeof(InputWindow)); break;
|
case "show-input-editor": ShowDialog(typeof(InputWindow)); break;
|
||||||
case "show-keys": ShowTextWithEditor("input-key-list", core.get_property_string("input-key-list").Replace(",", BR)); break;
|
case "show-keys": ShowTextWithEditor("input-key-list", Core.get_property_string("input-key-list").Replace(",", BR)); break;
|
||||||
case "show-media-search": ShowDialog(typeof(EverythingWindow)); break;
|
case "show-media-search": ShowDialog(typeof(EverythingWindow)); break;
|
||||||
case "show-profiles": ShowTextWithEditor("profile-list", mpvHelp.GetProfiles()); break;
|
|
||||||
case "show-playlist": ShowPlaylist(); break;
|
case "show-playlist": ShowPlaylist(); break;
|
||||||
|
case "show-profiles": ShowTextWithEditor("profile-list", mpvHelp.GetProfiles()); break;
|
||||||
case "show-properties": ShowProperties(); break;
|
case "show-properties": ShowProperties(); break;
|
||||||
case "show-protocols": ShowTextWithEditor("protocol-list", mpvHelp.GetProtocols()); break;
|
case "show-protocols": ShowTextWithEditor("protocol-list", mpvHelp.GetProtocols()); break;
|
||||||
case "show-setup-dialog": ShowDialog(typeof(SetupWindow)); break;
|
case "show-setup-dialog": ShowDialog(typeof(SetupWindow)); break;
|
||||||
case "show-text": ShowText(args[0], Convert.ToInt32(args[1]), Convert.ToInt32(args[2])); break;
|
case "show-text": ShowText(args[0], Convert.ToInt32(args[1]), Convert.ToInt32(args[2])); break;
|
||||||
case "update-check": UpdateCheck.CheckOnline(true); break;
|
case "update-check": UpdateCheck.CheckOnline(true); break;
|
||||||
|
case "window-scale": WindowScale(float.Parse(args[0], CultureInfo.InvariantCulture)); break;
|
||||||
|
|
||||||
default: Msg.ShowError($"No command '{id}' found."); break;
|
default: Msg.ShowError($"No command '{id}' found."); break;
|
||||||
}
|
}
|
||||||
@@ -85,7 +83,7 @@ namespace mpvnet
|
|||||||
InvokeOnMainThread(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
using (var d = new OpenFileDialog() { Multiselect = true })
|
using (var d = new OpenFileDialog() { Multiselect = true })
|
||||||
if (d.ShowDialog() == DialogResult.OK)
|
if (d.ShowDialog() == DialogResult.OK)
|
||||||
core.LoadFiles(d.FileNames, loadFolder, append);
|
Core.LoadFiles(d.FileNames, loadFolder, append);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,18 +97,18 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (dialog.ShowDialog() == DialogResult.OK)
|
if (dialog.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
core.command("stop");
|
Core.command("stop");
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
|
|
||||||
if (Directory.Exists(dialog.SelectedPath + "\\BDMV"))
|
if (Directory.Exists(dialog.SelectedPath + "\\BDMV"))
|
||||||
{
|
{
|
||||||
core.set_property_string("bluray-device", dialog.SelectedPath);
|
Core.set_property_string("bluray-device", dialog.SelectedPath);
|
||||||
core.LoadFiles(new[] { @"bd://" }, false, false);
|
Core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
core.set_property_string("dvd-device", dialog.SelectedPath);
|
Core.set_property_string("dvd-device", dialog.SelectedPath);
|
||||||
core.LoadFiles(new[] { @"dvd://" }, false, false);
|
Core.LoadFiles(new[] { @"dvd://" }, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,31 +117,31 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void PlaylistFirst()
|
public static void PlaylistFirst()
|
||||||
{
|
{
|
||||||
int pos = core.get_property_int("playlist-pos");
|
int pos = Core.get_property_int("playlist-pos");
|
||||||
|
|
||||||
if (pos != 0)
|
if (pos != 0)
|
||||||
core.set_property_int("playlist-pos", 0);
|
Core.set_property_int("playlist-pos", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void PlaylistLast()
|
public static void PlaylistLast()
|
||||||
{
|
{
|
||||||
int pos = core.get_property_int("playlist-pos");
|
int pos = Core.get_property_int("playlist-pos");
|
||||||
int count = core.get_property_int("playlist-count");
|
int count = Core.get_property_int("playlist-count");
|
||||||
|
|
||||||
if (pos < count - 1)
|
if (pos < count - 1)
|
||||||
core.set_property_int("playlist-pos", count - 1);
|
Core.set_property_int("playlist-pos", count - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ShowHistory()
|
public static void ShowHistory()
|
||||||
{
|
{
|
||||||
if (File.Exists(core.ConfigFolder + "history.txt"))
|
if (File.Exists(Core.ConfigFolder + "history.txt"))
|
||||||
ProcessHelp.ShellExecute(core.ConfigFolder + "history.txt");
|
ProcessHelp.ShellExecute(Core.ConfigFolder + "history.txt");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Msg.ShowQuestion("Create history.txt file in config folder?",
|
if (Msg.ShowQuestion("Create history.txt file in config folder?",
|
||||||
"mpv.net will write the date, time and filename of opened files to it.") == MsgResult.OK)
|
"mpv.net will write the date, time and filename of opened files to it.") == DialogResult.OK)
|
||||||
|
|
||||||
File.WriteAllText(core.ConfigFolder + "history.txt", "");
|
File.WriteAllText(Core.ConfigFolder + "history.txt", "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,19 +151,19 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
string performer, title, album, genre, date, duration, text = "";
|
string performer, title, album, genre, date, duration, text = "";
|
||||||
long fileSize = 0;
|
long fileSize = 0;
|
||||||
string path = core.get_property_string("path");
|
string path = Core.get_property_string("path");
|
||||||
|
|
||||||
if (path.Contains("://"))
|
if (path.Contains("://"))
|
||||||
path = core.get_property_string("media-title");
|
path = Core.get_property_string("media-title");
|
||||||
|
|
||||||
int width = core.get_property_int("video-params/w");
|
int width = Core.get_property_int("video-params/w");
|
||||||
int height = core.get_property_int("video-params/h");
|
int height = Core.get_property_int("video-params/h");
|
||||||
|
|
||||||
if (File.Exists(path))
|
if (File.Exists(path))
|
||||||
{
|
{
|
||||||
fileSize = new FileInfo(path).Length;
|
fileSize = new FileInfo(path).Length;
|
||||||
|
|
||||||
if (AudioTypes.Contains(path.Ext()))
|
if (CorePlayer.AudioTypes.Contains(path.Ext()))
|
||||||
{
|
{
|
||||||
using (MediaInfo mediaInfo = new MediaInfo(path))
|
using (MediaInfo mediaInfo = new MediaInfo(path))
|
||||||
{
|
{
|
||||||
@@ -185,11 +183,11 @@ namespace mpvnet
|
|||||||
text += "Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n";
|
text += "Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n";
|
||||||
text += "Type: " + path.Ext().ToUpper();
|
text += "Type: " + path.Ext().ToUpper();
|
||||||
|
|
||||||
core.commandv("show-text", text, "5000");
|
Core.commandv("show-text", text, "5000");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ImageTypes.Contains(path.Ext()))
|
else if (CorePlayer.ImageTypes.Contains(path.Ext()))
|
||||||
{
|
{
|
||||||
using (MediaInfo mediaInfo = new MediaInfo(path))
|
using (MediaInfo mediaInfo = new MediaInfo(path))
|
||||||
{
|
{
|
||||||
@@ -199,16 +197,16 @@ namespace mpvnet
|
|||||||
"Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n" +
|
"Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n" +
|
||||||
"Type: " + path.Ext().ToUpper();
|
"Type: " + path.Ext().ToUpper();
|
||||||
|
|
||||||
core.commandv("show-text", text, "5000");
|
Core.commandv("show-text", text, "5000");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeSpan position = TimeSpan.FromSeconds(core.get_property_number("time-pos"));
|
TimeSpan position = TimeSpan.FromSeconds(Core.get_property_number("time-pos"));
|
||||||
TimeSpan duration2 = TimeSpan.FromSeconds(core.get_property_number("duration"));
|
TimeSpan duration2 = TimeSpan.FromSeconds(Core.get_property_number("duration"));
|
||||||
string videoFormat = core.get_property_string("video-format").ToUpper();
|
string videoFormat = Core.get_property_string("video-format").ToUpper();
|
||||||
string audioCodec = core.get_property_string("audio-codec-name").ToUpper();
|
string audioCodec = Core.get_property_string("audio-codec-name").ToUpper();
|
||||||
|
|
||||||
text = path.FileName() + "\n" +
|
text = path.FileName() + "\n" +
|
||||||
FormatTime(position.TotalMinutes) + ":" +
|
FormatTime(position.TotalMinutes) + ":" +
|
||||||
@@ -222,7 +220,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
text += $"{videoFormat}\n{audioCodec}";
|
text += $"{videoFormat}\n{audioCodec}";
|
||||||
|
|
||||||
core.commandv("show-text", text, "5000");
|
Core.commandv("show-text", text, "5000");
|
||||||
string FormatTime(double value) => ((int)value).ToString("00");
|
string FormatTime(double value) => ((int)value).ToString("00");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@@ -231,19 +229,6 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ExecuteMpvCommand() // deprecated 2019
|
|
||||||
{
|
|
||||||
InvokeOnMainThread(new Action(() => {
|
|
||||||
string command = VB.Interaction.InputBox("Enter a mpv command to be executed.", "Execute Command", RegistryHelp.GetString("RecentExecutedCommand"));
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(command))
|
|
||||||
return;
|
|
||||||
|
|
||||||
RegistryHelp.SetValue(App.RegPath, "RecentExecutedCommand", command);
|
|
||||||
core.command(command, false);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void OpenURL()
|
public static void OpenURL()
|
||||||
{
|
{
|
||||||
InvokeOnMainThread(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
@@ -256,7 +241,7 @@ namespace mpvnet
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
core.LoadFiles(new [] { clipboard }, false, Control.ModifierKeys.HasFlag(Keys.Control));
|
Core.LoadFiles(new [] { clipboard }, false, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,7 +250,7 @@ namespace mpvnet
|
|||||||
InvokeOnMainThread(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
using (var d = new OpenFileDialog())
|
using (var d = new OpenFileDialog())
|
||||||
{
|
{
|
||||||
string path = core.get_property_string("path");
|
string path = Core.get_property_string("path");
|
||||||
|
|
||||||
if (File.Exists(path))
|
if (File.Exists(path))
|
||||||
d.InitialDirectory = Path.GetDirectoryName(path);
|
d.InitialDirectory = Path.GetDirectoryName(path);
|
||||||
@@ -274,7 +259,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (d.ShowDialog() == DialogResult.OK)
|
if (d.ShowDialog() == DialogResult.OK)
|
||||||
foreach (string filename in d.FileNames)
|
foreach (string filename in d.FileNames)
|
||||||
core.commandv("sub-add", filename);
|
Core.commandv("sub-add", filename);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -284,40 +269,40 @@ namespace mpvnet
|
|||||||
InvokeOnMainThread(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
using (var d = new OpenFileDialog())
|
using (var d = new OpenFileDialog())
|
||||||
{
|
{
|
||||||
string path = core.get_property_string("path");
|
string path = Core.get_property_string("path");
|
||||||
if (File.Exists(path))
|
if (File.Exists(path))
|
||||||
d.InitialDirectory = Path.GetDirectoryName(path);
|
d.InitialDirectory = Path.GetDirectoryName(path);
|
||||||
d.Multiselect = true;
|
d.Multiselect = true;
|
||||||
|
|
||||||
if (d.ShowDialog() == DialogResult.OK)
|
if (d.ShowDialog() == DialogResult.OK)
|
||||||
foreach (string i in d.FileNames)
|
foreach (string i in d.FileNames)
|
||||||
core.commandv("audio-add", i);
|
Core.commandv("audio-add", i);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CycleAudio()
|
public static void CycleAudio()
|
||||||
{
|
{
|
||||||
MediaTrack[] audioTracks = core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
MediaTrack[] audioTracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
||||||
int len = audioTracks.Length;
|
int len = audioTracks.Length;
|
||||||
|
|
||||||
if (len < 1)
|
if (len < 1)
|
||||||
{
|
{
|
||||||
core.commandv("show-text", "No audio tracks");
|
Core.commandv("show-text", "No audio tracks");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int aid = core.get_property_int("aid");
|
int aid = Core.get_property_int("aid");
|
||||||
|
|
||||||
if (len > 1)
|
if (len > 1)
|
||||||
{
|
{
|
||||||
if (++aid > len)
|
if (++aid > len)
|
||||||
aid = 1;
|
aid = 1;
|
||||||
|
|
||||||
core.commandv("set", "aid", aid.ToString());
|
Core.commandv("set", "aid", aid.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
core.commandv("show-text", aid + "/" + len + ": " + audioTracks[aid - 1].Text.Substring(3), "5000");
|
Core.commandv("show-text", aid + "/" + len + ": " + audioTracks[aid - 1].Text.Substring(3), "5000");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ShowCommands()
|
public static void ShowCommands()
|
||||||
@@ -341,13 +326,13 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}";
|
}";
|
||||||
|
|
||||||
string json = core.get_property_string("command-list");
|
string json = Core.get_property_string("command-list");
|
||||||
ShowTextWithEditor("command-list", PowerShell.InvokeAndReturnString(code, "json", json));
|
ShowTextWithEditor("command-list", PowerShell.InvokeAndReturnString(code, "json", json));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ShowProperties()
|
public static void ShowProperties()
|
||||||
{
|
{
|
||||||
var props = core.get_property_string("property-list").Split(',').OrderBy(prop => prop);
|
var props = Core.get_property_string("property-list").Split(',').OrderBy(prop => prop);
|
||||||
ShowTextWithEditor("property-list", string.Join(BR, props));
|
ShowTextWithEditor("property-list", string.Join(BR, props));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,9 +343,9 @@ namespace mpvnet
|
|||||||
ProcessHelp.ShellExecute(file);
|
ProcessHelp.ShellExecute(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ScaleWindow(float factor) => core.RaiseScaleWindow(factor);
|
public static void ScaleWindow(float factor) => Core.RaiseScaleWindow(factor);
|
||||||
|
|
||||||
public static void WindowScale(float value) => core.RaiseWindowScale(value);
|
public static void WindowScale(float value) => Core.RaiseWindowScale(value);
|
||||||
|
|
||||||
public static void ShowText(string text, int duration = 0, int fontSize = 0)
|
public static void ShowText(string text, int duration = 0, int fontSize = 0)
|
||||||
{
|
{
|
||||||
@@ -368,12 +353,12 @@ namespace mpvnet
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (duration == 0)
|
if (duration == 0)
|
||||||
duration = core.get_property_int("osd-duration");
|
duration = Core.get_property_int("osd-duration");
|
||||||
|
|
||||||
if (fontSize == 0)
|
if (fontSize == 0)
|
||||||
fontSize = core.get_property_int("osd-font-size");
|
fontSize = Core.get_property_int("osd-font-size");
|
||||||
|
|
||||||
core.command("show-text \"${osd-ass-cc/0}{\\\\fs" + fontSize +
|
Core.command("show-text \"${osd-ass-cc/0}{\\\\fs" + fontSize +
|
||||||
"}${osd-ass-cc/1}" + text + "\" " + duration);
|
"}${osd-ass-cc/1}" + text + "\" " + duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,13 +369,13 @@ namespace mpvnet
|
|||||||
if (args?.Length == 1)
|
if (args?.Length == 1)
|
||||||
duration = Convert.ToInt32(args[0]);
|
duration = Convert.ToInt32(args[0]);
|
||||||
|
|
||||||
var size = core.get_property_number("osd-font-size");
|
var size = Core.get_property_number("osd-font-size");
|
||||||
core.set_property_number("osd-font-size", 40);
|
Core.set_property_number("osd-font-size", 40);
|
||||||
core.command("show-text ${playlist} " + duration);
|
Core.command("show-text ${playlist} " + duration);
|
||||||
|
|
||||||
App.RunTask(() => {
|
App.RunTask(() => {
|
||||||
Thread.Sleep(6000);
|
Thread.Sleep(6000);
|
||||||
core.set_property_number("osd-font-size", size);
|
Core.set_property_number("osd-font-size", size);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System.ComponentModel.Composition.Hosting;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -33,14 +33,14 @@ namespace mpvnet
|
|||||||
if (knownExtensions.Contains(Path.GetFileName(extDir)))
|
if (knownExtensions.Contains(Path.GetFileName(extDir)))
|
||||||
catalog.Catalogs.Add(new DirectoryCatalog(extDir, Path.GetFileName(extDir) + ".dll"));
|
catalog.Catalogs.Add(new DirectoryCatalog(extDir, Path.GetFileName(extDir) + ".dll"));
|
||||||
else
|
else
|
||||||
ConsoleHelp.WriteError("Failed to load extension:\n\n" + extDir +
|
Terminal.WriteError("Failed to load extension:\n\n" + extDir +
|
||||||
"\n\nOnly extensions that ship with mpv.net are allowed in <startup>\\extensions" +
|
"\n\nOnly extensions that ship with mpv.net are allowed in <startup>\\extensions" +
|
||||||
"\n\nUser extensions have to use <config folder>\\extensions" +
|
"\n\nUser extensions have to use <config folder>\\extensions" +
|
||||||
"\n\nNever copy or install a new mpv.net version over a old mpv.net version.");
|
"\n\nNever copy or install a new mpv.net version over a old mpv.net version.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dir = core.ConfigFolder + "extensions";
|
dir = Core.ConfigFolder + "extensions";
|
||||||
|
|
||||||
if (Directory.Exists(dir))
|
if (Directory.Exists(dir))
|
||||||
foreach (string extDir in Directory.GetDirectories(dir))
|
foreach (string extDir in Directory.GetDirectories(dir))
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
public static class Extensions
|
public static class TestStringExtension
|
||||||
{
|
{
|
||||||
public static bool ContainsEx(this string instance, string value)
|
public static bool ContainsEx(this string instance, string value)
|
||||||
{
|
{
|
||||||
@@ -19,11 +19,14 @@ public static class Extensions
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ConvertToStringExtension
|
||||||
|
{
|
||||||
public static string ToUpperEx(this string instance)
|
public static string ToUpperEx(this string instance)
|
||||||
{
|
{
|
||||||
if (instance != null)
|
if (instance != null)
|
||||||
return instance.ToUpper();
|
return instance.ToUpperInvariant();
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@@ -31,11 +34,48 @@ public static class Extensions
|
|||||||
public static string ToLowerEx(this string instance)
|
public static string ToLowerEx(this string instance)
|
||||||
{
|
{
|
||||||
if (instance != null)
|
if (instance != null)
|
||||||
return instance.ToLower();
|
return instance.ToLowerInvariant();
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string TrimEx(this string instance)
|
||||||
|
{
|
||||||
|
if (instance == null)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
return instance.Trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ConvertStringExtension
|
||||||
|
{
|
||||||
|
public static int ToInt(this string instance)
|
||||||
|
{
|
||||||
|
int.TryParse(instance, out int result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float ToFloat(this string instance)
|
||||||
|
{
|
||||||
|
float.TryParse(instance.Replace(",", "."), NumberStyles.Float,
|
||||||
|
CultureInfo.InvariantCulture, out float result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class PathStringExtension
|
||||||
|
{
|
||||||
|
// return extension with lower case and without dot.
|
||||||
|
public static string Ext(this string instance)
|
||||||
|
{
|
||||||
|
if (instance == null)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
return Path.GetExtension(instance).TrimStart('.').ToLower();
|
||||||
|
}
|
||||||
|
|
||||||
public static string FileName(this string instance)
|
public static string FileName(this string instance)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(instance))
|
if (string.IsNullOrEmpty(instance))
|
||||||
@@ -54,25 +94,23 @@ public static class Extensions
|
|||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string Ext(this string instance)
|
// Ensure trailing directory separator char
|
||||||
|
public static string AddSep(this string instance)
|
||||||
{
|
{
|
||||||
if (instance == null)
|
if (string.IsNullOrEmpty(instance))
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
return Path.GetExtension(instance).TrimStart('.').ToLower();
|
if (!instance.EndsWith(Path.DirectorySeparatorChar.ToString()))
|
||||||
|
instance = instance + Path.DirectorySeparatorChar;
|
||||||
|
|
||||||
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int ToInt(this string instance)
|
public static bool IsIdenticalFolder(this string instance, string testFolder)
|
||||||
{
|
{
|
||||||
int.TryParse(instance, out int result);
|
if (string.IsNullOrEmpty(instance) || string.IsNullOrEmpty(testFolder))
|
||||||
return result;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
public static float ToFloat(this string instance)
|
return instance.ToLowerInvariant().AddSep() == testFolder.ToLowerInvariant().AddSep();
|
||||||
{
|
|
||||||
float.TryParse(instance.Replace(",", "."), NumberStyles.Float,
|
|
||||||
CultureInfo.InvariantCulture, out float result);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/Misc/Global.cs
Normal file
13
src/Misc/Global.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace mpvnet
|
||||||
|
{
|
||||||
|
public class Global
|
||||||
|
{
|
||||||
|
public static string BR = Environment.NewLine;
|
||||||
|
public static string BR2 = Environment.NewLine + Environment.NewLine;
|
||||||
|
|
||||||
|
public static CorePlayer Core { get; } = new CorePlayer();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ using System.ComponentModel;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -18,7 +18,7 @@ namespace mpvnet
|
|||||||
public static void RegisterGlobalHotkeys(IntPtr hwnd)
|
public static void RegisterGlobalHotkeys(IntPtr hwnd)
|
||||||
{
|
{
|
||||||
HWND = hwnd;
|
HWND = hwnd;
|
||||||
string path = core.ConfigFolder + "global-input.conf";
|
string path = Core.ConfigFolder + "global-input.conf";
|
||||||
|
|
||||||
if (!File.Exists(path))
|
if (!File.Exists(path))
|
||||||
return;
|
return;
|
||||||
@@ -82,14 +82,14 @@ namespace mpvnet
|
|||||||
bool success = RegisterHotKey(HWND, ID++, mod, vk);
|
bool success = RegisterHotKey(HWND, ID++, mod, vk);
|
||||||
|
|
||||||
if (!success)
|
if (!success)
|
||||||
ConsoleHelp.WriteError(line + ": " + new Win32Exception().Message + "\n", "global-input.conf");
|
Terminal.WriteError(line + ": " + new Win32Exception().Message + "\n", "global-input.conf");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Execute(int id)
|
public static void Execute(int id)
|
||||||
{
|
{
|
||||||
if (Commands.ContainsKey(id))
|
if (Commands.ContainsKey(id))
|
||||||
core.command(Commands[id]);
|
Core.command(Commands[id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mpv_to_VK(string value)
|
static int mpv_to_VK(string value)
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
using static mpvnet.NewLine;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -37,55 +36,6 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ConsoleHelp
|
|
||||||
{
|
|
||||||
public static int Padding { get; set; }
|
|
||||||
|
|
||||||
public static void WriteError(object obj, string module = "mpv.net")
|
|
||||||
{
|
|
||||||
Write(obj, module, ConsoleColor.DarkRed, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Write(object obj, string module = "mpv.net")
|
|
||||||
{
|
|
||||||
Write(obj, module, ConsoleColor.Black, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Write(object obj, string module, ConsoleColor color)
|
|
||||||
{
|
|
||||||
Write(obj, module, color, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Write(object obj, string module, ConsoleColor color, bool useDefaultColor)
|
|
||||||
{
|
|
||||||
if (obj == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
string value = obj.ToString();
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(module))
|
|
||||||
module = "[" + module + "] ";
|
|
||||||
|
|
||||||
if (useDefaultColor)
|
|
||||||
Console.ResetColor();
|
|
||||||
else
|
|
||||||
Console.ForegroundColor = color;
|
|
||||||
|
|
||||||
value = module + value;
|
|
||||||
|
|
||||||
if (Padding > 0 && value.Length < Padding)
|
|
||||||
value = value.PadRight(Padding);
|
|
||||||
|
|
||||||
if (color == ConsoleColor.Red || color == ConsoleColor.DarkRed)
|
|
||||||
Console.Error.WriteLine(value);
|
|
||||||
else
|
|
||||||
Console.WriteLine(value);
|
|
||||||
|
|
||||||
Console.ResetColor();
|
|
||||||
Trace.WriteLine(obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CursorHelp
|
public class CursorHelp
|
||||||
{
|
{
|
||||||
static bool IsVisible = true;
|
static bool IsVisible = true;
|
||||||
@@ -134,7 +84,7 @@ namespace mpvnet
|
|||||||
''
|
''
|
||||||
}";
|
}";
|
||||||
|
|
||||||
string json = core.get_property_string("profile-list");
|
string json = Core.get_property_string("profile-list");
|
||||||
return PowerShell.InvokeAndReturnString(code, "json", json).Trim();
|
return PowerShell.InvokeAndReturnString(code, "json", json).Trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,19 +96,19 @@ namespace mpvnet
|
|||||||
$item.codec + ' - ' + $item.description
|
$item.codec + ' - ' + $item.description
|
||||||
}";
|
}";
|
||||||
|
|
||||||
string json = core.get_property_string("decoder-list");
|
string json = Core.get_property_string("decoder-list");
|
||||||
return PowerShell.InvokeAndReturnString(code, "json", json).Trim();
|
return PowerShell.InvokeAndReturnString(code, "json", json).Trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetProtocols()
|
public static string GetProtocols()
|
||||||
{
|
{
|
||||||
string list = core.get_property_string("protocol-list");
|
string list = Core.get_property_string("protocol-list");
|
||||||
return string.Join(BR, list.Split(',').OrderBy(a => a));
|
return string.Join(BR, list.Split(',').OrderBy(a => a));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetDemuxers()
|
public static string GetDemuxers()
|
||||||
{
|
{
|
||||||
string list = core.get_property_string("demuxer-lavf-list");
|
string list = Core.get_property_string("demuxer-lavf-list");
|
||||||
return string.Join(BR, list.Split(',').OrderBy(a => a));
|
return string.Join(BR, list.Split(',').OrderBy(a => a));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -172,6 +122,17 @@ namespace mpvnet
|
|||||||
SetValue(ApplicationKey, name, value);
|
SetValue(ApplicationKey, name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void SetString(string name, string value)
|
||||||
|
{
|
||||||
|
SetValue(ApplicationKey, name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetValue(string name, object value)
|
||||||
|
{
|
||||||
|
using (RegistryKey regKey = GetRootKey(ApplicationKey).CreateSubKey(ApplicationKey.Substring(5), RegistryKeyPermissionCheck.ReadWriteSubTree))
|
||||||
|
regKey.SetValue(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
public static void SetValue(string path, string name, object value)
|
public static void SetValue(string path, string name, object value)
|
||||||
{
|
{
|
||||||
using (RegistryKey regKey = GetRootKey(path).CreateSubKey(path.Substring(5), RegistryKeyPermissionCheck.ReadWriteSubTree))
|
using (RegistryKey regKey = GetRootKey(path).CreateSubKey(path.Substring(5), RegistryKeyPermissionCheck.ReadWriteSubTree))
|
||||||
@@ -190,6 +151,8 @@ namespace mpvnet
|
|||||||
return !(value is int) ? defaultValue : (int)value;
|
return !(value is int) ? defaultValue : (int)value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static object GetValue(string name) => GetValue(ApplicationKey, name, null);
|
||||||
|
|
||||||
public static object GetValue(string path, string name, object defaultValue = null)
|
public static object GetValue(string path, string name, object defaultValue = null)
|
||||||
{
|
{
|
||||||
using (RegistryKey regKey = GetRootKey(path).OpenSubKey(path.Substring(5)))
|
using (RegistryKey regKey = GetRootKey(path).OpenSubKey(path.Substring(5)))
|
||||||
|
|||||||
@@ -13,16 +13,10 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
public static class NewLine
|
|
||||||
{
|
|
||||||
public static string BR = Environment.NewLine;
|
|
||||||
public static string BR2 = Environment.NewLine + Environment.NewLine;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Sys
|
public class Sys
|
||||||
{
|
{
|
||||||
public static bool IsDarkTheme {
|
public static bool IsDarkTheme {
|
||||||
@@ -102,13 +96,13 @@ namespace mpvnet
|
|||||||
RegistryHelp.SetValue($@"HKCR\" + "." + ext, null, ExeFilenameNoExt + "." + ext);
|
RegistryHelp.SetValue($@"HKCR\" + "." + ext, null, ExeFilenameNoExt + "." + ext);
|
||||||
RegistryHelp.SetValue($@"HKCR\" + "." + ext + @"\OpenWithProgIDs", ExeFilenameNoExt + "." + ext, "");
|
RegistryHelp.SetValue($@"HKCR\" + "." + ext + @"\OpenWithProgIDs", ExeFilenameNoExt + "." + ext, "");
|
||||||
|
|
||||||
if (VideoTypes.Contains(ext))
|
if (CorePlayer.VideoTypes.Contains(ext))
|
||||||
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "video");
|
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "video");
|
||||||
|
|
||||||
if (AudioTypes.Contains(ext))
|
if (CorePlayer.AudioTypes.Contains(ext))
|
||||||
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "audio");
|
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "audio");
|
||||||
|
|
||||||
if (ImageTypes.Contains(ext))
|
if (CorePlayer.ImageTypes.Contains(ext))
|
||||||
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "image");
|
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "image");
|
||||||
|
|
||||||
RegistryHelp.SetValue($@"HKCR\" + ExeFilenameNoExt + "." + ext + @"\shell\open\command", null, $"\"{ExePath}\" \"%1\"");
|
RegistryHelp.SetValue($@"HKCR\" + ExeFilenameNoExt + "." + ext + @"\shell\open\command", null, $"\"{ExePath}\" \"%1\"");
|
||||||
@@ -203,7 +197,7 @@ namespace mpvnet
|
|||||||
public static ObservableCollection<CommandItem> Items {
|
public static ObservableCollection<CommandItem> Items {
|
||||||
get {
|
get {
|
||||||
if (_Items is null)
|
if (_Items is null)
|
||||||
_Items = GetItems(File.ReadAllText(core.InputConfPath));
|
_Items = GetItems(File.ReadAllText(Core.InputConfPath));
|
||||||
|
|
||||||
return _Items;
|
return _Items;
|
||||||
}
|
}
|
||||||
@@ -212,6 +206,26 @@ namespace mpvnet
|
|||||||
|
|
||||||
public class Folder
|
public class Folder
|
||||||
{
|
{
|
||||||
public static string Startup { get; } = Application.StartupPath + @"\";
|
public static string Startup { get; } = Application.StartupPath.AddSep();
|
||||||
|
public static string AppData { get; } = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).AddSep();
|
||||||
|
|
||||||
|
public static string CustomSettings {
|
||||||
|
get {
|
||||||
|
string linkFile = Startup + "settings-directory.txt";
|
||||||
|
|
||||||
|
if (File.Exists(linkFile))
|
||||||
|
{
|
||||||
|
string linkTarget = File.ReadAllText(linkFile).Trim();
|
||||||
|
|
||||||
|
if (linkTarget.StartsWithEx("."))
|
||||||
|
linkTarget = Startup + linkTarget;
|
||||||
|
|
||||||
|
if (Directory.Exists(linkTarget))
|
||||||
|
return linkTarget.AddSep();
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
39
src/Misc/Msg.cs
Normal file
39
src/Misc/Msg.cs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
public class Msg
|
||||||
|
{
|
||||||
|
public static void ShowInfo(object title, object content = null)
|
||||||
|
{
|
||||||
|
Show(title, content, MessageBoxIcon.Information);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowError(object title, object content = null)
|
||||||
|
{
|
||||||
|
Show(title, content, MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowWarning(object title, object content = null)
|
||||||
|
{
|
||||||
|
Show(title, content, MessageBoxIcon.Warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DialogResult ShowQuestion(object title, object content = null,
|
||||||
|
MessageBoxButtons buttons = MessageBoxButtons.OKCancel)
|
||||||
|
{
|
||||||
|
return Show(title, content, MessageBoxIcon.Question, buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowException(Exception exception)
|
||||||
|
{
|
||||||
|
Show(exception, null, MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DialogResult Show(object title, object content, MessageBoxIcon icon,
|
||||||
|
MessageBoxButtons buttons = MessageBoxButtons.OK)
|
||||||
|
{
|
||||||
|
string msg = (title?.ToString().TrimEx() + "\n\n" + content?.ToString().TrimEx()).Trim();
|
||||||
|
return MessageBox.Show(msg, Application.ProductName, buttons, icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,8 +6,7 @@ using System.Management.Automation;
|
|||||||
using System.Management.Automation.Runspaces;
|
using System.Management.Automation.Runspaces;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
using static mpvnet.NewLine;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -90,7 +89,7 @@ namespace mpvnet
|
|||||||
var output = sender as PipelineReader<PSObject>;
|
var output = sender as PipelineReader<PSObject>;
|
||||||
|
|
||||||
while (output.Count > 0)
|
while (output.Count > 0)
|
||||||
ConsoleHelp.Write(output.Read(), Module);
|
Terminal.Write(output.Read(), Module);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Error_DataReady(object sender, EventArgs e)
|
public void Error_DataReady(object sender, EventArgs e)
|
||||||
@@ -98,7 +97,7 @@ namespace mpvnet
|
|||||||
var output = sender as PipelineReader<Object>;
|
var output = sender as PipelineReader<Object>;
|
||||||
|
|
||||||
while (output.Count > 0)
|
while (output.Count > 0)
|
||||||
ConsoleHelp.WriteError(output.Read(), Module);
|
Terminal.WriteError(output.Read(), Module);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RedirectStreams(PSEventJob job)
|
public void RedirectStreams(PSEventJob job)
|
||||||
@@ -110,25 +109,25 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void commandv(params string[] args) => core.commandv(args);
|
public void commandv(params string[] args) => Core.commandv(args);
|
||||||
|
|
||||||
public void command(string command) => core.command(command);
|
public void command(string command) => Core.command(command);
|
||||||
|
|
||||||
public bool get_property_bool(string name) => core.get_property_bool(name);
|
public bool get_property_bool(string name) => Core.get_property_bool(name);
|
||||||
|
|
||||||
public void set_property_bool(string name, bool value) => core.set_property_bool(name, value);
|
public void set_property_bool(string name, bool value) => Core.set_property_bool(name, value);
|
||||||
|
|
||||||
public int get_property_int(string name) => core.get_property_int(name);
|
public int get_property_int(string name) => Core.get_property_int(name);
|
||||||
|
|
||||||
public void set_property_int(string name, int value) => core.set_property_int(name, value);
|
public void set_property_int(string name, int value) => Core.set_property_int(name, value);
|
||||||
|
|
||||||
public double get_property_number(string name) => core.get_property_number(name);
|
public double get_property_number(string name) => Core.get_property_number(name);
|
||||||
|
|
||||||
public void set_property_number(string name, double value) => core.set_property_number(name, value);
|
public void set_property_number(string name, double value) => Core.set_property_number(name, value);
|
||||||
|
|
||||||
public string get_property_string(string name) => core.get_property_string(name);
|
public string get_property_string(string name) => Core.get_property_string(name);
|
||||||
|
|
||||||
public void set_property_string(string name, string value) => core.set_property_string(name, value);
|
public void set_property_string(string name, string value) => Core.set_property_string(name, value);
|
||||||
|
|
||||||
public void observe_property(string name, string type, ScriptBlock sb)
|
public void observe_property(string name, string type, ScriptBlock sb)
|
||||||
{
|
{
|
||||||
@@ -137,19 +136,19 @@ namespace mpvnet
|
|||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case "bool": case "boolean":
|
case "bool": case "boolean":
|
||||||
core.observe_property_bool(name, value => App.RunTask(() => PropertyChanged.Invoke(name, value)));
|
Core.observe_property_bool(name, value => App.RunTask(() => PropertyChanged.Invoke(name, value)));
|
||||||
break;
|
break;
|
||||||
case "string":
|
case "string":
|
||||||
core.observe_property_string(name, value => App.RunTask(() => PropertyChanged.Invoke(name, value)));
|
Core.observe_property_string(name, value => App.RunTask(() => PropertyChanged.Invoke(name, value)));
|
||||||
break;
|
break;
|
||||||
case "int": case "integer":
|
case "int": case "integer":
|
||||||
core.observe_property_int(name, value => App.RunTask(() => PropertyChanged.Invoke(name, value)));
|
Core.observe_property_int(name, value => App.RunTask(() => PropertyChanged.Invoke(name, value)));
|
||||||
break;
|
break;
|
||||||
case "float": case "double":
|
case "float": case "double":
|
||||||
core.observe_property_double(name, value => App.RunTask(() => PropertyChanged.Invoke(name, value)));
|
Core.observe_property_double(name, value => App.RunTask(() => PropertyChanged.Invoke(name, value)));
|
||||||
break;
|
break;
|
||||||
case "nil": case "none": case "native":
|
case "nil": case "none": case "native":
|
||||||
core.observe_property(name, () => App.RunTask(() => PropertyChanged.Invoke(name, null)));
|
Core.observe_property(name, () => App.RunTask(() => PropertyChanged.Invoke(name, null)));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
App.ShowError("Invalid Type", "Valid types are: bool or boolean, string, int or integer, float or double, nil or none or native");
|
App.ShowError("Invalid Type", "Valid types are: bool or boolean, string, int or integer, float or double, nil or none or native");
|
||||||
@@ -164,59 +163,59 @@ namespace mpvnet
|
|||||||
switch (name)
|
switch (name)
|
||||||
{
|
{
|
||||||
case "log-message":
|
case "log-message":
|
||||||
core.LogMessageAsync += (level, msg) => Event.Invoke("log-message", new object[] { level, msg });
|
Core.LogMessageAsync += (level, msg) => Event.Invoke("log-message", new object[] { level, msg });
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "end-file":
|
case "end-file":
|
||||||
core.EndFileAsync += reason => Event.Invoke("end-file", new object[] { reason });
|
Core.EndFileAsync += reason => Event.Invoke("end-file", new object[] { reason });
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "client-message":
|
case "client-message":
|
||||||
core.ClientMessageAsync += args => Event.Invoke("client-message", args);
|
Core.ClientMessageAsync += args => Event.Invoke("client-message", args);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "shutdown":
|
case "shutdown":
|
||||||
core.Shutdown += () => Event.Invoke("shutdown", null);
|
Core.Shutdown += () => Event.Invoke("shutdown", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "get-property-reply":
|
case "get-property-reply":
|
||||||
core.GetPropertyReplyAsync += () => Event.Invoke("get-property-reply", null);
|
Core.GetPropertyReplyAsync += () => Event.Invoke("get-property-reply", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "set-property-reply":
|
case "set-property-reply":
|
||||||
core.SetPropertyReplyAsync += () => Event.Invoke("set-property-reply", null);
|
Core.SetPropertyReplyAsync += () => Event.Invoke("set-property-reply", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "command-reply":
|
case "command-reply":
|
||||||
core.CommandReplyAsync += () => Event.Invoke("command-reply", null);
|
Core.CommandReplyAsync += () => Event.Invoke("command-reply", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "start-file":
|
case "start-file":
|
||||||
core.StartFileAsync += () => Event.Invoke("start-file", null);
|
Core.StartFileAsync += () => Event.Invoke("start-file", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "file-loaded":
|
case "file-loaded":
|
||||||
core.FileLoadedAsync += () => Event.Invoke("file-loaded", null);
|
Core.FileLoadedAsync += () => Event.Invoke("file-loaded", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "idle":
|
case "idle":
|
||||||
core.IdleAsync += () => Event.Invoke("idle", null);
|
Core.IdleAsync += () => Event.Invoke("idle", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "video-reconfig":
|
case "video-reconfig":
|
||||||
core.VideoReconfigAsync += () => Event.Invoke("video-reconfig", null);
|
Core.VideoReconfigAsync += () => Event.Invoke("video-reconfig", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "audio-reconfig":
|
case "audio-reconfig":
|
||||||
core.AudioReconfigAsync += () => Event.Invoke("audio-reconfig", null);
|
Core.AudioReconfigAsync += () => Event.Invoke("audio-reconfig", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "seek":
|
case "seek":
|
||||||
core.SeekAsync += () => Event.Invoke("seek", null);
|
Core.SeekAsync += () => Event.Invoke("seek", null);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "playback-restart":
|
case "playback-restart":
|
||||||
core.PlaybackRestartAsync += () => Event.Invoke("playback-restart", null);
|
Core.PlaybackRestartAsync += () => Event.Invoke("playback-restart", null);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,13 +223,13 @@ namespace mpvnet
|
|||||||
void Output_DataAdded(object sender, DataAddedEventArgs e)
|
void Output_DataAdded(object sender, DataAddedEventArgs e)
|
||||||
{
|
{
|
||||||
var output = sender as PSDataCollection<PSObject>;
|
var output = sender as PSDataCollection<PSObject>;
|
||||||
ConsoleHelp.Write(output[e.Index], Module);
|
Terminal.Write(output[e.Index], Module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Error_DataAdded(object sender, DataAddedEventArgs e)
|
void Error_DataAdded(object sender, DataAddedEventArgs e)
|
||||||
{
|
{
|
||||||
var error = sender as PSDataCollection<ErrorRecord>;
|
var error = sender as PSDataCollection<ErrorRecord>;
|
||||||
ConsoleHelp.WriteError(error[e.Index], Module);
|
Terminal.WriteError(error[e.Index], Module);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using System.Collections.Generic;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -23,7 +23,7 @@ namespace mpvnet
|
|||||||
if (App.IsStartedFromTerminal)
|
if (App.IsStartedFromTerminal)
|
||||||
Native.AttachConsole(-1 /*ATTACH_PARENT_PROCESS*/);
|
Native.AttachConsole(-1 /*ATTACH_PARENT_PROCESS*/);
|
||||||
|
|
||||||
if (core.ConfigFolder == "")
|
if (Core.ConfigFolder == "")
|
||||||
return;
|
return;
|
||||||
|
|
||||||
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
|
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
|
||||||
@@ -31,11 +31,11 @@ namespace mpvnet
|
|||||||
if (args.Length >= 2 && args[0] == "--reg-file-assoc")
|
if (args.Length >= 2 && args[0] == "--reg-file-assoc")
|
||||||
{
|
{
|
||||||
if (args[1] == "audio")
|
if (args[1] == "audio")
|
||||||
FileAssociation.Register(Core.AudioTypes);
|
FileAssociation.Register(CorePlayer.AudioTypes);
|
||||||
else if (args[1] == "video")
|
else if (args[1] == "video")
|
||||||
FileAssociation.Register(Core.VideoTypes);
|
FileAssociation.Register(CorePlayer.VideoTypes);
|
||||||
else if (args[1] == "image")
|
else if (args[1] == "image")
|
||||||
FileAssociation.Register(Core.ImageTypes);
|
FileAssociation.Register(CorePlayer.ImageTypes);
|
||||||
else
|
else
|
||||||
FileAssociation.Register(args.Skip(1).ToArray());
|
FileAssociation.Register(args.Skip(1).ToArray());
|
||||||
|
|
||||||
|
|||||||
50
src/Misc/Terminal.cs
Normal file
50
src/Misc/Terminal.cs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
namespace mpvnet
|
||||||
|
{
|
||||||
|
public static class Terminal
|
||||||
|
{
|
||||||
|
static int Padding { get; } = 60;
|
||||||
|
|
||||||
|
public static void WriteError(object obj, string module = "mpv.net")
|
||||||
|
{
|
||||||
|
Write(obj, module, ConsoleColor.DarkRed, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Write(object obj, string module = "mpv.net")
|
||||||
|
{
|
||||||
|
Write(obj, module, ConsoleColor.Black, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Write(object obj, string module, ConsoleColor color, bool useDefaultColor)
|
||||||
|
{
|
||||||
|
if (obj == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
string value = obj.ToString();
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(module))
|
||||||
|
module = "[" + module + "] ";
|
||||||
|
|
||||||
|
if (useDefaultColor)
|
||||||
|
Console.ResetColor();
|
||||||
|
else
|
||||||
|
Console.ForegroundColor = color;
|
||||||
|
|
||||||
|
value = module + value;
|
||||||
|
|
||||||
|
if (value.Length < Padding)
|
||||||
|
value = value.PadRight(Padding);
|
||||||
|
|
||||||
|
if (color == ConsoleColor.Red || color == ConsoleColor.DarkRed)
|
||||||
|
Console.Error.WriteLine(value);
|
||||||
|
else
|
||||||
|
Console.WriteLine(value);
|
||||||
|
|
||||||
|
Console.ResetColor();
|
||||||
|
Trace.WriteLine(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -45,7 +45,7 @@ namespace mpvnet
|
|||||||
if (!theme.Dictionary.ContainsKey(key))
|
if (!theme.Dictionary.ContainsKey(key))
|
||||||
{
|
{
|
||||||
isKeyMissing = true;
|
isKeyMissing = true;
|
||||||
ConsoleHelp.WriteError($"Theme '{activeTheme}' misses '{key}'");
|
Terminal.WriteError($"Theme '{activeTheme}' misses '{key}'");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ using System.Reflection;
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
using static TaskDialog.Msg;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -16,7 +15,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
public static void DailyCheck()
|
public static void DailyCheck()
|
||||||
{
|
{
|
||||||
if (App.UpdateCheck && RegistryHelp.GetInt("UpdateCheckLast")
|
if (App.UpdateCheck && RegistryHelp.GetInt("last-update-check")
|
||||||
!= DateTime.Now.DayOfYear)
|
!= DateTime.Now.DayOfYear)
|
||||||
|
|
||||||
CheckOnline();
|
CheckOnline();
|
||||||
@@ -28,26 +27,33 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
using (HttpClient client = new HttpClient())
|
using (HttpClient client = new HttpClient())
|
||||||
{
|
{
|
||||||
RegistryHelp.SetValue(RegistryHelp.ApplicationKey, "UpdateCheckLast", DateTime.Now.DayOfYear);
|
RegistryHelp.SetValue("last-update-check", DateTime.Now.DayOfYear);
|
||||||
client.DefaultRequestHeaders.Add("User-Agent", "mpv.net");
|
client.DefaultRequestHeaders.Add("User-Agent", "mpv.net");
|
||||||
var response = await client.GetAsync("https://api.github.com/repos/stax76/mpv.net/releases/latest");
|
var response = await client.GetAsync("https://api.github.com/repos/stax76/mpv.net/releases/latest");
|
||||||
response.EnsureSuccessStatusCode();
|
response.EnsureSuccessStatusCode();
|
||||||
string content = await response.Content.ReadAsStringAsync();
|
string content = await response.Content.ReadAsStringAsync();
|
||||||
Match match = Regex.Match(content, @"""mpv\.net-([\d\.]+)-portable\.zip""");
|
Match match = Regex.Match(content, @"""mpv\.net-([\d\.]+)-portable\.zip""");
|
||||||
|
|
||||||
|
if (!match.Success)
|
||||||
|
{
|
||||||
|
App.ShowError("Update check is currently not available.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Version onlineVersion = Version.Parse(match.Groups[1].Value);
|
Version onlineVersion = Version.Parse(match.Groups[1].Value);
|
||||||
Version currentVersion = Assembly.GetEntryAssembly().GetName().Version;
|
Version currentVersion = Assembly.GetEntryAssembly().GetName().Version;
|
||||||
|
|
||||||
if (onlineVersion <= currentVersion)
|
if (onlineVersion <= currentVersion)
|
||||||
{
|
{
|
||||||
if (showUpToDateMessage)
|
if (showUpToDateMessage)
|
||||||
MsgInfo($"{Application.ProductName} is up to date.");
|
Msg.ShowInfo($"{Application.ProductName} is up to date.");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((RegistryHelp.GetString("UpdateCheckVersion")
|
if ((RegistryHelp.GetString("update-check-version")
|
||||||
!= onlineVersion.ToString() || showUpToDateMessage) && Msg.ShowQuestion(
|
!= onlineVersion.ToString() || showUpToDateMessage) && Msg.ShowQuestion(
|
||||||
$"New version {onlineVersion} is available, update now?") == MsgResult.OK)
|
$"New version {onlineVersion} is available, update now?") == DialogResult.OK)
|
||||||
{
|
{
|
||||||
string url = $"https://github.com/stax76/mpv.net/releases/download/{onlineVersion}/mpv.net-{onlineVersion}-portable.zip";
|
string url = $"https://github.com/stax76/mpv.net/releases/download/{onlineVersion}/mpv.net-{onlineVersion}-portable.zip";
|
||||||
|
|
||||||
@@ -64,16 +70,16 @@ namespace mpvnet
|
|||||||
proc.Start();
|
proc.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
core.command("quit");
|
Core.command("quit");
|
||||||
}
|
}
|
||||||
|
|
||||||
RegistryHelp.SetValue(RegistryHelp.ApplicationKey, "UpdateCheckVersion", onlineVersion.ToString());
|
RegistryHelp.SetValue("update-check-version", onlineVersion.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
if (showUpToDateMessage)
|
if (showUpToDateMessage)
|
||||||
Msg.ShowException(ex);
|
App.ShowException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,10 @@ using System;
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
public class Native
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
|
public class Native
|
||||||
|
{
|
||||||
static Version Windows_10_1607 = new Version(10, 0, 14393); // Windows 10 1607
|
static Version Windows_10_1607 = new Version(10, 0, 14393); // Windows 10 1607
|
||||||
|
|
||||||
[DllImport("kernel32.dll")]
|
[DllImport("kernel32.dll")]
|
||||||
@@ -49,7 +51,8 @@ public class Native
|
|||||||
ref RECT lpRect, uint dwStyle, bool bMenu, uint dwExStyle, uint dpi);
|
ref RECT lpRect, uint dwStyle, bool bMenu, uint dwExStyle, uint dpi);
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
|
public static extern bool SetWindowPos(
|
||||||
|
IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
|
||||||
|
|
||||||
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
|
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
|
||||||
static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);
|
static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);
|
||||||
@@ -152,4 +155,5 @@ public class Native
|
|||||||
using (Graphics gx = Graphics.FromHwnd(hwnd))
|
using (Graphics gx = Graphics.FromHwnd(hwnd))
|
||||||
return GetDeviceCaps(gx.GetHdc(), 88 /*LOGPIXELSX*/);
|
return GetDeviceCaps(gx.GetHdc(), 88 /*LOGPIXELSX*/);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,674 +0,0 @@
|
|||||||
|
|
||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
public class Msg
|
|
||||||
{
|
|
||||||
static string ShownMessages;
|
|
||||||
|
|
||||||
public static string SupportURL { get; set; }
|
|
||||||
|
|
||||||
public static void Show(string mainInstruction, string content = null)
|
|
||||||
{
|
|
||||||
Msg.Show(mainInstruction, content, MsgIcon.Info, MsgButtons.Ok, MsgResult.None);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ShowError(string mainInstruction, string content = null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (TaskDialog<string> td = new TaskDialog<string>())
|
|
||||||
{
|
|
||||||
td.AllowCancel = false;
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(content))
|
|
||||||
{
|
|
||||||
if (mainInstruction.Length < 80)
|
|
||||||
td.MainInstruction = mainInstruction;
|
|
||||||
else
|
|
||||||
td.Content = mainInstruction;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
td.MainInstruction = mainInstruction;
|
|
||||||
td.Content = content;
|
|
||||||
}
|
|
||||||
|
|
||||||
td.MainIcon = MsgIcon.Error;
|
|
||||||
td.Footer = "[Copy Message](copymsg)";
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Msg.SupportURL))
|
|
||||||
td.Footer += $" [Contact Support]({SupportURL})";
|
|
||||||
|
|
||||||
td.Show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
MessageBox.Show(e.GetType().Name + "\n\n" + e.Message + "\n\n" + e,
|
|
||||||
Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ShowException(Exception exception)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (TaskDialog<string> td = new TaskDialog<string>())
|
|
||||||
{
|
|
||||||
td.MainInstruction = exception.GetType().Name;
|
|
||||||
td.Content = exception.Message;
|
|
||||||
td.MainIcon = MsgIcon.Error;
|
|
||||||
td.ExpandedInformation = exception.StackTrace;
|
|
||||||
td.Footer = "[Copy Message](copymsg)";
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Msg.SupportURL))
|
|
||||||
td.Footer += $" [Contact Support]({SupportURL})";
|
|
||||||
|
|
||||||
td.Show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
MessageBox.Show(e.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ShowWarning(
|
|
||||||
string mainInstruction,
|
|
||||||
string content = null,
|
|
||||||
bool onlyOnce = false)
|
|
||||||
{
|
|
||||||
if (onlyOnce && Msg.ShownMessages != null &&
|
|
||||||
Msg.ShownMessages.Contains(mainInstruction + content))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Msg.Show(mainInstruction, content, MsgIcon.Warning, MsgButtons.Ok, MsgResult.None);
|
|
||||||
|
|
||||||
if (!onlyOnce)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Msg.ShownMessages += mainInstruction + content;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MsgResult ShowQuestion(
|
|
||||||
string mainInstruction, MsgButtons buttons = MsgButtons.OkCancel)
|
|
||||||
{
|
|
||||||
return Msg.Show(mainInstruction, null, MsgIcon.None, buttons, MsgResult.None);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MsgResult ShowQuestion(
|
|
||||||
string mainInstruction, string content, MsgButtons buttons = MsgButtons.OkCancel)
|
|
||||||
{
|
|
||||||
return Msg.Show(mainInstruction, content, MsgIcon.None, buttons, MsgResult.None);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MsgResult Show(
|
|
||||||
string mainInstruction,
|
|
||||||
string content,
|
|
||||||
MsgIcon icon,
|
|
||||||
MsgButtons buttons,
|
|
||||||
MsgResult defaultButton = MsgResult.None)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (TaskDialog<MsgResult> td = new TaskDialog<MsgResult>())
|
|
||||||
{
|
|
||||||
td.AllowCancel = false;
|
|
||||||
td.DefaultButton = defaultButton;
|
|
||||||
td.MainIcon = icon;
|
|
||||||
|
|
||||||
if (content == null)
|
|
||||||
{
|
|
||||||
if (mainInstruction.Length < 80)
|
|
||||||
td.MainInstruction = mainInstruction;
|
|
||||||
else
|
|
||||||
td.Content = mainInstruction;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
td.MainInstruction = mainInstruction;
|
|
||||||
td.Content = content;
|
|
||||||
}
|
|
||||||
if (buttons == MsgButtons.OkCancel)
|
|
||||||
{
|
|
||||||
td.AddButton("OK", MsgResult.OK);
|
|
||||||
td.AddButton("Cancel", MsgResult.Cancel);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
td.CommonButtons = buttons;
|
|
||||||
return td.Show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
return (MsgResult)MessageBox.Show(e.GetType().Name + "\n\n" + e.Message + "\n\n" + e,
|
|
||||||
Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TaskDialog<T> : TaskDialogNative, IDisposable
|
|
||||||
{
|
|
||||||
Dictionary<int, T> IdValueDic;
|
|
||||||
Dictionary<int, string> IdTextDic;
|
|
||||||
List<int> CommandLinkShieldList;
|
|
||||||
IntPtr ButtonArray;
|
|
||||||
IntPtr RadioButtonArray;
|
|
||||||
T SelectedValueValue;
|
|
||||||
string SelectedTextValue;
|
|
||||||
int TimeoutValue;
|
|
||||||
int ExitTickCount;
|
|
||||||
bool Disposed;
|
|
||||||
List<TaskDialogNative.TASKDIALOG_BUTTON> Buttons;
|
|
||||||
List<TaskDialogNative.TASKDIALOG_BUTTON> RadioButtons;
|
|
||||||
TaskDialogNative.TASKDIALOGCONFIG Config;
|
|
||||||
|
|
||||||
const int TDE_CONTENT = 0;
|
|
||||||
const int TDE_EXPANDED_INFORMATION = 1;
|
|
||||||
const int TDE_FOOTER = 2;
|
|
||||||
const int TDE_MAIN_INSTRUCTION = 3;
|
|
||||||
const int TDN_CREATED = 0;
|
|
||||||
const int TDN_NAVIGATED = 1;
|
|
||||||
const int TDN_BUTTON_CLICKED = 2;
|
|
||||||
const int TDN_HYPERLINK_CLICKED = 3;
|
|
||||||
const int TDN_TIMER = 4;
|
|
||||||
const int TDN_DESTROYED = 5;
|
|
||||||
const int TDN_RADIO_BUTTON_CLICKED = 6;
|
|
||||||
const int TDN_DIALOG_CONSTRUCTED = 7;
|
|
||||||
const int TDN_VERIFICATION_CLICKED = 8;
|
|
||||||
const int TDN_HELP = 9;
|
|
||||||
const int TDN_EXPANDO_BUTTON_CLICKED = 10;
|
|
||||||
const int TDM_NAVIGATE_PAGE = 1125;
|
|
||||||
const int TDM_CLICK_BUTTON = 1126;
|
|
||||||
const int TDM_SET_MARQUEE_PROGRESS_BAR = 1127;
|
|
||||||
const int TDM_SET_PROGRESS_BAR_STATE = 1128;
|
|
||||||
const int TDM_SET_PROGRESS_BAR_RANGE = 1129;
|
|
||||||
const int TDM_SET_PROGRESS_BAR_POS = 1130;
|
|
||||||
const int TDM_SET_PROGRESS_BAR_MARQUEE = 1131;
|
|
||||||
const int TDM_SET_ELEMENT_TEXT = 1132;
|
|
||||||
const int TDM_CLICK_RADIO_BUTTON = 1134;
|
|
||||||
const int TDM_ENABLE_BUTTON = 1135;
|
|
||||||
const int TDM_ENABLE_RADIO_BUTTON = 1136;
|
|
||||||
const int TDM_CLICK_VERIFICATION = 1137;
|
|
||||||
const int TDM_UPDATE_ELEMENT_TEXT = 1138;
|
|
||||||
const int TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE = 1139;
|
|
||||||
const int TDM_UPDATE_ICON = 1140;
|
|
||||||
|
|
||||||
public TaskDialog()
|
|
||||||
{
|
|
||||||
IdValueDic = new Dictionary<int, T>();
|
|
||||||
IdTextDic = new Dictionary<int, string>();
|
|
||||||
CommandLinkShieldList = new List<int>();
|
|
||||||
Buttons = new List<TaskDialogNative.TASKDIALOG_BUTTON>();
|
|
||||||
RadioButtons = new List<TaskDialogNative.TASKDIALOG_BUTTON>();
|
|
||||||
_SelectedID = -1;
|
|
||||||
Config = new TaskDialogNative.TASKDIALOGCONFIG();
|
|
||||||
Config.cbSize = (uint)Marshal.SizeOf(Config);
|
|
||||||
Config.hwndParent = GetHandle();
|
|
||||||
Config.hInstance = IntPtr.Zero;
|
|
||||||
Config.dwFlags = TaskDialogNative.TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION;
|
|
||||||
Config.dwCommonButtons = MsgButtons.None;
|
|
||||||
Config.MainIcon = new TaskDialogNative.TASKDIALOGCONFIG_ICON_UNION(0);
|
|
||||||
Config.FooterIcon = new TaskDialogNative.TASKDIALOGCONFIG_ICON_UNION(0);
|
|
||||||
Config.cxWidth = 0U;
|
|
||||||
Config.cButtons = 0U;
|
|
||||||
Config.cRadioButtons = 0U;
|
|
||||||
Config.pButtons = IntPtr.Zero;
|
|
||||||
Config.pRadioButtons = IntPtr.Zero;
|
|
||||||
Config.nDefaultButton = 0;
|
|
||||||
Config.nDefaultRadioButton = 0;
|
|
||||||
Config.pszWindowTitle = ((AssemblyProductAttribute)Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), true)[0]).Product;
|
|
||||||
Config.pszMainInstruction = "";
|
|
||||||
Config.pszContent = "";
|
|
||||||
Config.pfCallback = new PFTASKDIALOGCALLBACK(this.DialogProc);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntPtr GetHandle()
|
|
||||||
{
|
|
||||||
StringBuilder lpszFileName = new StringBuilder(260);
|
|
||||||
IntPtr foregroundWindow = TaskDialogNative.GetForegroundWindow();
|
|
||||||
TaskDialogNative.GetWindowModuleFileName(foregroundWindow, lpszFileName, 260U);
|
|
||||||
|
|
||||||
if (Path.GetFileName(lpszFileName.ToString().Replace(".vshost", "")) ==
|
|
||||||
Path.GetFileName(Assembly.GetEntryAssembly().Location))
|
|
||||||
|
|
||||||
return foregroundWindow;
|
|
||||||
|
|
||||||
return IntPtr.Zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool AllowCancel {
|
|
||||||
set {
|
|
||||||
if (value)
|
|
||||||
Config.dwFlags |= TaskDialogNative.TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION;
|
|
||||||
else
|
|
||||||
Config.dwFlags ^= TaskDialogNative.TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string MainInstruction {
|
|
||||||
get => Config.pszMainInstruction;
|
|
||||||
set => Config.pszMainInstruction = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Content {
|
|
||||||
get => Config.pszContent;
|
|
||||||
set => Config.pszContent = ExpandMarkdownMarkup(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ExpandedInformation {
|
|
||||||
get => Config.pszExpandedInformation;
|
|
||||||
set => Config.pszExpandedInformation = ExpandMarkdownMarkup(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string VerificationText {
|
|
||||||
get => Config.pszVerificationText;
|
|
||||||
set => Config.pszVerificationText = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MsgResult DefaultButton {
|
|
||||||
get => (MsgResult)Config.nDefaultButton;
|
|
||||||
set => Config.nDefaultButton = (int)value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Footer {
|
|
||||||
get => Config.pszFooter;
|
|
||||||
set => Config.pszFooter = ExpandMarkdownMarkup(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MsgIcon MainIcon {
|
|
||||||
set => Config.MainIcon = new TaskDialogNative.TASKDIALOGCONFIG_ICON_UNION((int)value);
|
|
||||||
}
|
|
||||||
|
|
||||||
int _SelectedID;
|
|
||||||
|
|
||||||
public int SelectedID {
|
|
||||||
get => _SelectedID;
|
|
||||||
set {
|
|
||||||
foreach (var i in IdValueDic)
|
|
||||||
if (i.Key == value)
|
|
||||||
_SelectedID = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public T SelectedValue {
|
|
||||||
get {
|
|
||||||
if (IdValueDic.ContainsKey(SelectedID))
|
|
||||||
return IdValueDic[SelectedID];
|
|
||||||
|
|
||||||
return SelectedValueValue;
|
|
||||||
}
|
|
||||||
set => SelectedValueValue = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SelectedText {
|
|
||||||
get {
|
|
||||||
if (IdTextDic.ContainsKey(SelectedID))
|
|
||||||
return IdTextDic[SelectedID];
|
|
||||||
|
|
||||||
return SelectedTextValue;
|
|
||||||
}
|
|
||||||
set => SelectedTextValue = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool CheckBoxChecked {
|
|
||||||
get => (Config.dwFlags & TaskDialogNative.TASKDIALOG_FLAGS.TDF_VERIFICATION_FLAG_CHECKED)
|
|
||||||
== TaskDialogNative.TASKDIALOG_FLAGS.TDF_VERIFICATION_FLAG_CHECKED;
|
|
||||||
set {
|
|
||||||
if (value)
|
|
||||||
Config.dwFlags |= TaskDialogNative.TASKDIALOG_FLAGS.TDF_VERIFICATION_FLAG_CHECKED;
|
|
||||||
else
|
|
||||||
Config.dwFlags ^= TaskDialogNative.TASKDIALOG_FLAGS.TDF_VERIFICATION_FLAG_CHECKED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public MsgButtons CommonButtons {
|
|
||||||
get => Config.dwCommonButtons;
|
|
||||||
set => Config.dwCommonButtons = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Timeout {
|
|
||||||
get => Convert.ToInt32(TimeoutValue / 1000.0);
|
|
||||||
set {
|
|
||||||
TimeoutValue = value * 1000;
|
|
||||||
Config.dwFlags |= TaskDialogNative.TASKDIALOG_FLAGS.TDF_CALLBACK_TIMER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddButton(string text, T value)
|
|
||||||
{
|
|
||||||
int n = 1000 + IdValueDic.Count + 1;
|
|
||||||
IdValueDic[n] = value;
|
|
||||||
Buttons.Add(new TaskDialogNative.TASKDIALOG_BUTTON(n, text));
|
|
||||||
}
|
|
||||||
|
|
||||||
public string ExpandMarkdownMarkup(string value)
|
|
||||||
{
|
|
||||||
if (value.Contains("["))
|
|
||||||
{
|
|
||||||
Regex regex = new Regex(@"\[(.+)\]\((.+)\)");
|
|
||||||
|
|
||||||
if (regex.Match(value).Success)
|
|
||||||
{
|
|
||||||
Config.dwFlags |= TaskDialogNative.TASKDIALOG_FLAGS.TDF_ENABLE_HYPERLINKS;
|
|
||||||
value = regex.Replace(value, "<a href=\"$2\">$1</a>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCommand(string text)
|
|
||||||
{
|
|
||||||
object obj = text;
|
|
||||||
AddCommand(text, (T)obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCommand(string text, T value)
|
|
||||||
{
|
|
||||||
int n = 1000 + IdValueDic.Count + 1;
|
|
||||||
IdValueDic[n] = value;
|
|
||||||
IdTextDic[n] = text;
|
|
||||||
Buttons.Add(new TaskDialogNative.TASKDIALOG_BUTTON(n, text));
|
|
||||||
Config.dwFlags |= TaskDialogNative.TASKDIALOG_FLAGS.TDF_USE_COMMAND_LINKS;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCommand(string text, string description, T value, bool setShield = false)
|
|
||||||
{
|
|
||||||
int n = 1000 + IdValueDic.Count + 1;
|
|
||||||
IdValueDic[n] = value;
|
|
||||||
|
|
||||||
if (setShield)
|
|
||||||
CommandLinkShieldList.Add(n);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(description))
|
|
||||||
text += "\n" + description;
|
|
||||||
|
|
||||||
Buttons.Add(new TaskDialogNative.TASKDIALOG_BUTTON(n, text));
|
|
||||||
Config.dwFlags |= TaskDialogNative.TASKDIALOG_FLAGS.TDF_USE_COMMAND_LINKS;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddRadioButton(string text, T value)
|
|
||||||
{
|
|
||||||
int n = 1000 + IdValueDic.Count + 1;
|
|
||||||
IdValueDic[n] = value;
|
|
||||||
RadioButtons.Add(new TaskDialogNative.TASKDIALOG_BUTTON(n, text));
|
|
||||||
}
|
|
||||||
|
|
||||||
public T Show()
|
|
||||||
{
|
|
||||||
MarshalDialogControlStructs();
|
|
||||||
TaskDialogNative.TASKDIALOGCONFIG config = Config;
|
|
||||||
int hr = TaskDialogNative.TaskDialogIndirect(
|
|
||||||
config, out int dummy1, out int dummy2, out bool isChecked);
|
|
||||||
|
|
||||||
if (hr < 0)
|
|
||||||
Marshal.ThrowExceptionForHR(hr);
|
|
||||||
|
|
||||||
CheckBoxChecked = isChecked;
|
|
||||||
|
|
||||||
if (SelectedValue is MsgResult)
|
|
||||||
SelectedValue = (T)(object)SelectedID;
|
|
||||||
|
|
||||||
return SelectedValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int DialogProc(IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam, IntPtr lpRefData)
|
|
||||||
{
|
|
||||||
switch (msg)
|
|
||||||
{
|
|
||||||
case 0: //TDN_CREATED
|
|
||||||
foreach (var i in CommandLinkShieldList)
|
|
||||||
SendMessage(hwnd, TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, new IntPtr(i), new IntPtr(1));
|
|
||||||
break;
|
|
||||||
case 2: //TDN_BUTTON_CLICKED
|
|
||||||
case 6: //TDN_RADIO_BUTTON_CLICKED
|
|
||||||
if (SelectedValue is MsgResult)
|
|
||||||
_SelectedID = wParam.ToInt32();
|
|
||||||
else
|
|
||||||
SelectedID = wParam.ToInt32();
|
|
||||||
break;
|
|
||||||
case 3: //TDN_HYPERLINK_CLICKED
|
|
||||||
string stringUni = Marshal.PtrToStringUni(lParam);
|
|
||||||
|
|
||||||
if (stringUni.StartsWith("mailto") || stringUni.StartsWith("http"))
|
|
||||||
Process.Start(stringUni);
|
|
||||||
|
|
||||||
if (stringUni == "copymsg")
|
|
||||||
{
|
|
||||||
Thread thread = new Thread((ThreadStart)(() => {
|
|
||||||
Clipboard.SetText(MainInstruction + "\r\n\r\n" + Content + "\r\n\r\n" + ExpandedInformation);
|
|
||||||
MessageBox.Show("Message was copied to clipboard.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
||||||
}));
|
|
||||||
thread.SetApartmentState(ApartmentState.STA);
|
|
||||||
thread.Start();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4: //TDN_TIMER
|
|
||||||
if (ExitTickCount == 0) ExitTickCount = Environment.TickCount + Timeout * 1000;
|
|
||||||
if (Environment.TickCount > ExitTickCount)
|
|
||||||
TaskDialogNative.SendMessage(hwnd, 1126, new IntPtr(1), IntPtr.Zero);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MarshalDialogControlStructs()
|
|
||||||
{
|
|
||||||
if (Buttons != null && Buttons.Count > 0)
|
|
||||||
{
|
|
||||||
ButtonArray = AllocateAndMarshalButtons(Buttons);
|
|
||||||
Config.pButtons = ButtonArray;
|
|
||||||
Config.cButtons = (uint)Buttons.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RadioButtons == null || RadioButtons.Count <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
RadioButtonArray = AllocateAndMarshalButtons(RadioButtons);
|
|
||||||
Config.pRadioButtons = RadioButtonArray;
|
|
||||||
Config.cRadioButtons = (uint)RadioButtons.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IntPtr AllocateAndMarshalButtons(List<TASKDIALOG_BUTTON> structs)
|
|
||||||
{
|
|
||||||
var initialPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TASKDIALOG_BUTTON)) * structs.Count);
|
|
||||||
var currentPtr = initialPtr;
|
|
||||||
|
|
||||||
foreach (var button in structs)
|
|
||||||
{
|
|
||||||
Marshal.StructureToPtr(button, currentPtr, false);
|
|
||||||
currentPtr = (IntPtr)(currentPtr.ToInt64() + Marshal.SizeOf(button));
|
|
||||||
}
|
|
||||||
|
|
||||||
return initialPtr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Dispose(true);
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
~TaskDialog()
|
|
||||||
{
|
|
||||||
Dispose(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (Disposed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Disposed = true;
|
|
||||||
|
|
||||||
if (ButtonArray != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
Marshal.FreeHGlobal(ButtonArray);
|
|
||||||
ButtonArray = IntPtr.Zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RadioButtonArray != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
Marshal.FreeHGlobal(RadioButtonArray);
|
|
||||||
RadioButtonArray = IntPtr.Zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public delegate int PFTASKDIALOGCALLBACK(
|
|
||||||
IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam, IntPtr lpRefData);
|
|
||||||
|
|
||||||
public class TaskDialogNative
|
|
||||||
{
|
|
||||||
[DllImport("comctl32", CharSet = CharSet.Unicode, SetLastError = true)]
|
|
||||||
public static extern int TaskDialogIndirect(
|
|
||||||
TaskDialogNative.TASKDIALOGCONFIG pTaskConfig,
|
|
||||||
out int pnButton,
|
|
||||||
out int pnRadioButton,
|
|
||||||
out bool pVerificationFlagChecked);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
public static extern IntPtr GetForegroundWindow();
|
|
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
|
||||||
public static extern uint GetWindowModuleFileName(
|
|
||||||
IntPtr hwnd, StringBuilder lpszFileName, uint cchFileNameMax);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
public static extern IntPtr SendMessage(
|
|
||||||
IntPtr handle, int message, IntPtr wParam, IntPtr lParam);
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
|
|
||||||
public class TASKDIALOGCONFIG
|
|
||||||
{
|
|
||||||
public uint cbSize;
|
|
||||||
public IntPtr hwndParent;
|
|
||||||
public IntPtr hInstance;
|
|
||||||
public TaskDialogNative.TASKDIALOG_FLAGS dwFlags;
|
|
||||||
public MsgButtons dwCommonButtons;
|
|
||||||
public string pszWindowTitle;
|
|
||||||
public TaskDialogNative.TASKDIALOGCONFIG_ICON_UNION MainIcon;
|
|
||||||
public string pszMainInstruction;
|
|
||||||
public string pszContent;
|
|
||||||
public uint cButtons;
|
|
||||||
public IntPtr pButtons;
|
|
||||||
public int nDefaultButton;
|
|
||||||
public uint cRadioButtons;
|
|
||||||
public IntPtr pRadioButtons;
|
|
||||||
public int nDefaultRadioButton;
|
|
||||||
public string pszVerificationText;
|
|
||||||
public string pszExpandedInformation;
|
|
||||||
public string pszExpandedControlText;
|
|
||||||
public string pszCollapsedControlText;
|
|
||||||
public TaskDialogNative.TASKDIALOGCONFIG_ICON_UNION FooterIcon;
|
|
||||||
public string pszFooter;
|
|
||||||
public PFTASKDIALOGCALLBACK pfCallback;
|
|
||||||
public IntPtr lpCallbackData;
|
|
||||||
public uint cxWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum TASKDIALOG_FLAGS
|
|
||||||
{
|
|
||||||
NONE = 0,
|
|
||||||
TDF_ENABLE_HYPERLINKS = 1,
|
|
||||||
TDF_USE_HICON_MAIN = 2,
|
|
||||||
TDF_USE_HICON_FOOTER = 4,
|
|
||||||
TDF_ALLOW_DIALOG_CANCELLATION = 8,
|
|
||||||
TDF_USE_COMMAND_LINKS = 16,
|
|
||||||
TDF_USE_COMMAND_LINKS_NO_ICON = 32,
|
|
||||||
TDF_EXPAND_FOOTER_AREA = 64,
|
|
||||||
TDF_EXPANDED_BY_DEFAULT = 128,
|
|
||||||
TDF_VERIFICATION_FLAG_CHECKED = 256,
|
|
||||||
TDF_SHOW_PROGRESS_BAR = 512,
|
|
||||||
TDF_SHOW_MARQUEE_PROGRESS_BAR = 1024,
|
|
||||||
TDF_CALLBACK_TIMER = 2048,
|
|
||||||
TDF_POSITION_RELATIVE_TO_WINDOW = 4096,
|
|
||||||
TDF_RTL_LAYOUT = 8192,
|
|
||||||
TDF_NO_DEFAULT_RADIO_BUTTON = 16384,
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
|
|
||||||
public struct TASKDIALOGCONFIG_ICON_UNION
|
|
||||||
{
|
|
||||||
[FieldOffset(0)]
|
|
||||||
public int hMainIcon;
|
|
||||||
[FieldOffset(0)]
|
|
||||||
public int pszIcon;
|
|
||||||
[FieldOffset(0)]
|
|
||||||
public IntPtr spacer;
|
|
||||||
|
|
||||||
public TASKDIALOGCONFIG_ICON_UNION(int i)
|
|
||||||
{
|
|
||||||
this = new TaskDialogNative.TASKDIALOGCONFIG_ICON_UNION();
|
|
||||||
spacer = IntPtr.Zero;
|
|
||||||
pszIcon = 0;
|
|
||||||
hMainIcon = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
|
|
||||||
public struct TASKDIALOG_BUTTON
|
|
||||||
{
|
|
||||||
public int nButtonID;
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)]
|
|
||||||
public string pszButtonText;
|
|
||||||
|
|
||||||
public TASKDIALOG_BUTTON(int n, string txt)
|
|
||||||
{
|
|
||||||
this = new TaskDialogNative.TASKDIALOG_BUTTON();
|
|
||||||
nButtonID = n;
|
|
||||||
pszButtonText = txt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum MsgButtons
|
|
||||||
{
|
|
||||||
None = 0,
|
|
||||||
Ok = 1,
|
|
||||||
Yes = 2,
|
|
||||||
No = 4,
|
|
||||||
YesNo = 6,
|
|
||||||
Cancel = 8,
|
|
||||||
OkCancel = 9,
|
|
||||||
YesNoCancel = 14,
|
|
||||||
Retry = 16,
|
|
||||||
RetryCancel = 24,
|
|
||||||
Close = 32,
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum MsgResult
|
|
||||||
{
|
|
||||||
None,
|
|
||||||
OK,
|
|
||||||
Cancel,
|
|
||||||
Abort,
|
|
||||||
Retry,
|
|
||||||
Ignore,
|
|
||||||
Yes,
|
|
||||||
No,
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum MsgIcon
|
|
||||||
{
|
|
||||||
None = 0,
|
|
||||||
SecurityShieldGray = 65527,
|
|
||||||
SecuritySuccess = 65528,
|
|
||||||
SecurityError = 65529,
|
|
||||||
SecurityWarning = 65530,
|
|
||||||
SecurityShieldBlue = 65531,
|
|
||||||
Shield = 65532,
|
|
||||||
Info = 65533,
|
|
||||||
Error = 65534,
|
|
||||||
Warning = 65535,
|
|
||||||
}
|
|
||||||
@@ -34,7 +34,7 @@ if ($versionInfo.FilePrivatePart -eq 0)
|
|||||||
if ($LastExitCode) { throw $LastExitCode }
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
$targetDir = $tmpDir + "\mpv.net-$($versionInfo.FileVersion)-portable"
|
$targetDir = $tmpDir + "\mpv.net-$($versionInfo.FileVersion)-portable"
|
||||||
Copy-Item $PSScriptRoot\bin $targetDir -Recurse -Exclude System.Management.Automation.xml
|
Copy-Item $PSScriptRoot\bin $targetDir -Recurse -Exclude 'System.Management.Automation.xml', 'settings-directory.txt'
|
||||||
& $7z a -tzip -mx9 "$targetDir.zip" -r "$targetDir\*"
|
& $7z a -tzip -mx9 "$targetDir.zip" -r "$targetDir\*"
|
||||||
if ($LastExitCode) { throw $LastExitCode }
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ if ($versionInfo.FilePrivatePart -eq 0)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
$targetDir = "$tmpDir\mpv.net-$($versionInfo.FileVersion)-portable-beta"
|
$targetDir = "$tmpDir\mpv.net-$($versionInfo.FileVersion)-portable-beta"
|
||||||
Copy-Item $PSScriptRoot\bin $targetDir -Recurse -Exclude System.Management.Automation.xml
|
Copy-Item $PSScriptRoot\bin $targetDir -Recurse -Exclude 'System.Management.Automation.xml', 'settings-directory.txt'
|
||||||
& $7z a -t7z -mx9 "$targetDir.7z" -r "$targetDir\*"
|
& $7z a -t7z -mx9 "$targetDir.7z" -r "$targetDir\*"
|
||||||
if ($LastExitCode) { throw $LastExitCode }
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
UploadBeta "$targetDir.7z"
|
UploadBeta "$targetDir.7z"
|
||||||
|
|||||||
@@ -12,6 +12,11 @@ menu-highlight = #505050
|
|||||||
menu-border = #FFFFFF
|
menu-border = #FFFFFF
|
||||||
menu-checked = #5A5A5A
|
menu-checked = #5A5A5A
|
||||||
|
|
||||||
|
button-foreground = #DDDDDD
|
||||||
|
button-background = #505050
|
||||||
|
button-hover = #555555
|
||||||
|
button-border = #707070
|
||||||
|
|
||||||
|
|
||||||
[light]
|
[light]
|
||||||
|
|
||||||
@@ -25,3 +30,8 @@ menu-background = #DFDFDF
|
|||||||
menu-highlight = #BFBFBF
|
menu-highlight = #BFBFBF
|
||||||
menu-border = #6A6A6A
|
menu-border = #6A6A6A
|
||||||
menu-checked = #AAAAAA
|
menu-checked = #AAAAAA
|
||||||
|
|
||||||
|
button-foreground = #000000
|
||||||
|
button-background = #BBBBBB
|
||||||
|
button-hover = #CCCCCC
|
||||||
|
button-border = #6A6A6A
|
||||||
|
|||||||
63
src/Scripts/C-Sharp/delete-current-file.cs
Normal file
63
src/Scripts/C-Sharp/delete-current-file.cs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
|
||||||
|
// C# Script that deletes the current file
|
||||||
|
|
||||||
|
// In input.conf add:
|
||||||
|
|
||||||
|
// KP0 script-message delete-current-file ask #menu: Script > Delete current file > Ask
|
||||||
|
// KP1 script-message delete-current-file confirm #menu: Script > Delete current file > Confirm
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
using Microsoft.VisualBasic.FileIO;
|
||||||
|
|
||||||
|
using mpvnet;
|
||||||
|
|
||||||
|
class Script
|
||||||
|
{
|
||||||
|
string FileToDelete;
|
||||||
|
DateTime DeleteTime;
|
||||||
|
CorePlayer Core;
|
||||||
|
|
||||||
|
public Script()
|
||||||
|
{
|
||||||
|
Core = Global.Core;
|
||||||
|
Core.ClientMessage += ClientMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientMessage(string[] args)
|
||||||
|
{
|
||||||
|
if (args == null || args.Length != 2 || args[0] != "delete-current-file")
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (args[1] == "ask")
|
||||||
|
{
|
||||||
|
FileToDelete = Core.get_property_string("path");
|
||||||
|
DeleteTime = DateTime.Now;
|
||||||
|
Core.commandv("show-text", "Press 1 to delete file", "5000");
|
||||||
|
}
|
||||||
|
else if (args[1] == "confirm")
|
||||||
|
{
|
||||||
|
TimeSpan ts = DateTime.Now - DeleteTime;
|
||||||
|
string path = Core.get_property_string("path");
|
||||||
|
|
||||||
|
if (FileToDelete == path && ts.TotalSeconds < 5 && File.Exists(FileToDelete))
|
||||||
|
{
|
||||||
|
Core.command("playlist-remove current");
|
||||||
|
int pos = Core.get_property_int("playlist-pos");
|
||||||
|
|
||||||
|
if (pos == -1)
|
||||||
|
{
|
||||||
|
int count = Core.get_property_int("playlist-count");
|
||||||
|
|
||||||
|
if (count > 0)
|
||||||
|
Core.set_property_int("playlist-pos", count - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.Sleep(2000);
|
||||||
|
FileSystem.DeleteFile(FileToDelete, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,7 +11,7 @@ class Script
|
|||||||
{
|
{
|
||||||
string content = "ctrl+w script-message my-message-1 my-argument-1";
|
string content = "ctrl+w script-message my-message-1 my-argument-1";
|
||||||
string sectionName = Assembly.GetExecutingAssembly().GetName().Name;
|
string sectionName = Assembly.GetExecutingAssembly().GetName().Name;
|
||||||
Core core = Core.core;
|
CorePlayer core = Global.Core;
|
||||||
core.commandv("define-section", sectionName, content, "force");
|
core.commandv("define-section", sectionName, content, "force");
|
||||||
core.commandv("enable-section", sectionName);
|
core.commandv("enable-section", sectionName);
|
||||||
core.ClientMessage += ClientMessage;
|
core.ClientMessage += ClientMessage;
|
||||||
@@ -22,7 +22,7 @@ class Script
|
|||||||
switch (args[0])
|
switch (args[0])
|
||||||
{
|
{
|
||||||
case "my-message-1":
|
case "my-message-1":
|
||||||
Msg.Show(args[1]);
|
Msg.ShowInfo(args[1]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,16 +6,16 @@ using mpvnet;
|
|||||||
|
|
||||||
class Script
|
class Script
|
||||||
{
|
{
|
||||||
Core core;
|
CorePlayer Core;
|
||||||
|
|
||||||
public Script()
|
public Script()
|
||||||
{
|
{
|
||||||
core = Core.core;
|
Core = Global.Core;
|
||||||
core.observe_property_bool("fullscreen", FullscreenChange);
|
Core.observe_property_bool("fullscreen", FullscreenChange);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FullscreenChange(bool value)
|
void FullscreenChange(bool value)
|
||||||
{
|
{
|
||||||
core.commandv("show-text", "fullscreen: " + value);
|
Core.commandv("show-text", "fullscreen: " + value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,28 +8,28 @@ using mpvnet;
|
|||||||
|
|
||||||
class Script
|
class Script
|
||||||
{
|
{
|
||||||
MainForm Form;
|
MainForm MainForm;
|
||||||
Core core;
|
CorePlayer Core;
|
||||||
|
|
||||||
bool WasPlaying;
|
bool WasPlaying;
|
||||||
bool WasPaused;
|
bool WasPaused;
|
||||||
|
|
||||||
public Script()
|
public Script()
|
||||||
{
|
{
|
||||||
core = Core.core;
|
Core = Global.Core;
|
||||||
Form = MainForm.Instance;
|
MainForm = MainForm.Instance;
|
||||||
Form.Resize += Form_Resize;
|
MainForm.Resize += Form_Resize;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Form_Resize(object sender, EventArgs e)
|
void Form_Resize(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (Form.WindowState == FormWindowState.Minimized)
|
if (MainForm.WindowState == FormWindowState.Minimized)
|
||||||
{
|
{
|
||||||
WasPlaying = !core.get_property_bool("pause");
|
WasPlaying = !Core.get_property_bool("pause");
|
||||||
|
|
||||||
if (WasPlaying)
|
if (WasPlaying)
|
||||||
{
|
{
|
||||||
core.set_property_bool("pause", true, true);
|
Core.set_property_bool("pause", true, true);
|
||||||
WasPaused = true;
|
WasPaused = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,7 @@ class Script
|
|||||||
{
|
{
|
||||||
if (WasPaused)
|
if (WasPaused)
|
||||||
{
|
{
|
||||||
core.set_property_bool("pause", false, true);
|
Core.set_property_bool("pause", false, true);
|
||||||
WasPaused = false;
|
WasPaused = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
84
src/Scripts/C-Sharp/rate-file.cs
Normal file
84
src/Scripts/C-Sharp/rate-file.cs
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
|
||||||
|
// This script writes a rating to the filename of rated videos when mpv.net shuts down.
|
||||||
|
|
||||||
|
// In input.conf add:
|
||||||
|
|
||||||
|
// KP0 script-message rate-file 0 #menu: Extensions > Rating > 0stars
|
||||||
|
// KP1 script-message rate-file 1 #menu: Extensions > Rating > 1stars
|
||||||
|
// KP2 script-message rate-file 2 #menu: Extensions > Rating > 2stars
|
||||||
|
// KP3 script-message rate-file 3 #menu: Extensions > Rating > 3stars
|
||||||
|
// KP4 script-message rate-file 4 #menu: Extensions > Rating > 4stars
|
||||||
|
// KP5 script-message rate-file 5 #menu: Extensions > Rating > 5stars
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
using mpvnet;
|
||||||
|
|
||||||
|
class Script
|
||||||
|
{
|
||||||
|
// dictionory to store the filename and the rating
|
||||||
|
Dictionary<string, int> Dic = new Dictionary<string, int>();
|
||||||
|
CorePlayer Core;
|
||||||
|
|
||||||
|
public Script() // plugin initialization
|
||||||
|
{
|
||||||
|
Core = Global.Core;
|
||||||
|
Core.ClientMessage += ClientMessage; //handles keys defined in input.conf
|
||||||
|
Core.Shutdown += Shutdown; // handles MPV_EVENT_SHUTDOWN
|
||||||
|
}
|
||||||
|
|
||||||
|
// handles MPV_EVENT_SHUTDOWN
|
||||||
|
void Shutdown()
|
||||||
|
{
|
||||||
|
foreach (var i in Dic)
|
||||||
|
{
|
||||||
|
string filepath = i.Key;
|
||||||
|
int rating = i.Value;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath))
|
||||||
|
return;
|
||||||
|
|
||||||
|
string basename = Path.GetFileNameWithoutExtension(filepath);
|
||||||
|
|
||||||
|
for (int x = 0; x < 6; x++)
|
||||||
|
if (basename.Contains(" (" + x + "stars)"))
|
||||||
|
basename = basename.Replace(" (" + x + "stars)", "");
|
||||||
|
|
||||||
|
basename += " (" + rating + "stars)";
|
||||||
|
|
||||||
|
string newPath = Path.Combine(Path.GetDirectoryName(filepath),
|
||||||
|
basename + Path.GetExtension(filepath));
|
||||||
|
|
||||||
|
if (filepath.ToLower() != newPath.ToLower())
|
||||||
|
File.Move(filepath, newPath);
|
||||||
|
|
||||||
|
File.SetLastWriteTime(newPath, DateTime.Now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//handles keys defined in input.conf
|
||||||
|
void ClientMessage(string[] args)
|
||||||
|
{
|
||||||
|
if (args[0] != "rate-file")
|
||||||
|
return;
|
||||||
|
|
||||||
|
int rating;
|
||||||
|
|
||||||
|
if (int.TryParse(args[1], out rating))
|
||||||
|
{
|
||||||
|
string path = Core.get_property_string("path");
|
||||||
|
|
||||||
|
if (!File.Exists(path))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Dic[path] = rating;
|
||||||
|
Core.commandv("show-text", "Rating: " + rating);
|
||||||
|
}
|
||||||
|
else if (args[1] == "about")
|
||||||
|
MessageBox.Show("This extension writes a rating to the filename of rated videos when mpv.net shuts down.",
|
||||||
|
"Rating Extension");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,12 +8,12 @@ using System.Linq;
|
|||||||
class Script
|
class Script
|
||||||
{
|
{
|
||||||
MainForm MainForm;
|
MainForm MainForm;
|
||||||
Core core;
|
CorePlayer Core;
|
||||||
|
|
||||||
public Script()
|
public Script()
|
||||||
{
|
{
|
||||||
core = Core.core;
|
Core = Global.Core;
|
||||||
MainForm = mpvnet.MainForm.Instance;
|
MainForm = MainForm.Instance;
|
||||||
MainForm.ContextMenu.Opening += ContextMenu_Opening;
|
MainForm.ContextMenu.Opening += ContextMenu_Opening;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,13 +26,13 @@ class Script
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
menuItem.DropDownItems.Clear();
|
menuItem.DropDownItems.Clear();
|
||||||
var editionTracks = core.MediaTracks.Where(track => track.Type == "e");
|
var editionTracks = Core.MediaTracks.Where(track => track.Type == "e");
|
||||||
|
|
||||||
foreach (MediaTrack track in editionTracks)
|
foreach (MediaTrack track in editionTracks)
|
||||||
{
|
{
|
||||||
MenuItem mi = new MenuItem(track.Text);
|
MenuItem mi = new MenuItem(track.Text);
|
||||||
mi.Action = () => { core.commandv("set", "edition", track.ID.ToString()); };
|
mi.Action = () => { Core.commandv("set", "edition", track.ID.ToString()); };
|
||||||
mi.Checked = core.Edition == track.ID;
|
mi.Checked = Core.Edition == track.ID;
|
||||||
menuItem.DropDownItems.Add(mi);
|
menuItem.DropDownItems.Add(mi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@ using System.Windows.Data;
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Interop;
|
using System.Windows.Interop;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -107,7 +107,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
CommandItem item = ListView.SelectedItem as CommandItem;
|
CommandItem item = ListView.SelectedItem as CommandItem;
|
||||||
Close();
|
Close();
|
||||||
core.command(item.Command);
|
Core.command(item.Command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,7 @@ using System.Windows.Input;
|
|||||||
|
|
||||||
using DynamicGUI;
|
using DynamicGUI;
|
||||||
|
|
||||||
using static TaskDialog.Msg;
|
using static mpvnet.Global;
|
||||||
using static mpvnet.Core;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -28,11 +27,11 @@ namespace mpvnet
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
DataContext = this;
|
DataContext = this;
|
||||||
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
||||||
LoadConf(core.ConfPath);
|
LoadConf(Core.ConfPath);
|
||||||
LoadConf(App.ConfPath);
|
LoadConf(App.ConfPath);
|
||||||
LoadSettings();
|
LoadSettings();
|
||||||
InitialContent = GetCompareString();
|
InitialContent = GetCompareString();
|
||||||
SearchControl.Text = RegistryHelp.GetString("ConfigEditorSearch");
|
SearchControl.Text = RegistryHelp.GetString("config-editor-search");
|
||||||
FilterListBox.SelectedItem = SearchControl.Text.TrimEnd(':');
|
FilterListBox.SelectedItem = SearchControl.Text.TrimEnd(':');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,14 +68,14 @@ namespace mpvnet
|
|||||||
protected override void OnClosed(EventArgs e)
|
protected override void OnClosed(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnClosed(e);
|
base.OnClosed(e);
|
||||||
RegistryHelp.SetValue(App.RegPath, "ConfigEditorSearch", SearchControl.Text);
|
RegistryHelp.SetValue("config-editor-search", SearchControl.Text);
|
||||||
|
|
||||||
if (InitialContent == GetCompareString())
|
if (InitialContent == GetCompareString())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
File.WriteAllText(core.ConfPath, GetContent("mpv"));
|
File.WriteAllText(Core.ConfPath, GetContent("mpv"));
|
||||||
File.WriteAllText(App.ConfPath, GetContent("mpvnet"));
|
File.WriteAllText(App.ConfPath, GetContent("mpvnet"));
|
||||||
MsgInfo("Changes will be available on next mpv.net startup.");
|
Msg.ShowInfo("Changes will be available on next startup.");
|
||||||
}
|
}
|
||||||
|
|
||||||
string GetCompareString()
|
string GetCompareString()
|
||||||
@@ -291,25 +290,17 @@ namespace mpvnet
|
|||||||
SearchControl.Text = e.AddedItems[0] + ":";
|
SearchControl.Text = e.AddedItems[0] + ":";
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenSettingsTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
void OpenSettingsTextBlock_MouseUp(object sender, MouseButtonEventArgs e) =>
|
||||||
{
|
ProcessHelp.ShellExecute(Path.GetDirectoryName(Core.ConfPath));
|
||||||
ProcessHelp.ShellExecute(Path.GetDirectoryName(core.ConfPath));
|
|
||||||
}
|
|
||||||
|
|
||||||
void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e) =>
|
||||||
{
|
Msg.ShowInfo("mpv.conf Preview", GetContent("mpv"));
|
||||||
MsgInfo("mpv.conf Preview", GetContent("mpv"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e) =>
|
||||||
{
|
|
||||||
ProcessHelp.ShellExecute("https://mpv.io/manual/master/");
|
ProcessHelp.ShellExecute("https://mpv.io/manual/master/");
|
||||||
}
|
|
||||||
|
|
||||||
void SupportTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
void SupportTextBlock_MouseUp(object sender, MouseButtonEventArgs e) =>
|
||||||
{
|
|
||||||
ProcessHelp.ShellExecute("https://github.com/stax76/mpv.net#Support");
|
ProcessHelp.ShellExecute("https://github.com/stax76/mpv.net#Support");
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnKeyDown(KeyEventArgs e)
|
protected override void OnKeyDown(KeyEventArgs e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,13 +4,12 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
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.Interop;
|
using System.Windows.Interop;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -109,7 +108,7 @@ namespace mpvnet
|
|||||||
void Execute()
|
void Execute()
|
||||||
{
|
{
|
||||||
if (ListView.SelectedItem != null)
|
if (ListView.SelectedItem != null)
|
||||||
core.LoadFiles(new[] { ListView.SelectedItem as string }, true, Keyboard.Modifiers == ModifierKeys.Control);
|
Core.LoadFiles(new[] { ListView.SelectedItem as string }, true, Keyboard.Modifiers == ModifierKeys.Control);
|
||||||
|
|
||||||
Keyboard.Focus(FilterTextBox);
|
Keyboard.Focus(FilterTextBox);
|
||||||
}
|
}
|
||||||
@@ -142,7 +141,7 @@ namespace mpvnet
|
|||||||
Everything_GetResultFullPathName(i, sb, (uint)sb.Capacity);
|
Everything_GetResultFullPathName(i, sb, (uint)sb.Capacity);
|
||||||
string ext = sb.ToString().Ext();
|
string ext = sb.ToString().Ext();
|
||||||
|
|
||||||
if (Core.AudioTypes.Contains(ext) || Core.VideoTypes.Contains(ext) || Core.ImageTypes.Contains(ext))
|
if (CorePlayer.AudioTypes.Contains(ext) || CorePlayer.VideoTypes.Contains(ext) || CorePlayer.ImageTypes.Contains(ext))
|
||||||
items.Add(sb.ToString());
|
items.Add(sb.ToString());
|
||||||
|
|
||||||
if (items.Count > 100)
|
if (items.Count > 100)
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ using System.Windows.Controls;
|
|||||||
using System.Windows.Data;
|
using System.Windows.Data;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Global;
|
||||||
using static TaskDialog.Msg;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -38,7 +37,9 @@ namespace mpvnet
|
|||||||
if (SearchControl.SearchTextBox.Text == "?")
|
if (SearchControl.SearchTextBox.Text == "?")
|
||||||
{
|
{
|
||||||
SearchControl.SearchTextBox.Text = "";
|
SearchControl.SearchTextBox.Text = "";
|
||||||
MsgInfo("Filtering", "Reduce the filter scope with:\n\ni input\n\nm menu\n\nc command\n\nIf only one character is entered input search is performed.");
|
Msg.ShowInfo("Filtering",
|
||||||
|
"Reduce the filter scope with:\n\ni input\n\nm menu\n\nc command\n\n" +
|
||||||
|
"If only one character is entered input search is performed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +87,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
foreach (CommandItem i in CommandItem.Items)
|
foreach (CommandItem i in CommandItem.Items)
|
||||||
if (items.ContainsKey(i.Input) && i.Input != "")
|
if (items.ContainsKey(i.Input) && i.Input != "")
|
||||||
MsgInfo($"Duplicate found:\n\n{i.Input}: {i.Path}\n\n{items[i.Input].Input}: {items[i.Input].Path}\n\nPlease note that you can chain multiple commands in the same line by using a semicolon as separator.", "Duplicate Found");
|
Msg.ShowInfo($"Duplicate found:\n\n{i.Input}: {i.Path}\n\n{items[i.Input].Input}: {items[i.Input].Path}\n\nPlease note that you can chain multiple commands in the same line by using a semicolon as separator.", "Duplicate Found");
|
||||||
else
|
else
|
||||||
items[i.Input] = i;
|
items[i.Input] = i;
|
||||||
}
|
}
|
||||||
@@ -128,8 +129,8 @@ namespace mpvnet
|
|||||||
if (InitialInputConfContent == GetInputConfContent())
|
if (InitialInputConfContent == GetInputConfContent())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
File.WriteAllText(core.InputConfPath, GetInputConfContent());
|
File.WriteAllText(Core.InputConfPath, GetInputConfContent());
|
||||||
MsgInfo("Changes will be available on next mpv.net startup.");
|
Msg.ShowInfo("Changes will be available on next startup.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataGrid_PreviewCanExecute(object sender, CanExecuteRoutedEventArgs e)
|
void DataGrid_PreviewCanExecute(object sender, CanExecuteRoutedEventArgs e)
|
||||||
@@ -137,7 +138,7 @@ namespace mpvnet
|
|||||||
DataGrid grid = (DataGrid)sender;
|
DataGrid grid = (DataGrid)sender;
|
||||||
|
|
||||||
if (e.Command == DataGrid.DeleteCommand)
|
if (e.Command == DataGrid.DeleteCommand)
|
||||||
if (Msg.ShowQuestion($"Confirm to delete: {(grid.SelectedItem as CommandItem).Input} ({(grid.SelectedItem as CommandItem).Path})") != MsgResult.OK)
|
if (Msg.ShowQuestion($"Confirm to delete: {(grid.SelectedItem as CommandItem).Input} ({(grid.SelectedItem as CommandItem).Path})") != System.Windows.Forms.DialogResult.OK)
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ using System.Windows;
|
|||||||
using WinForms = System.Windows.Forms;
|
using WinForms = System.Windows.Forms;
|
||||||
|
|
||||||
using static StockIcon;
|
using static StockIcon;
|
||||||
using static TaskDialog.Msg;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -45,15 +44,16 @@ namespace mpvnet
|
|||||||
proc.WaitForExit();
|
proc.WaitForExit();
|
||||||
|
|
||||||
if (proc.ExitCode == 0)
|
if (proc.ExitCode == 0)
|
||||||
MsgInfo("File associations successfully created.");
|
Msg.ShowInfo("File associations successfully created.");
|
||||||
|
else
|
||||||
|
Msg.ShowError("Error creating file associations.");
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddVideo_Click(object sender, RoutedEventArgs e) => RegFileAssoc(Core.VideoTypes);
|
void AddVideo_Click(object sender, RoutedEventArgs e) => RegFileAssoc(CorePlayer.VideoTypes);
|
||||||
void AddAudio_Click(object sender, RoutedEventArgs e) => RegFileAssoc(Core.AudioTypes);
|
void AddAudio_Click(object sender, RoutedEventArgs e) => RegFileAssoc(CorePlayer.AudioTypes);
|
||||||
void AddImage_Click(object sender, RoutedEventArgs e) => RegFileAssoc(Core.ImageTypes);
|
void AddImage_Click(object sender, RoutedEventArgs e) => RegFileAssoc(CorePlayer.ImageTypes);
|
||||||
|
|
||||||
void RemoveFileAssociations_Click(object sender, RoutedEventArgs e)
|
void RemoveFileAssociations_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
|
||||||
using System.IO;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using System.Drawing;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
using static mpvnet.Core;
|
using static mpvnet.Native;
|
||||||
using static Native;
|
using static mpvnet.Global;
|
||||||
using static TaskDialog.Msg;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -35,61 +34,55 @@ namespace mpvnet
|
|||||||
public MainForm()
|
public MainForm()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
SetColors();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
object recent = RegistryHelp.GetValue(App.RegPath, "Recent");
|
object recent = RegistryHelp.GetValue("recent");
|
||||||
|
RecentFiles = recent is string[] r ? new List<string>(r) : new List<string>();
|
||||||
if (recent is string[] r)
|
|
||||||
RecentFiles = new List<string>(r);
|
|
||||||
else
|
|
||||||
RecentFiles = new List<string>();
|
|
||||||
|
|
||||||
Instance = this;
|
Instance = this;
|
||||||
Hwnd = Handle;
|
Hwnd = Handle;
|
||||||
ConsoleHelp.Padding = 60;
|
Core.Init();
|
||||||
core.Init();
|
|
||||||
|
|
||||||
core.Shutdown += Shutdown;
|
Core.Shutdown += Shutdown;
|
||||||
core.VideoSizeChanged += VideoSizeChanged;
|
Core.VideoSizeChanged += VideoSizeChanged;
|
||||||
core.ScaleWindow += ScaleWindow;
|
Core.ScaleWindow += ScaleWindow;
|
||||||
core.WindowScale += WindowScale;
|
Core.WindowScale += WindowScale;
|
||||||
core.FileLoaded += FileLoaded;
|
Core.FileLoaded += FileLoaded;
|
||||||
core.Idle += Idle;
|
Core.Idle += Idle;
|
||||||
core.Seek += () => UpdateProgressBar();
|
Core.Seek += () => UpdateProgressBar();
|
||||||
|
|
||||||
core.observe_property("window-maximized", PropChangeWindowMaximized);
|
Core.observe_property("window-maximized", PropChangeWindowMaximized);
|
||||||
core.observe_property("window-minimized", PropChangeWindowMinimized);
|
Core.observe_property("window-minimized", PropChangeWindowMinimized);
|
||||||
core.observe_property_bool("pause", PropChangePause);
|
Core.observe_property_bool("pause", PropChangePause);
|
||||||
core.observe_property_bool("fullscreen", PropChangeFullscreen);
|
Core.observe_property_bool("fullscreen", PropChangeFullscreen);
|
||||||
core.observe_property_bool("ontop", PropChangeOnTop);
|
Core.observe_property_bool("ontop", PropChangeOnTop);
|
||||||
core.observe_property_bool("border", PropChangeBorder);
|
Core.observe_property_bool("border", PropChangeBorder);
|
||||||
|
|
||||||
core.observe_property_string("sid", PropChangeSid);
|
Core.observe_property_string("sid", PropChangeSid);
|
||||||
core.observe_property_string("aid", PropChangeAid);
|
Core.observe_property_string("aid", PropChangeAid);
|
||||||
core.observe_property_string("vid", PropChangeVid);
|
Core.observe_property_string("vid", PropChangeVid);
|
||||||
|
|
||||||
core.observe_property_string("title", PropChangeTitle);
|
Core.observe_property_string("title", PropChangeTitle);
|
||||||
|
|
||||||
core.observe_property_int("edition", PropChangeEdition);
|
Core.observe_property_int("edition", PropChangeEdition);
|
||||||
|
|
||||||
if (core.GPUAPI != "vulkan")
|
if (Core.GPUAPI != "vulkan")
|
||||||
core.ProcessCommandLine(false);
|
Core.ProcessCommandLine(false);
|
||||||
|
|
||||||
AppDomain.CurrentDomain.UnhandledException += (sender, e) => App.ShowException(e.ExceptionObject);
|
AppDomain.CurrentDomain.UnhandledException += (sender, e) => App.ShowException(e.ExceptionObject);
|
||||||
Application.ThreadException += (sender, e) => App.ShowException(e.Exception);
|
Application.ThreadException += (sender, e) => App.ShowException(e.Exception);
|
||||||
|
|
||||||
Msg.SupportURL = "https://github.com/stax76/mpv.net#support";
|
|
||||||
|
|
||||||
TaskbarButtonCreatedMessage = RegisterWindowMessage("TaskbarButtonCreated");
|
TaskbarButtonCreatedMessage = RegisterWindowMessage("TaskbarButtonCreated");
|
||||||
|
|
||||||
ContextMenu = new ContextMenuStripEx(components);
|
ContextMenu = new ContextMenuStripEx(components);
|
||||||
ContextMenu.Opened += ContextMenu_Opened;
|
ContextMenu.Opened += ContextMenu_Opened;
|
||||||
ContextMenu.Opening += ContextMenu_Opening;
|
ContextMenu.Opening += ContextMenu_Opening;
|
||||||
|
|
||||||
if (core.Screen > -1)
|
if (Core.Screen > -1)
|
||||||
{
|
{
|
||||||
int targetIndex = core.Screen;
|
int targetIndex = Core.Screen;
|
||||||
Screen[] screens = Screen.AllScreens;
|
Screen[] screens = Screen.AllScreens;
|
||||||
|
|
||||||
if (targetIndex < 0)
|
if (targetIndex < 0)
|
||||||
@@ -104,19 +97,19 @@ namespace mpvnet
|
|||||||
Top = target.Y + (target.Height - Height) / 2;
|
Top = target.Y + (target.Height - Height) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!core.Border)
|
if (!Core.Border)
|
||||||
FormBorderStyle = FormBorderStyle.None;
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
|
|
||||||
int posX = RegistryHelp.GetInt("PosX");
|
int posX = RegistryHelp.GetInt("position-x");
|
||||||
int posY = RegistryHelp.GetInt("PosY");
|
int posY = RegistryHelp.GetInt("position-y");
|
||||||
|
|
||||||
if ((posX != 0 || posY != 0) && App.RememberPosition)
|
if ((posX != 0 || posY != 0) && App.RememberPosition)
|
||||||
{
|
{
|
||||||
Left = posX - Width / 2;
|
Left = posX - Width / 2;
|
||||||
Top = posY - Height / 2;
|
Top = posY - Height / 2;
|
||||||
|
|
||||||
int horizontal = RegistryHelp.GetInt("HorizontalLocation");
|
int horizontal = RegistryHelp.GetInt("location-horizontal");
|
||||||
int vertical = RegistryHelp.GetInt("VerticalLocation");
|
int vertical = RegistryHelp.GetInt("location-vertical");
|
||||||
|
|
||||||
if (horizontal == -1) Left = posX;
|
if (horizontal == -1) Left = posX;
|
||||||
if (horizontal == 1) Left = posX - Width;
|
if (horizontal == 1) Left = posX - Width;
|
||||||
@@ -124,13 +117,13 @@ namespace mpvnet
|
|||||||
if (vertical == 1) Top = posY - Height;
|
if (vertical == 1) Top = posY - Height;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (core.WindowMaximized)
|
if (Core.WindowMaximized)
|
||||||
{
|
{
|
||||||
SetFormPosAndSize(true);
|
SetFormPosAndSize(true);
|
||||||
WindowState = FormWindowState.Maximized;
|
WindowState = FormWindowState.Maximized;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (core.WindowMinimized)
|
if (Core.WindowMinimized)
|
||||||
{
|
{
|
||||||
SetFormPosAndSize(true);
|
SetFormPosAndSize(true);
|
||||||
WindowState = FormWindowState.Minimized;
|
WindowState = FormWindowState.Minimized;
|
||||||
@@ -145,7 +138,7 @@ namespace mpvnet
|
|||||||
void ScaleWindow(float scale) {
|
void ScaleWindow(float scale) {
|
||||||
BeginInvoke(new Action(() => {
|
BeginInvoke(new Action(() => {
|
||||||
int w = (int)(ClientSize.Width * scale);
|
int w = (int)(ClientSize.Width * scale);
|
||||||
int h = (int)Math.Ceiling(w * core.VideoSize.Height / (double)core.VideoSize.Width);
|
int h = (int)Math.Ceiling(w * Core.VideoSize.Height / (double)Core.VideoSize.Width);
|
||||||
SetSize(w, h, Screen.FromControl(this), false);
|
SetSize(w, h, Screen.FromControl(this), false);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -154,10 +147,10 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
BeginInvoke(new Action(() => {
|
BeginInvoke(new Action(() => {
|
||||||
SetSize(
|
SetSize(
|
||||||
(int)(core.VideoSize.Width * scale),
|
(int)(Core.VideoSize.Width * scale),
|
||||||
(int)Math.Ceiling(core.VideoSize.Height * scale),
|
(int)Math.Ceiling(Core.VideoSize.Height * scale),
|
||||||
Screen.FromControl(this), false);
|
Screen.FromControl(this), false);
|
||||||
core.command($"show-text \"window-scale {scale.ToString(CultureInfo.InvariantCulture)}\"");
|
Core.command($"show-text \"window-scale {scale.ToString(CultureInfo.InvariantCulture)}\"");
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,7 +185,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
void ContextMenu_Opening(object sender, CancelEventArgs e)
|
void ContextMenu_Opening(object sender, CancelEventArgs e)
|
||||||
{
|
{
|
||||||
lock (core.MediaTracks)
|
lock (Core.MediaTracks)
|
||||||
{
|
{
|
||||||
MenuItem trackMenuItem = FindMenuItem("Track");
|
MenuItem trackMenuItem = FindMenuItem("Track");
|
||||||
|
|
||||||
@@ -200,16 +193,16 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
trackMenuItem.DropDownItems.Clear();
|
trackMenuItem.DropDownItems.Clear();
|
||||||
|
|
||||||
MediaTrack[] audTracks = core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
MediaTrack[] audTracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
||||||
MediaTrack[] subTracks = core.MediaTracks.Where(track => track.Type == "s").ToArray();
|
MediaTrack[] subTracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray();
|
||||||
MediaTrack[] vidTracks = core.MediaTracks.Where(track => track.Type == "v").ToArray();
|
MediaTrack[] vidTracks = Core.MediaTracks.Where(track => track.Type == "v").ToArray();
|
||||||
MediaTrack[] ediTracks = core.MediaTracks.Where(track => track.Type == "e").ToArray();
|
MediaTrack[] ediTracks = Core.MediaTracks.Where(track => track.Type == "e").ToArray();
|
||||||
|
|
||||||
foreach (MediaTrack track in vidTracks)
|
foreach (MediaTrack track in vidTracks)
|
||||||
{
|
{
|
||||||
MenuItem mi = new MenuItem(track.Text);
|
MenuItem mi = new MenuItem(track.Text);
|
||||||
mi.Action = () => core.commandv("set", "vid", track.ID.ToString());
|
mi.Action = () => Core.commandv("set", "vid", track.ID.ToString());
|
||||||
mi.Checked = core.Vid == track.ID.ToString();
|
mi.Checked = Core.Vid == track.ID.ToString();
|
||||||
trackMenuItem.DropDownItems.Add(mi);
|
trackMenuItem.DropDownItems.Add(mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,8 +212,8 @@ namespace mpvnet
|
|||||||
foreach (MediaTrack track in audTracks)
|
foreach (MediaTrack track in audTracks)
|
||||||
{
|
{
|
||||||
MenuItem mi = new MenuItem(track.Text);
|
MenuItem mi = new MenuItem(track.Text);
|
||||||
mi.Action = () => core.commandv("set", "aid", track.ID.ToString());
|
mi.Action = () => Core.commandv("set", "aid", track.ID.ToString());
|
||||||
mi.Checked = core.Aid == track.ID.ToString();
|
mi.Checked = Core.Aid == track.ID.ToString();
|
||||||
trackMenuItem.DropDownItems.Add(mi);
|
trackMenuItem.DropDownItems.Add(mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,16 +223,16 @@ namespace mpvnet
|
|||||||
foreach (MediaTrack track in subTracks)
|
foreach (MediaTrack track in subTracks)
|
||||||
{
|
{
|
||||||
MenuItem mi = new MenuItem(track.Text);
|
MenuItem mi = new MenuItem(track.Text);
|
||||||
mi.Action = () => core.commandv("set", "sid", track.ID.ToString());
|
mi.Action = () => Core.commandv("set", "sid", track.ID.ToString());
|
||||||
mi.Checked = core.Sid == track.ID.ToString();
|
mi.Checked = Core.Sid == track.ID.ToString();
|
||||||
trackMenuItem.DropDownItems.Add(mi);
|
trackMenuItem.DropDownItems.Add(mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subTracks.Length > 0)
|
if (subTracks.Length > 0)
|
||||||
{
|
{
|
||||||
MenuItem mi = new MenuItem("S: No subtitles");
|
MenuItem mi = new MenuItem("S: No subtitles");
|
||||||
mi.Action = () => core.commandv("set", "sid", "no");
|
mi.Action = () => Core.commandv("set", "sid", "no");
|
||||||
mi.Checked = core.Sid == "no";
|
mi.Checked = Core.Sid == "no";
|
||||||
trackMenuItem.DropDownItems.Add(mi);
|
trackMenuItem.DropDownItems.Add(mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,14 +242,14 @@ namespace mpvnet
|
|||||||
foreach (MediaTrack track in ediTracks)
|
foreach (MediaTrack track in ediTracks)
|
||||||
{
|
{
|
||||||
MenuItem mi = new MenuItem(track.Text);
|
MenuItem mi = new MenuItem(track.Text);
|
||||||
mi.Action = () => core.commandv("set", "edition", track.ID.ToString());
|
mi.Action = () => Core.commandv("set", "edition", track.ID.ToString());
|
||||||
mi.Checked = core.Edition == track.ID;
|
mi.Checked = Core.Edition == track.ID;
|
||||||
trackMenuItem.DropDownItems.Add(mi);
|
trackMenuItem.DropDownItems.Add(mi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lock (core.Chapters)
|
lock (Core.Chapters)
|
||||||
{
|
{
|
||||||
MenuItem chaptersMenuItem = FindMenuItem("Chapters");
|
MenuItem chaptersMenuItem = FindMenuItem("Chapters");
|
||||||
|
|
||||||
@@ -264,11 +257,11 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
chaptersMenuItem.DropDownItems.Clear();
|
chaptersMenuItem.DropDownItems.Clear();
|
||||||
|
|
||||||
foreach (var pair in core.Chapters)
|
foreach (var pair in Core.Chapters)
|
||||||
{
|
{
|
||||||
MenuItem mi = new MenuItem(pair.Key);
|
MenuItem mi = new MenuItem(pair.Key);
|
||||||
mi.ShortcutKeyDisplayString = TimeSpan.FromSeconds(pair.Value).ToString().Substring(0, 8) + " ";
|
mi.ShortcutKeyDisplayString = TimeSpan.FromSeconds(pair.Value).ToString().Substring(0, 8) + " ";
|
||||||
mi.Action = () => core.commandv("seek", pair.Value.ToString(CultureInfo.InvariantCulture), "absolute");
|
mi.Action = () => Core.commandv("seek", pair.Value.ToString(CultureInfo.InvariantCulture), "absolute");
|
||||||
chaptersMenuItem.DropDownItems.Add(mi);
|
chaptersMenuItem.DropDownItems.Add(mi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -281,7 +274,7 @@ namespace mpvnet
|
|||||||
recent.DropDownItems.Clear();
|
recent.DropDownItems.Clear();
|
||||||
|
|
||||||
foreach (string path in RecentFiles)
|
foreach (string path in RecentFiles)
|
||||||
MenuItem.Add(recent.DropDownItems, path, () => core.LoadFiles(new[] { path }, true, Control.ModifierKeys.HasFlag(Keys.Control)));
|
MenuItem.Add(recent.DropDownItems, path, () => Core.LoadFiles(new[] { path }, true, Control.ModifierKeys.HasFlag(Keys.Control)));
|
||||||
|
|
||||||
recent.DropDownItems.Add(new ToolStripSeparator());
|
recent.DropDownItems.Add(new ToolStripSeparator());
|
||||||
MenuItem mi = new MenuItem("Clear List");
|
MenuItem mi = new MenuItem("Clear List");
|
||||||
@@ -295,12 +288,12 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
titles.DropDownItems.Clear();
|
titles.DropDownItems.Clear();
|
||||||
|
|
||||||
lock (core.BluRayTitles)
|
lock (Core.BluRayTitles)
|
||||||
{
|
{
|
||||||
List<(int Index, TimeSpan Len)> items = new List<(int Index, TimeSpan Len)>();
|
List<(int Index, TimeSpan Len)> items = new List<(int Index, TimeSpan Len)>();
|
||||||
|
|
||||||
for (int i = 0; i < core.BluRayTitles.Count; i++)
|
for (int i = 0; i < Core.BluRayTitles.Count; i++)
|
||||||
items.Add((i, core.BluRayTitles[i]));
|
items.Add((i, Core.BluRayTitles[i]));
|
||||||
|
|
||||||
var titleItems = items.OrderByDescending(item => item.Len)
|
var titleItems = items.OrderByDescending(item => item.Len)
|
||||||
.Take(20).OrderBy(item => item.Index);
|
.Take(20).OrderBy(item => item.Index);
|
||||||
@@ -308,7 +301,7 @@ namespace mpvnet
|
|||||||
foreach (var item in titleItems)
|
foreach (var item in titleItems)
|
||||||
if (item.Len != TimeSpan.Zero)
|
if (item.Len != TimeSpan.Zero)
|
||||||
MenuItem.Add(titles.DropDownItems, $"{item.Len} ({item.Index})",
|
MenuItem.Add(titles.DropDownItems, $"{item.Len} ({item.Index})",
|
||||||
() => core.SetBluRayTitle(item.Index));
|
() => Core.SetBluRayTitle(item.Index));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -341,7 +334,7 @@ namespace mpvnet
|
|||||||
if (WindowState != FormWindowState.Normal)
|
if (WindowState != FormWindowState.Normal)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (core.Fullscreen)
|
if (Core.Fullscreen)
|
||||||
{
|
{
|
||||||
CycleFullscreen(true);
|
CycleFullscreen(true);
|
||||||
return;
|
return;
|
||||||
@@ -349,14 +342,14 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
|
|
||||||
Screen screen = Screen.FromControl(this);
|
Screen screen = Screen.FromControl(this);
|
||||||
int autoFitHeight = Convert.ToInt32(screen.WorkingArea.Height * core.Autofit);
|
int autoFitHeight = Convert.ToInt32(screen.WorkingArea.Height * Core.Autofit);
|
||||||
|
|
||||||
if (core.VideoSize.Height == 0 || core.VideoSize.Width == 0 ||
|
if (Core.VideoSize.Height == 0 || Core.VideoSize.Width == 0 ||
|
||||||
core.VideoSize.Width / (float)core.VideoSize.Height < App.MinimumAspectRatio)
|
Core.VideoSize.Width / (float)Core.VideoSize.Height < App.MinimumAspectRatio)
|
||||||
|
|
||||||
core.VideoSize = new Size((int)(autoFitHeight * (16 / 9f)), autoFitHeight);
|
Core.VideoSize = new Size((int)(autoFitHeight * (16 / 9f)), autoFitHeight);
|
||||||
|
|
||||||
Size videoSize = core.VideoSize;
|
Size videoSize = Core.VideoSize;
|
||||||
|
|
||||||
int height = videoSize.Height;
|
int height = videoSize.Height;
|
||||||
int width = videoSize.Width;
|
int width = videoSize.Width;
|
||||||
@@ -364,7 +357,7 @@ namespace mpvnet
|
|||||||
if (App.StartSize == "previous")
|
if (App.StartSize == "previous")
|
||||||
App.StartSize = "height-session";
|
App.StartSize = "height-session";
|
||||||
|
|
||||||
if (core.WasInitialSizeSet)
|
if (Core.WasInitialSizeSet)
|
||||||
{
|
{
|
||||||
if (App.StartSize == "always")
|
if (App.StartSize == "always")
|
||||||
{
|
{
|
||||||
@@ -384,8 +377,8 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int savedHeight = RegistryHelp.GetInt("Height");
|
int savedHeight = RegistryHelp.GetInt("window-height");
|
||||||
int savedWidth = RegistryHelp.GetInt("Width");
|
int savedWidth = RegistryHelp.GetInt("window-width");
|
||||||
|
|
||||||
if (App.StartSize == "height-always" && savedHeight != 0)
|
if (App.StartSize == "height-always" && savedHeight != 0)
|
||||||
{
|
{
|
||||||
@@ -413,7 +406,7 @@ namespace mpvnet
|
|||||||
width = savedWidth;
|
width = savedWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
core.WasInitialSizeSet = true;
|
Core.WasInitialSizeSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetSize(width, height, screen, checkAutofit);
|
SetSize(width, height, screen, checkAutofit);
|
||||||
@@ -429,15 +422,15 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (checkAutofit)
|
if (checkAutofit)
|
||||||
{
|
{
|
||||||
if (height < maxHeight * core.AutofitSmaller)
|
if (height < maxHeight * Core.AutofitSmaller)
|
||||||
{
|
{
|
||||||
height = Convert.ToInt32(maxHeight * core.AutofitSmaller);
|
height = Convert.ToInt32(maxHeight * Core.AutofitSmaller);
|
||||||
width = Convert.ToInt32(height * startWidth / (double)startHeight);
|
width = Convert.ToInt32(height * startWidth / (double)startHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (height > maxHeight * core.AutofitLarger)
|
if (height > maxHeight * Core.AutofitLarger)
|
||||||
{
|
{
|
||||||
height = Convert.ToInt32(maxHeight * core.AutofitLarger);
|
height = Convert.ToInt32(maxHeight * Core.AutofitLarger);
|
||||||
width = Convert.ToInt32(height * startWidth / (double)startHeight);
|
width = Convert.ToInt32(height * startWidth / (double)startHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -493,7 +486,8 @@ namespace mpvnet
|
|||||||
if (top + rect.Height > maxBottom)
|
if (top + rect.Height > maxBottom)
|
||||||
top = maxBottom - rect.Height;
|
top = maxBottom - rect.Height;
|
||||||
|
|
||||||
SetWindowPos(Handle, IntPtr.Zero, left, top, rect.Width, rect.Height, 4);
|
uint SWP_NOACTIVATE = 0x0010;
|
||||||
|
SetWindowPos(Handle, IntPtr.Zero, left, top, rect.Width, rect.Height, SWP_NOACTIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int GetHorizontalLocation(Screen screen)
|
public int GetHorizontalLocation(Screen screen)
|
||||||
@@ -533,7 +527,7 @@ namespace mpvnet
|
|||||||
public void CycleFullscreen(bool enabled)
|
public void CycleFullscreen(bool enabled)
|
||||||
{
|
{
|
||||||
LastCycleFullscreen = Environment.TickCount;
|
LastCycleFullscreen = Environment.TickCount;
|
||||||
core.Fullscreen = enabled;
|
Core.Fullscreen = enabled;
|
||||||
|
|
||||||
if (enabled)
|
if (enabled)
|
||||||
{
|
{
|
||||||
@@ -560,7 +554,7 @@ namespace mpvnet
|
|||||||
else
|
else
|
||||||
WindowState = FormWindowState.Normal;
|
WindowState = FormWindowState.Normal;
|
||||||
|
|
||||||
if (core.Border)
|
if (Core.Border)
|
||||||
FormBorderStyle = FormBorderStyle.Sizable;
|
FormBorderStyle = FormBorderStyle.Sizable;
|
||||||
else
|
else
|
||||||
FormBorderStyle = FormBorderStyle.None;
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
@@ -573,7 +567,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
public void BuildMenu()
|
public void BuildMenu()
|
||||||
{
|
{
|
||||||
string content = File.ReadAllText(core.InputConfPath);
|
string content = File.ReadAllText(Core.InputConfPath);
|
||||||
var items = CommandItem.GetItems(content);
|
var items = CommandItem.GetItems(content);
|
||||||
|
|
||||||
if (!content.Contains("#menu:"))
|
if (!content.Contains("#menu:"))
|
||||||
@@ -595,7 +589,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
MenuItem menuItem = ContextMenu.Add(item.Path.Replace("&", "&&"), () => {
|
MenuItem menuItem = ContextMenu.Add(item.Path.Replace("&", "&&"), () => {
|
||||||
try {
|
try {
|
||||||
core.command(item.Command);
|
Core.command(item.Command);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Msg.ShowException(ex);
|
Msg.ShowException(ex);
|
||||||
}
|
}
|
||||||
@@ -608,12 +602,12 @@ namespace mpvnet
|
|||||||
|
|
||||||
void FileLoaded()
|
void FileLoaded()
|
||||||
{
|
{
|
||||||
string path = core.get_property_string("path");
|
string path = Core.get_property_string("path");
|
||||||
|
|
||||||
BeginInvoke(new Action(() => {
|
BeginInvoke(new Action(() => {
|
||||||
Text = core.expand(Title);
|
Text = Core.expand(Title);
|
||||||
|
|
||||||
int interval = (int)(core.Duration.TotalMilliseconds / 100);
|
int interval = (int)(Core.Duration.TotalMilliseconds / 100);
|
||||||
|
|
||||||
if (interval < 100)
|
if (interval < 100)
|
||||||
interval = 100;
|
interval = 100;
|
||||||
@@ -634,7 +628,7 @@ namespace mpvnet
|
|||||||
RecentFiles.RemoveAt(App.RecentCount);
|
RecentFiles.RemoveAt(App.RecentCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetTitle() => BeginInvoke(new Action(() => Text = core.expand(Title)));
|
void SetTitle() => BeginInvoke(new Action(() => Text = Core.expand(Title)));
|
||||||
|
|
||||||
void SaveWindowProperties()
|
void SaveWindowProperties()
|
||||||
{
|
{
|
||||||
@@ -642,8 +636,8 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
SavePosition();
|
SavePosition();
|
||||||
|
|
||||||
RegistryHelp.SetValue(App.RegPath, "Width", ClientSize.Width);
|
RegistryHelp.SetInt("window-width", ClientSize.Width);
|
||||||
RegistryHelp.SetValue(App.RegPath, "Height", ClientSize.Height);
|
RegistryHelp.SetInt("window-height", ClientSize.Height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -662,11 +656,11 @@ namespace mpvnet
|
|||||||
if (y == -1) posY = Top;
|
if (y == -1) posY = Top;
|
||||||
if (y == 1) posY = Top + Height;
|
if (y == 1) posY = Top + Height;
|
||||||
|
|
||||||
RegistryHelp.SetInt("PosX", posX);
|
RegistryHelp.SetInt("position-x", posX);
|
||||||
RegistryHelp.SetInt("PosY", posY);
|
RegistryHelp.SetInt("position-y", posY);
|
||||||
|
|
||||||
RegistryHelp.SetInt("HorizontalLocation", x);
|
RegistryHelp.SetInt("location-horizontal", x);
|
||||||
RegistryHelp.SetInt("VerticalLocation", y);
|
RegistryHelp.SetInt("location-vertical", y);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override CreateParams CreateParams {
|
protected override CreateParams CreateParams {
|
||||||
@@ -714,8 +708,8 @@ namespace mpvnet
|
|||||||
bool skip = m.Msg == 0x100 && LastAppCommand != 0 &&
|
bool skip = m.Msg == 0x100 && LastAppCommand != 0 &&
|
||||||
(Environment.TickCount - LastAppCommand) < 1000;
|
(Environment.TickCount - LastAppCommand) < 1000;
|
||||||
|
|
||||||
if (core.WindowHandle != IntPtr.Zero && !skip)
|
if (Core.WindowHandle != IntPtr.Zero && !skip)
|
||||||
m.Result = SendMessage(core.WindowHandle, m.Msg, m.WParam, m.LParam);
|
m.Result = SendMessage(Core.WindowHandle, m.Msg, m.WParam, m.LParam);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x319: // WM_APPCOMMAND
|
case 0x319: // WM_APPCOMMAND
|
||||||
@@ -724,7 +718,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (value != null)
|
if (value != null)
|
||||||
{
|
{
|
||||||
core.command("keypress " + value);
|
Core.command("keypress " + value);
|
||||||
m.Result = new IntPtr(1);
|
m.Result = new IntPtr(1);
|
||||||
LastAppCommand = Environment.TickCount;
|
LastAppCommand = Environment.TickCount;
|
||||||
return;
|
return;
|
||||||
@@ -738,7 +732,7 @@ namespace mpvnet
|
|||||||
if (Environment.TickCount - LastCycleFullscreen > 500)
|
if (Environment.TickCount - LastCycleFullscreen > 500)
|
||||||
{
|
{
|
||||||
Point pos = PointToClient(Cursor.Position);
|
Point pos = PointToClient(Cursor.Position);
|
||||||
core.command($"mouse {pos.X} {pos.Y}");
|
Core.command($"mouse {pos.X} {pos.Y}");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CursorHelp.IsPosDifferent(LastCursorPosition))
|
if (CursorHelp.IsPosDifferent(LastCursorPosition))
|
||||||
@@ -746,12 +740,12 @@ namespace mpvnet
|
|||||||
break;
|
break;
|
||||||
case 0x2a3: // WM_MOUSELEAVE
|
case 0x2a3: // WM_MOUSELEAVE
|
||||||
//osc won't auto hide after mouse left window in borderless mode
|
//osc won't auto hide after mouse left window in borderless mode
|
||||||
core.command($"mouse {ClientSize.Width / 2} {ClientSize.Height / 3}");
|
Core.command($"mouse {ClientSize.Width / 2} {ClientSize.Height / 3}");
|
||||||
break;
|
break;
|
||||||
case 0x203: // WM_LBUTTONDBLCLK
|
case 0x203: // WM_LBUTTONDBLCLK
|
||||||
{
|
{
|
||||||
Point pos = PointToClient(Cursor.Position);
|
Point pos = PointToClient(Cursor.Position);
|
||||||
core.command($"mouse {pos.X} {pos.Y} 0 double");
|
Core.command($"mouse {pos.X} {pos.Y} 0 double");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x02E0: // WM_DPICHANGED
|
case 0x02E0: // WM_DPICHANGED
|
||||||
@@ -770,7 +764,7 @@ namespace mpvnet
|
|||||||
SubtractWindowBorders(Handle, ref r, GetDPI(Handle));
|
SubtractWindowBorders(Handle, ref r, GetDPI(Handle));
|
||||||
|
|
||||||
int c_w = r.Right - r.Left, c_h = r.Bottom - r.Top;
|
int c_w = r.Right - r.Left, c_h = r.Bottom - r.Top;
|
||||||
Size videoSize = core.VideoSize;
|
Size videoSize = Core.VideoSize;
|
||||||
|
|
||||||
if (videoSize == Size.Empty)
|
if (videoSize == Size.Empty)
|
||||||
videoSize = new Size(16, 9);
|
videoSize = new Size(16, 9);
|
||||||
@@ -800,14 +794,14 @@ namespace mpvnet
|
|||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case "single":
|
case "single":
|
||||||
core.LoadFiles(args, true, ModifierKeys.HasFlag(Keys.Control));
|
Core.LoadFiles(args, true, ModifierKeys.HasFlag(Keys.Control));
|
||||||
break;
|
break;
|
||||||
case "queue":
|
case "queue":
|
||||||
foreach (string file in args)
|
foreach (string file in args)
|
||||||
core.commandv("loadfile", file, "append");
|
Core.commandv("loadfile", file, "append");
|
||||||
break;
|
break;
|
||||||
case "command":
|
case "command":
|
||||||
core.command(args[0]);
|
Core.command(args[0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -816,7 +810,7 @@ namespace mpvnet
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.Msg == TaskbarButtonCreatedMessage && core.TaskbarProgress)
|
if (m.Msg == TaskbarButtonCreatedMessage && Core.TaskbarProgress)
|
||||||
{
|
{
|
||||||
Taskbar = new Taskbar(Handle);
|
Taskbar = new Taskbar(Handle);
|
||||||
ProgressTimer.Start();
|
ProgressTimer.Start();
|
||||||
@@ -845,21 +839,21 @@ namespace mpvnet
|
|||||||
|
|
||||||
void UpdateProgressBar()
|
void UpdateProgressBar()
|
||||||
{
|
{
|
||||||
if (core.TaskbarProgress && Taskbar != null)
|
if (Core.TaskbarProgress && Taskbar != null)
|
||||||
Taskbar.SetValue(core.get_property_number("time-pos"), core.Duration.TotalSeconds);
|
Taskbar.SetValue(Core.get_property_number("time-pos"), Core.Duration.TotalSeconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PropChangeOnTop(bool value) => BeginInvoke(new Action(() => TopMost = value));
|
void PropChangeOnTop(bool value) => BeginInvoke(new Action(() => TopMost = value));
|
||||||
|
|
||||||
void PropChangeAid(string value) => core.Aid = value;
|
void PropChangeAid(string value) => Core.Aid = value;
|
||||||
|
|
||||||
void PropChangeSid(string value) => core.Sid = value;
|
void PropChangeSid(string value) => Core.Sid = value;
|
||||||
|
|
||||||
void PropChangeVid(string value) => core.Vid = value;
|
void PropChangeVid(string value) => Core.Vid = value;
|
||||||
|
|
||||||
void PropChangeTitle(string value) { Title = value; SetTitle(); }
|
void PropChangeTitle(string value) { Title = value; SetTitle(); }
|
||||||
|
|
||||||
void PropChangeEdition(int value) => core.Edition = value;
|
void PropChangeEdition(int value) => Core.Edition = value;
|
||||||
|
|
||||||
void PropChangeWindowMaximized()
|
void PropChangeWindowMaximized()
|
||||||
{
|
{
|
||||||
@@ -868,11 +862,11 @@ namespace mpvnet
|
|||||||
|
|
||||||
BeginInvoke(new Action(() =>
|
BeginInvoke(new Action(() =>
|
||||||
{
|
{
|
||||||
core.WindowMaximized = core.get_property_bool("window-maximized");
|
Core.WindowMaximized = Core.get_property_bool("window-maximized");
|
||||||
|
|
||||||
if (core.WindowMaximized && WindowState != FormWindowState.Maximized)
|
if (Core.WindowMaximized && WindowState != FormWindowState.Maximized)
|
||||||
WindowState = FormWindowState.Maximized;
|
WindowState = FormWindowState.Maximized;
|
||||||
else if (!core.WindowMaximized && WindowState == FormWindowState.Maximized)
|
else if (!Core.WindowMaximized && WindowState == FormWindowState.Maximized)
|
||||||
WindowState = FormWindowState.Normal;
|
WindowState = FormWindowState.Normal;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -884,25 +878,25 @@ namespace mpvnet
|
|||||||
|
|
||||||
BeginInvoke(new Action(() =>
|
BeginInvoke(new Action(() =>
|
||||||
{
|
{
|
||||||
core.WindowMinimized = core.get_property_bool("window-minimized");
|
Core.WindowMinimized = Core.get_property_bool("window-minimized");
|
||||||
|
|
||||||
if (core.WindowMinimized && WindowState != FormWindowState.Minimized)
|
if (Core.WindowMinimized && WindowState != FormWindowState.Minimized)
|
||||||
WindowState = FormWindowState.Minimized;
|
WindowState = FormWindowState.Minimized;
|
||||||
else if (!core.WindowMinimized && WindowState == FormWindowState.Minimized)
|
else if (!Core.WindowMinimized && WindowState == FormWindowState.Minimized)
|
||||||
WindowState = FormWindowState.Normal;
|
WindowState = FormWindowState.Normal;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PropChangeBorder(bool enabled) {
|
void PropChangeBorder(bool enabled) {
|
||||||
core.Border = enabled;
|
Core.Border = enabled;
|
||||||
|
|
||||||
BeginInvoke(new Action(() => {
|
BeginInvoke(new Action(() => {
|
||||||
if (!IsFullscreen)
|
if (!IsFullscreen)
|
||||||
{
|
{
|
||||||
if (core.Border && FormBorderStyle == FormBorderStyle.None)
|
if (Core.Border && FormBorderStyle == FormBorderStyle.None)
|
||||||
FormBorderStyle = FormBorderStyle.Sizable;
|
FormBorderStyle = FormBorderStyle.Sizable;
|
||||||
|
|
||||||
if (!core.Border && FormBorderStyle == FormBorderStyle.Sizable)
|
if (!Core.Border && FormBorderStyle == FormBorderStyle.Sizable)
|
||||||
FormBorderStyle = FormBorderStyle.None;
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
@@ -910,7 +904,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
void PropChangePause(bool enabled)
|
void PropChangePause(bool enabled)
|
||||||
{
|
{
|
||||||
if (Taskbar != null && core.TaskbarProgress)
|
if (Taskbar != null && Core.TaskbarProgress)
|
||||||
{
|
{
|
||||||
if (enabled)
|
if (enabled)
|
||||||
Taskbar.SetState(TaskbarStates.Paused);
|
Taskbar.SetState(TaskbarStates.Paused);
|
||||||
@@ -923,44 +917,13 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
base.OnLoad(e);
|
base.OnLoad(e);
|
||||||
|
|
||||||
if (core.GPUAPI != "vulkan")
|
if (Core.GPUAPI != "vulkan")
|
||||||
core.VideoSizeAutoResetEvent.WaitOne(App.StartThreshold);
|
Core.VideoSizeAutoResetEvent.WaitOne(App.StartThreshold);
|
||||||
|
|
||||||
LastCycleFullscreen = Environment.TickCount;
|
LastCycleFullscreen = Environment.TickCount;
|
||||||
SetFormPosAndSize();
|
SetFormPosAndSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnShown(EventArgs e)
|
|
||||||
{
|
|
||||||
base.OnShown(e);
|
|
||||||
|
|
||||||
if (WindowState == FormWindowState.Maximized)
|
|
||||||
core.set_property_bool("window-maximized", true);
|
|
||||||
|
|
||||||
if (core.GPUAPI == "vulkan")
|
|
||||||
core.ProcessCommandLine(false);
|
|
||||||
|
|
||||||
ToolStripRendererEx.ForegroundColor = Theme.Current.GetWinFormsColor("menu-foreground");
|
|
||||||
ToolStripRendererEx.BackgroundColor = Theme.Current.GetWinFormsColor("menu-background");
|
|
||||||
ToolStripRendererEx.SelectionColor = Theme.Current.GetWinFormsColor("menu-highlight");
|
|
||||||
ToolStripRendererEx.BorderColor = Theme.Current.GetWinFormsColor("menu-border");
|
|
||||||
ToolStripRendererEx.CheckedColor = Theme.Current.GetWinFormsColor("menu-checked");
|
|
||||||
|
|
||||||
BuildMenu();
|
|
||||||
ContextMenuStrip = ContextMenu;
|
|
||||||
WPF.Init();
|
|
||||||
System.Windows.Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
|
|
||||||
Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);
|
|
||||||
UpdateCheck.DailyCheck();
|
|
||||||
core.LoadScripts();
|
|
||||||
GlobalHotkey.RegisterGlobalHotkeys(Handle);
|
|
||||||
App.RunTask(() => App.Extension = new Extension());
|
|
||||||
CSharpScriptHost.ExecuteScriptsInFolder(core.ConfigFolder + "scripts-cs");
|
|
||||||
ShownTickCount = Environment.TickCount;
|
|
||||||
App.ShowSetup();
|
|
||||||
MsgError("aaaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbb");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnActivated(EventArgs e)
|
protected override void OnActivated(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnActivated(e);
|
base.OnActivated(e);
|
||||||
@@ -968,12 +931,49 @@ namespace mpvnet
|
|||||||
SendMessage(Handle, m.Msg, m.WParam, m.LParam);
|
SendMessage(Handle, m.Msg, m.WParam, m.LParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnShown(EventArgs e)
|
||||||
|
{
|
||||||
|
base.OnShown(e);
|
||||||
|
|
||||||
|
if (WindowState == FormWindowState.Maximized)
|
||||||
|
Core.set_property_bool("window-maximized", true);
|
||||||
|
|
||||||
|
if (Core.GPUAPI == "vulkan")
|
||||||
|
Core.ProcessCommandLine(false);
|
||||||
|
|
||||||
|
BuildMenu();
|
||||||
|
ContextMenuStrip = ContextMenu;
|
||||||
|
WPF.Init();
|
||||||
|
System.Windows.Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
|
||||||
|
Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);
|
||||||
|
UpdateCheck.DailyCheck();
|
||||||
|
Core.LoadScripts();
|
||||||
|
GlobalHotkey.RegisterGlobalHotkeys(Handle);
|
||||||
|
App.RunTask(() => App.Extension = new Extension());
|
||||||
|
CSharpScriptHost.ExecuteScriptsInFolder(Core.ConfigFolder + "scripts-cs");
|
||||||
|
ShownTickCount = Environment.TickCount;
|
||||||
|
App.ShowSetup();
|
||||||
|
|
||||||
|
//if (Debugger.IsAttached)
|
||||||
|
//{
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetColors()
|
||||||
|
{
|
||||||
|
ToolStripRendererEx.ForegroundColor = Theme.Current.GetWinFormsColor("menu-foreground");
|
||||||
|
ToolStripRendererEx.BackgroundColor = Theme.Current.GetWinFormsColor("menu-background");
|
||||||
|
ToolStripRendererEx.SelectionColor = Theme.Current.GetWinFormsColor("menu-highlight");
|
||||||
|
ToolStripRendererEx.BorderColor = Theme.Current.GetWinFormsColor("menu-border");
|
||||||
|
ToolStripRendererEx.CheckedColor = Theme.Current.GetWinFormsColor("menu-checked");
|
||||||
|
}
|
||||||
|
|
||||||
protected override void OnResize(EventArgs e)
|
protected override void OnResize(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnResize(e);
|
base.OnResize(e);
|
||||||
|
|
||||||
if (core.IsLogoVisible)
|
if (Core.IsLogoVisible)
|
||||||
core.ShowLogo();
|
Core.ShowLogo();
|
||||||
|
|
||||||
if (FormBorderStyle != FormBorderStyle.None)
|
if (FormBorderStyle != FormBorderStyle.None)
|
||||||
{
|
{
|
||||||
@@ -987,16 +987,16 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (WindowState == FormWindowState.Minimized)
|
if (WindowState == FormWindowState.Minimized)
|
||||||
{
|
{
|
||||||
core.set_property_bool("window-minimized", true);
|
Core.set_property_bool("window-minimized", true);
|
||||||
}
|
}
|
||||||
else if (WindowState == FormWindowState.Normal)
|
else if (WindowState == FormWindowState.Normal)
|
||||||
{
|
{
|
||||||
core.set_property_bool("window-maximized", false);
|
Core.set_property_bool("window-maximized", false);
|
||||||
core.set_property_bool("window-minimized", false);
|
Core.set_property_bool("window-minimized", false);
|
||||||
}
|
}
|
||||||
else if (WindowState == FormWindowState.Maximized)
|
else if (WindowState == FormWindowState.Maximized)
|
||||||
{
|
{
|
||||||
core.set_property_bool("window-maximized", true);
|
Core.set_property_bool("window-maximized", true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1005,12 +1005,12 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
base.OnFormClosing(e);
|
base.OnFormClosing(e);
|
||||||
SaveWindowProperties();
|
SaveWindowProperties();
|
||||||
RegistryHelp.SetValue(App.RegPath, "Recent", RecentFiles.ToArray());
|
RegistryHelp.SetValue("recent", RecentFiles.ToArray());
|
||||||
|
|
||||||
if (core.IsQuitNeeded)
|
if (Core.IsQuitNeeded)
|
||||||
core.commandv("quit");
|
Core.commandv("quit");
|
||||||
|
|
||||||
if (!core.ShutdownAutoResetEvent.WaitOne(10000))
|
if (!Core.ShutdownAutoResetEvent.WaitOne(10000))
|
||||||
Msg.ShowError("Shutdown thread failed to complete within 10 seconds.");
|
Msg.ShowError("Shutdown thread failed to complete within 10 seconds.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1027,7 +1027,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Width - e.Location.X < 10 && e.Location.Y < 10)
|
if (Width - e.Location.X < 10 && e.Location.Y < 10)
|
||||||
core.commandv("quit");
|
Core.commandv("quit");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnDragEnter(DragEventArgs e)
|
protected override void OnDragEnter(DragEventArgs e)
|
||||||
@@ -1043,10 +1043,10 @@ namespace mpvnet
|
|||||||
base.OnDragDrop(e);
|
base.OnDragDrop(e);
|
||||||
|
|
||||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||||
core.LoadFiles(e.Data.GetData(DataFormats.FileDrop) as String[], true, Control.ModifierKeys.HasFlag(Keys.Control));
|
Core.LoadFiles(e.Data.GetData(DataFormats.FileDrop) as String[], true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||||
|
|
||||||
if (e.Data.GetDataPresent(DataFormats.Text))
|
if (e.Data.GetDataPresent(DataFormats.Text))
|
||||||
core.LoadFiles(new[] { e.Data.GetData(DataFormats.Text).ToString() }, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
Core.LoadFiles(new[] { e.Data.GetData(DataFormats.Text).ToString() }, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnLostFocus(EventArgs e)
|
protected override void OnLostFocus(EventArgs e)
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
|
|
||||||
Imports System.Drawing
|
|
||||||
Imports System.Drawing.Drawing2D
|
|
||||||
Imports System.Windows.Forms
|
|
||||||
Imports System.Windows.Forms.VisualStyles
|
|
||||||
|
|
||||||
Public Class CheckBoxRendererEx
|
|
||||||
Public Shared Sub DrawCheckBox(g As Graphics, glyphLocation As Point, state As CheckBoxState)
|
|
||||||
DrawCheckBox(g, New Rectangle(glyphLocation, GetGlyphSize(g, state)), state)
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Public Shared Sub DrawCheckBox(g As Graphics, rect As Rectangle, state As CheckBoxState)
|
|
||||||
'Dim smoothingModeBackup = g.SmoothingMode
|
|
||||||
'g.SmoothingMode = SmoothingMode.AntiAlias
|
|
||||||
|
|
||||||
'If ThemeManager.CurrentTheme.UsesSystemColors OrElse DesignHelp.IsDesignMode Then
|
|
||||||
' CheckBoxRenderer.DrawCheckBox(g, rect.Location, state)
|
|
||||||
' Return
|
|
||||||
'End If
|
|
||||||
|
|
||||||
'Dim theme = ThemeManager.CurrentTheme.General.Controls.CheckBox
|
|
||||||
'Dim checked = state = CheckBoxState.CheckedDisabled OrElse state = CheckBoxState.CheckedHot OrElse state = CheckBoxState.CheckedNormal OrElse state = CheckBoxState.CheckedPressed
|
|
||||||
'Dim backColor = If(checked, theme.BoxCheckedColor, theme.BoxColor)
|
|
||||||
'Dim borderColor = If(checked, theme.BorderCheckedColor, theme.BorderColor)
|
|
||||||
'Dim borderStrength = 2
|
|
||||||
'Dim checkmarkColor = theme.CheckmarkColor
|
|
||||||
'Dim checkmarkStrength = rect.Width \ 5
|
|
||||||
|
|
||||||
'Select Case state
|
|
||||||
' Case CheckBoxState.CheckedNormal
|
|
||||||
' Using brush As New SolidBrush(backColor)
|
|
||||||
' Using pen As New Pen(borderColor, borderStrength)
|
|
||||||
' g.FillRectangle(brush, rect)
|
|
||||||
' g.DrawRectangle(pen, rect)
|
|
||||||
' End Using
|
|
||||||
' End Using
|
|
||||||
|
|
||||||
' Dim startX1 = rect.Left + rect.Width / 4.5F
|
|
||||||
' Dim startY1 = rect.Top + rect.Height / 2.75F
|
|
||||||
' Dim endX1 = rect.Left + rect.Width / 3.0F
|
|
||||||
' Dim endY1 = rect.Top + rect.Height / 1.2F
|
|
||||||
|
|
||||||
' Dim startX2 = rect.Left + rect.Width / 3.6F
|
|
||||||
' Dim startY2 = rect.Top + rect.Height / 1.3F
|
|
||||||
' Dim endX2 = rect.Left + rect.Width / 1.2F
|
|
||||||
' Dim endY2 = rect.Top + rect.Height / 5.0F
|
|
||||||
|
|
||||||
' Using pen As New Pen(checkmarkColor, checkmarkStrength)
|
|
||||||
' g.DrawLine(pen, startX1, startY1, endX1, endY1)
|
|
||||||
' g.DrawLine(pen, startX2, startY2, endX2, endY2)
|
|
||||||
' End Using
|
|
||||||
|
|
||||||
' Case CheckBoxState.UncheckedNormal
|
|
||||||
' Using brush As New SolidBrush(backColor)
|
|
||||||
' Using pen As New Pen(borderColor, borderStrength)
|
|
||||||
' g.FillRectangle(brush, rect)
|
|
||||||
' g.DrawRectangle(pen, rect)
|
|
||||||
' End Using
|
|
||||||
' End Using
|
|
||||||
'End Select
|
|
||||||
|
|
||||||
'g.SmoothingMode = smoothingModeBackup
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Shared Function GetGlyphSize(g As Graphics, state As CheckBoxState) As Size
|
|
||||||
Dim defaultSize = CheckBoxRenderer.GetGlyphSize(g, state)
|
|
||||||
Dim uiSize = New Size(CInt(defaultSize.Width), CInt(defaultSize.Height))
|
|
||||||
Return uiSize
|
|
||||||
End Function
|
|
||||||
End Class
|
|
||||||
@@ -1,164 +0,0 @@
|
|||||||
Imports System.Drawing
|
|
||||||
|
|
||||||
<Serializable>
|
|
||||||
Public Structure ColorHSL
|
|
||||||
Private ReadOnly _h As Integer
|
|
||||||
Private ReadOnly _s As Single
|
|
||||||
Private ReadOnly _l As Single
|
|
||||||
Private ReadOnly _a As Single
|
|
||||||
|
|
||||||
|
|
||||||
Public ReadOnly Property H As Integer
|
|
||||||
Get
|
|
||||||
Return _h
|
|
||||||
End Get
|
|
||||||
End Property
|
|
||||||
|
|
||||||
Public ReadOnly Property S As Single
|
|
||||||
Get
|
|
||||||
Return _s
|
|
||||||
End Get
|
|
||||||
End Property
|
|
||||||
|
|
||||||
Public ReadOnly Property L As Single
|
|
||||||
Get
|
|
||||||
Return _l
|
|
||||||
End Get
|
|
||||||
End Property
|
|
||||||
|
|
||||||
Public ReadOnly Property A As Single
|
|
||||||
Get
|
|
||||||
Return _a
|
|
||||||
End Get
|
|
||||||
End Property
|
|
||||||
|
|
||||||
Public Sub New(h As Integer, s As Single, l As Single, Optional a As Single = 1.0F)
|
|
||||||
Dim newHue = h Mod 360
|
|
||||||
_h = Mathf.Clamp(If(newHue < 0, newHue + 360, newHue), 0, 359)
|
|
||||||
_s = Mathf.Clamp01(s)
|
|
||||||
_l = Mathf.Clamp01(l)
|
|
||||||
_a = Mathf.Clamp01(a)
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Public Shared Widening Operator CType(colorHSL As ColorHSL) As Color
|
|
||||||
Dim hue As Integer = Mathf.Clamp(colorHSL.H Mod 360, 0, 359)
|
|
||||||
Dim saturation As Single = Mathf.Clamp01(colorHSL.S)
|
|
||||||
Dim lightness As Single = Mathf.Clamp01(colorHSL.L)
|
|
||||||
Dim alpha As Single = Mathf.Clamp01(colorHSL.A)
|
|
||||||
Dim c As Single = (1.0F - Math.Abs(2.0F * lightness - 1.0F)) * saturation
|
|
||||||
Dim x As Single = c * (1.0F - Math.Abs((hue / 60.0F) Mod 2.0F - 1.0F))
|
|
||||||
Dim m As Single = lightness - c / 2.0F
|
|
||||||
Dim r As Single = c
|
|
||||||
Dim g As Single = 0
|
|
||||||
Dim b As Single = x
|
|
||||||
|
|
||||||
If hue < 300 Then
|
|
||||||
r = x
|
|
||||||
g = 0
|
|
||||||
b = c
|
|
||||||
End If
|
|
||||||
|
|
||||||
If hue < 240 Then
|
|
||||||
r = 0
|
|
||||||
g = x
|
|
||||||
b = c
|
|
||||||
End If
|
|
||||||
|
|
||||||
If hue < 180 Then
|
|
||||||
r = 0
|
|
||||||
g = c
|
|
||||||
b = x
|
|
||||||
End If
|
|
||||||
|
|
||||||
If hue < 120 Then
|
|
||||||
r = x
|
|
||||||
g = c
|
|
||||||
b = 0
|
|
||||||
End If
|
|
||||||
|
|
||||||
If hue < 60 Then
|
|
||||||
r = c
|
|
||||||
g = x
|
|
||||||
b = 0
|
|
||||||
End If
|
|
||||||
|
|
||||||
Return Color.FromArgb(CType(alpha * 255.0F, Byte), CType(Mathf.Clamp01(r + m) * 255.0F, Byte), CType(Mathf.Clamp01(g + m) * 255.0F, Byte), CType(Mathf.Clamp01(b + m) * 255.0F, Byte))
|
|
||||||
End Operator
|
|
||||||
|
|
||||||
Public Shared Widening Operator CType(color As Color) As ColorHSL
|
|
||||||
Dim r As Single = color.R / 255.0F
|
|
||||||
Dim g As Single = color.G / 255.0F
|
|
||||||
Dim b As Single = color.B / 255.0F
|
|
||||||
Dim max As Single = Mathf.Max(r, g, b)
|
|
||||||
Dim min As Single = Mathf.Min(r, g, b)
|
|
||||||
Dim delta As Single = max - min
|
|
||||||
Dim alpha As Single = color.A / 255.0F
|
|
||||||
Dim lightness As Single = (min + max) / 2
|
|
||||||
Dim saturation As Single = 0F
|
|
||||||
saturation = If(delta <> 0F, (delta / (1 - Math.Abs(2 * lightness - 1))), saturation)
|
|
||||||
Dim hue As Single = 0F
|
|
||||||
If delta <> 0F Then
|
|
||||||
hue = If(max = r, 60.0F * (((g - b) / delta) Mod 6.0F), hue)
|
|
||||||
hue = If(max = g, 60.0F * (((b - r) / delta) + 2.0F), hue)
|
|
||||||
hue = If(max = b, 60.0F * (((r - g) / delta) + 4.0F), hue)
|
|
||||||
End If
|
|
||||||
Return New ColorHSL(Mathf.RoundToInt(hue), saturation, lightness, alpha)
|
|
||||||
End Operator
|
|
||||||
|
|
||||||
Public Shared Operator =(colorA As ColorHSL, colorB As ColorHSL) As Boolean
|
|
||||||
Return colorA.Equals(colorB)
|
|
||||||
End Operator
|
|
||||||
|
|
||||||
Public Shared Operator <>(colorA As ColorHSL, colorB As ColorHSL) As Boolean
|
|
||||||
Return Not colorA.Equals(colorB)
|
|
||||||
End Operator
|
|
||||||
|
|
||||||
Public Function AddHue(offset As Integer) As ColorHSL
|
|
||||||
Return New ColorHSL(H + offset, S, L, A)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function AddSaturation(offset As Single) As ColorHSL
|
|
||||||
Return New ColorHSL(H, S + offset, L, A)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function AddLuminance(offset As Single) As ColorHSL
|
|
||||||
Return New ColorHSL(H, S, L + offset, A)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function AddAlpha(offset As Single) As ColorHSL
|
|
||||||
Return New ColorHSL(H, S, L, A + offset)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Overrides Function Equals(obj As Object) As Boolean
|
|
||||||
Dim objColor = CType(obj, ColorHSL)
|
|
||||||
Return H = objColor.H AndAlso S = objColor.S AndAlso L = objColor.L AndAlso A = objColor.A
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function SetHue(value As Integer) As ColorHSL
|
|
||||||
Return New ColorHSL(value, S, L, A)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function SetSaturation(value As Single) As ColorHSL
|
|
||||||
Return New ColorHSL(H, value, L, A)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function SetLuminance(value As Single) As ColorHSL
|
|
||||||
Return New ColorHSL(H, S, value, A)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function SetAlpha(value As Single) As ColorHSL
|
|
||||||
Return New ColorHSL(H, S, L, value)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function ToColor() As Color
|
|
||||||
Return CType(Me, Color)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Function ToHTML() As String
|
|
||||||
Return ColorTranslator.ToHtml(Me)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Overrides Function ToString() As String
|
|
||||||
Return String.Format($"HSLA({H:0}, {S:0.00}, {L:0.00}, {A:0.00})")
|
|
||||||
End Function
|
|
||||||
End Structure
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
Public Class Mathf
|
|
||||||
Public Shared Function Clamp(value As Integer, min As Integer, max As Integer) As Integer
|
|
||||||
If value < min Then
|
|
||||||
value = min
|
|
||||||
ElseIf value > max Then
|
|
||||||
value = max
|
|
||||||
End If
|
|
||||||
Return value
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Clamp(value As Single, min As Single, max As Single) As Single
|
|
||||||
If value < min Then
|
|
||||||
value = min
|
|
||||||
ElseIf value > max Then
|
|
||||||
value = max
|
|
||||||
End If
|
|
||||||
Return value
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Clamp01(value As Single) As Single
|
|
||||||
If value < 0F Then
|
|
||||||
value = 0F
|
|
||||||
ElseIf value > 1.0F Then
|
|
||||||
value = 1.0F
|
|
||||||
End If
|
|
||||||
Return value
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Min(a As Single, b As Single) As Single
|
|
||||||
Return If((a >= b), b, a)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Min(ParamArray values As Single()) As Single
|
|
||||||
Dim num As Integer = values.Length
|
|
||||||
Dim result As Single
|
|
||||||
If num = 0 Then
|
|
||||||
result = 0F
|
|
||||||
Else
|
|
||||||
Dim num2 As Single = values(0)
|
|
||||||
For i As Integer = 1 To num - 1
|
|
||||||
If values(i) < num2 Then
|
|
||||||
num2 = values(i)
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
result = num2
|
|
||||||
End If
|
|
||||||
Return result
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Min(a As Integer, b As Integer) As Integer
|
|
||||||
Return If((a >= b), b, a)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Min(ParamArray values As Integer()) As Integer
|
|
||||||
Dim num As Integer = values.Length
|
|
||||||
Dim result As Integer
|
|
||||||
If num = 0 Then
|
|
||||||
result = 0
|
|
||||||
Else
|
|
||||||
Dim num2 As Integer = values(0)
|
|
||||||
For i As Integer = 1 To num - 1
|
|
||||||
If values(i) < num2 Then
|
|
||||||
num2 = values(i)
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
result = num2
|
|
||||||
End If
|
|
||||||
Return result
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Max(a As Single, b As Single) As Single
|
|
||||||
Return If((a <= b), b, a)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Max(ParamArray values As Single()) As Single
|
|
||||||
Dim num As Integer = values.Length
|
|
||||||
Dim result As Single
|
|
||||||
If num = 0 Then
|
|
||||||
result = 0F
|
|
||||||
Else
|
|
||||||
Dim num2 As Single = values(0)
|
|
||||||
For i As Integer = 1 To num - 1
|
|
||||||
If values(i) > num2 Then
|
|
||||||
num2 = values(i)
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
result = num2
|
|
||||||
End If
|
|
||||||
Return result
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Max(a As Integer, b As Integer) As Integer
|
|
||||||
Return If((a <= b), b, a)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function Max(ParamArray values As Integer()) As Integer
|
|
||||||
Dim num As Integer = values.Length
|
|
||||||
Dim result As Integer
|
|
||||||
If num = 0 Then
|
|
||||||
result = 0
|
|
||||||
Else
|
|
||||||
Dim num2 As Integer = values(0)
|
|
||||||
For i As Integer = 1 To num - 1
|
|
||||||
If values(i) > num2 Then
|
|
||||||
num2 = values(i)
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
result = num2
|
|
||||||
End If
|
|
||||||
Return result
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Shared Function RoundToInt(value As Single) As Integer
|
|
||||||
Return CInt(Math.Round(value))
|
|
||||||
End Function
|
|
||||||
End Class
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
|
|
||||||
Imports System.IO
|
|
||||||
Imports System.Runtime.InteropServices
|
|
||||||
Imports System.Text
|
|
||||||
Imports System.Windows.Forms
|
|
||||||
|
|
||||||
Public Class StringHelp
|
|
||||||
Shared Function Base(instance As String) As String
|
|
||||||
If instance = "" Then
|
|
||||||
Return ""
|
|
||||||
End If
|
|
||||||
|
|
||||||
Dim ret = instance
|
|
||||||
|
|
||||||
If ret.Contains(Path.DirectorySeparatorChar) Then
|
|
||||||
ret = RightLast(ret, Path.DirectorySeparatorChar)
|
|
||||||
End If
|
|
||||||
|
|
||||||
If ret.Contains(".") Then
|
|
||||||
ret = LeftLast(ret, ".")
|
|
||||||
End If
|
|
||||||
|
|
||||||
Return ret
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function RightLast(value As String, start As String) As String
|
|
||||||
If value = "" OrElse start = "" Then
|
|
||||||
Return ""
|
|
||||||
End If
|
|
||||||
|
|
||||||
If Not value.Contains(start) Then
|
|
||||||
Return ""
|
|
||||||
End If
|
|
||||||
|
|
||||||
Return value.Substring(value.LastIndexOf(start) + start.Length)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function LeftLast(value As String, start As String) As String
|
|
||||||
If Not value.Contains(start) Then
|
|
||||||
Return ""
|
|
||||||
End If
|
|
||||||
|
|
||||||
Return value.Substring(0, value.LastIndexOf(start))
|
|
||||||
End Function
|
|
||||||
End Class
|
|
||||||
|
|
||||||
Public Class Native
|
|
||||||
<DllImport("user32.dll")>
|
|
||||||
Shared Function GetForegroundWindow() As IntPtr
|
|
||||||
End Function
|
|
||||||
|
|
||||||
<DllImport("user32.dll", CharSet:=CharSet.Unicode)>
|
|
||||||
Shared Function GetWindowModuleFileName(
|
|
||||||
hwnd As IntPtr,
|
|
||||||
lpszFileName As StringBuilder,
|
|
||||||
cchFileNameMax As UInteger) As UInteger
|
|
||||||
End Function
|
|
||||||
|
|
||||||
<DllImport("user32.dll")>
|
|
||||||
Shared Function SetWindowPos(
|
|
||||||
hWnd As IntPtr,
|
|
||||||
hWndInsertAfter As IntPtr,
|
|
||||||
X As Integer,
|
|
||||||
Y As Integer,
|
|
||||||
cx As Integer,
|
|
||||||
cy As Integer,
|
|
||||||
uFlags As UInteger) As Boolean
|
|
||||||
End Function
|
|
||||||
End Class
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
|
|
||||||
Imports System.Windows.Forms
|
|
||||||
|
|
||||||
Public Class Msg
|
|
||||||
Shared Sub MsgInfo(title As Object, Optional content As Object = Nothing)
|
|
||||||
Dim title1 = title?.ToString
|
|
||||||
Dim content1 = content?.ToString
|
|
||||||
Msg(title1, content1, TaskIcon.Info, TaskButton.OK)
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Shared Sub MsgError(title As String, Optional content As String = Nothing)
|
|
||||||
MsgError(title, content, IntPtr.Zero)
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Shared Sub MsgError(title As String, content As String, handle As IntPtr)
|
|
||||||
If title = "" Then
|
|
||||||
title = content
|
|
||||||
End If
|
|
||||||
|
|
||||||
If title = "" Then
|
|
||||||
Exit Sub
|
|
||||||
End If
|
|
||||||
|
|
||||||
Using td As New TaskDialog(Of String)
|
|
||||||
td.Title = title
|
|
||||||
td.Content = content
|
|
||||||
td.Owner = handle
|
|
||||||
td.Icon = TaskIcon.Error
|
|
||||||
td.ShowCopyButton = True
|
|
||||||
td.AddButton("OK")
|
|
||||||
td.Show()
|
|
||||||
End Using
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Private Shared ShownMessages As String
|
|
||||||
|
|
||||||
Shared Sub MsgWarn(text As String, Optional content As String = Nothing, Optional onlyOnce As Boolean = False)
|
|
||||||
If onlyOnce AndAlso ShownMessages?.Contains(text + content) Then
|
|
||||||
Exit Sub
|
|
||||||
End If
|
|
||||||
|
|
||||||
Msg(text, content, TaskIcon.Warning, TaskButton.OK)
|
|
||||||
|
|
||||||
If onlyOnce Then
|
|
||||||
ShownMessages += text + content
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Shared Function MsgOK(title As String) As Boolean
|
|
||||||
Return Msg(title, Nothing, TaskIcon.Question, TaskButton.OkCancel) = DialogResult.OK
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function MsgQuestion(
|
|
||||||
title As String,
|
|
||||||
Optional buttons As TaskButton = TaskButton.OkCancel) As DialogResult
|
|
||||||
|
|
||||||
Return Msg(title, Nothing, TaskIcon.Question, buttons)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function MsgQuestion(
|
|
||||||
title As String,
|
|
||||||
content As String,
|
|
||||||
Optional buttons As TaskButton = TaskButton.OkCancel) As DialogResult
|
|
||||||
|
|
||||||
Return Msg(title, content, TaskIcon.Question, buttons)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function Msg(
|
|
||||||
title As String,
|
|
||||||
content As String,
|
|
||||||
icon As TaskIcon,
|
|
||||||
buttons As TaskButton) As DialogResult
|
|
||||||
|
|
||||||
Using td As New TaskDialog(Of DialogResult)
|
|
||||||
td.Icon = icon
|
|
||||||
td.Title = title
|
|
||||||
td.Content = content
|
|
||||||
td.Buttons = buttons
|
|
||||||
Return td.Show()
|
|
||||||
End Using
|
|
||||||
End Function
|
|
||||||
End Class
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
'------------------------------------------------------------------------------
|
|
||||||
' <auto-generated>
|
|
||||||
' This code was generated by a tool.
|
|
||||||
' Runtime Version:4.0.30319.42000
|
|
||||||
'
|
|
||||||
' Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
' the code is regenerated.
|
|
||||||
' </auto-generated>
|
|
||||||
'------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Option Strict On
|
|
||||||
Option Explicit On
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
|
||||||
<MySubMain>false</MySubMain>
|
|
||||||
<SingleInstance>false</SingleInstance>
|
|
||||||
<ShutdownMode>0</ShutdownMode>
|
|
||||||
<EnableVisualStyles>true</EnableVisualStyles>
|
|
||||||
<AuthenticationMode>0</AuthenticationMode>
|
|
||||||
<ApplicationType>2</ApplicationType>
|
|
||||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
|
||||||
</MyApplicationData>
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
Imports System
|
|
||||||
Imports System.Reflection
|
|
||||||
Imports System.Runtime.InteropServices
|
|
||||||
|
|
||||||
' General Information about an assembly is controlled through the following
|
|
||||||
' set of attributes. Change these attribute values to modify the information
|
|
||||||
' associated with an assembly.
|
|
||||||
|
|
||||||
' Review the values of the assembly attributes
|
|
||||||
|
|
||||||
<Assembly: AssemblyTitle("TaskDialog")>
|
|
||||||
<Assembly: AssemblyDescription("")>
|
|
||||||
<Assembly: AssemblyCompany("")>
|
|
||||||
<Assembly: AssemblyProduct("TaskDialog")>
|
|
||||||
<Assembly: AssemblyCopyright("Copyright © 2021")>
|
|
||||||
<Assembly: AssemblyTrademark("")>
|
|
||||||
|
|
||||||
<Assembly: ComVisible(False)>
|
|
||||||
|
|
||||||
'The following GUID is for the ID of the typelib if this project is exposed to COM
|
|
||||||
<Assembly: Guid("f93669b6-6d35-4b9b-8336-ba229135de4d")>
|
|
||||||
|
|
||||||
' Version information for an assembly consists of the following four values:
|
|
||||||
'
|
|
||||||
' Major Version
|
|
||||||
' Minor Version
|
|
||||||
' Build Number
|
|
||||||
' Revision
|
|
||||||
'
|
|
||||||
' 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.0.0.0")>
|
|
||||||
<Assembly: AssemblyFileVersion("1.0.0.0")>
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
'------------------------------------------------------------------------------
|
|
||||||
' <auto-generated>
|
|
||||||
' This code was generated by a tool.
|
|
||||||
' Runtime Version:4.0.30319.42000
|
|
||||||
'
|
|
||||||
' Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
' the code is regenerated.
|
|
||||||
' </auto-generated>
|
|
||||||
'------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Option Strict On
|
|
||||||
Option Explicit On
|
|
||||||
|
|
||||||
Imports System
|
|
||||||
|
|
||||||
Namespace My.Resources
|
|
||||||
|
|
||||||
'This class was auto-generated by the StronglyTypedResourceBuilder
|
|
||||||
'class via a tool like ResGen or Visual Studio.
|
|
||||||
'To add or remove a member, edit your .ResX file then rerun ResGen
|
|
||||||
'with the /str option, or rebuild your VS project.
|
|
||||||
'''<summary>
|
|
||||||
''' A strongly-typed resource class, for looking up localized strings, etc.
|
|
||||||
'''</summary>
|
|
||||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0"), _
|
|
||||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
|
||||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
|
||||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
|
||||||
Friend Module Resources
|
|
||||||
|
|
||||||
Private resourceMan As Global.System.Resources.ResourceManager
|
|
||||||
|
|
||||||
Private resourceCulture As Global.System.Globalization.CultureInfo
|
|
||||||
|
|
||||||
'''<summary>
|
|
||||||
''' Returns the cached ResourceManager instance used by this class.
|
|
||||||
'''</summary>
|
|
||||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
|
||||||
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
|
||||||
Get
|
|
||||||
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
|
||||||
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("TaskDialog.Resources", GetType(Resources).Assembly)
|
|
||||||
resourceMan = temp
|
|
||||||
End If
|
|
||||||
Return resourceMan
|
|
||||||
End Get
|
|
||||||
End Property
|
|
||||||
|
|
||||||
'''<summary>
|
|
||||||
''' Overrides the current thread's CurrentUICulture property for all
|
|
||||||
''' resource lookups using this strongly typed resource class.
|
|
||||||
'''</summary>
|
|
||||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
|
||||||
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
|
||||||
Get
|
|
||||||
Return resourceCulture
|
|
||||||
End Get
|
|
||||||
Set
|
|
||||||
resourceCulture = value
|
|
||||||
End Set
|
|
||||||
End Property
|
|
||||||
End Module
|
|
||||||
End Namespace
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
'------------------------------------------------------------------------------
|
|
||||||
' <auto-generated>
|
|
||||||
' This code was generated by a tool.
|
|
||||||
' Runtime Version:4.0.30319.42000
|
|
||||||
'
|
|
||||||
' Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
' the code is regenerated.
|
|
||||||
' </auto-generated>
|
|
||||||
'------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Option Strict On
|
|
||||||
Option Explicit On
|
|
||||||
|
|
||||||
|
|
||||||
Namespace My
|
|
||||||
|
|
||||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
|
||||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0"), _
|
|
||||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
|
||||||
Partial Friend NotInheritable Class MySettings
|
|
||||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
|
||||||
|
|
||||||
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
|
|
||||||
|
|
||||||
#Region "My.Settings Auto-Save Functionality"
|
|
||||||
#If _MyType = "WindowsForms" Then
|
|
||||||
Private Shared addedHandler As Boolean
|
|
||||||
|
|
||||||
Private Shared addedHandlerLockObject As New Object
|
|
||||||
|
|
||||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
|
||||||
Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
|
|
||||||
If My.Application.SaveMySettingsOnExit Then
|
|
||||||
My.Settings.Save()
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
#End If
|
|
||||||
#End Region
|
|
||||||
|
|
||||||
Public Shared ReadOnly Property [Default]() As MySettings
|
|
||||||
Get
|
|
||||||
|
|
||||||
#If _MyType = "WindowsForms" Then
|
|
||||||
If Not addedHandler Then
|
|
||||||
SyncLock addedHandlerLockObject
|
|
||||||
If Not addedHandler Then
|
|
||||||
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
|
||||||
addedHandler = True
|
|
||||||
End If
|
|
||||||
End SyncLock
|
|
||||||
End If
|
|
||||||
#End If
|
|
||||||
Return defaultInstance
|
|
||||||
End Get
|
|
||||||
End Property
|
|
||||||
End Class
|
|
||||||
End Namespace
|
|
||||||
|
|
||||||
Namespace My
|
|
||||||
|
|
||||||
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
|
|
||||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
|
||||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
|
|
||||||
Friend Module MySettingsProperty
|
|
||||||
|
|
||||||
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
|
|
||||||
Friend ReadOnly Property Settings() As Global.TaskDialog.My.MySettings
|
|
||||||
Get
|
|
||||||
Return Global.TaskDialog.My.MySettings.Default
|
|
||||||
End Get
|
|
||||||
End Property
|
|
||||||
End Module
|
|
||||||
End Namespace
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
|
||||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
|
|
||||||
<Profiles>
|
|
||||||
<Profile Name="(Default)" />
|
|
||||||
</Profiles>
|
|
||||||
<Settings />
|
|
||||||
</SettingsFile>
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
|
|
||||||
Imports System.Drawing
|
|
||||||
Imports System.Runtime.InteropServices
|
|
||||||
|
|
||||||
<Flags()>
|
|
||||||
Enum StockIconOptions As UInteger
|
|
||||||
Small = &H1
|
|
||||||
ShellSize = &H4
|
|
||||||
Handle = &H100
|
|
||||||
SystemIndex = &H4000
|
|
||||||
LinkOverlay = &H8000
|
|
||||||
Selected = &H10000
|
|
||||||
End Enum
|
|
||||||
|
|
||||||
Enum StockIconIdentifier As UInteger
|
|
||||||
DocumentNotAssociated = 0
|
|
||||||
DocumentAssociated = 1
|
|
||||||
Application = 2
|
|
||||||
Folder = 3
|
|
||||||
FolderOpen = 4
|
|
||||||
Drive525 = 5
|
|
||||||
Drive35 = 6
|
|
||||||
DriveRemove = 7
|
|
||||||
DriveFixed = 8
|
|
||||||
DriveNetwork = 9
|
|
||||||
DriveNetworkDisabled = 10
|
|
||||||
DriveCD = 11
|
|
||||||
DriveRAM = 12
|
|
||||||
World = 13
|
|
||||||
Server = 15
|
|
||||||
Printer = 16
|
|
||||||
MyNetwork = 17
|
|
||||||
Find = 22
|
|
||||||
Help = 23
|
|
||||||
Share = 28
|
|
||||||
Link = 29
|
|
||||||
SlowFile = 30
|
|
||||||
Recycler = 31
|
|
||||||
RecyclerFull = 32
|
|
||||||
MediaCDAudio = 40
|
|
||||||
Lock = 47
|
|
||||||
AutoList = 49
|
|
||||||
PrinterNet = 50
|
|
||||||
ServerShare = 51
|
|
||||||
PrinterFax = 52
|
|
||||||
PrinterFaxNet = 53
|
|
||||||
PrinterFile = 54
|
|
||||||
Stack = 55
|
|
||||||
MediaSVCD = 56
|
|
||||||
StuffedFolder = 57
|
|
||||||
DriveUnknown = 58
|
|
||||||
DriveDVD = 59
|
|
||||||
MediaDVD = 60
|
|
||||||
MediaDVDRAM = 61
|
|
||||||
MediaDVDRW = 62
|
|
||||||
MediaDVDR = 63
|
|
||||||
MediaDVDROM = 64
|
|
||||||
MediaCDAudioPlus = 65
|
|
||||||
MediaCDRW = 66
|
|
||||||
MediaCDR = 67
|
|
||||||
MediaCDBurn = 68
|
|
||||||
MediaBlankCD = 69
|
|
||||||
MediaCDROM = 70
|
|
||||||
AudioFiles = 71
|
|
||||||
ImageFiles = 72
|
|
||||||
VideoFiles = 73
|
|
||||||
MixedFiles = 74
|
|
||||||
FolderBack = 75
|
|
||||||
FolderFront = 76
|
|
||||||
Shield = 77
|
|
||||||
Warning = 78
|
|
||||||
Info = 79
|
|
||||||
[Error] = 80
|
|
||||||
Key = 81
|
|
||||||
Software = 82
|
|
||||||
Rename = 83
|
|
||||||
Delete = 84
|
|
||||||
MediaAudioDVD = 85
|
|
||||||
MediaMovieDVD = 86
|
|
||||||
MediaEnhancedCD = 87
|
|
||||||
MediaEnhancedDVD = 88
|
|
||||||
MediaHDDVD = 89
|
|
||||||
MediaBluRay = 90
|
|
||||||
MediaVCD = 91
|
|
||||||
MediaDVDPlusR = 92
|
|
||||||
MediaDVDPlusRW = 93
|
|
||||||
DesktopPC = 94
|
|
||||||
MobilePC = 95
|
|
||||||
Users = 96
|
|
||||||
MediaSmartMedia = 97
|
|
||||||
MediaCompactFlash = 98
|
|
||||||
DeviceCellPhone = 99
|
|
||||||
DeviceCamera = 100
|
|
||||||
DeviceVideoCamera = 101
|
|
||||||
DeviceAudioPlayer = 102
|
|
||||||
NetworkConnect = 103
|
|
||||||
Internet = 104
|
|
||||||
ZipFile = 105
|
|
||||||
Settings = 106
|
|
||||||
End Enum
|
|
||||||
|
|
||||||
Class StockIcon
|
|
||||||
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
|
|
||||||
Structure StockIconInfo
|
|
||||||
Friend StuctureSize As UInt32
|
|
||||||
Friend Handle As IntPtr
|
|
||||||
Friend ImageIndex As Int32
|
|
||||||
Friend Identifier As Int32
|
|
||||||
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)>
|
|
||||||
Friend Path As String
|
|
||||||
End Structure
|
|
||||||
|
|
||||||
<DllImport("shell32.dll")>
|
|
||||||
Shared Function SHGetStockIconInfo(
|
|
||||||
identifier As StockIconIdentifier,
|
|
||||||
flags As StockIconOptions,
|
|
||||||
ByRef info As StockIconInfo) As Integer
|
|
||||||
End Function
|
|
||||||
|
|
||||||
<DllImport("user32.dll")>
|
|
||||||
Shared Function DestroyIcon(handle As IntPtr) As Boolean
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function GetSmallImage(identifier As StockIconIdentifier) As Bitmap
|
|
||||||
Dim ptr = GetIcon(identifier, StockIconOptions.Handle Or StockIconOptions.Small)
|
|
||||||
Dim bmp = Icon.FromHandle(ptr).ToBitmap
|
|
||||||
DestroyIcon(ptr)
|
|
||||||
Return bmp
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function GetImage(identifier As StockIconIdentifier) As Image
|
|
||||||
Dim ptr = GetIcon(identifier, StockIconOptions.Handle Or StockIconOptions.ShellSize)
|
|
||||||
Dim bmp = Icon.FromHandle(ptr).ToBitmap
|
|
||||||
DestroyIcon(ptr)
|
|
||||||
Return bmp
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function GetIcon(identifier As StockIconIdentifier, flags As StockIconOptions) As IntPtr
|
|
||||||
Dim info As New StockIconInfo()
|
|
||||||
info.StuctureSize = CType(Marshal.SizeOf(GetType(StockIconInfo)), UInt32)
|
|
||||||
Marshal.ThrowExceptionForHR(SHGetStockIconInfo(identifier, flags, info))
|
|
||||||
Return info.Handle
|
|
||||||
End Function
|
|
||||||
End Class
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,25 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 16
|
|
||||||
VisualStudioVersion = 16.0.31229.75
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TaskDialog", "TaskDialog.vbproj", "{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {A25E6589-5D38-46A2-B480-5B0FFCAC64D7}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
@@ -1,486 +0,0 @@
|
|||||||
|
|
||||||
Imports System.Drawing
|
|
||||||
Imports System.Text
|
|
||||||
Imports System.Threading
|
|
||||||
Imports System.Windows.Forms
|
|
||||||
|
|
||||||
Imports TaskDialog.Msg
|
|
||||||
|
|
||||||
Public Class TaskDialog(Of T)
|
|
||||||
Inherits TaskDialogBaseForm
|
|
||||||
|
|
||||||
Property CommandDefinitions As New List(Of CommandDefinition)
|
|
||||||
Property ButtonDefinitions As New List(Of ButtonDefinition)
|
|
||||||
Property SelectedValue As T
|
|
||||||
Property SelectedText As String
|
|
||||||
Property Title As String
|
|
||||||
Property Timeout As Integer
|
|
||||||
Property Content As String
|
|
||||||
Property ContentLabel As LabelEx
|
|
||||||
Property ExpandedContent As String
|
|
||||||
Property ExpandedContentLabel As LabelEx
|
|
||||||
|
|
||||||
Overloads Property Icon As TaskIcon
|
|
||||||
Overloads Property Owner As IntPtr
|
|
||||||
|
|
||||||
|
|
||||||
Public Sub New()
|
|
||||||
MyBase.New()
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Public Sub New(defaultValue As T)
|
|
||||||
MyClass.New()
|
|
||||||
SelectedValue = defaultValue
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Public Sub New(defaultText As String, defaultValue As T)
|
|
||||||
MyClass.New(defaultValue)
|
|
||||||
SelectedText = defaultText
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub Init()
|
|
||||||
ShowInTaskbar = False
|
|
||||||
Width = FontHeight * 22
|
|
||||||
|
|
||||||
If Content = "" AndAlso Title?.Length > 80 Then
|
|
||||||
Content = Title
|
|
||||||
Title = ""
|
|
||||||
End If
|
|
||||||
|
|
||||||
If MenuButton.Items.Count > 0 Then
|
|
||||||
MenuButton.Visible = True
|
|
||||||
|
|
||||||
For Each i In MenuButton.Items
|
|
||||||
Dim textWidth = TextRenderer.MeasureText(i.ToString, Font).Width + FontHeight * 3
|
|
||||||
|
|
||||||
If MenuButton.Width < textWidth Then
|
|
||||||
Width += textWidth - MenuButton.Width
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
End If
|
|
||||||
|
|
||||||
If Content?.Length > 1000 OrElse ExpandedContent?.Length > 1000 Then
|
|
||||||
Width = FontHeight * 35
|
|
||||||
End If
|
|
||||||
|
|
||||||
ShowIcon = False
|
|
||||||
StartPosition = FormStartPosition.CenterScreen
|
|
||||||
|
|
||||||
If Icon <> TaskIcon.None Then
|
|
||||||
pbIcon.Visible = True
|
|
||||||
End If
|
|
||||||
|
|
||||||
Select Case Icon
|
|
||||||
Case TaskIcon.Warning
|
|
||||||
pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Warning)
|
|
||||||
Case TaskIcon.Error
|
|
||||||
pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Error)
|
|
||||||
Case TaskIcon.Info
|
|
||||||
pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Info)
|
|
||||||
Case TaskIcon.Shield
|
|
||||||
pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Shield)
|
|
||||||
Case TaskIcon.Question
|
|
||||||
pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Help)
|
|
||||||
End Select
|
|
||||||
|
|
||||||
TitleLabel.Font = New Font("Segoe UI", 11)
|
|
||||||
TitleLabel.Text = Title
|
|
||||||
|
|
||||||
If Content <> "" Then
|
|
||||||
ContentLabel = New LabelEx
|
|
||||||
ContentLabel.Margin = New Padding(0)
|
|
||||||
ContentLabel.BorderStyle = BorderStyle.None
|
|
||||||
ContentLabel.Text = Content
|
|
||||||
paMain.Controls.Add(ContentLabel)
|
|
||||||
End If
|
|
||||||
|
|
||||||
If ExpandedContent <> "" Then
|
|
||||||
ExpandedContentLabel = New LabelEx
|
|
||||||
ExpandedContentLabel.Margin = New Padding(0)
|
|
||||||
ExpandedContentLabel.BorderStyle = BorderStyle.None
|
|
||||||
ExpandedContentLabel.Text = ExpandedContent
|
|
||||||
ExpandedContentLabel.Name = "ExpandedInformation"
|
|
||||||
blDetails.Visible = True
|
|
||||||
paMain.Controls.Add(ExpandedContentLabel)
|
|
||||||
End If
|
|
||||||
|
|
||||||
Dim firstCommandButton As CommandButton = Nothing
|
|
||||||
|
|
||||||
For Each cmd In CommandDefinitions
|
|
||||||
Dim cb As New CommandButton
|
|
||||||
cb.Title = cmd.Text
|
|
||||||
cb.Description = cmd.Description
|
|
||||||
cb.Tag = cmd
|
|
||||||
|
|
||||||
If TypeOf cmd.Value Is FontFamily Then
|
|
||||||
cb.Font = New Font(cmd.Text, Font.Size)
|
|
||||||
End If
|
|
||||||
|
|
||||||
AddHandler cb.Click, AddressOf CommandClick
|
|
||||||
paMain.Controls.Add(cb)
|
|
||||||
|
|
||||||
If firstCommandButton Is Nothing Then
|
|
||||||
firstCommandButton = cb
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
|
|
||||||
For Each i In ButtonDefinitions
|
|
||||||
If Not flpButtons.Visible Then
|
|
||||||
flpButtons.Visible = True
|
|
||||||
flpButtons.AutoSize = True
|
|
||||||
End If
|
|
||||||
|
|
||||||
Dim b As New ButtonEx
|
|
||||||
b.Text = i.Text
|
|
||||||
b.Tag = i.Value
|
|
||||||
|
|
||||||
If AcceptButton Is Nothing AndAlso i.Text = "OK" Then
|
|
||||||
AcceptButton = b
|
|
||||||
End If
|
|
||||||
|
|
||||||
flpButtons.Controls.Add(b)
|
|
||||||
i.Button = b
|
|
||||||
AddHandler b.Click, AddressOf ButtonClick
|
|
||||||
Next
|
|
||||||
|
|
||||||
If Timeout > 0 Then
|
|
||||||
Task.Run(Sub()
|
|
||||||
Thread.Sleep(Timeout * 1000)
|
|
||||||
|
|
||||||
If Not IsDisposingOrDisposed Then
|
|
||||||
Invoke(Sub() Close())
|
|
||||||
End If
|
|
||||||
End Sub)
|
|
||||||
End If
|
|
||||||
|
|
||||||
If TypeOf SelectedValue Is DialogResult Then
|
|
||||||
If SelectedValue.Equals(DialogResult.None) Then
|
|
||||||
If ButtonDefinitions.Where(Function(i) i.Value.Equals(DialogResult.No)).Any Then
|
|
||||||
SelectedValue = CType(CObj(DialogResult.No), T)
|
|
||||||
End If
|
|
||||||
|
|
||||||
If ButtonDefinitions.Where(Function(i) i.Value.Equals(DialogResult.Cancel)).Any Then
|
|
||||||
SelectedValue = CType(CObj(DialogResult.Cancel), T)
|
|
||||||
End If
|
|
||||||
End If
|
|
||||||
|
|
||||||
Dim ok = ButtonDefinitions.Where(Function(i) i.Value.Equals(DialogResult.OK)).FirstOrDefault
|
|
||||||
|
|
||||||
If Not ok Is Nothing Then
|
|
||||||
ActiveControl = ok.Button
|
|
||||||
End If
|
|
||||||
|
|
||||||
If ActiveControl Is Nothing Then
|
|
||||||
Dim yes = ButtonDefinitions.Where(Function(i) i.Value.Equals(DialogResult.Yes)).FirstOrDefault
|
|
||||||
|
|
||||||
If Not yes Is Nothing Then
|
|
||||||
ActiveControl = yes.Button
|
|
||||||
End If
|
|
||||||
End If
|
|
||||||
End If
|
|
||||||
|
|
||||||
If ActiveControl Is Nothing Then
|
|
||||||
If firstCommandButton Is Nothing Then
|
|
||||||
ActiveControl = TitleLabel
|
|
||||||
Else
|
|
||||||
ActiveControl = firstCommandButton
|
|
||||||
End If
|
|
||||||
End If
|
|
||||||
|
|
||||||
If Owner = IntPtr.Zero Then
|
|
||||||
Owner = GetHandle()
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub AddCommand(value As T)
|
|
||||||
AddCommand(value.ToString, Nothing, value)
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub AddCommand(text As String, Optional value As T = Nothing)
|
|
||||||
AddCommand(text, Nothing, value)
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub AddCommand(text As String, description As String, value As T)
|
|
||||||
If value Is Nothing Then
|
|
||||||
value = CType(CObj(text), T)
|
|
||||||
End If
|
|
||||||
|
|
||||||
CommandDefinitions.Add(New CommandDefinition With {.Text = text, .Description = description, .Value = value})
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub AddCommands(values As IEnumerable(Of T))
|
|
||||||
For Each i In values
|
|
||||||
AddCommand(i)
|
|
||||||
Next
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub AddButton(text As String)
|
|
||||||
AddButton(text, CType(CObj(text), T))
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub AddButton(text As String, value As T)
|
|
||||||
ButtonDefinitions.Add(New ButtonDefinition With {.Text = text, .Value = value})
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub AddButton(value As T)
|
|
||||||
ButtonDefinitions.Add(New ButtonDefinition With {.Text = value.ToString, .Value = value})
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub AddButtons(values As IEnumerable(Of T))
|
|
||||||
For Each i In values
|
|
||||||
AddButton(i)
|
|
||||||
Next
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
WriteOnly Property Buttons As TaskButton
|
|
||||||
Set(value As TaskButton)
|
|
||||||
For Each i In {TaskButton.OK, TaskButton.Yes, TaskButton.No,
|
|
||||||
TaskButton.Cancel, TaskButton.Retry, TaskButton.Close}
|
|
||||||
|
|
||||||
If value.HasFlag(i) Then
|
|
||||||
AddButton(i.ToString, CType(CObj(GetDialogResultFromButton(i)), T))
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
End Set
|
|
||||||
End Property
|
|
||||||
|
|
||||||
Sub CommandClick(sender As Object, e As EventArgs)
|
|
||||||
Dim tag = DirectCast(sender, CommandButton).Tag
|
|
||||||
Dim cmd = DirectCast(tag, CommandDefinition)
|
|
||||||
SelectedText = If(cmd.Text = "", cmd.Description, cmd.Text)
|
|
||||||
SelectedValue = cmd.Value
|
|
||||||
Close()
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Sub ButtonClick(sender As Object, e As EventArgs)
|
|
||||||
Dim button = DirectCast(sender, ButtonEx)
|
|
||||||
SelectedText = button.Text
|
|
||||||
SelectedValue = DirectCast(button.Tag, T)
|
|
||||||
Close()
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Overrides Sub AdjustSize()
|
|
||||||
Dim h = tlpTop.Height + tlpTop.Margin.Vertical
|
|
||||||
|
|
||||||
If paMain.Controls.Count > 0 Then
|
|
||||||
Dim last = paMain.Controls(paMain.Controls.Count - 1)
|
|
||||||
h += last.Top + last.Height + last.Margin.Vertical
|
|
||||||
End If
|
|
||||||
|
|
||||||
h += spBottom.Height
|
|
||||||
|
|
||||||
If spBottom.Controls.OfType(Of Control).Where(Function(i) i.Visible).Count > 0 Then
|
|
||||||
h += spBottom.Margin.Vertical
|
|
||||||
End If
|
|
||||||
|
|
||||||
Dim fh = FontHeight
|
|
||||||
h += CInt(fh * 0.7)
|
|
||||||
|
|
||||||
Dim nonClientHeight = Height - ClientSize.Height
|
|
||||||
Dim workingArea = Screen.FromControl(Me).WorkingArea
|
|
||||||
Dim maxHeight = workingArea.Height
|
|
||||||
Dim w = ClientSize.Width
|
|
||||||
Dim secondLongestLine = GetSecondLongestLineLength()
|
|
||||||
Dim predictedWidth = CInt(secondLongestLine * fh * 0.45)
|
|
||||||
|
|
||||||
If predictedWidth > Width Then
|
|
||||||
w = predictedWidth
|
|
||||||
End If
|
|
||||||
|
|
||||||
If w > fh * 40 Then
|
|
||||||
w = fh * 40
|
|
||||||
End If
|
|
||||||
|
|
||||||
Dim ncx = Width - ClientSize.Width
|
|
||||||
Dim ncy = Height - ClientSize.Height
|
|
||||||
|
|
||||||
w += ncx
|
|
||||||
h += ncy
|
|
||||||
|
|
||||||
If h > maxHeight Then
|
|
||||||
h = maxHeight
|
|
||||||
End If
|
|
||||||
|
|
||||||
Dim l = (workingArea.Width - w) \ 2
|
|
||||||
Dim t = (workingArea.Height - h) \ 2
|
|
||||||
|
|
||||||
Native.SetWindowPos(Handle, IntPtr.Zero, l, t, w, h, 64)
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Function GetSecondLongestLineLength() As Integer
|
|
||||||
Dim list As New List(Of Integer)({51, 52})
|
|
||||||
|
|
||||||
If Content <> "" Then
|
|
||||||
For Each line In Content.Split(vbLf)
|
|
||||||
list.Add(line.Length)
|
|
||||||
Next
|
|
||||||
End If
|
|
||||||
|
|
||||||
If ExpandedContent <> "" AndAlso ExpandedContentLabel?.Height > 0 Then
|
|
||||||
For Each line In ExpandedContent.Split(vbLf)
|
|
||||||
list.Add(line.Length)
|
|
||||||
Next
|
|
||||||
End If
|
|
||||||
|
|
||||||
For Each def In CommandDefinitions
|
|
||||||
If def.Description <> "" Then
|
|
||||||
For Each line In def.Description.Split(vbLf)
|
|
||||||
list.Add(line.Length)
|
|
||||||
Next
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
|
|
||||||
For Each def In CommandDefinitions
|
|
||||||
If def.Text <> "" Then
|
|
||||||
For Each line In def.Text.Split(vbLf)
|
|
||||||
list.Add(CInt(line.Length / 11 * 9))
|
|
||||||
Next
|
|
||||||
End If
|
|
||||||
Next
|
|
||||||
|
|
||||||
list.Sort()
|
|
||||||
list.Reverse()
|
|
||||||
Return list(1)
|
|
||||||
End Function
|
|
||||||
|
|
||||||
WriteOnly Property ShowCopyButton As Boolean
|
|
||||||
Set(value As Boolean)
|
|
||||||
If value Then
|
|
||||||
blCopyMessage.Text = "Copy Message"
|
|
||||||
blCopyMessage.Visible = True
|
|
||||||
blCopyMessage.ClickAction = Sub()
|
|
||||||
Clipboard.SetText(GetText)
|
|
||||||
MsgInfo("Message was copied to clipboard.")
|
|
||||||
End Sub
|
|
||||||
End If
|
|
||||||
End Set
|
|
||||||
End Property
|
|
||||||
|
|
||||||
Function GetHandle() As IntPtr
|
|
||||||
Dim sb As New StringBuilder(500)
|
|
||||||
Dim handle = Native.GetForegroundWindow
|
|
||||||
Native.GetWindowModuleFileName(handle, sb, CUInt(sb.Capacity))
|
|
||||||
|
|
||||||
If StringHelp.Base(sb.ToString.Replace(".vshost", "")) = StringHelp.Base(Application.ExecutablePath) Then
|
|
||||||
Return handle
|
|
||||||
End If
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Function GetText() As String
|
|
||||||
Dim ret = TitleLabel.Text
|
|
||||||
|
|
||||||
If Content <> "" Then
|
|
||||||
ret += BR2 + Content
|
|
||||||
End If
|
|
||||||
|
|
||||||
If ExpandedContent <> "" Then
|
|
||||||
ret += BR2 + ExpandedContent
|
|
||||||
End If
|
|
||||||
|
|
||||||
Return ret
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Shared Function GetDialogResultFromButton(button As TaskButton) As DialogResult
|
|
||||||
Select Case button
|
|
||||||
Case TaskButton.OK
|
|
||||||
Return DialogResult.OK
|
|
||||||
Case TaskButton.Cancel, TaskButton.Close
|
|
||||||
Return DialogResult.Cancel
|
|
||||||
Case TaskButton.Yes
|
|
||||||
Return DialogResult.Yes
|
|
||||||
Case TaskButton.No
|
|
||||||
Return DialogResult.No
|
|
||||||
Case TaskButton.None
|
|
||||||
Return DialogResult.None
|
|
||||||
Case TaskButton.Retry
|
|
||||||
Return DialogResult.Retry
|
|
||||||
End Select
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Protected Overrides Sub OnLoad(args As EventArgs)
|
|
||||||
MyBase.OnLoad(args)
|
|
||||||
Font = New Font("Segoe UI", 9)
|
|
||||||
Dim fh = FontHeight
|
|
||||||
|
|
||||||
For Each i As ButtonEx In flpButtons.Controls
|
|
||||||
i.Height = CInt(fh * 1.5)
|
|
||||||
i.Width = fh * 5
|
|
||||||
|
|
||||||
Using g = i.CreateGraphics
|
|
||||||
Dim minWidth = CInt(g.MeasureString(i.Text, i.Font).Width + fh)
|
|
||||||
|
|
||||||
If i.Width < minWidth Then
|
|
||||||
i.Width = minWidth
|
|
||||||
End If
|
|
||||||
End Using
|
|
||||||
|
|
||||||
i.Margin = New Padding(CInt(fh * 0.4), 0, 0, 0)
|
|
||||||
Next
|
|
||||||
|
|
||||||
MenuButton.Margin = New Padding(CInt(fh * 0.7), MenuButton.Margin.Top, CInt(fh * 0.7), MenuButton.Margin.Bottom)
|
|
||||||
InputTextEdit.Margin = MenuButton.Margin
|
|
||||||
flpButtons.Margin = New Padding(0, 0, CInt(fh * 0.7), 0)
|
|
||||||
|
|
||||||
If InputTextEdit.Visible Then
|
|
||||||
ActiveControl = InputTextEdit
|
|
||||||
InputTextEdit.TextBox.SelectAll()
|
|
||||||
End If
|
|
||||||
|
|
||||||
AdjustSize()
|
|
||||||
AdjustSize()
|
|
||||||
|
|
||||||
If Owner <> IntPtr.Zero Then
|
|
||||||
Dim GWLP_HWNDPARENT = -8
|
|
||||||
SetWindowLongPtr(Handle, GWLP_HWNDPARENT, Owner)
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Overloads Function Show() As T
|
|
||||||
Init()
|
|
||||||
|
|
||||||
If Application.MessageLoop Then
|
|
||||||
Using Me
|
|
||||||
ShowDialog()
|
|
||||||
End Using
|
|
||||||
Else
|
|
||||||
Application.Run(Me)
|
|
||||||
End If
|
|
||||||
|
|
||||||
Return SelectedValue
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Public Class CommandDefinition
|
|
||||||
Property Text As String
|
|
||||||
Property Description As String
|
|
||||||
Property Value As T
|
|
||||||
End Class
|
|
||||||
|
|
||||||
Public Class ButtonDefinition
|
|
||||||
Property Text As String
|
|
||||||
Property Value As T
|
|
||||||
Property Button As ButtonEx
|
|
||||||
End Class
|
|
||||||
End Class
|
|
||||||
|
|
||||||
Public Enum TaskIcon
|
|
||||||
None
|
|
||||||
Info
|
|
||||||
Warning
|
|
||||||
Question
|
|
||||||
[Error]
|
|
||||||
Shield
|
|
||||||
End Enum
|
|
||||||
|
|
||||||
Public Enum TaskButton
|
|
||||||
None = 0
|
|
||||||
OK = 1
|
|
||||||
Yes = 2
|
|
||||||
No = 4
|
|
||||||
Cancel = 8
|
|
||||||
Retry = 16
|
|
||||||
Close = 32
|
|
||||||
OkCancel = OK Or Cancel
|
|
||||||
YesNo = Yes Or No
|
|
||||||
YesNoCancel = YesNo Or Cancel
|
|
||||||
RetryCancel = Retry Or Cancel
|
|
||||||
End Enum
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}</ProjectGuid>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<StartupObject>
|
|
||||||
</StartupObject>
|
|
||||||
<RootNamespace>TaskDialog</RootNamespace>
|
|
||||||
<AssemblyName>TaskDialog</AssemblyName>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<MyType>Windows</MyType>
|
|
||||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
|
||||||
<Deterministic>true</Deterministic>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<DefineDebug>true</DefineDebug>
|
|
||||||
<DefineTrace>true</DefineTrace>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DocumentationFile>TaskDialog.xml</DocumentationFile>
|
|
||||||
<NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42105,42106,42107,42353,42354,42355</NoWarn>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<DefineDebug>false</DefineDebug>
|
|
||||||
<DefineTrace>true</DefineTrace>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DocumentationFile>TaskDialog.xml</DocumentationFile>
|
|
||||||
<NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42105,42106,42107,42353,42354,42355</NoWarn>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<OptionExplicit>On</OptionExplicit>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<OptionCompare>Binary</OptionCompare>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<OptionStrict>Off</OptionStrict>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<OptionInfer>On</OptionInfer>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Deployment" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Windows.Forms" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="System.Net.Http" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Import Include="Microsoft.VisualBasic" />
|
|
||||||
<Import Include="System" />
|
|
||||||
<Import Include="System.Collections" />
|
|
||||||
<Import Include="System.Collections.Generic" />
|
|
||||||
<Import Include="System.Data" />
|
|
||||||
<Import Include="System.Diagnostics" />
|
|
||||||
<Import Include="System.Linq" />
|
|
||||||
<Import Include="System.Xml.Linq" />
|
|
||||||
<Import Include="System.Threading.Tasks" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="CheckBoxRendererEx.vb" />
|
|
||||||
<Compile Include="ColorHSL.vb" />
|
|
||||||
<Compile Include="Mathf.vb" />
|
|
||||||
<Compile Include="Misc.vb" />
|
|
||||||
<Compile Include="Msg.vb" />
|
|
||||||
<Compile Include="My Project\AssemblyInfo.vb" />
|
|
||||||
<Compile Include="My Project\Application.Designer.vb">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Application.myapp</DependentUpon>
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="My Project\Resources.Designer.vb">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="My Project\Settings.Designer.vb">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Settings.settings</DependentUpon>
|
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="StockIcon.vb" />
|
|
||||||
<Compile Include="Symbol.vb" />
|
|
||||||
<Compile Include="TaskDialog.vb">
|
|
||||||
<SubType>Form</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="TaskDialogBaseForm.Designer.vb">
|
|
||||||
<DependentUpon>TaskDialogBaseForm.vb</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="TaskDialogBaseForm.vb">
|
|
||||||
<SubType>Form</SubType>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<EmbeddedResource Include="My Project\Resources.resx">
|
|
||||||
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
|
||||||
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<EmbeddedResource Include="TaskDialogBaseForm.resx">
|
|
||||||
<DependentUpon>TaskDialogBaseForm.vb</DependentUpon>
|
|
||||||
</EmbeddedResource>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="My Project\Application.myapp">
|
|
||||||
<Generator>MyApplicationCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
|
||||||
</None>
|
|
||||||
<None Include="My Project\Settings.settings">
|
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
|
||||||
<CustomToolNamespace>My</CustomToolNamespace>
|
|
||||||
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
|
||||||
</Project>
|
|
||||||
247
src/WinForms/TaskDialog/TaskDialogBaseForm.Designer.vb
generated
247
src/WinForms/TaskDialog/TaskDialogBaseForm.Designer.vb
generated
@@ -1,247 +0,0 @@
|
|||||||
|
|
||||||
Imports System.Windows.Forms
|
|
||||||
|
|
||||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
|
||||||
Partial Class TaskDialogBaseForm
|
|
||||||
Inherits Form
|
|
||||||
|
|
||||||
'Form overrides dispose to clean up the component list.
|
|
||||||
<System.Diagnostics.DebuggerNonUserCode()>
|
|
||||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
|
||||||
Try
|
|
||||||
If disposing AndAlso components IsNot Nothing Then
|
|
||||||
components.Dispose()
|
|
||||||
End If
|
|
||||||
Finally
|
|
||||||
MyBase.Dispose(disposing)
|
|
||||||
End Try
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
'Required by the Windows Form Designer
|
|
||||||
Private components As System.ComponentModel.IContainer
|
|
||||||
|
|
||||||
'NOTE: The following procedure is required by the Windows Form Designer
|
|
||||||
'It can be modified using the Windows Form Designer.
|
|
||||||
'Do not modify it using the code editor.
|
|
||||||
<System.Diagnostics.DebuggerStepThrough()>
|
|
||||||
Private Sub InitializeComponent()
|
|
||||||
Me.components = New System.ComponentModel.Container()
|
|
||||||
Me.tlpMain = New System.Windows.Forms.TableLayoutPanel()
|
|
||||||
Me.tlpTop = New System.Windows.Forms.TableLayoutPanel()
|
|
||||||
Me.TitleLabel = New TaskDialog.TaskDialogBaseForm.LabelEx()
|
|
||||||
Me.pbIcon = New System.Windows.Forms.PictureBox()
|
|
||||||
Me.paMain = New TaskDialog.TaskDialogBaseForm.TaskDialogPanel()
|
|
||||||
Me.spBottom = New TaskDialog.TaskDialogBaseForm.StackPanel()
|
|
||||||
Me.InputTextEdit = New TaskDialog.TaskDialogBaseForm.TextEdit()
|
|
||||||
Me.MenuButton = New TaskDialog.TaskDialogBaseForm.MenuButtonEx()
|
|
||||||
Me.CheckBox = New TaskDialog.TaskDialogBaseForm.CheckBoxEx()
|
|
||||||
Me.flpButtons = New System.Windows.Forms.FlowLayoutPanel()
|
|
||||||
Me.blDetails = New TaskDialog.TaskDialogBaseForm.ButtonLabel()
|
|
||||||
Me.blCopyMessage = New TaskDialog.TaskDialogBaseForm.ButtonLabel()
|
|
||||||
Me.tlpMain.SuspendLayout()
|
|
||||||
Me.tlpTop.SuspendLayout()
|
|
||||||
CType(Me.pbIcon, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
||||||
Me.spBottom.SuspendLayout()
|
|
||||||
Me.SuspendLayout()
|
|
||||||
'
|
|
||||||
'tlpMain
|
|
||||||
'
|
|
||||||
Me.tlpMain.ColumnCount = 1
|
|
||||||
Me.tlpMain.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
|
||||||
Me.tlpMain.Controls.Add(Me.tlpTop, 0, 0)
|
|
||||||
Me.tlpMain.Controls.Add(Me.paMain, 0, 1)
|
|
||||||
Me.tlpMain.Controls.Add(Me.spBottom, 0, 2)
|
|
||||||
Me.tlpMain.Dock = System.Windows.Forms.DockStyle.Fill
|
|
||||||
Me.tlpMain.Location = New System.Drawing.Point(0, 0)
|
|
||||||
Me.tlpMain.Name = "tlpMain"
|
|
||||||
Me.tlpMain.RowCount = 3
|
|
||||||
Me.tlpMain.RowStyles.Add(New System.Windows.Forms.RowStyle())
|
|
||||||
Me.tlpMain.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
|
|
||||||
Me.tlpMain.RowStyles.Add(New System.Windows.Forms.RowStyle())
|
|
||||||
Me.tlpMain.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
|
|
||||||
Me.tlpMain.Size = New System.Drawing.Size(705, 683)
|
|
||||||
Me.tlpMain.TabIndex = 0
|
|
||||||
'
|
|
||||||
'tlpTop
|
|
||||||
'
|
|
||||||
Me.tlpTop.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
|
|
||||||
Or System.Windows.Forms.AnchorStyles.Left) _
|
|
||||||
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
|
||||||
Me.tlpTop.AutoSize = True
|
|
||||||
Me.tlpTop.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
|
|
||||||
Me.tlpTop.ColumnCount = 2
|
|
||||||
Me.tlpTop.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle())
|
|
||||||
Me.tlpTop.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
|
|
||||||
Me.tlpTop.Controls.Add(Me.TitleLabel, 1, 0)
|
|
||||||
Me.tlpTop.Controls.Add(Me.pbIcon, 0, 0)
|
|
||||||
Me.tlpTop.Location = New System.Drawing.Point(0, 15)
|
|
||||||
Me.tlpTop.Margin = New System.Windows.Forms.Padding(0, 15, 0, 20)
|
|
||||||
Me.tlpTop.Name = "tlpTop"
|
|
||||||
Me.tlpTop.RowCount = 1
|
|
||||||
Me.tlpTop.RowStyles.Add(New System.Windows.Forms.RowStyle())
|
|
||||||
Me.tlpTop.Size = New System.Drawing.Size(705, 150)
|
|
||||||
Me.tlpTop.TabIndex = 1
|
|
||||||
'
|
|
||||||
'TitleLabel
|
|
||||||
'
|
|
||||||
Me.TitleLabel.Anchor = System.Windows.Forms.AnchorStyles.Left
|
|
||||||
Me.TitleLabel.AutoSize = True
|
|
||||||
Me.TitleLabel.Location = New System.Drawing.Point(160, 56)
|
|
||||||
Me.TitleLabel.Margin = New System.Windows.Forms.Padding(20)
|
|
||||||
Me.TitleLabel.Size = New System.Drawing.Size(155, 37)
|
|
||||||
Me.TitleLabel.Text = "TitleLabel"
|
|
||||||
Me.TitleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
|
|
||||||
'
|
|
||||||
'pbIcon
|
|
||||||
'
|
|
||||||
Me.pbIcon.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
|
|
||||||
Or System.Windows.Forms.AnchorStyles.Left) _
|
|
||||||
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
|
||||||
Me.pbIcon.Location = New System.Drawing.Point(40, 30)
|
|
||||||
Me.pbIcon.Margin = New System.Windows.Forms.Padding(40, 30, 0, 20)
|
|
||||||
Me.pbIcon.Name = "pbIcon"
|
|
||||||
Me.pbIcon.Size = New System.Drawing.Size(100, 100)
|
|
||||||
Me.pbIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage
|
|
||||||
Me.pbIcon.TabIndex = 2
|
|
||||||
Me.pbIcon.TabStop = False
|
|
||||||
Me.pbIcon.Visible = False
|
|
||||||
'
|
|
||||||
'paMain
|
|
||||||
'
|
|
||||||
Me.paMain.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
|
|
||||||
Or System.Windows.Forms.AnchorStyles.Left) _
|
|
||||||
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
|
||||||
Me.paMain.AutoScroll = True
|
|
||||||
Me.paMain.Form = Nothing
|
|
||||||
Me.paMain.LineBreaks = 0
|
|
||||||
Me.paMain.Location = New System.Drawing.Point(0, 185)
|
|
||||||
Me.paMain.Margin = New System.Windows.Forms.Padding(0)
|
|
||||||
Me.paMain.Name = "paMain"
|
|
||||||
Me.paMain.Size = New System.Drawing.Size(705, 63)
|
|
||||||
Me.paMain.TabIndex = 2
|
|
||||||
'
|
|
||||||
'spBottom
|
|
||||||
'
|
|
||||||
Me.spBottom.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
|
|
||||||
Or System.Windows.Forms.AnchorStyles.Left) _
|
|
||||||
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
|
||||||
Me.spBottom.AutoSize = True
|
|
||||||
Me.spBottom.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
|
|
||||||
Me.spBottom.Controls.Add(Me.InputTextEdit)
|
|
||||||
Me.spBottom.Controls.Add(Me.MenuButton)
|
|
||||||
Me.spBottom.Controls.Add(Me.CheckBox)
|
|
||||||
Me.spBottom.Controls.Add(Me.flpButtons)
|
|
||||||
Me.spBottom.Controls.Add(Me.blDetails)
|
|
||||||
Me.spBottom.Controls.Add(Me.blCopyMessage)
|
|
||||||
Me.spBottom.FlowDirection = System.Windows.Forms.FlowDirection.TopDown
|
|
||||||
Me.spBottom.Location = New System.Drawing.Point(0, 248)
|
|
||||||
Me.spBottom.Margin = New System.Windows.Forms.Padding(0, 0, 0, 30)
|
|
||||||
Me.spBottom.Name = "spBottom"
|
|
||||||
Me.spBottom.Size = New System.Drawing.Size(705, 405)
|
|
||||||
Me.spBottom.TabIndex = 3
|
|
||||||
Me.spBottom.WrapContents = False
|
|
||||||
'
|
|
||||||
'InputTextEdit
|
|
||||||
'
|
|
||||||
Me.InputTextEdit.Anchor = CType((System.Windows.Forms.AnchorStyles.Left Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
|
||||||
Me.InputTextEdit.Location = New System.Drawing.Point(30, 0)
|
|
||||||
Me.InputTextEdit.Margin = New System.Windows.Forms.Padding(30, 0, 30, 30)
|
|
||||||
Me.InputTextEdit.Name = "InputTextEdit"
|
|
||||||
Me.InputTextEdit.Size = New System.Drawing.Size(645, 60)
|
|
||||||
Me.InputTextEdit.Text = "InputTextEdit"
|
|
||||||
Me.InputTextEdit.Visible = False
|
|
||||||
'
|
|
||||||
'MenuButton
|
|
||||||
'
|
|
||||||
Me.MenuButton.Anchor = CType((System.Windows.Forms.AnchorStyles.Left Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
|
||||||
Me.MenuButton.FlatAppearance.BorderSize = 2
|
|
||||||
Me.MenuButton.Location = New System.Drawing.Point(30, 90)
|
|
||||||
Me.MenuButton.Margin = New System.Windows.Forms.Padding(30, 0, 30, 30)
|
|
||||||
Me.MenuButton.Padding = New System.Windows.Forms.Padding(4, 0, 0, 0)
|
|
||||||
Me.MenuButton.ShowMenuSymbol = True
|
|
||||||
Me.MenuButton.ShowPath = False
|
|
||||||
Me.MenuButton.Size = New System.Drawing.Size(645, 70)
|
|
||||||
Me.MenuButton.Text2 = "MenuButton"
|
|
||||||
Me.MenuButton.Visible = False
|
|
||||||
'
|
|
||||||
'CheckBox
|
|
||||||
'
|
|
||||||
Me.CheckBox.AutoSize = True
|
|
||||||
Me.CheckBox.FlatAppearance.BorderSize = 2
|
|
||||||
Me.CheckBox.Location = New System.Drawing.Point(30, 190)
|
|
||||||
Me.CheckBox.Margin = New System.Windows.Forms.Padding(30, 0, 0, 0)
|
|
||||||
Me.CheckBox.Size = New System.Drawing.Size(366, 41)
|
|
||||||
Me.CheckBox.Text = "VerificationCheckBox"
|
|
||||||
Me.CheckBox.UseVisualStyleBackColor = False
|
|
||||||
Me.CheckBox.Visible = False
|
|
||||||
'
|
|
||||||
'flpButtons
|
|
||||||
'
|
|
||||||
Me.flpButtons.Anchor = System.Windows.Forms.AnchorStyles.Right
|
|
||||||
Me.flpButtons.Location = New System.Drawing.Point(505, 231)
|
|
||||||
Me.flpButtons.Margin = New System.Windows.Forms.Padding(0)
|
|
||||||
Me.flpButtons.Name = "flpButtons"
|
|
||||||
Me.flpButtons.Size = New System.Drawing.Size(200, 100)
|
|
||||||
Me.flpButtons.TabIndex = 2
|
|
||||||
Me.flpButtons.Visible = False
|
|
||||||
'
|
|
||||||
'blDetails
|
|
||||||
'
|
|
||||||
Me.blDetails.AutoSize = True
|
|
||||||
Me.blDetails.ClickAction = Nothing
|
|
||||||
Me.blDetails.Location = New System.Drawing.Point(20, 331)
|
|
||||||
Me.blDetails.Margin = New System.Windows.Forms.Padding(20, 0, 0, 0)
|
|
||||||
Me.blDetails.Name = "blDetails"
|
|
||||||
Me.blDetails.Size = New System.Drawing.Size(203, 37)
|
|
||||||
Me.blDetails.TabIndex = 8
|
|
||||||
Me.blDetails.Text = "Show Details"
|
|
||||||
Me.blDetails.Visible = False
|
|
||||||
'
|
|
||||||
'blCopyMessage
|
|
||||||
'
|
|
||||||
Me.blCopyMessage.AutoSize = True
|
|
||||||
Me.blCopyMessage.ClickAction = Nothing
|
|
||||||
Me.blCopyMessage.Location = New System.Drawing.Point(20, 368)
|
|
||||||
Me.blCopyMessage.Margin = New System.Windows.Forms.Padding(20, 0, 0, 0)
|
|
||||||
Me.blCopyMessage.Name = "blCopyMessage"
|
|
||||||
Me.blCopyMessage.Size = New System.Drawing.Size(228, 37)
|
|
||||||
Me.blCopyMessage.TabIndex = 7
|
|
||||||
Me.blCopyMessage.Text = "Copy Message"
|
|
||||||
Me.blCopyMessage.Visible = False
|
|
||||||
'
|
|
||||||
'TaskDialogBaseForm
|
|
||||||
'
|
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(288.0!, 288.0!)
|
|
||||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi
|
|
||||||
Me.ClientSize = New System.Drawing.Size(705, 683)
|
|
||||||
Me.Controls.Add(Me.tlpMain)
|
|
||||||
Me.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4)
|
|
||||||
Me.MaximizeBox = False
|
|
||||||
Me.MinimizeBox = False
|
|
||||||
Me.Name = "TaskDialogBaseForm"
|
|
||||||
Me.ShowIcon = False
|
|
||||||
Me.Text = "StaxRip"
|
|
||||||
Me.tlpMain.ResumeLayout(False)
|
|
||||||
Me.tlpMain.PerformLayout()
|
|
||||||
Me.tlpTop.ResumeLayout(False)
|
|
||||||
Me.tlpTop.PerformLayout()
|
|
||||||
CType(Me.pbIcon, System.ComponentModel.ISupportInitialize).EndInit()
|
|
||||||
Me.spBottom.ResumeLayout(False)
|
|
||||||
Me.spBottom.PerformLayout()
|
|
||||||
Me.ResumeLayout(False)
|
|
||||||
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Friend WithEvents tlpMain As TableLayoutPanel
|
|
||||||
Friend WithEvents CheckBox As CheckBoxEx
|
|
||||||
Friend WithEvents flpButtons As FlowLayoutPanel
|
|
||||||
Friend WithEvents InputTextEdit As TextEdit
|
|
||||||
Friend WithEvents tlpTop As TableLayoutPanel
|
|
||||||
Friend WithEvents TitleLabel As LabelEx
|
|
||||||
Friend WithEvents MenuButton As MenuButtonEx
|
|
||||||
Friend WithEvents paMain As TaskDialogPanel
|
|
||||||
Friend WithEvents spBottom As StackPanel
|
|
||||||
Friend WithEvents blCopyMessage As ButtonLabel
|
|
||||||
Friend WithEvents blDetails As ButtonLabel
|
|
||||||
Friend WithEvents pbIcon As PictureBox
|
|
||||||
End Class
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -110,8 +110,11 @@
|
|||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
</Page>
|
</Page>
|
||||||
|
<Compile Include="Misc\Global.cs" />
|
||||||
<Compile Include="Misc\Help.cs" />
|
<Compile Include="Misc\Help.cs" />
|
||||||
<Compile Include="Misc\GlobalHotkey.cs" />
|
<Compile Include="Misc\GlobalHotkey.cs" />
|
||||||
|
<Compile Include="Misc\Msg.cs" />
|
||||||
|
<Compile Include="Misc\Terminal.cs" />
|
||||||
<Compile Include="Misc\UpdateCheck.cs" />
|
<Compile Include="Misc\UpdateCheck.cs" />
|
||||||
<Compile Include="Misc\Theme.cs" />
|
<Compile Include="Misc\Theme.cs" />
|
||||||
<Compile Include="Misc\PowerShell.cs" />
|
<Compile Include="Misc\PowerShell.cs" />
|
||||||
@@ -146,12 +149,11 @@
|
|||||||
<DependentUpon>MainForm.cs</DependentUpon>
|
<DependentUpon>MainForm.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Misc\Misc.cs" />
|
<Compile Include="Misc\Misc.cs" />
|
||||||
<Compile Include="mpv\core.cs" />
|
<Compile Include="mpv\CorePlayer.cs" />
|
||||||
<Compile Include="Misc\Commands.cs" />
|
<Compile Include="Misc\Commands.cs" />
|
||||||
<Compile Include="Native\Native.cs" />
|
<Compile Include="Native\Native.cs" />
|
||||||
<Compile Include="Misc\Program.cs" />
|
<Compile Include="Misc\Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Native\TaskDialog.cs" />
|
|
||||||
<Compile Include="WPF\SetupWindow.xaml.cs">
|
<Compile Include="WPF\SetupWindow.xaml.cs">
|
||||||
<DependentUpon>SetupWindow.xaml</DependentUpon>
|
<DependentUpon>SetupWindow.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -231,12 +233,6 @@
|
|||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Page>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="WinForms\TaskDialog\TaskDialog.vbproj">
|
|
||||||
<Project>{cfbe6e6c-b711-42bb-b5ed-487d4767fe2b}</Project>
|
|
||||||
<Name>TaskDialog</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mpv.net", "mpv.net.csproj",
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RatingExtension", "extensions\RatingExtension\RatingExtension.csproj", "{55C88710-539D-4402-84C8-31694841C731}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RatingExtension", "extensions\RatingExtension\RatingExtension.csproj", "{55C88710-539D-4402-84C8-31694841C731}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TaskDialog", "WinForms\TaskDialog\TaskDialog.vbproj", "{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -23,10 +21,6 @@ Global
|
|||||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{55C88710-539D-4402-84C8-31694841C731}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.Build.0 = Release|Any CPU
|
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Drawing.Drawing2D;
|
using System.Drawing.Drawing2D;
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
@@ -11,17 +12,12 @@ using System.Threading;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
using static libmpv;
|
using static libmpv;
|
||||||
using static mpvnet.NewLine;
|
using static mpvnet.Global;
|
||||||
|
|
||||||
using System.Globalization;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
public class Core
|
public class CorePlayer
|
||||||
{
|
{
|
||||||
public static Core core { get; } = new Core();
|
|
||||||
public static Core GetCore() => core;
|
|
||||||
|
|
||||||
public static string[] VideoTypes { get; set; } = "264 265 asf avc avi avs dav flv h264 h265 hevc m2t m2ts m2v m4v mkv mov mp4 mpeg mpg mpv mts ts vob vpy webm wmv y4m".Split(' ');
|
public static string[] VideoTypes { get; set; } = "264 265 asf avc avi avs dav flv h264 h265 hevc m2t m2ts m2v m4v mkv mov mp4 mpeg mpg mpv mts ts vob vpy webm wmv y4m".Split(' ');
|
||||||
public static string[] AudioTypes { get; set; } = "aac ac3 dts dtshd dtshr dtsma eac3 flac m4a mka mp2 mp3 mpa mpc ogg opus thd thd+ac3 w64 wav".Split(' ');
|
public static string[] AudioTypes { get; set; } = "aac ac3 dts dtshd dtshr dtsma eac3 flac m4a mka mp2 mp3 mpa mpc ogg opus thd thd+ac3 w64 wav".Split(' ');
|
||||||
public static string[] ImageTypes { get; set; } = { "jpg", "bmp", "png", "gif" };
|
public static string[] ImageTypes { get; set; } = { "jpg", "bmp", "png", "gif" };
|
||||||
@@ -190,57 +186,31 @@ namespace mpvnet
|
|||||||
get {
|
get {
|
||||||
if (_ConfigFolder == null)
|
if (_ConfigFolder == null)
|
||||||
{
|
{
|
||||||
string portableFolder = Folder.Startup + @"portable_config\";
|
_ConfigFolder = Folder.Startup + "portable_config";
|
||||||
_ConfigFolder = portableFolder;
|
|
||||||
|
|
||||||
if (!Directory.Exists(_ConfigFolder))
|
|
||||||
_ConfigFolder = RegistryHelp.GetString("ConfigFolder");
|
|
||||||
|
|
||||||
if (!Directory.Exists(_ConfigFolder))
|
if (!Directory.Exists(_ConfigFolder))
|
||||||
{
|
{
|
||||||
string appdataFolder = Environment.GetFolderPath(
|
_ConfigFolder = Folder.AppData + "mpv.net";
|
||||||
Environment.SpecialFolder.ApplicationData) + @"\mpv.net\";
|
|
||||||
|
|
||||||
using (TaskDialog<string> td = new TaskDialog<string>())
|
if (!Directory.Exists(_ConfigFolder))
|
||||||
{
|
{
|
||||||
td.MainInstruction = "Choose a settings folder.";
|
_ConfigFolder = Folder.CustomSettings;
|
||||||
td.AddCommand(@"AppData\Roaming\mpv.net", appdataFolder, appdataFolder);
|
|
||||||
td.AddCommand(@"<startup>\portable_config", portableFolder, portableFolder);
|
|
||||||
td.AddCommand("Choose custom folder", "custom");
|
|
||||||
_ConfigFolder = td.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_ConfigFolder == null)
|
if (!Directory.Exists(_ConfigFolder))
|
||||||
{
|
_ConfigFolder = Folder.AppData + "mpv.net";
|
||||||
_ConfigFolder = "";
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_ConfigFolder == "custom")
|
|
||||||
{
|
|
||||||
using (var dialog = new FolderBrowserDialog())
|
|
||||||
{
|
|
||||||
dialog.Description = "Choose a folder.";
|
|
||||||
|
|
||||||
if (dialog.ShowDialog() == DialogResult.OK)
|
|
||||||
_ConfigFolder = dialog.SelectedPath + @"\";
|
|
||||||
else
|
|
||||||
_ConfigFolder = appdataFolder;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Folder.Startup == _ConfigFolder)
|
if (Folder.Startup.IsIdenticalFolder(_ConfigFolder))
|
||||||
{
|
{
|
||||||
Msg.ShowError("Startup folder and config folder cannot be identical, using portable_config instead.");
|
Msg.ShowError("Startup folder and config folder cannot be identical, using portable_config instead.");
|
||||||
_ConfigFolder = portableFolder;
|
_ConfigFolder = Folder.Startup + "portable_config";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Directory.Exists(_ConfigFolder))
|
if (!Directory.Exists(_ConfigFolder))
|
||||||
Directory.CreateDirectory(_ConfigFolder);
|
Directory.CreateDirectory(_ConfigFolder);
|
||||||
|
|
||||||
if (!_ConfigFolder.Contains("portable_config"))
|
_ConfigFolder = _ConfigFolder.AddSep();
|
||||||
RegistryHelp.SetValue(App.RegPath, "ConfigFolder", _ConfigFolder);
|
|
||||||
|
|
||||||
if (!File.Exists(_ConfigFolder + "input.conf"))
|
if (!File.Exists(_ConfigFolder + "input.conf"))
|
||||||
File.WriteAllText(_ConfigFolder + "input.conf", Properties.Resources.input_conf);
|
File.WriteAllText(_ConfigFolder + "input.conf", Properties.Resources.input_conf);
|
||||||
@@ -292,7 +262,7 @@ namespace mpvnet
|
|||||||
public void InvokePowerShellScript(string file)
|
public void InvokePowerShellScript(string file)
|
||||||
{
|
{
|
||||||
PowerShell ps = new PowerShell();
|
PowerShell ps = new PowerShell();
|
||||||
ps.Variables.Add(new KeyValuePair<string, object>("core", core));
|
ps.Variables.Add(new KeyValuePair<string, object>("core", Core));
|
||||||
ps.Variables.Add(new KeyValuePair<string, object>("window", MainForm.Instance));
|
ps.Variables.Add(new KeyValuePair<string, object>("window", MainForm.Instance));
|
||||||
ps.Scripts.Add("Using namespace mpvnet; [Reflection.Assembly]::LoadWithPartialName('mpvnet')" + BR);
|
ps.Scripts.Add("Using namespace mpvnet; [Reflection.Assembly]::LoadWithPartialName('mpvnet')" + BR);
|
||||||
|
|
||||||
@@ -427,7 +397,7 @@ namespace mpvnet
|
|||||||
Duration = TimeSpan.FromSeconds(get_property_number("duration"));
|
Duration = TimeSpan.FromSeconds(get_property_number("duration"));
|
||||||
|
|
||||||
if (App.StartSize == "video")
|
if (App.StartSize == "video")
|
||||||
core.WasInitialSizeSet = false;
|
Core.WasInitialSizeSet = false;
|
||||||
|
|
||||||
Size size = new Size(get_property_int("width"), get_property_int("height"));
|
Size size = new Size(get_property_int("width"), get_property_int("height"));
|
||||||
|
|
||||||
@@ -445,10 +415,10 @@ namespace mpvnet
|
|||||||
App.RunTask(new Action(() => ReadMetaData()));
|
App.RunTask(new Action(() => ReadMetaData()));
|
||||||
|
|
||||||
App.RunTask(new Action(() => {
|
App.RunTask(new Action(() => {
|
||||||
string path = core.get_property_string("path");
|
string path = Core.get_property_string("path");
|
||||||
|
|
||||||
if (path.Contains("://"))
|
if (path.Contains("://"))
|
||||||
path = core.get_property_string("media-title");
|
path = Core.get_property_string("media-title");
|
||||||
|
|
||||||
WriteHistory(path);
|
WriteHistory(path);
|
||||||
}));
|
}));
|
||||||
@@ -594,7 +564,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
public void SetBluRayTitle(int id)
|
public void SetBluRayTitle(int id)
|
||||||
{
|
{
|
||||||
core.LoadFiles(new[] { @"bd://" + id }, false, false);
|
Core.LoadFiles(new[] { @"bd://" + id }, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InvokeEvent(Action action, Action asyncAction)
|
void InvokeEvent(Action action, Action asyncAction)
|
||||||
@@ -947,9 +917,9 @@ namespace mpvnet
|
|||||||
if (throwException)
|
if (throwException)
|
||||||
{
|
{
|
||||||
foreach (string msg in messages)
|
foreach (string msg in messages)
|
||||||
ConsoleHelp.WriteError(msg);
|
Terminal.WriteError(msg);
|
||||||
|
|
||||||
ConsoleHelp.WriteError(GetError(err));
|
Terminal.WriteError(GetError(err));
|
||||||
throw new Exception(string.Join(BR2, messages) + BR2 + GetError(err));
|
throw new Exception(string.Join(BR2, messages) + BR2 + GetError(err));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -984,7 +954,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
else if (arg == "--audio-device=help")
|
else if (arg == "--audio-device=help")
|
||||||
{
|
{
|
||||||
Console.WriteLine(core.get_property_osd_string("audio-device-list"));
|
Console.WriteLine(Core.get_property_osd_string("audio-device-list"));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (arg == "--version")
|
else if (arg == "--version")
|
||||||
@@ -994,12 +964,12 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
else if (arg == "--input-keylist")
|
else if (arg == "--input-keylist")
|
||||||
{
|
{
|
||||||
Console.WriteLine(core.get_property_string("input-key-list").Replace(",", BR));
|
Console.WriteLine(Core.get_property_string("input-key-list").Replace(",", BR));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (arg.StartsWith("--command="))
|
else if (arg.StartsWith("--command="))
|
||||||
{
|
{
|
||||||
core.command(arg.Substring(10));
|
Core.command(arg.Substring(10));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1029,14 +999,14 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (preInit && preInitProperties.Contains(left))
|
if (preInit && preInitProperties.Contains(left))
|
||||||
{
|
{
|
||||||
core.ProcessProperty(left, right);
|
Core.ProcessProperty(left, right);
|
||||||
|
|
||||||
if (!App.ProcessProperty(left, right))
|
if (!App.ProcessProperty(left, right))
|
||||||
set_property_string(left, right, true);
|
set_property_string(left, right, true);
|
||||||
}
|
}
|
||||||
else if (!preInit && !preInitProperties.Contains(left))
|
else if (!preInit && !preInitProperties.Contains(left))
|
||||||
{
|
{
|
||||||
core.ProcessProperty(left, right);
|
Core.ProcessProperty(left, right);
|
||||||
|
|
||||||
if (!App.ProcessProperty(left, right))
|
if (!App.ProcessProperty(left, right))
|
||||||
{
|
{
|
||||||
@@ -1069,7 +1039,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (shuffle)
|
if (shuffle)
|
||||||
{
|
{
|
||||||
core.command("playlist-shuffle");
|
Core.command("playlist-shuffle");
|
||||||
set_property_int("playlist-pos", 0);
|
set_property_int("playlist-pos", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1104,11 +1074,11 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (file.Ext() == "iso")
|
if (file.Ext() == "iso")
|
||||||
LoadISO(file);
|
LoadISO(file);
|
||||||
else if(Core.SubtitleTypes.Contains(file.Ext()))
|
else if(CorePlayer.SubtitleTypes.Contains(file.Ext()))
|
||||||
commandv("sub-add", file);
|
commandv("sub-add", file);
|
||||||
else if (file.Ext().Length != 3 && File.Exists(Path.Combine(file, "BDMV\\index.bdmv")))
|
else if (file.Ext().Length != 3 && File.Exists(Path.Combine(file, "BDMV\\index.bdmv")))
|
||||||
{
|
{
|
||||||
core.command("stop");
|
Core.command("stop");
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
set_property_string("bluray-device", file);
|
set_property_string("bluray-device", file);
|
||||||
commandv("loadfile", @"bd://");
|
commandv("loadfile", @"bd://");
|
||||||
@@ -1133,35 +1103,31 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (gb < 10)
|
if (gb < 10)
|
||||||
{
|
{
|
||||||
using (TaskDialog<string> td = new TaskDialog<string>())
|
DialogResult result = Msg.ShowQuestion("Click Yes for Blu-ray and No for DVD.",
|
||||||
{
|
null, MessageBoxButtons.YesNoCancel);
|
||||||
td.MainInstruction = "Is this a Blu-ray or a DVD image?";
|
|
||||||
td.AddCommand("Blu-ray");
|
|
||||||
td.AddCommand("DVD");
|
|
||||||
|
|
||||||
switch (td.Show())
|
switch (result)
|
||||||
{
|
{
|
||||||
case "Blu-ray":
|
case DialogResult.Yes:
|
||||||
core.command("stop");
|
Core.command("stop");
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
core.set_property_string("bluray-device", path);
|
Core.set_property_string("bluray-device", path);
|
||||||
core.LoadFiles(new[] { @"bd://" }, false, false);
|
Core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||||
break;
|
break;
|
||||||
case "DVD":
|
case DialogResult.No:
|
||||||
core.command("stop");
|
Core.command("stop");
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
core.set_property_string("dvd-device", path);
|
Core.set_property_string("dvd-device", path);
|
||||||
core.LoadFiles(new[] { @"dvd://" }, false, false);
|
Core.LoadFiles(new[] { @"dvd://" }, false, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
core.command("stop");
|
Core.command("stop");
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
core.set_property_string("bluray-device", path);
|
Core.set_property_string("bluray-device", path);
|
||||||
core.LoadFiles(new[] { @"bd://" }, false, false);
|
Core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1184,9 +1150,9 @@ namespace mpvnet
|
|||||||
List<string> files = Directory.GetFiles(dir).ToList();
|
List<string> files = Directory.GetFiles(dir).ToList();
|
||||||
|
|
||||||
files = files.Where(file =>
|
files = files.Where(file =>
|
||||||
Core.VideoTypes.Contains(file.Ext()) ||
|
CorePlayer.VideoTypes.Contains(file.Ext()) ||
|
||||||
Core.AudioTypes.Contains(file.Ext()) ||
|
CorePlayer.AudioTypes.Contains(file.Ext()) ||
|
||||||
Core.ImageTypes.Contains(file.Ext())).ToList();
|
CorePlayer.ImageTypes.Contains(file.Ext())).ToList();
|
||||||
|
|
||||||
files.Sort(new StringLogicalComparer());
|
files.Sort(new StringLogicalComparer());
|
||||||
int index = files.IndexOf(path);
|
int index = files.IndexOf(path);
|
||||||
@@ -1239,7 +1205,7 @@ namespace mpvnet
|
|||||||
bool HistoryDiscard()
|
bool HistoryDiscard()
|
||||||
{
|
{
|
||||||
if (HistoryDiscardOption == null)
|
if (HistoryDiscardOption == null)
|
||||||
HistoryDiscardOption = core.get_opt("history-discard");
|
HistoryDiscardOption = Core.get_opt("history-discard");
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(HistoryDiscardOption))
|
if (string.IsNullOrEmpty(HistoryDiscardOption))
|
||||||
return false;
|
return false;
|
||||||
@@ -1316,30 +1282,30 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (path.ToLowerEx().Contains("://"))
|
if (path.ToLowerEx().Contains("://"))
|
||||||
{
|
{
|
||||||
int count = core.get_property_int("track-list/count");
|
int count = Core.get_property_int("track-list/count");
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
string type = core.get_property_string($"track-list/{i}/type");
|
string type = Core.get_property_string($"track-list/{i}/type");
|
||||||
|
|
||||||
if (type == "audio")
|
if (type == "audio")
|
||||||
{
|
{
|
||||||
MediaTrack track = new MediaTrack();
|
MediaTrack track = new MediaTrack();
|
||||||
Add(track, GetLanguage(core.get_property_string($"track-list/{i}/lang")));
|
Add(track, GetLanguage(Core.get_property_string($"track-list/{i}/lang")));
|
||||||
Add(track, core.get_property_string($"track-list/{i}/codec").ToUpperEx());
|
Add(track, Core.get_property_string($"track-list/{i}/codec").ToUpperEx());
|
||||||
Add(track, core.get_property_int($"track-list/{i}/audio-channels") + " channels");
|
Add(track, Core.get_property_int($"track-list/{i}/audio-channels") + " channels");
|
||||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||||
track.Type = "a";
|
track.Type = "a";
|
||||||
track.ID = core.get_property_int($"track-list/{i}/id");
|
track.ID = Core.get_property_int($"track-list/{i}/id");
|
||||||
MediaTracks.Add(track);
|
MediaTracks.Add(track);
|
||||||
}
|
}
|
||||||
else if (type == "sub")
|
else if (type == "sub")
|
||||||
{
|
{
|
||||||
MediaTrack track = new MediaTrack();
|
MediaTrack track = new MediaTrack();
|
||||||
Add(track, GetLanguage(core.get_property_string($"track-list/{i}/lang")));
|
Add(track, GetLanguage(Core.get_property_string($"track-list/{i}/lang")));
|
||||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||||
track.Type = "s";
|
track.Type = "s";
|
||||||
track.ID = core.get_property_int($"track-list/{i}/id");
|
track.ID = Core.get_property_int($"track-list/{i}/id");
|
||||||
MediaTracks.Add(track);
|
MediaTracks.Add(track);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user