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
|
||||
work correctly in mpv either, so I've removed support for it and
|
||||
added my own implementation `script-message mpv.net window-scale`.
|
||||
- The previous Beta replaced the CS-Script library with my own
|
||||
C# scripting implementation.
|
||||
- The CS-Script library was replaced with my own C# scripting implementation.
|
||||
- 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.
|
||||
Furthermore the `remember-position` option remembers a near screen border
|
||||
position instead of remembering the window center position.
|
||||
- High DPI multi monitor fix.
|
||||
- `start-size` option has new options, see in config editor and manual.
|
||||
- Improved `cycle-audio` OSD info.
|
||||
- `start-size` option has new options, see config editor and manual.
|
||||
- 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)
|
||||
|
||||
@@ -108,21 +108,28 @@ Or use the [support thread](https://forum.videohelp.com/threads/392514-mpv-net-a
|
||||
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,
|
||||
all config will be loaded from this folder only.
|
||||
1. startup\portable_config
|
||||
2. %APPDATA%\mpv.net
|
||||
|
||||
```Text
|
||||
<startup>\portable_config\
|
||||
```
|
||||
In order to use a custom directory create following file:
|
||||
|
||||
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.net generates it with the following defaults:
|
||||
|
||||
[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
|
||||
|
||||
@@ -18,16 +18,19 @@ using System.ComponentModel.Composition;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using Microsoft.VisualBasic.FileIO;
|
||||
|
||||
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))]
|
||||
public class RatingExtension : IExtension
|
||||
{
|
||||
//Script script = new Script();
|
||||
|
||||
// dictionory to store the filename and the rating
|
||||
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
|
||||
{
|
||||
core.ClientMessage += ClientMessage; //handles keys defined in input.conf
|
||||
core.Shutdown += Shutdown; // handles MPV_EVENT_SHUTDOWN
|
||||
Core.ClientMessage += ClientMessage; //handles keys defined in input.conf
|
||||
Core.Shutdown += 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;
|
||||
int rating = i.Value;
|
||||
|
||||
if (String.IsNullOrEmpty(filepath) || !File.Exists(filepath))
|
||||
if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath))
|
||||
return;
|
||||
|
||||
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))
|
||||
{
|
||||
string path = core.get_property_string("path");
|
||||
string path = Core.get_property_string("path");
|
||||
|
||||
if (!File.Exists(path))
|
||||
return;
|
||||
@@ -87,7 +90,7 @@ namespace RatingExtension // the assembly name must end with 'Extension'
|
||||
else
|
||||
{
|
||||
Dic[path] = rating;
|
||||
core.commandv("show-text", $"Rating: {rating}");
|
||||
Core.commandv("show-text", $"Rating: {rating}");
|
||||
}
|
||||
}
|
||||
else if (args[1] == "about")
|
||||
@@ -99,26 +102,26 @@ namespace RatingExtension // the assembly name must end with 'Extension'
|
||||
{
|
||||
if (rating == 0)
|
||||
{
|
||||
FileToDelete = core.get_property_string("path");
|
||||
FileToDelete = Core.get_property_string("path");
|
||||
DeleteTime = DateTime.Now;
|
||||
core.commandv("show-text", "Press 1 to delete file", "5000");
|
||||
Core.commandv("show-text", "Press 1 to delete file", "5000");
|
||||
}
|
||||
else
|
||||
{
|
||||
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))
|
||||
{
|
||||
core.command("playlist-remove current");
|
||||
int pos = core.get_property_int("playlist-pos");
|
||||
Core.command("playlist-remove current");
|
||||
int pos = Core.get_property_int("playlist-pos");
|
||||
|
||||
if (pos == -1)
|
||||
{
|
||||
int count = core.get_property_int("playlist-count");
|
||||
int count = Core.get_property_int("playlist-count");
|
||||
|
||||
if (count > 0)
|
||||
core.set_property_int("playlist-pos", count - 1);
|
||||
Core.set_property_int("playlist-pos", count - 1);
|
||||
}
|
||||
|
||||
Thread.Sleep(2000);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>C:\Users\frank\OneDrive\Settings\mpv.net\extensions\RatingExtension\</OutputPath>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
@@ -24,7 +24,7 @@
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
|
||||
<OutputPath>C:\Users\frank\OneDrive\Settings\mpv.net\extensions\RatingExtension\</OutputPath>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
@@ -38,6 +38,7 @@
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
@@ -49,6 +50,7 @@
|
||||
<ItemGroup>
|
||||
<Compile Include="RatingExtension.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="ScriptDevelopment.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<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.Threading.Tasks;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static TaskDialog.Msg;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
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 DarkMode { get; set; } = "always";
|
||||
public static string DarkTheme { get; set; } = "dark";
|
||||
@@ -43,8 +41,8 @@ namespace mpvnet
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
string dummy = core.ConfigFolder;
|
||||
var dummy2 = core.Conf;
|
||||
string dummy = Core.ConfigFolder;
|
||||
var dummy2 = Core.Conf;
|
||||
|
||||
foreach (var i in Conf)
|
||||
ProcessProperty(i.Key, i.Value, true);
|
||||
@@ -53,7 +51,7 @@ namespace mpvnet
|
||||
{
|
||||
try
|
||||
{
|
||||
string filePath = core.ConfigFolder + "mpvnet-debug.log";
|
||||
string filePath = Core.ConfigFolder + "mpvnet-debug.log";
|
||||
|
||||
if (File.Exists(filePath))
|
||||
File.Delete(filePath);
|
||||
@@ -72,16 +70,16 @@ namespace mpvnet
|
||||
|
||||
string themeContent = null;
|
||||
|
||||
if (File.Exists(core.ConfigFolder + "theme.conf"))
|
||||
themeContent = File.ReadAllText(core.ConfigFolder + "theme.conf");
|
||||
if (File.Exists(Core.ConfigFolder + "theme.conf"))
|
||||
themeContent = File.ReadAllText(Core.ConfigFolder + "theme.conf");
|
||||
|
||||
Theme.Init(
|
||||
themeContent,
|
||||
Properties.Resources.theme,
|
||||
IsDarkMode ? DarkTheme : LightTheme);
|
||||
|
||||
core.Shutdown += Shutdown;
|
||||
core.Initialized += Initialized;
|
||||
Core.Shutdown += Shutdown;
|
||||
Core.Initialized += Initialized;
|
||||
}
|
||||
|
||||
public static void RunTask(Action action)
|
||||
@@ -99,34 +97,32 @@ namespace mpvnet
|
||||
get {
|
||||
return "Copyright (C) 2000-2021 mpv.net/mpv/mplayer\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)
|
||||
{
|
||||
if (obj is Exception e)
|
||||
{
|
||||
if (IsStartedFromTerminal)
|
||||
ConsoleHelp.WriteError(e.ToString());
|
||||
else
|
||||
Msg.ShowException(e);
|
||||
}
|
||||
if (IsStartedFromTerminal)
|
||||
Terminal.WriteError(obj.ToString());
|
||||
else
|
||||
{
|
||||
if (IsStartedFromTerminal)
|
||||
ConsoleHelp.WriteError(obj.ToString());
|
||||
if (obj is Exception e)
|
||||
Msg.ShowException(e);
|
||||
else
|
||||
MsgError(obj.ToString());
|
||||
Msg.ShowError(obj.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
public static void ShowError(string title, string msg)
|
||||
public static void ShowError(string title, string msg = null)
|
||||
{
|
||||
if (IsStartedFromTerminal)
|
||||
{
|
||||
ConsoleHelp.WriteError(title);
|
||||
ConsoleHelp.WriteError(msg);
|
||||
if (title != null)
|
||||
Terminal.WriteError(title);
|
||||
|
||||
if (msg != null)
|
||||
Terminal.WriteError(msg);
|
||||
}
|
||||
else
|
||||
Msg.ShowError(title, msg);
|
||||
@@ -136,8 +132,8 @@ namespace mpvnet
|
||||
{
|
||||
if (RememberVolume)
|
||||
{
|
||||
core.set_property_int("volume", RegistryHelp.GetInt("Volume", 70));
|
||||
core.set_property_string("mute", RegistryHelp.GetString("Mute", "no"));
|
||||
Core.set_property_int("volume", RegistryHelp.GetInt("volume", 70));
|
||||
Core.set_property_string("mute", RegistryHelp.GetString("mute", "no"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,8 +141,8 @@ namespace mpvnet
|
||||
{
|
||||
if (RememberVolume)
|
||||
{
|
||||
RegistryHelp.SetValue(RegPath, "Volume", core.get_property_int("volume"));
|
||||
RegistryHelp.SetValue(RegPath, "Mute", core.get_property_string("mute"));
|
||||
RegistryHelp.SetInt("volume", Core.get_property_int("volume"));
|
||||
RegistryHelp.SetString("mute", Core.get_property_string("mute"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,31 +181,31 @@ namespace mpvnet
|
||||
case "minimum-aspect-ratio": MinimumAspectRatio = value.ToFloat(); return true;
|
||||
case "dark-theme": DarkTheme = 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 "audio-file-extensions": AudioTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
||||
case "image-file-extensions": ImageTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
||||
case "video-file-extensions": CorePlayer.VideoTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
||||
case "audio-file-extensions": CorePlayer.AudioTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
||||
case "image-file-extensions": CorePlayer.ImageTypes = value.Split(" ,;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); return true;
|
||||
default:
|
||||
if (writeError)
|
||||
ConsoleHelp.WriteError($"unknown mpvnet.conf property: {name}");
|
||||
Terminal.WriteError($"unknown mpvnet.conf property: {name}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void ShowSetup()
|
||||
{
|
||||
int value = RegistryHelp.GetInt(Folder.Startup);
|
||||
int value = RegistryHelp.GetInt("location: " + Folder.Startup);
|
||||
|
||||
if (value != 1)
|
||||
{
|
||||
if (Msg.ShowQuestion("Would you like to setup mpv.net?",
|
||||
"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");
|
||||
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);
|
||||
|
||||
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)
|
||||
@@ -42,6 +49,7 @@ namespace mpvnet
|
||||
CompilerParameters parameters = new CompilerParameters();
|
||||
|
||||
string[] dependencies = {
|
||||
Folder.Startup + "mpvnet.exe",
|
||||
"Microsoft.VisualBasic.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",
|
||||
@@ -55,10 +63,10 @@ namespace mpvnet
|
||||
CompilerResults results = provider.CompileAssemblyFromFile(parameters, file);
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
@@ -10,8 +10,7 @@ using System.Windows;
|
||||
|
||||
using VB = Microsoft.VisualBasic;
|
||||
|
||||
using static mpvnet.NewLine;
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -23,21 +22,19 @@ namespace mpvnet
|
||||
{
|
||||
case "add-files-to-playlist": OpenFiles("append"); break; // deprecated 2019
|
||||
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-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-optical-media": Open_DVD_Or_BD_Folder(); break;
|
||||
case "open-url": OpenURL(); break;
|
||||
case "playlist-first": PlaylistFirst(); break;
|
||||
case "playlist-last": PlaylistLast(); 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 "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-commands": ShowCommands(); break;
|
||||
case "show-conf-editor": ShowDialog(typeof(ConfWindow)); break;
|
||||
@@ -46,15 +43,16 @@ namespace mpvnet
|
||||
case "show-history": ShowHistory(); break;
|
||||
case "show-info": ShowInfo(); 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-profiles": ShowTextWithEditor("profile-list", mpvHelp.GetProfiles()); break;
|
||||
case "show-playlist": ShowPlaylist(); break;
|
||||
case "show-profiles": ShowTextWithEditor("profile-list", mpvHelp.GetProfiles()); break;
|
||||
case "show-properties": ShowProperties(); break;
|
||||
case "show-protocols": ShowTextWithEditor("protocol-list", mpvHelp.GetProtocols()); 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 "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;
|
||||
}
|
||||
@@ -85,7 +83,7 @@ namespace mpvnet
|
||||
InvokeOnMainThread(new Action(() => {
|
||||
using (var d = new OpenFileDialog() { Multiselect = true })
|
||||
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)
|
||||
{
|
||||
core.command("stop");
|
||||
Core.command("stop");
|
||||
Thread.Sleep(500);
|
||||
|
||||
if (Directory.Exists(dialog.SelectedPath + "\\BDMV"))
|
||||
{
|
||||
core.set_property_string("bluray-device", dialog.SelectedPath);
|
||||
core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||
Core.set_property_string("bluray-device", dialog.SelectedPath);
|
||||
Core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
core.set_property_string("dvd-device", dialog.SelectedPath);
|
||||
core.LoadFiles(new[] { @"dvd://" }, false, false);
|
||||
Core.set_property_string("dvd-device", dialog.SelectedPath);
|
||||
Core.LoadFiles(new[] { @"dvd://" }, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -119,31 +117,31 @@ namespace mpvnet
|
||||
|
||||
public static void PlaylistFirst()
|
||||
{
|
||||
int pos = core.get_property_int("playlist-pos");
|
||||
int pos = Core.get_property_int("playlist-pos");
|
||||
|
||||
if (pos != 0)
|
||||
core.set_property_int("playlist-pos", 0);
|
||||
Core.set_property_int("playlist-pos", 0);
|
||||
}
|
||||
|
||||
public static void PlaylistLast()
|
||||
{
|
||||
int pos = core.get_property_int("playlist-pos");
|
||||
int count = core.get_property_int("playlist-count");
|
||||
int pos = Core.get_property_int("playlist-pos");
|
||||
int count = Core.get_property_int("playlist-count");
|
||||
|
||||
if (pos < count - 1)
|
||||
core.set_property_int("playlist-pos", count - 1);
|
||||
Core.set_property_int("playlist-pos", count - 1);
|
||||
}
|
||||
|
||||
public static void ShowHistory()
|
||||
{
|
||||
if (File.Exists(core.ConfigFolder + "history.txt"))
|
||||
ProcessHelp.ShellExecute(core.ConfigFolder + "history.txt");
|
||||
if (File.Exists(Core.ConfigFolder + "history.txt"))
|
||||
ProcessHelp.ShellExecute(Core.ConfigFolder + "history.txt");
|
||||
else
|
||||
{
|
||||
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 = "";
|
||||
long fileSize = 0;
|
||||
string path = core.get_property_string("path");
|
||||
string path = Core.get_property_string("path");
|
||||
|
||||
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 height = core.get_property_int("video-params/h");
|
||||
int width = Core.get_property_int("video-params/w");
|
||||
int height = Core.get_property_int("video-params/h");
|
||||
|
||||
if (File.Exists(path))
|
||||
{
|
||||
fileSize = new FileInfo(path).Length;
|
||||
|
||||
if (AudioTypes.Contains(path.Ext()))
|
||||
if (CorePlayer.AudioTypes.Contains(path.Ext()))
|
||||
{
|
||||
using (MediaInfo mediaInfo = new MediaInfo(path))
|
||||
{
|
||||
@@ -185,11 +183,11 @@ namespace mpvnet
|
||||
text += "Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n";
|
||||
text += "Type: " + path.Ext().ToUpper();
|
||||
|
||||
core.commandv("show-text", text, "5000");
|
||||
Core.commandv("show-text", text, "5000");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (ImageTypes.Contains(path.Ext()))
|
||||
else if (CorePlayer.ImageTypes.Contains(path.Ext()))
|
||||
{
|
||||
using (MediaInfo mediaInfo = new MediaInfo(path))
|
||||
{
|
||||
@@ -199,16 +197,16 @@ namespace mpvnet
|
||||
"Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n" +
|
||||
"Type: " + path.Ext().ToUpper();
|
||||
|
||||
core.commandv("show-text", text, "5000");
|
||||
Core.commandv("show-text", text, "5000");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TimeSpan position = TimeSpan.FromSeconds(core.get_property_number("time-pos"));
|
||||
TimeSpan duration2 = TimeSpan.FromSeconds(core.get_property_number("duration"));
|
||||
string videoFormat = core.get_property_string("video-format").ToUpper();
|
||||
string audioCodec = core.get_property_string("audio-codec-name").ToUpper();
|
||||
TimeSpan position = TimeSpan.FromSeconds(Core.get_property_number("time-pos"));
|
||||
TimeSpan duration2 = TimeSpan.FromSeconds(Core.get_property_number("duration"));
|
||||
string videoFormat = Core.get_property_string("video-format").ToUpper();
|
||||
string audioCodec = Core.get_property_string("audio-codec-name").ToUpper();
|
||||
|
||||
text = path.FileName() + "\n" +
|
||||
FormatTime(position.TotalMinutes) + ":" +
|
||||
@@ -222,7 +220,7 @@ namespace mpvnet
|
||||
|
||||
text += $"{videoFormat}\n{audioCodec}";
|
||||
|
||||
core.commandv("show-text", text, "5000");
|
||||
Core.commandv("show-text", text, "5000");
|
||||
string FormatTime(double value) => ((int)value).ToString("00");
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -230,19 +228,6 @@ namespace mpvnet
|
||||
App.ShowException(e);
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
@@ -256,7 +241,7 @@ namespace mpvnet
|
||||
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(() => {
|
||||
using (var d = new OpenFileDialog())
|
||||
{
|
||||
string path = core.get_property_string("path");
|
||||
string path = Core.get_property_string("path");
|
||||
|
||||
if (File.Exists(path))
|
||||
d.InitialDirectory = Path.GetDirectoryName(path);
|
||||
@@ -274,7 +259,7 @@ namespace mpvnet
|
||||
|
||||
if (d.ShowDialog() == DialogResult.OK)
|
||||
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(() => {
|
||||
using (var d = new OpenFileDialog())
|
||||
{
|
||||
string path = core.get_property_string("path");
|
||||
string path = Core.get_property_string("path");
|
||||
if (File.Exists(path))
|
||||
d.InitialDirectory = Path.GetDirectoryName(path);
|
||||
d.Multiselect = true;
|
||||
|
||||
if (d.ShowDialog() == DialogResult.OK)
|
||||
foreach (string i in d.FileNames)
|
||||
core.commandv("audio-add", i);
|
||||
Core.commandv("audio-add", i);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (len < 1)
|
||||
{
|
||||
core.commandv("show-text", "No audio tracks");
|
||||
Core.commandv("show-text", "No audio tracks");
|
||||
return;
|
||||
}
|
||||
|
||||
int aid = core.get_property_int("aid");
|
||||
int aid = Core.get_property_int("aid");
|
||||
|
||||
if (len > 1)
|
||||
{
|
||||
if (++aid > len)
|
||||
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()
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -358,9 +343,9 @@ namespace mpvnet
|
||||
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)
|
||||
{
|
||||
@@ -368,12 +353,12 @@ namespace mpvnet
|
||||
return;
|
||||
|
||||
if (duration == 0)
|
||||
duration = core.get_property_int("osd-duration");
|
||||
duration = Core.get_property_int("osd-duration");
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -384,13 +369,13 @@ namespace mpvnet
|
||||
if (args?.Length == 1)
|
||||
duration = Convert.ToInt32(args[0]);
|
||||
|
||||
var size = core.get_property_number("osd-font-size");
|
||||
core.set_property_number("osd-font-size", 40);
|
||||
core.command("show-text ${playlist} " + duration);
|
||||
var size = Core.get_property_number("osd-font-size");
|
||||
Core.set_property_number("osd-font-size", 40);
|
||||
Core.command("show-text ${playlist} " + duration);
|
||||
|
||||
App.RunTask(() => {
|
||||
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.Linq;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -33,14 +33,14 @@ namespace mpvnet
|
||||
if (knownExtensions.Contains(Path.GetFileName(extDir)))
|
||||
catalog.Catalogs.Add(new DirectoryCatalog(extDir, Path.GetFileName(extDir) + ".dll"));
|
||||
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\nUser extensions have to use <config folder>\\extensions" +
|
||||
"\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))
|
||||
foreach (string extDir in Directory.GetDirectories(dir))
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
|
||||
public static class Extensions
|
||||
public static class TestStringExtension
|
||||
{
|
||||
public static bool ContainsEx(this string instance, string value)
|
||||
{
|
||||
@@ -19,11 +19,14 @@ public static class Extensions
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ConvertToStringExtension
|
||||
{
|
||||
public static string ToUpperEx(this string instance)
|
||||
{
|
||||
if (instance != null)
|
||||
return instance.ToUpper();
|
||||
return instance.ToUpperInvariant();
|
||||
|
||||
return "";
|
||||
}
|
||||
@@ -31,11 +34,48 @@ public static class Extensions
|
||||
public static string ToLowerEx(this string instance)
|
||||
{
|
||||
if (instance != null)
|
||||
return instance.ToLower();
|
||||
return instance.ToLowerInvariant();
|
||||
|
||||
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)
|
||||
{
|
||||
if (string.IsNullOrEmpty(instance))
|
||||
@@ -54,25 +94,23 @@ public static class Extensions
|
||||
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 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);
|
||||
return result;
|
||||
}
|
||||
if (string.IsNullOrEmpty(instance) || string.IsNullOrEmpty(testFolder))
|
||||
return false;
|
||||
|
||||
public static float ToFloat(this string instance)
|
||||
{
|
||||
float.TryParse(instance.Replace(",", "."), NumberStyles.Float,
|
||||
CultureInfo.InvariantCulture, out float result);
|
||||
|
||||
return result;
|
||||
return instance.ToLowerInvariant().AddSep() == testFolder.ToLowerInvariant().AddSep();
|
||||
}
|
||||
}
|
||||
|
||||
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.Runtime.InteropServices;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -18,7 +18,7 @@ namespace mpvnet
|
||||
public static void RegisterGlobalHotkeys(IntPtr hwnd)
|
||||
{
|
||||
HWND = hwnd;
|
||||
string path = core.ConfigFolder + "global-input.conf";
|
||||
string path = Core.ConfigFolder + "global-input.conf";
|
||||
|
||||
if (!File.Exists(path))
|
||||
return;
|
||||
@@ -82,14 +82,14 @@ namespace mpvnet
|
||||
bool success = RegisterHotKey(HWND, ID++, mod, vk);
|
||||
|
||||
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)
|
||||
{
|
||||
if (Commands.ContainsKey(id))
|
||||
core.command(Commands[id]);
|
||||
Core.command(Commands[id]);
|
||||
}
|
||||
|
||||
static int mpv_to_VK(string value)
|
||||
|
||||
@@ -7,8 +7,7 @@ using System.Windows.Forms;
|
||||
|
||||
using Microsoft.Win32;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.NewLine;
|
||||
using static mpvnet.Global;
|
||||
|
||||
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
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -146,19 +96,19 @@ namespace mpvnet
|
||||
$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();
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
@@ -172,6 +122,17 @@ namespace mpvnet
|
||||
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)
|
||||
{
|
||||
using (RegistryKey regKey = GetRootKey(path).CreateSubKey(path.Substring(5), RegistryKeyPermissionCheck.ReadWriteSubTree))
|
||||
@@ -190,6 +151,8 @@ namespace mpvnet
|
||||
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)
|
||||
{
|
||||
using (RegistryKey regKey = GetRootKey(path).OpenSubKey(path.Substring(5)))
|
||||
|
||||
@@ -13,16 +13,10 @@ using System.Windows.Forms;
|
||||
|
||||
using Microsoft.Win32;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
public static class NewLine
|
||||
{
|
||||
public static string BR = Environment.NewLine;
|
||||
public static string BR2 = Environment.NewLine + Environment.NewLine;
|
||||
}
|
||||
|
||||
public class Sys
|
||||
{
|
||||
public static bool IsDarkTheme {
|
||||
@@ -102,13 +96,13 @@ namespace mpvnet
|
||||
RegistryHelp.SetValue($@"HKCR\" + "." + ext, null, ExeFilenameNoExt + "." + ext);
|
||||
RegistryHelp.SetValue($@"HKCR\" + "." + ext + @"\OpenWithProgIDs", ExeFilenameNoExt + "." + ext, "");
|
||||
|
||||
if (VideoTypes.Contains(ext))
|
||||
if (CorePlayer.VideoTypes.Contains(ext))
|
||||
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "video");
|
||||
|
||||
if (AudioTypes.Contains(ext))
|
||||
if (CorePlayer.AudioTypes.Contains(ext))
|
||||
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "audio");
|
||||
|
||||
if (ImageTypes.Contains(ext))
|
||||
if (CorePlayer.ImageTypes.Contains(ext))
|
||||
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "image");
|
||||
|
||||
RegistryHelp.SetValue($@"HKCR\" + ExeFilenameNoExt + "." + ext + @"\shell\open\command", null, $"\"{ExePath}\" \"%1\"");
|
||||
@@ -203,7 +197,7 @@ namespace mpvnet
|
||||
public static ObservableCollection<CommandItem> Items {
|
||||
get {
|
||||
if (_Items is null)
|
||||
_Items = GetItems(File.ReadAllText(core.InputConfPath));
|
||||
_Items = GetItems(File.ReadAllText(Core.InputConfPath));
|
||||
|
||||
return _Items;
|
||||
}
|
||||
@@ -212,6 +206,26 @@ namespace mpvnet
|
||||
|
||||
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.Threading;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.NewLine;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -90,7 +89,7 @@ namespace mpvnet
|
||||
var output = sender as PipelineReader<PSObject>;
|
||||
|
||||
while (output.Count > 0)
|
||||
ConsoleHelp.Write(output.Read(), Module);
|
||||
Terminal.Write(output.Read(), Module);
|
||||
}
|
||||
|
||||
public void Error_DataReady(object sender, EventArgs e)
|
||||
@@ -98,7 +97,7 @@ namespace mpvnet
|
||||
var output = sender as PipelineReader<Object>;
|
||||
|
||||
while (output.Count > 0)
|
||||
ConsoleHelp.WriteError(output.Read(), Module);
|
||||
Terminal.WriteError(output.Read(), Module);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -137,19 +136,19 @@ namespace mpvnet
|
||||
switch (type)
|
||||
{
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
default:
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
case "end-file":
|
||||
core.EndFileAsync += reason => Event.Invoke("end-file", new object[] { reason });
|
||||
Core.EndFileAsync += reason => Event.Invoke("end-file", new object[] { reason });
|
||||
break;
|
||||
|
||||
case "client-message":
|
||||
core.ClientMessageAsync += args => Event.Invoke("client-message", args);
|
||||
Core.ClientMessageAsync += args => Event.Invoke("client-message", args);
|
||||
break;
|
||||
|
||||
case "shutdown":
|
||||
core.Shutdown += () => Event.Invoke("shutdown", null);
|
||||
Core.Shutdown += () => Event.Invoke("shutdown", null);
|
||||
break;
|
||||
|
||||
case "get-property-reply":
|
||||
core.GetPropertyReplyAsync += () => Event.Invoke("get-property-reply", null);
|
||||
Core.GetPropertyReplyAsync += () => Event.Invoke("get-property-reply", null);
|
||||
break;
|
||||
|
||||
case "set-property-reply":
|
||||
core.SetPropertyReplyAsync += () => Event.Invoke("set-property-reply", null);
|
||||
Core.SetPropertyReplyAsync += () => Event.Invoke("set-property-reply", null);
|
||||
break;
|
||||
|
||||
case "command-reply":
|
||||
core.CommandReplyAsync += () => Event.Invoke("command-reply", null);
|
||||
Core.CommandReplyAsync += () => Event.Invoke("command-reply", null);
|
||||
break;
|
||||
|
||||
case "start-file":
|
||||
core.StartFileAsync += () => Event.Invoke("start-file", null);
|
||||
Core.StartFileAsync += () => Event.Invoke("start-file", null);
|
||||
break;
|
||||
|
||||
case "file-loaded":
|
||||
core.FileLoadedAsync += () => Event.Invoke("file-loaded", null);
|
||||
Core.FileLoadedAsync += () => Event.Invoke("file-loaded", null);
|
||||
break;
|
||||
|
||||
case "idle":
|
||||
core.IdleAsync += () => Event.Invoke("idle", null);
|
||||
Core.IdleAsync += () => Event.Invoke("idle", null);
|
||||
break;
|
||||
|
||||
case "video-reconfig":
|
||||
core.VideoReconfigAsync += () => Event.Invoke("video-reconfig", null);
|
||||
Core.VideoReconfigAsync += () => Event.Invoke("video-reconfig", null);
|
||||
break;
|
||||
|
||||
case "audio-reconfig":
|
||||
core.AudioReconfigAsync += () => Event.Invoke("audio-reconfig", null);
|
||||
Core.AudioReconfigAsync += () => Event.Invoke("audio-reconfig", null);
|
||||
break;
|
||||
|
||||
case "seek":
|
||||
core.SeekAsync += () => Event.Invoke("seek", null);
|
||||
Core.SeekAsync += () => Event.Invoke("seek", null);
|
||||
break;
|
||||
|
||||
case "playback-restart":
|
||||
core.PlaybackRestartAsync += () => Event.Invoke("playback-restart", null);
|
||||
Core.PlaybackRestartAsync += () => Event.Invoke("playback-restart", null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -224,13 +223,13 @@ namespace mpvnet
|
||||
void Output_DataAdded(object sender, DataAddedEventArgs e)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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.Diagnostics;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -23,7 +23,7 @@ namespace mpvnet
|
||||
if (App.IsStartedFromTerminal)
|
||||
Native.AttachConsole(-1 /*ATTACH_PARENT_PROCESS*/);
|
||||
|
||||
if (core.ConfigFolder == "")
|
||||
if (Core.ConfigFolder == "")
|
||||
return;
|
||||
|
||||
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
|
||||
@@ -31,11 +31,11 @@ namespace mpvnet
|
||||
if (args.Length >= 2 && args[0] == "--reg-file-assoc")
|
||||
{
|
||||
if (args[1] == "audio")
|
||||
FileAssociation.Register(Core.AudioTypes);
|
||||
FileAssociation.Register(CorePlayer.AudioTypes);
|
||||
else if (args[1] == "video")
|
||||
FileAssociation.Register(Core.VideoTypes);
|
||||
FileAssociation.Register(CorePlayer.VideoTypes);
|
||||
else if (args[1] == "image")
|
||||
FileAssociation.Register(Core.ImageTypes);
|
||||
FileAssociation.Register(CorePlayer.ImageTypes);
|
||||
else
|
||||
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))
|
||||
{
|
||||
isKeyMissing = true;
|
||||
ConsoleHelp.WriteError($"Theme '{activeTheme}' misses '{key}'");
|
||||
Terminal.WriteError($"Theme '{activeTheme}' misses '{key}'");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,7 @@ using System.Reflection;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static TaskDialog.Msg;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -16,7 +15,7 @@ namespace mpvnet
|
||||
{
|
||||
public static void DailyCheck()
|
||||
{
|
||||
if (App.UpdateCheck && RegistryHelp.GetInt("UpdateCheckLast")
|
||||
if (App.UpdateCheck && RegistryHelp.GetInt("last-update-check")
|
||||
!= DateTime.Now.DayOfYear)
|
||||
|
||||
CheckOnline();
|
||||
@@ -28,26 +27,33 @@ namespace mpvnet
|
||||
{
|
||||
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");
|
||||
var response = await client.GetAsync("https://api.github.com/repos/stax76/mpv.net/releases/latest");
|
||||
response.EnsureSuccessStatusCode();
|
||||
string content = await response.Content.ReadAsStringAsync();
|
||||
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 currentVersion = Assembly.GetEntryAssembly().GetName().Version;
|
||||
|
||||
if (onlineVersion <= currentVersion)
|
||||
{
|
||||
if (showUpToDateMessage)
|
||||
MsgInfo($"{Application.ProductName} is up to date.");
|
||||
Msg.ShowInfo($"{Application.ProductName} is up to date.");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ((RegistryHelp.GetString("UpdateCheckVersion")
|
||||
if ((RegistryHelp.GetString("update-check-version")
|
||||
!= 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";
|
||||
|
||||
@@ -64,16 +70,16 @@ namespace mpvnet
|
||||
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)
|
||||
{
|
||||
if (showUpToDateMessage)
|
||||
Msg.ShowException(ex);
|
||||
App.ShowException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,153 +3,157 @@ using System;
|
||||
using System.Drawing;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
public class Native
|
||||
namespace mpvnet
|
||||
{
|
||||
static Version Windows_10_1607 = new Version(10, 0, 14393); // Windows 10 1607
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool AttachConsole(int dwProcessId);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool FreeConsole();
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern IntPtr LoadLibrary(string path);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr FindWindowEx(
|
||||
IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern int RegisterWindowMessage(string id);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool AllowSetForegroundWindow(int dwProcessId);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern void ReleaseCapture();
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int GetDpiForWindow(IntPtr hwnd);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool AdjustWindowRect(ref RECT lpRect, uint dwStyle, bool bMenu);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool AdjustWindowRectExForDpi(
|
||||
ref RECT lpRect, uint dwStyle, bool bMenu, uint dwExStyle, uint dpi);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
|
||||
static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
|
||||
static extern IntPtr GetWindowLong64(IntPtr hWnd, int nIndex);
|
||||
|
||||
public static IntPtr GetWindowLong(IntPtr hWnd, int nIndex)
|
||||
public class Native
|
||||
{
|
||||
if (IntPtr.Size == 8)
|
||||
return GetWindowLong64(hWnd, nIndex);
|
||||
else
|
||||
return GetWindowLong32(hWnd, nIndex);
|
||||
}
|
||||
static Version Windows_10_1607 = new Version(10, 0, 14393); // Windows 10 1607
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool AttachConsole(int dwProcessId);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct RECT
|
||||
{
|
||||
public int Left;
|
||||
public int Top;
|
||||
public int Right;
|
||||
public int Bottom;
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool FreeConsole();
|
||||
|
||||
public RECT(Rectangle r)
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern IntPtr LoadLibrary(string path);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr FindWindowEx(
|
||||
IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern int RegisterWindowMessage(string id);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool AllowSetForegroundWindow(int dwProcessId);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern void ReleaseCapture();
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int GetDpiForWindow(IntPtr hwnd);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool AdjustWindowRect(ref RECT lpRect, uint dwStyle, bool bMenu);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool AdjustWindowRectExForDpi(
|
||||
ref RECT lpRect, uint dwStyle, bool bMenu, uint dwExStyle, uint dpi);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool SetWindowPos(
|
||||
IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
|
||||
static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
|
||||
static extern IntPtr GetWindowLong64(IntPtr hWnd, int nIndex);
|
||||
|
||||
public static IntPtr GetWindowLong(IntPtr hWnd, int nIndex)
|
||||
{
|
||||
Left = r.Left;
|
||||
Top = r.Top;
|
||||
Right = r.Right;
|
||||
Bottom = r.Bottom;
|
||||
if (IntPtr.Size == 8)
|
||||
return GetWindowLong64(hWnd, nIndex);
|
||||
else
|
||||
return GetWindowLong32(hWnd, nIndex);
|
||||
}
|
||||
|
||||
public RECT(int left, int top, int right, int bottom)
|
||||
[DllImport("gdi32.dll")]
|
||||
public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct RECT
|
||||
{
|
||||
Left = left;
|
||||
Top = top;
|
||||
Right = right;
|
||||
Bottom = bottom;
|
||||
public int Left;
|
||||
public int Top;
|
||||
public int Right;
|
||||
public int Bottom;
|
||||
|
||||
public RECT(Rectangle r)
|
||||
{
|
||||
Left = r.Left;
|
||||
Top = r.Top;
|
||||
Right = r.Right;
|
||||
Bottom = r.Bottom;
|
||||
}
|
||||
|
||||
public RECT(int left, int top, int right, int bottom)
|
||||
{
|
||||
Left = left;
|
||||
Top = top;
|
||||
Right = right;
|
||||
Bottom = bottom;
|
||||
}
|
||||
|
||||
public Rectangle ToRectangle() => Rectangle.FromLTRB(Left, Top, Right, Bottom);
|
||||
public Size Size => new Size(Right - Left, Bottom - Top);
|
||||
public int Width => Right - Left;
|
||||
public int Height => Bottom - Top;
|
||||
}
|
||||
|
||||
public Rectangle ToRectangle() => Rectangle.FromLTRB(Left, Top, Right, Bottom);
|
||||
public Size Size => new Size(Right - Left, Bottom - Top);
|
||||
public int Width => Right - Left;
|
||||
public int Height => Bottom - Top;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct COPYDATASTRUCT
|
||||
{
|
||||
public IntPtr dwData;
|
||||
public int cbData;
|
||||
[MarshalAs(UnmanagedType.LPTStr)]
|
||||
public string lpData;
|
||||
}
|
||||
|
||||
public static int GetResizeBorder(int v)
|
||||
{
|
||||
switch (v)
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct COPYDATASTRUCT
|
||||
{
|
||||
case 1 /* WMSZ_LEFT */ : return 3;
|
||||
case 3 /* WMSZ_TOP */ : return 2;
|
||||
case 2 /* WMSZ_RIGHT */ : return 3;
|
||||
case 6 /* WMSZ_BOTTOM */ : return 2;
|
||||
case 4 /* WMSZ_TOPLEFT */ : return 1;
|
||||
case 5 /* WMSZ_TOPRIGHT */ : return 1;
|
||||
case 7 /* WMSZ_BOTTOMLEFT */ : return 3;
|
||||
case 8 /* WMSZ_BOTTOMRIGHT */ : return 3;
|
||||
default: return -1;
|
||||
public IntPtr dwData;
|
||||
public int cbData;
|
||||
[MarshalAs(UnmanagedType.LPTStr)]
|
||||
public string lpData;
|
||||
}
|
||||
}
|
||||
|
||||
public static void SubtractWindowBorders(IntPtr hwnd, ref RECT rc, int dpi)
|
||||
{
|
||||
RECT r = new RECT(0, 0, 0, 0);
|
||||
AddWindowBorders(hwnd, ref r, dpi);
|
||||
rc.Left -= r.Left;
|
||||
rc.Top -= r.Top;
|
||||
rc.Right -= r.Right;
|
||||
rc.Bottom -= r.Bottom;
|
||||
}
|
||||
public static int GetResizeBorder(int v)
|
||||
{
|
||||
switch (v)
|
||||
{
|
||||
case 1 /* WMSZ_LEFT */ : return 3;
|
||||
case 3 /* WMSZ_TOP */ : return 2;
|
||||
case 2 /* WMSZ_RIGHT */ : return 3;
|
||||
case 6 /* WMSZ_BOTTOM */ : return 2;
|
||||
case 4 /* WMSZ_TOPLEFT */ : return 1;
|
||||
case 5 /* WMSZ_TOPRIGHT */ : return 1;
|
||||
case 7 /* WMSZ_BOTTOMLEFT */ : return 3;
|
||||
case 8 /* WMSZ_BOTTOMRIGHT */ : return 3;
|
||||
default: return -1;
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddWindowBorders(IntPtr hwnd, ref RECT rc, int dpi)
|
||||
{
|
||||
uint windowStyle = (uint)GetWindowLong(hwnd, -16); // GWL_STYLE
|
||||
uint windowStyleEx = (uint)GetWindowLong(hwnd, -20); // GWL_EXSTYLE
|
||||
public static void SubtractWindowBorders(IntPtr hwnd, ref RECT rc, int dpi)
|
||||
{
|
||||
RECT r = new RECT(0, 0, 0, 0);
|
||||
AddWindowBorders(hwnd, ref r, dpi);
|
||||
rc.Left -= r.Left;
|
||||
rc.Top -= r.Top;
|
||||
rc.Right -= r.Right;
|
||||
rc.Bottom -= r.Bottom;
|
||||
}
|
||||
|
||||
if (Environment.OSVersion.Version >= Windows_10_1607)
|
||||
AdjustWindowRectExForDpi(ref rc, windowStyle, false, windowStyleEx, (uint)dpi);
|
||||
else
|
||||
AdjustWindowRect(ref rc, windowStyle, false);
|
||||
}
|
||||
public static void AddWindowBorders(IntPtr hwnd, ref RECT rc, int dpi)
|
||||
{
|
||||
uint windowStyle = (uint)GetWindowLong(hwnd, -16); // GWL_STYLE
|
||||
uint windowStyleEx = (uint)GetWindowLong(hwnd, -20); // GWL_EXSTYLE
|
||||
|
||||
public static int GetDPI(IntPtr hwnd)
|
||||
{
|
||||
if (Environment.OSVersion.Version >= Windows_10_1607)
|
||||
return GetDpiForWindow(hwnd);
|
||||
else
|
||||
using (Graphics gx = Graphics.FromHwnd(hwnd))
|
||||
return GetDeviceCaps(gx.GetHdc(), 88 /*LOGPIXELSX*/);
|
||||
if (Environment.OSVersion.Version >= Windows_10_1607)
|
||||
AdjustWindowRectExForDpi(ref rc, windowStyle, false, windowStyleEx, (uint)dpi);
|
||||
else
|
||||
AdjustWindowRect(ref rc, windowStyle, false);
|
||||
}
|
||||
|
||||
public static int GetDPI(IntPtr hwnd)
|
||||
{
|
||||
if (Environment.OSVersion.Version >= Windows_10_1607)
|
||||
return GetDpiForWindow(hwnd);
|
||||
else
|
||||
using (Graphics gx = Graphics.FromHwnd(hwnd))
|
||||
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 }
|
||||
|
||||
$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\*"
|
||||
if ($LastExitCode) { throw $LastExitCode }
|
||||
|
||||
@@ -45,7 +45,7 @@ if ($versionInfo.FilePrivatePart -eq 0)
|
||||
else
|
||||
{
|
||||
$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\*"
|
||||
if ($LastExitCode) { throw $LastExitCode }
|
||||
UploadBeta "$targetDir.7z"
|
||||
|
||||
@@ -12,6 +12,11 @@ menu-highlight = #505050
|
||||
menu-border = #FFFFFF
|
||||
menu-checked = #5A5A5A
|
||||
|
||||
button-foreground = #DDDDDD
|
||||
button-background = #505050
|
||||
button-hover = #555555
|
||||
button-border = #707070
|
||||
|
||||
|
||||
[light]
|
||||
|
||||
@@ -25,3 +30,8 @@ menu-background = #DFDFDF
|
||||
menu-highlight = #BFBFBF
|
||||
menu-border = #6A6A6A
|
||||
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 sectionName = Assembly.GetExecutingAssembly().GetName().Name;
|
||||
Core core = Core.core;
|
||||
CorePlayer core = Global.Core;
|
||||
core.commandv("define-section", sectionName, content, "force");
|
||||
core.commandv("enable-section", sectionName);
|
||||
core.ClientMessage += ClientMessage;
|
||||
@@ -22,7 +22,7 @@ class Script
|
||||
switch (args[0])
|
||||
{
|
||||
case "my-message-1":
|
||||
Msg.Show(args[1]);
|
||||
Msg.ShowInfo(args[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,16 +6,16 @@ using mpvnet;
|
||||
|
||||
class Script
|
||||
{
|
||||
Core core;
|
||||
|
||||
CorePlayer Core;
|
||||
|
||||
public Script()
|
||||
{
|
||||
core = Core.core;
|
||||
core.observe_property_bool("fullscreen", FullscreenChange);
|
||||
Core = Global.Core;
|
||||
Core.observe_property_bool("fullscreen", FullscreenChange);
|
||||
}
|
||||
|
||||
void FullscreenChange(bool value)
|
||||
{
|
||||
core.commandv("show-text", "fullscreen: " + value);
|
||||
Core.commandv("show-text", "fullscreen: " + value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,28 +8,28 @@ using mpvnet;
|
||||
|
||||
class Script
|
||||
{
|
||||
MainForm Form;
|
||||
Core core;
|
||||
MainForm MainForm;
|
||||
CorePlayer Core;
|
||||
|
||||
bool WasPlaying;
|
||||
bool WasPaused;
|
||||
|
||||
public Script()
|
||||
{
|
||||
core = Core.core;
|
||||
Form = MainForm.Instance;
|
||||
Form.Resize += Form_Resize;
|
||||
Core = Global.Core;
|
||||
MainForm = MainForm.Instance;
|
||||
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)
|
||||
{
|
||||
core.set_property_bool("pause", true, true);
|
||||
Core.set_property_bool("pause", true, true);
|
||||
WasPaused = true;
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ class Script
|
||||
{
|
||||
if (WasPaused)
|
||||
{
|
||||
core.set_property_bool("pause", false, true);
|
||||
Core.set_property_bool("pause", false, true);
|
||||
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
|
||||
{
|
||||
MainForm MainForm;
|
||||
Core core;
|
||||
CorePlayer Core;
|
||||
|
||||
public Script()
|
||||
{
|
||||
core = Core.core;
|
||||
MainForm = mpvnet.MainForm.Instance;
|
||||
Core = Global.Core;
|
||||
MainForm = MainForm.Instance;
|
||||
MainForm.ContextMenu.Opening += ContextMenu_Opening;
|
||||
}
|
||||
|
||||
@@ -26,13 +26,13 @@ class Script
|
||||
return;
|
||||
|
||||
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)
|
||||
{
|
||||
MenuItem mi = new MenuItem(track.Text);
|
||||
mi.Action = () => { core.commandv("set", "edition", track.ID.ToString()); };
|
||||
mi.Checked = core.Edition == track.ID;
|
||||
mi.Action = () => { Core.commandv("set", "edition", track.ID.ToString()); };
|
||||
mi.Checked = Core.Edition == track.ID;
|
||||
menuItem.DropDownItems.Add(mi);
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ using System.Windows.Data;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Interop;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -107,7 +107,7 @@ namespace mpvnet
|
||||
{
|
||||
CommandItem item = ListView.SelectedItem as CommandItem;
|
||||
Close();
|
||||
core.command(item.Command);
|
||||
Core.command(item.Command);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,7 @@ using System.Windows.Input;
|
||||
|
||||
using DynamicGUI;
|
||||
|
||||
using static TaskDialog.Msg;
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -28,11 +27,11 @@ namespace mpvnet
|
||||
InitializeComponent();
|
||||
DataContext = this;
|
||||
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
||||
LoadConf(core.ConfPath);
|
||||
LoadConf(Core.ConfPath);
|
||||
LoadConf(App.ConfPath);
|
||||
LoadSettings();
|
||||
InitialContent = GetCompareString();
|
||||
SearchControl.Text = RegistryHelp.GetString("ConfigEditorSearch");
|
||||
SearchControl.Text = RegistryHelp.GetString("config-editor-search");
|
||||
FilterListBox.SelectedItem = SearchControl.Text.TrimEnd(':');
|
||||
}
|
||||
|
||||
@@ -69,14 +68,14 @@ namespace mpvnet
|
||||
protected override void OnClosed(EventArgs e)
|
||||
{
|
||||
base.OnClosed(e);
|
||||
RegistryHelp.SetValue(App.RegPath, "ConfigEditorSearch", SearchControl.Text);
|
||||
RegistryHelp.SetValue("config-editor-search", SearchControl.Text);
|
||||
|
||||
if (InitialContent == GetCompareString())
|
||||
return;
|
||||
|
||||
File.WriteAllText(core.ConfPath, GetContent("mpv"));
|
||||
File.WriteAllText(Core.ConfPath, GetContent("mpv"));
|
||||
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()
|
||||
@@ -291,25 +290,17 @@ namespace mpvnet
|
||||
SearchControl.Text = e.AddedItems[0] + ":";
|
||||
}
|
||||
|
||||
void OpenSettingsTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
ProcessHelp.ShellExecute(Path.GetDirectoryName(core.ConfPath));
|
||||
}
|
||||
void OpenSettingsTextBlock_MouseUp(object sender, MouseButtonEventArgs e) =>
|
||||
ProcessHelp.ShellExecute(Path.GetDirectoryName(Core.ConfPath));
|
||||
|
||||
void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
MsgInfo("mpv.conf Preview", GetContent("mpv"));
|
||||
}
|
||||
void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e) =>
|
||||
Msg.ShowInfo("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/");
|
||||
}
|
||||
|
||||
void SupportTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
void SupportTextBlock_MouseUp(object sender, MouseButtonEventArgs e) =>
|
||||
ProcessHelp.ShellExecute("https://github.com/stax76/mpv.net#Support");
|
||||
}
|
||||
|
||||
protected override void OnKeyDown(KeyEventArgs e)
|
||||
{
|
||||
|
||||
@@ -4,13 +4,12 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Interop;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -109,7 +108,7 @@ namespace mpvnet
|
||||
void Execute()
|
||||
{
|
||||
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);
|
||||
}
|
||||
@@ -142,7 +141,7 @@ namespace mpvnet
|
||||
Everything_GetResultFullPathName(i, sb, (uint)sb.Capacity);
|
||||
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());
|
||||
|
||||
if (items.Count > 100)
|
||||
|
||||
@@ -8,8 +8,7 @@ using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Input;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static TaskDialog.Msg;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -38,7 +37,9 @@ namespace mpvnet
|
||||
if (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)
|
||||
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
|
||||
items[i.Input] = i;
|
||||
}
|
||||
@@ -128,8 +129,8 @@ namespace mpvnet
|
||||
if (InitialInputConfContent == GetInputConfContent())
|
||||
return;
|
||||
|
||||
File.WriteAllText(core.InputConfPath, GetInputConfContent());
|
||||
MsgInfo("Changes will be available on next mpv.net startup.");
|
||||
File.WriteAllText(Core.InputConfPath, GetInputConfContent());
|
||||
Msg.ShowInfo("Changes will be available on next startup.");
|
||||
}
|
||||
|
||||
void DataGrid_PreviewCanExecute(object sender, CanExecuteRoutedEventArgs e)
|
||||
@@ -137,7 +138,7 @@ namespace mpvnet
|
||||
DataGrid grid = (DataGrid)sender;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ using System.Windows;
|
||||
using WinForms = System.Windows.Forms;
|
||||
|
||||
using static StockIcon;
|
||||
using static TaskDialog.Msg;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -45,15 +44,16 @@ namespace mpvnet
|
||||
proc.WaitForExit();
|
||||
|
||||
if (proc.ExitCode == 0)
|
||||
MsgInfo("File associations successfully created.");
|
||||
Msg.ShowInfo("File associations successfully created.");
|
||||
else
|
||||
Msg.ShowError("Error creating file associations.");
|
||||
}
|
||||
|
||||
} catch {}
|
||||
}
|
||||
|
||||
void AddVideo_Click(object sender, RoutedEventArgs e) => RegFileAssoc(Core.VideoTypes);
|
||||
void AddAudio_Click(object sender, RoutedEventArgs e) => RegFileAssoc(Core.AudioTypes);
|
||||
void AddImage_Click(object sender, RoutedEventArgs e) => RegFileAssoc(Core.ImageTypes);
|
||||
void AddVideo_Click(object sender, RoutedEventArgs e) => RegFileAssoc(CorePlayer.VideoTypes);
|
||||
void AddAudio_Click(object sender, RoutedEventArgs e) => RegFileAssoc(CorePlayer.AudioTypes);
|
||||
void AddImage_Click(object sender, RoutedEventArgs e) => RegFileAssoc(CorePlayer.ImageTypes);
|
||||
|
||||
void RemoveFileAssociations_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
|
||||
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.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using static mpvnet.Core;
|
||||
using static Native;
|
||||
using static TaskDialog.Msg;
|
||||
using static mpvnet.Native;
|
||||
using static mpvnet.Global;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -35,51 +34,45 @@ namespace mpvnet
|
||||
public MainForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
SetColors();
|
||||
|
||||
try
|
||||
{
|
||||
object recent = RegistryHelp.GetValue(App.RegPath, "Recent");
|
||||
|
||||
if (recent is string[] r)
|
||||
RecentFiles = new List<string>(r);
|
||||
else
|
||||
RecentFiles = new List<string>();
|
||||
object recent = RegistryHelp.GetValue("recent");
|
||||
RecentFiles = recent is string[] r ? new List<string>(r) : new List<string>();
|
||||
|
||||
Instance = this;
|
||||
Hwnd = Handle;
|
||||
ConsoleHelp.Padding = 60;
|
||||
core.Init();
|
||||
Core.Init();
|
||||
|
||||
core.Shutdown += Shutdown;
|
||||
core.VideoSizeChanged += VideoSizeChanged;
|
||||
core.ScaleWindow += ScaleWindow;
|
||||
core.WindowScale += WindowScale;
|
||||
core.FileLoaded += FileLoaded;
|
||||
core.Idle += Idle;
|
||||
core.Seek += () => UpdateProgressBar();
|
||||
Core.Shutdown += Shutdown;
|
||||
Core.VideoSizeChanged += VideoSizeChanged;
|
||||
Core.ScaleWindow += ScaleWindow;
|
||||
Core.WindowScale += WindowScale;
|
||||
Core.FileLoaded += FileLoaded;
|
||||
Core.Idle += Idle;
|
||||
Core.Seek += () => UpdateProgressBar();
|
||||
|
||||
core.observe_property("window-maximized", PropChangeWindowMaximized);
|
||||
core.observe_property("window-minimized", PropChangeWindowMinimized);
|
||||
core.observe_property_bool("pause", PropChangePause);
|
||||
core.observe_property_bool("fullscreen", PropChangeFullscreen);
|
||||
core.observe_property_bool("ontop", PropChangeOnTop);
|
||||
core.observe_property_bool("border", PropChangeBorder);
|
||||
Core.observe_property("window-maximized", PropChangeWindowMaximized);
|
||||
Core.observe_property("window-minimized", PropChangeWindowMinimized);
|
||||
Core.observe_property_bool("pause", PropChangePause);
|
||||
Core.observe_property_bool("fullscreen", PropChangeFullscreen);
|
||||
Core.observe_property_bool("ontop", PropChangeOnTop);
|
||||
Core.observe_property_bool("border", PropChangeBorder);
|
||||
|
||||
core.observe_property_string("sid", PropChangeSid);
|
||||
core.observe_property_string("aid", PropChangeAid);
|
||||
core.observe_property_string("vid", PropChangeVid);
|
||||
Core.observe_property_string("sid", PropChangeSid);
|
||||
Core.observe_property_string("aid", PropChangeAid);
|
||||
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")
|
||||
core.ProcessCommandLine(false);
|
||||
if (Core.GPUAPI != "vulkan")
|
||||
Core.ProcessCommandLine(false);
|
||||
|
||||
AppDomain.CurrentDomain.UnhandledException += (sender, e) => App.ShowException(e.ExceptionObject);
|
||||
Application.ThreadException += (sender, e) => App.ShowException(e.Exception);
|
||||
|
||||
Msg.SupportURL = "https://github.com/stax76/mpv.net#support";
|
||||
|
||||
TaskbarButtonCreatedMessage = RegisterWindowMessage("TaskbarButtonCreated");
|
||||
|
||||
@@ -87,9 +80,9 @@ namespace mpvnet
|
||||
ContextMenu.Opened += ContextMenu_Opened;
|
||||
ContextMenu.Opening += ContextMenu_Opening;
|
||||
|
||||
if (core.Screen > -1)
|
||||
if (Core.Screen > -1)
|
||||
{
|
||||
int targetIndex = core.Screen;
|
||||
int targetIndex = Core.Screen;
|
||||
Screen[] screens = Screen.AllScreens;
|
||||
|
||||
if (targetIndex < 0)
|
||||
@@ -104,19 +97,19 @@ namespace mpvnet
|
||||
Top = target.Y + (target.Height - Height) / 2;
|
||||
}
|
||||
|
||||
if (!core.Border)
|
||||
if (!Core.Border)
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
|
||||
int posX = RegistryHelp.GetInt("PosX");
|
||||
int posY = RegistryHelp.GetInt("PosY");
|
||||
int posX = RegistryHelp.GetInt("position-x");
|
||||
int posY = RegistryHelp.GetInt("position-y");
|
||||
|
||||
if ((posX != 0 || posY != 0) && App.RememberPosition)
|
||||
{
|
||||
Left = posX - Width / 2;
|
||||
Top = posY - Height / 2;
|
||||
|
||||
int horizontal = RegistryHelp.GetInt("HorizontalLocation");
|
||||
int vertical = RegistryHelp.GetInt("VerticalLocation");
|
||||
int horizontal = RegistryHelp.GetInt("location-horizontal");
|
||||
int vertical = RegistryHelp.GetInt("location-vertical");
|
||||
|
||||
if (horizontal == -1) Left = posX;
|
||||
if (horizontal == 1) Left = posX - Width;
|
||||
@@ -124,13 +117,13 @@ namespace mpvnet
|
||||
if (vertical == 1) Top = posY - Height;
|
||||
}
|
||||
|
||||
if (core.WindowMaximized)
|
||||
if (Core.WindowMaximized)
|
||||
{
|
||||
SetFormPosAndSize(true);
|
||||
WindowState = FormWindowState.Maximized;
|
||||
}
|
||||
|
||||
if (core.WindowMinimized)
|
||||
if (Core.WindowMinimized)
|
||||
{
|
||||
SetFormPosAndSize(true);
|
||||
WindowState = FormWindowState.Minimized;
|
||||
@@ -145,7 +138,7 @@ namespace mpvnet
|
||||
void ScaleWindow(float scale) {
|
||||
BeginInvoke(new Action(() => {
|
||||
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);
|
||||
}));
|
||||
}
|
||||
@@ -154,10 +147,10 @@ namespace mpvnet
|
||||
{
|
||||
BeginInvoke(new Action(() => {
|
||||
SetSize(
|
||||
(int)(core.VideoSize.Width * scale),
|
||||
(int)Math.Ceiling(core.VideoSize.Height * scale),
|
||||
(int)(Core.VideoSize.Width * scale),
|
||||
(int)Math.Ceiling(Core.VideoSize.Height * scale),
|
||||
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)
|
||||
{
|
||||
lock (core.MediaTracks)
|
||||
lock (Core.MediaTracks)
|
||||
{
|
||||
MenuItem trackMenuItem = FindMenuItem("Track");
|
||||
|
||||
@@ -200,16 +193,16 @@ namespace mpvnet
|
||||
{
|
||||
trackMenuItem.DropDownItems.Clear();
|
||||
|
||||
MediaTrack[] audTracks = core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
||||
MediaTrack[] subTracks = core.MediaTracks.Where(track => track.Type == "s").ToArray();
|
||||
MediaTrack[] vidTracks = core.MediaTracks.Where(track => track.Type == "v").ToArray();
|
||||
MediaTrack[] ediTracks = core.MediaTracks.Where(track => track.Type == "e").ToArray();
|
||||
MediaTrack[] audTracks = Core.MediaTracks.Where(track => track.Type == "a").ToArray();
|
||||
MediaTrack[] subTracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray();
|
||||
MediaTrack[] vidTracks = Core.MediaTracks.Where(track => track.Type == "v").ToArray();
|
||||
MediaTrack[] ediTracks = Core.MediaTracks.Where(track => track.Type == "e").ToArray();
|
||||
|
||||
foreach (MediaTrack track in vidTracks)
|
||||
{
|
||||
MenuItem mi = new MenuItem(track.Text);
|
||||
mi.Action = () => core.commandv("set", "vid", track.ID.ToString());
|
||||
mi.Checked = core.Vid == track.ID.ToString();
|
||||
mi.Action = () => Core.commandv("set", "vid", track.ID.ToString());
|
||||
mi.Checked = Core.Vid == track.ID.ToString();
|
||||
trackMenuItem.DropDownItems.Add(mi);
|
||||
}
|
||||
|
||||
@@ -219,8 +212,8 @@ namespace mpvnet
|
||||
foreach (MediaTrack track in audTracks)
|
||||
{
|
||||
MenuItem mi = new MenuItem(track.Text);
|
||||
mi.Action = () => core.commandv("set", "aid", track.ID.ToString());
|
||||
mi.Checked = core.Aid == track.ID.ToString();
|
||||
mi.Action = () => Core.commandv("set", "aid", track.ID.ToString());
|
||||
mi.Checked = Core.Aid == track.ID.ToString();
|
||||
trackMenuItem.DropDownItems.Add(mi);
|
||||
}
|
||||
|
||||
@@ -230,16 +223,16 @@ namespace mpvnet
|
||||
foreach (MediaTrack track in subTracks)
|
||||
{
|
||||
MenuItem mi = new MenuItem(track.Text);
|
||||
mi.Action = () => core.commandv("set", "sid", track.ID.ToString());
|
||||
mi.Checked = core.Sid == track.ID.ToString();
|
||||
mi.Action = () => Core.commandv("set", "sid", track.ID.ToString());
|
||||
mi.Checked = Core.Sid == track.ID.ToString();
|
||||
trackMenuItem.DropDownItems.Add(mi);
|
||||
}
|
||||
|
||||
if (subTracks.Length > 0)
|
||||
{
|
||||
MenuItem mi = new MenuItem("S: No subtitles");
|
||||
mi.Action = () => core.commandv("set", "sid", "no");
|
||||
mi.Checked = core.Sid == "no";
|
||||
mi.Action = () => Core.commandv("set", "sid", "no");
|
||||
mi.Checked = Core.Sid == "no";
|
||||
trackMenuItem.DropDownItems.Add(mi);
|
||||
}
|
||||
|
||||
@@ -249,14 +242,14 @@ namespace mpvnet
|
||||
foreach (MediaTrack track in ediTracks)
|
||||
{
|
||||
MenuItem mi = new MenuItem(track.Text);
|
||||
mi.Action = () => core.commandv("set", "edition", track.ID.ToString());
|
||||
mi.Checked = core.Edition == track.ID;
|
||||
mi.Action = () => Core.commandv("set", "edition", track.ID.ToString());
|
||||
mi.Checked = Core.Edition == track.ID;
|
||||
trackMenuItem.DropDownItems.Add(mi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lock (core.Chapters)
|
||||
lock (Core.Chapters)
|
||||
{
|
||||
MenuItem chaptersMenuItem = FindMenuItem("Chapters");
|
||||
|
||||
@@ -264,11 +257,11 @@ namespace mpvnet
|
||||
{
|
||||
chaptersMenuItem.DropDownItems.Clear();
|
||||
|
||||
foreach (var pair in core.Chapters)
|
||||
foreach (var pair in Core.Chapters)
|
||||
{
|
||||
MenuItem mi = new MenuItem(pair.Key);
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -281,7 +274,7 @@ namespace mpvnet
|
||||
recent.DropDownItems.Clear();
|
||||
|
||||
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());
|
||||
MenuItem mi = new MenuItem("Clear List");
|
||||
@@ -295,12 +288,12 @@ namespace mpvnet
|
||||
{
|
||||
titles.DropDownItems.Clear();
|
||||
|
||||
lock (core.BluRayTitles)
|
||||
lock (Core.BluRayTitles)
|
||||
{
|
||||
List<(int Index, TimeSpan Len)> items = new List<(int Index, TimeSpan Len)>();
|
||||
|
||||
for (int i = 0; i < core.BluRayTitles.Count; i++)
|
||||
items.Add((i, core.BluRayTitles[i]));
|
||||
for (int i = 0; i < Core.BluRayTitles.Count; i++)
|
||||
items.Add((i, Core.BluRayTitles[i]));
|
||||
|
||||
var titleItems = items.OrderByDescending(item => item.Len)
|
||||
.Take(20).OrderBy(item => item.Index);
|
||||
@@ -308,7 +301,7 @@ namespace mpvnet
|
||||
foreach (var item in titleItems)
|
||||
if (item.Len != TimeSpan.Zero)
|
||||
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)
|
||||
return;
|
||||
|
||||
if (core.Fullscreen)
|
||||
if (Core.Fullscreen)
|
||||
{
|
||||
CycleFullscreen(true);
|
||||
return;
|
||||
@@ -349,14 +342,14 @@ namespace mpvnet
|
||||
}
|
||||
|
||||
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 ||
|
||||
core.VideoSize.Width / (float)core.VideoSize.Height < App.MinimumAspectRatio)
|
||||
if (Core.VideoSize.Height == 0 || Core.VideoSize.Width == 0 ||
|
||||
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 width = videoSize.Width;
|
||||
@@ -364,7 +357,7 @@ namespace mpvnet
|
||||
if (App.StartSize == "previous")
|
||||
App.StartSize = "height-session";
|
||||
|
||||
if (core.WasInitialSizeSet)
|
||||
if (Core.WasInitialSizeSet)
|
||||
{
|
||||
if (App.StartSize == "always")
|
||||
{
|
||||
@@ -384,8 +377,8 @@ namespace mpvnet
|
||||
}
|
||||
else
|
||||
{
|
||||
int savedHeight = RegistryHelp.GetInt("Height");
|
||||
int savedWidth = RegistryHelp.GetInt("Width");
|
||||
int savedHeight = RegistryHelp.GetInt("window-height");
|
||||
int savedWidth = RegistryHelp.GetInt("window-width");
|
||||
|
||||
if (App.StartSize == "height-always" && savedHeight != 0)
|
||||
{
|
||||
@@ -413,7 +406,7 @@ namespace mpvnet
|
||||
width = savedWidth;
|
||||
}
|
||||
|
||||
core.WasInitialSizeSet = true;
|
||||
Core.WasInitialSizeSet = true;
|
||||
}
|
||||
|
||||
SetSize(width, height, screen, checkAutofit);
|
||||
@@ -429,15 +422,15 @@ namespace mpvnet
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -493,7 +486,8 @@ namespace mpvnet
|
||||
if (top + rect.Height > maxBottom)
|
||||
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)
|
||||
@@ -533,7 +527,7 @@ namespace mpvnet
|
||||
public void CycleFullscreen(bool enabled)
|
||||
{
|
||||
LastCycleFullscreen = Environment.TickCount;
|
||||
core.Fullscreen = enabled;
|
||||
Core.Fullscreen = enabled;
|
||||
|
||||
if (enabled)
|
||||
{
|
||||
@@ -560,7 +554,7 @@ namespace mpvnet
|
||||
else
|
||||
WindowState = FormWindowState.Normal;
|
||||
|
||||
if (core.Border)
|
||||
if (Core.Border)
|
||||
FormBorderStyle = FormBorderStyle.Sizable;
|
||||
else
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
@@ -573,7 +567,7 @@ namespace mpvnet
|
||||
|
||||
public void BuildMenu()
|
||||
{
|
||||
string content = File.ReadAllText(core.InputConfPath);
|
||||
string content = File.ReadAllText(Core.InputConfPath);
|
||||
var items = CommandItem.GetItems(content);
|
||||
|
||||
if (!content.Contains("#menu:"))
|
||||
@@ -595,7 +589,7 @@ namespace mpvnet
|
||||
|
||||
MenuItem menuItem = ContextMenu.Add(item.Path.Replace("&", "&&"), () => {
|
||||
try {
|
||||
core.command(item.Command);
|
||||
Core.command(item.Command);
|
||||
} catch (Exception ex) {
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
@@ -608,12 +602,12 @@ namespace mpvnet
|
||||
|
||||
void FileLoaded()
|
||||
{
|
||||
string path = core.get_property_string("path");
|
||||
string path = Core.get_property_string("path");
|
||||
|
||||
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)
|
||||
interval = 100;
|
||||
@@ -634,7 +628,7 @@ namespace mpvnet
|
||||
RecentFiles.RemoveAt(App.RecentCount);
|
||||
}
|
||||
|
||||
void SetTitle() => BeginInvoke(new Action(() => Text = core.expand(Title)));
|
||||
void SetTitle() => BeginInvoke(new Action(() => Text = Core.expand(Title)));
|
||||
|
||||
void SaveWindowProperties()
|
||||
{
|
||||
@@ -642,8 +636,8 @@ namespace mpvnet
|
||||
{
|
||||
SavePosition();
|
||||
|
||||
RegistryHelp.SetValue(App.RegPath, "Width", ClientSize.Width);
|
||||
RegistryHelp.SetValue(App.RegPath, "Height", ClientSize.Height);
|
||||
RegistryHelp.SetInt("window-width", ClientSize.Width);
|
||||
RegistryHelp.SetInt("window-height", ClientSize.Height);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -662,11 +656,11 @@ namespace mpvnet
|
||||
if (y == -1) posY = Top;
|
||||
if (y == 1) posY = Top + Height;
|
||||
|
||||
RegistryHelp.SetInt("PosX", posX);
|
||||
RegistryHelp.SetInt("PosY", posY);
|
||||
RegistryHelp.SetInt("position-x", posX);
|
||||
RegistryHelp.SetInt("position-y", posY);
|
||||
|
||||
RegistryHelp.SetInt("HorizontalLocation", x);
|
||||
RegistryHelp.SetInt("VerticalLocation", y);
|
||||
RegistryHelp.SetInt("location-horizontal", x);
|
||||
RegistryHelp.SetInt("location-vertical", y);
|
||||
}
|
||||
|
||||
protected override CreateParams CreateParams {
|
||||
@@ -714,8 +708,8 @@ namespace mpvnet
|
||||
bool skip = m.Msg == 0x100 && LastAppCommand != 0 &&
|
||||
(Environment.TickCount - LastAppCommand) < 1000;
|
||||
|
||||
if (core.WindowHandle != IntPtr.Zero && !skip)
|
||||
m.Result = SendMessage(core.WindowHandle, m.Msg, m.WParam, m.LParam);
|
||||
if (Core.WindowHandle != IntPtr.Zero && !skip)
|
||||
m.Result = SendMessage(Core.WindowHandle, m.Msg, m.WParam, m.LParam);
|
||||
}
|
||||
break;
|
||||
case 0x319: // WM_APPCOMMAND
|
||||
@@ -724,7 +718,7 @@ namespace mpvnet
|
||||
|
||||
if (value != null)
|
||||
{
|
||||
core.command("keypress " + value);
|
||||
Core.command("keypress " + value);
|
||||
m.Result = new IntPtr(1);
|
||||
LastAppCommand = Environment.TickCount;
|
||||
return;
|
||||
@@ -738,7 +732,7 @@ namespace mpvnet
|
||||
if (Environment.TickCount - LastCycleFullscreen > 500)
|
||||
{
|
||||
Point pos = PointToClient(Cursor.Position);
|
||||
core.command($"mouse {pos.X} {pos.Y}");
|
||||
Core.command($"mouse {pos.X} {pos.Y}");
|
||||
}
|
||||
|
||||
if (CursorHelp.IsPosDifferent(LastCursorPosition))
|
||||
@@ -746,12 +740,12 @@ namespace mpvnet
|
||||
break;
|
||||
case 0x2a3: // WM_MOUSELEAVE
|
||||
//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;
|
||||
case 0x203: // WM_LBUTTONDBLCLK
|
||||
{
|
||||
Point pos = PointToClient(Cursor.Position);
|
||||
core.command($"mouse {pos.X} {pos.Y} 0 double");
|
||||
Core.command($"mouse {pos.X} {pos.Y} 0 double");
|
||||
}
|
||||
break;
|
||||
case 0x02E0: // WM_DPICHANGED
|
||||
@@ -770,7 +764,7 @@ namespace mpvnet
|
||||
SubtractWindowBorders(Handle, ref r, GetDPI(Handle));
|
||||
|
||||
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)
|
||||
videoSize = new Size(16, 9);
|
||||
@@ -800,14 +794,14 @@ namespace mpvnet
|
||||
switch (mode)
|
||||
{
|
||||
case "single":
|
||||
core.LoadFiles(args, true, ModifierKeys.HasFlag(Keys.Control));
|
||||
Core.LoadFiles(args, true, ModifierKeys.HasFlag(Keys.Control));
|
||||
break;
|
||||
case "queue":
|
||||
foreach (string file in args)
|
||||
core.commandv("loadfile", file, "append");
|
||||
Core.commandv("loadfile", file, "append");
|
||||
break;
|
||||
case "command":
|
||||
core.command(args[0]);
|
||||
Core.command(args[0]);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -816,7 +810,7 @@ namespace mpvnet
|
||||
return;
|
||||
}
|
||||
|
||||
if (m.Msg == TaskbarButtonCreatedMessage && core.TaskbarProgress)
|
||||
if (m.Msg == TaskbarButtonCreatedMessage && Core.TaskbarProgress)
|
||||
{
|
||||
Taskbar = new Taskbar(Handle);
|
||||
ProgressTimer.Start();
|
||||
@@ -845,21 +839,21 @@ namespace mpvnet
|
||||
|
||||
void UpdateProgressBar()
|
||||
{
|
||||
if (core.TaskbarProgress && Taskbar != null)
|
||||
Taskbar.SetValue(core.get_property_number("time-pos"), core.Duration.TotalSeconds);
|
||||
if (Core.TaskbarProgress && Taskbar != null)
|
||||
Taskbar.SetValue(Core.get_property_number("time-pos"), Core.Duration.TotalSeconds);
|
||||
}
|
||||
|
||||
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 PropChangeEdition(int value) => core.Edition = value;
|
||||
void PropChangeEdition(int value) => Core.Edition = value;
|
||||
|
||||
void PropChangeWindowMaximized()
|
||||
{
|
||||
@@ -868,11 +862,11 @@ namespace mpvnet
|
||||
|
||||
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;
|
||||
else if (!core.WindowMaximized && WindowState == FormWindowState.Maximized)
|
||||
else if (!Core.WindowMaximized && WindowState == FormWindowState.Maximized)
|
||||
WindowState = FormWindowState.Normal;
|
||||
}));
|
||||
}
|
||||
@@ -884,25 +878,25 @@ namespace mpvnet
|
||||
|
||||
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;
|
||||
else if (!core.WindowMinimized && WindowState == FormWindowState.Minimized)
|
||||
else if (!Core.WindowMinimized && WindowState == FormWindowState.Minimized)
|
||||
WindowState = FormWindowState.Normal;
|
||||
}));
|
||||
}
|
||||
|
||||
void PropChangeBorder(bool enabled) {
|
||||
core.Border = enabled;
|
||||
Core.Border = enabled;
|
||||
|
||||
BeginInvoke(new Action(() => {
|
||||
if (!IsFullscreen)
|
||||
{
|
||||
if (core.Border && FormBorderStyle == FormBorderStyle.None)
|
||||
if (Core.Border && FormBorderStyle == FormBorderStyle.None)
|
||||
FormBorderStyle = FormBorderStyle.Sizable;
|
||||
|
||||
if (!core.Border && FormBorderStyle == FormBorderStyle.Sizable)
|
||||
if (!Core.Border && FormBorderStyle == FormBorderStyle.Sizable)
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
}
|
||||
}));
|
||||
@@ -910,7 +904,7 @@ namespace mpvnet
|
||||
|
||||
void PropChangePause(bool enabled)
|
||||
{
|
||||
if (Taskbar != null && core.TaskbarProgress)
|
||||
if (Taskbar != null && Core.TaskbarProgress)
|
||||
{
|
||||
if (enabled)
|
||||
Taskbar.SetState(TaskbarStates.Paused);
|
||||
@@ -923,44 +917,13 @@ namespace mpvnet
|
||||
{
|
||||
base.OnLoad(e);
|
||||
|
||||
if (core.GPUAPI != "vulkan")
|
||||
core.VideoSizeAutoResetEvent.WaitOne(App.StartThreshold);
|
||||
if (Core.GPUAPI != "vulkan")
|
||||
Core.VideoSizeAutoResetEvent.WaitOne(App.StartThreshold);
|
||||
|
||||
LastCycleFullscreen = Environment.TickCount;
|
||||
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)
|
||||
{
|
||||
base.OnActivated(e);
|
||||
@@ -968,12 +931,49 @@ namespace mpvnet
|
||||
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)
|
||||
{
|
||||
base.OnResize(e);
|
||||
|
||||
if (core.IsLogoVisible)
|
||||
core.ShowLogo();
|
||||
if (Core.IsLogoVisible)
|
||||
Core.ShowLogo();
|
||||
|
||||
if (FormBorderStyle != FormBorderStyle.None)
|
||||
{
|
||||
@@ -987,16 +987,16 @@ namespace mpvnet
|
||||
{
|
||||
if (WindowState == FormWindowState.Minimized)
|
||||
{
|
||||
core.set_property_bool("window-minimized", true);
|
||||
Core.set_property_bool("window-minimized", true);
|
||||
}
|
||||
else if (WindowState == FormWindowState.Normal)
|
||||
{
|
||||
core.set_property_bool("window-maximized", false);
|
||||
core.set_property_bool("window-minimized", false);
|
||||
Core.set_property_bool("window-maximized", false);
|
||||
Core.set_property_bool("window-minimized", false);
|
||||
}
|
||||
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);
|
||||
SaveWindowProperties();
|
||||
RegistryHelp.SetValue(App.RegPath, "Recent", RecentFiles.ToArray());
|
||||
RegistryHelp.SetValue("recent", RecentFiles.ToArray());
|
||||
|
||||
if (core.IsQuitNeeded)
|
||||
core.commandv("quit");
|
||||
if (Core.IsQuitNeeded)
|
||||
Core.commandv("quit");
|
||||
|
||||
if (!core.ShutdownAutoResetEvent.WaitOne(10000))
|
||||
if (!Core.ShutdownAutoResetEvent.WaitOne(10000))
|
||||
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)
|
||||
core.commandv("quit");
|
||||
Core.commandv("quit");
|
||||
}
|
||||
|
||||
protected override void OnDragEnter(DragEventArgs e)
|
||||
@@ -1043,10 +1043,10 @@ namespace mpvnet
|
||||
base.OnDragDrop(e);
|
||||
|
||||
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))
|
||||
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)
|
||||
|
||||
@@ -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>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Compile Include="Misc\Global.cs" />
|
||||
<Compile Include="Misc\Help.cs" />
|
||||
<Compile Include="Misc\GlobalHotkey.cs" />
|
||||
<Compile Include="Misc\Msg.cs" />
|
||||
<Compile Include="Misc\Terminal.cs" />
|
||||
<Compile Include="Misc\UpdateCheck.cs" />
|
||||
<Compile Include="Misc\Theme.cs" />
|
||||
<Compile Include="Misc\PowerShell.cs" />
|
||||
@@ -146,12 +149,11 @@
|
||||
<DependentUpon>MainForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Misc\Misc.cs" />
|
||||
<Compile Include="mpv\core.cs" />
|
||||
<Compile Include="mpv\CorePlayer.cs" />
|
||||
<Compile Include="Misc\Commands.cs" />
|
||||
<Compile Include="Native\Native.cs" />
|
||||
<Compile Include="Misc\Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Native\TaskDialog.cs" />
|
||||
<Compile Include="WPF\SetupWindow.xaml.cs">
|
||||
<DependentUpon>SetupWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
@@ -231,12 +233,6 @@
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
</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" />
|
||||
<!-- 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.
|
||||
|
||||
@@ -7,8 +7,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mpv.net", "mpv.net.csproj",
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RatingExtension", "extensions\RatingExtension\RatingExtension.csproj", "{55C88710-539D-4402-84C8-31694841C731}"
|
||||
EndProject
|
||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TaskDialog", "WinForms\TaskDialog\TaskDialog.vbproj", "{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
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}.Release|Any CPU.ActiveCfg = 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
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
@@ -11,17 +12,12 @@ using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using static libmpv;
|
||||
using static mpvnet.NewLine;
|
||||
|
||||
using System.Globalization;
|
||||
using static mpvnet.Global;
|
||||
|
||||
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[] 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" };
|
||||
@@ -190,57 +186,31 @@ namespace mpvnet
|
||||
get {
|
||||
if (_ConfigFolder == null)
|
||||
{
|
||||
string portableFolder = Folder.Startup + @"portable_config\";
|
||||
_ConfigFolder = portableFolder;
|
||||
|
||||
if (!Directory.Exists(_ConfigFolder))
|
||||
_ConfigFolder = RegistryHelp.GetString("ConfigFolder");
|
||||
_ConfigFolder = Folder.Startup + "portable_config";
|
||||
|
||||
if (!Directory.Exists(_ConfigFolder))
|
||||
{
|
||||
string appdataFolder = Environment.GetFolderPath(
|
||||
Environment.SpecialFolder.ApplicationData) + @"\mpv.net\";
|
||||
_ConfigFolder = Folder.AppData + "mpv.net";
|
||||
|
||||
using (TaskDialog<string> td = new TaskDialog<string>())
|
||||
if (!Directory.Exists(_ConfigFolder))
|
||||
{
|
||||
td.MainInstruction = "Choose a settings folder.";
|
||||
td.AddCommand(@"AppData\Roaming\mpv.net", appdataFolder, appdataFolder);
|
||||
td.AddCommand(@"<startup>\portable_config", portableFolder, portableFolder);
|
||||
td.AddCommand("Choose custom folder", "custom");
|
||||
_ConfigFolder = td.Show();
|
||||
}
|
||||
_ConfigFolder = Folder.CustomSettings;
|
||||
|
||||
if (_ConfigFolder == null)
|
||||
{
|
||||
_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 (!Directory.Exists(_ConfigFolder))
|
||||
_ConfigFolder = Folder.AppData + "mpv.net";
|
||||
}
|
||||
}
|
||||
|
||||
if (Folder.Startup == _ConfigFolder)
|
||||
if (Folder.Startup.IsIdenticalFolder(_ConfigFolder))
|
||||
{
|
||||
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))
|
||||
Directory.CreateDirectory(_ConfigFolder);
|
||||
|
||||
if (!_ConfigFolder.Contains("portable_config"))
|
||||
RegistryHelp.SetValue(App.RegPath, "ConfigFolder", _ConfigFolder);
|
||||
_ConfigFolder = _ConfigFolder.AddSep();
|
||||
|
||||
if (!File.Exists(_ConfigFolder + "input.conf"))
|
||||
File.WriteAllText(_ConfigFolder + "input.conf", Properties.Resources.input_conf);
|
||||
@@ -292,7 +262,7 @@ namespace mpvnet
|
||||
public void InvokePowerShellScript(string file)
|
||||
{
|
||||
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.Scripts.Add("Using namespace mpvnet; [Reflection.Assembly]::LoadWithPartialName('mpvnet')" + BR);
|
||||
|
||||
@@ -427,7 +397,7 @@ namespace mpvnet
|
||||
Duration = TimeSpan.FromSeconds(get_property_number("duration"));
|
||||
|
||||
if (App.StartSize == "video")
|
||||
core.WasInitialSizeSet = false;
|
||||
Core.WasInitialSizeSet = false;
|
||||
|
||||
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(() => {
|
||||
string path = core.get_property_string("path");
|
||||
string path = Core.get_property_string("path");
|
||||
|
||||
if (path.Contains("://"))
|
||||
path = core.get_property_string("media-title");
|
||||
path = Core.get_property_string("media-title");
|
||||
|
||||
WriteHistory(path);
|
||||
}));
|
||||
@@ -594,7 +564,7 @@ namespace mpvnet
|
||||
|
||||
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)
|
||||
@@ -947,9 +917,9 @@ namespace mpvnet
|
||||
if (throwException)
|
||||
{
|
||||
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));
|
||||
}
|
||||
}
|
||||
@@ -984,7 +954,7 @@ namespace mpvnet
|
||||
}
|
||||
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;
|
||||
}
|
||||
else if (arg == "--version")
|
||||
@@ -994,12 +964,12 @@ namespace mpvnet
|
||||
}
|
||||
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;
|
||||
}
|
||||
else if (arg.StartsWith("--command="))
|
||||
{
|
||||
core.command(arg.Substring(10));
|
||||
Core.command(arg.Substring(10));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -1029,14 +999,14 @@ namespace mpvnet
|
||||
|
||||
if (preInit && preInitProperties.Contains(left))
|
||||
{
|
||||
core.ProcessProperty(left, right);
|
||||
Core.ProcessProperty(left, right);
|
||||
|
||||
if (!App.ProcessProperty(left, right))
|
||||
set_property_string(left, right, true);
|
||||
}
|
||||
else if (!preInit && !preInitProperties.Contains(left))
|
||||
{
|
||||
core.ProcessProperty(left, right);
|
||||
Core.ProcessProperty(left, right);
|
||||
|
||||
if (!App.ProcessProperty(left, right))
|
||||
{
|
||||
@@ -1069,7 +1039,7 @@ namespace mpvnet
|
||||
|
||||
if (shuffle)
|
||||
{
|
||||
core.command("playlist-shuffle");
|
||||
Core.command("playlist-shuffle");
|
||||
set_property_int("playlist-pos", 0);
|
||||
}
|
||||
|
||||
@@ -1104,11 +1074,11 @@ namespace mpvnet
|
||||
|
||||
if (file.Ext() == "iso")
|
||||
LoadISO(file);
|
||||
else if(Core.SubtitleTypes.Contains(file.Ext()))
|
||||
else if(CorePlayer.SubtitleTypes.Contains(file.Ext()))
|
||||
commandv("sub-add", file);
|
||||
else if (file.Ext().Length != 3 && File.Exists(Path.Combine(file, "BDMV\\index.bdmv")))
|
||||
{
|
||||
core.command("stop");
|
||||
Core.command("stop");
|
||||
Thread.Sleep(500);
|
||||
set_property_string("bluray-device", file);
|
||||
commandv("loadfile", @"bd://");
|
||||
@@ -1133,35 +1103,31 @@ namespace mpvnet
|
||||
|
||||
if (gb < 10)
|
||||
{
|
||||
using (TaskDialog<string> td = new TaskDialog<string>())
|
||||
{
|
||||
td.MainInstruction = "Is this a Blu-ray or a DVD image?";
|
||||
td.AddCommand("Blu-ray");
|
||||
td.AddCommand("DVD");
|
||||
DialogResult result = Msg.ShowQuestion("Click Yes for Blu-ray and No for DVD.",
|
||||
null, MessageBoxButtons.YesNoCancel);
|
||||
|
||||
switch (td.Show())
|
||||
{
|
||||
case "Blu-ray":
|
||||
core.command("stop");
|
||||
Thread.Sleep(500);
|
||||
core.set_property_string("bluray-device", path);
|
||||
core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||
break;
|
||||
case "DVD":
|
||||
core.command("stop");
|
||||
Thread.Sleep(500);
|
||||
core.set_property_string("dvd-device", path);
|
||||
core.LoadFiles(new[] { @"dvd://" }, false, false);
|
||||
break;
|
||||
}
|
||||
switch (result)
|
||||
{
|
||||
case DialogResult.Yes:
|
||||
Core.command("stop");
|
||||
Thread.Sleep(500);
|
||||
Core.set_property_string("bluray-device", path);
|
||||
Core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||
break;
|
||||
case DialogResult.No:
|
||||
Core.command("stop");
|
||||
Thread.Sleep(500);
|
||||
Core.set_property_string("dvd-device", path);
|
||||
Core.LoadFiles(new[] { @"dvd://" }, false, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
core.command("stop");
|
||||
Core.command("stop");
|
||||
Thread.Sleep(500);
|
||||
core.set_property_string("bluray-device", path);
|
||||
core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||
Core.set_property_string("bluray-device", path);
|
||||
Core.LoadFiles(new[] { @"bd://" }, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1184,9 +1150,9 @@ namespace mpvnet
|
||||
List<string> files = Directory.GetFiles(dir).ToList();
|
||||
|
||||
files = files.Where(file =>
|
||||
Core.VideoTypes.Contains(file.Ext()) ||
|
||||
Core.AudioTypes.Contains(file.Ext()) ||
|
||||
Core.ImageTypes.Contains(file.Ext())).ToList();
|
||||
CorePlayer.VideoTypes.Contains(file.Ext()) ||
|
||||
CorePlayer.AudioTypes.Contains(file.Ext()) ||
|
||||
CorePlayer.ImageTypes.Contains(file.Ext())).ToList();
|
||||
|
||||
files.Sort(new StringLogicalComparer());
|
||||
int index = files.IndexOf(path);
|
||||
@@ -1239,7 +1205,7 @@ namespace mpvnet
|
||||
bool HistoryDiscard()
|
||||
{
|
||||
if (HistoryDiscardOption == null)
|
||||
HistoryDiscardOption = core.get_opt("history-discard");
|
||||
HistoryDiscardOption = Core.get_opt("history-discard");
|
||||
|
||||
if (string.IsNullOrEmpty(HistoryDiscardOption))
|
||||
return false;
|
||||
@@ -1316,30 +1282,30 @@ namespace mpvnet
|
||||
|
||||
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++)
|
||||
{
|
||||
string type = core.get_property_string($"track-list/{i}/type");
|
||||
string type = Core.get_property_string($"track-list/{i}/type");
|
||||
|
||||
if (type == "audio")
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
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_int($"track-list/{i}/audio-channels") + " channels");
|
||||
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_int($"track-list/{i}/audio-channels") + " channels");
|
||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||
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);
|
||||
}
|
||||
else if (type == "sub")
|
||||
{
|
||||
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.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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user