2.5
This commit is contained in:
29
README.md
29
README.md
@@ -70,16 +70,33 @@ https://github.com/stax76/mpv.net/wiki/Scripting-(CSharp,-Python,-JavaScript,-Lu
|
||||
|
||||
### Changelog
|
||||
|
||||
### 2.5 (2019-04-08)
|
||||
|
||||
- in case the input conf don't contain a menu definition mpv.net creates the default menu instead no menu like before
|
||||
- all message boxes were migrated to use the TaskDialog API
|
||||
- an improvement in the previous release unfortunately introduced a bug
|
||||
causing the conf editor not to save settings
|
||||
|
||||
### 2.4 (2019-04-06)
|
||||
|
||||
- new options added to the conf GUI editor: gpu-context, gpu-api, scale, cscale,
|
||||
dscale, dither-depth, correct-downscaling, sigmoid-upscaling, deband
|
||||
- the conf edit GUI has a 'Apply' feature added to write the conf to mpv.conf without the need to close the conf edit GUI
|
||||
- the input edit GUI shows a message box when a duplicate is detected and it has a new feature to reduce the filter scope to eather of input, menu or command and the editor writes always the same help on top of input.conf as it is found in the defaults
|
||||
- the conf edit GUI has a 'Apply' feature added to write the conf to mpv.conf
|
||||
without the need to close the conf edit GUI
|
||||
- the input edit GUI shows a message box when a duplicate is detected and it has
|
||||
a new feature to reduce the filter scope to eather of input, menu or command and
|
||||
the editor writes always the same help on top of input.conf as it is found in the defaults
|
||||
- the conf edit GUI was often starting out of working area bounds and is now starting with center screen
|
||||
- the startup size was reduced and a issue was fixed that when the screen property was defined for a screen that isn't connected the startup size wasn't applied
|
||||
- added feature to load external audio and subtitle files in the menu under: Open > Load external audio|subtitle files (default binding at: [input.conf](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt))
|
||||
- previously the conf edit GUI removed settings from the conf file if the setting was set to the default, the new behavior is not to remove anything
|
||||
- the autofit mpv property was partly implemented, you can use 'autofit = 50%' in mpv.conf or '--autofit=50%' on the command line, WxH isn't implemented and only percent values are accepted. There is a new wiki page explaining the mpv.net limitations compared to the original mpv: [Limitations](https://github.com/stax76/mpv.net/wiki/Limitations)
|
||||
- the startup size was reduced and a issue was fixed that when the screen property
|
||||
was defined for a screen that isn't connected the startup size wasn't applied
|
||||
- added feature to load external audio and subtitle files in the menu under:
|
||||
Open > Load external audio|subtitle files (default binding at:
|
||||
[input.conf](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt))
|
||||
- previously the conf edit GUI removed settings from the conf file if the setting
|
||||
was set to the default, the new behavior is not to remove anything
|
||||
- the autofit mpv property was partly implemented, you can use 'autofit = 50%' in mpv.conf or
|
||||
'--autofit=50%' on the command line, WxH isn't implemented and only percent values are accepted.
|
||||
There is a new wiki page explaining the mpv.net limitations compared to the original mpv:
|
||||
[Limitations](https://github.com/stax76/mpv.net/wiki/Limitations)
|
||||
|
||||
[go to download page](https://github.com/stax76/mpv.net/releases)
|
||||
13
VBNET/My Project/Application.Designer.vb
generated
Normal file
13
VBNET/My Project/Application.Designer.vb
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <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
|
||||
|
||||
10
VBNET/My Project/Application.myapp
Normal file
10
VBNET/My Project/Application.myapp
Normal file
@@ -0,0 +1,10 @@
|
||||
<?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>1</ApplicationType>
|
||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||
</MyApplicationData>
|
||||
35
VBNET/My Project/AssemblyInfo.vb
Normal file
35
VBNET/My Project/AssemblyInfo.vb
Normal file
@@ -0,0 +1,35 @@
|
||||
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("VBNET")>
|
||||
<Assembly: AssemblyDescription("")>
|
||||
<Assembly: AssemblyCompany("")>
|
||||
<Assembly: AssemblyProduct("VBNET")>
|
||||
<Assembly: AssemblyCopyright("Copyright © 2019")>
|
||||
<Assembly: AssemblyTrademark("")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
|
||||
'The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
<Assembly: Guid("a5571ff4-12ae-4e1a-ad2b-863b07d1b952")>
|
||||
|
||||
' 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")>
|
||||
62
VBNET/My Project/Resources.Designer.vb
generated
Normal file
62
VBNET/My Project/Resources.Designer.vb
generated
Normal file
@@ -0,0 +1,62 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <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.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", "4.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("VBNET.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(ByVal value As Global.System.Globalization.CultureInfo)
|
||||
resourceCulture = value
|
||||
End Set
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
117
VBNET/My Project/Resources.resx
Normal file
117
VBNET/My Project/Resources.resx
Normal file
@@ -0,0 +1,117 @@
|
||||
<?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>
|
||||
73
VBNET/My Project/Settings.Designer.vb
generated
Normal file
73
VBNET/My Project/Settings.Designer.vb
generated
Normal file
@@ -0,0 +1,73 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <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", "11.0.0.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(ByVal sender As Global.System.Object, ByVal 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.VBNET.My.MySettings
|
||||
Get
|
||||
Return Global.VBNET.My.MySettings.Default
|
||||
End Get
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
7
VBNET/My Project/Settings.settings
Normal file
7
VBNET/My Project/Settings.settings
Normal file
@@ -0,0 +1,7 @@
|
||||
<?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>
|
||||
678
VBNET/TaskDialog.vb
Normal file
678
VBNET/TaskDialog.vb
Normal file
@@ -0,0 +1,678 @@
|
||||
Imports System.IO
|
||||
Imports System.Reflection
|
||||
Imports System.Runtime.InteropServices
|
||||
Imports System.Text
|
||||
Imports System.Text.RegularExpressions
|
||||
Imports System.Threading
|
||||
|
||||
Public Delegate Function PFTASKDIALOGCALLBACK(hwnd As IntPtr,
|
||||
msg As UInteger,
|
||||
wParam As IntPtr,
|
||||
lParam As IntPtr,
|
||||
lpRefData As IntPtr) As Integer
|
||||
Public Class Msg
|
||||
Public Shared Property SupportURL As String
|
||||
|
||||
Public Shared Sub Show(mainInstruction As String, Optional content As String = Nothing)
|
||||
Show(mainInstruction, content, MsgIcon.Info, MsgButtons.Ok)
|
||||
End Sub
|
||||
|
||||
Public Shared Sub ShowError(mainInstruction As String, Optional content As String = Nothing)
|
||||
If mainInstruction = "" Then mainInstruction = content
|
||||
If mainInstruction = "" Then Exit Sub
|
||||
|
||||
Using td As New TaskDialog(Of String)
|
||||
td.AllowCancel = False
|
||||
|
||||
If content = "" Then
|
||||
If mainInstruction.Length < 80 Then
|
||||
td.MainInstruction = mainInstruction
|
||||
Else
|
||||
td.Content = mainInstruction
|
||||
End If
|
||||
Else
|
||||
td.MainInstruction = mainInstruction
|
||||
td.Content = content
|
||||
End If
|
||||
|
||||
td.MainIcon = MsgIcon.Error
|
||||
td.Footer = "[copymsg Copy Message]"
|
||||
If SupportURL <> "" Then td.Footer += $" [{SupportURL} Contact Support]"
|
||||
td.Show()
|
||||
End Using
|
||||
End Sub
|
||||
|
||||
Public Shared Sub ShowException(e As Exception)
|
||||
Try
|
||||
Using td As New TaskDialog(Of String)
|
||||
td.MainInstruction = e.GetType.Name
|
||||
td.Content = e.Message
|
||||
td.MainIcon = MsgIcon.Error
|
||||
td.ExpandedInformation = e.ToString
|
||||
td.Footer = "[copymsg Copy Message]"
|
||||
If SupportURL <> "" Then td.Footer += $" [{SupportURL} Contact Support]"
|
||||
td.Show()
|
||||
End Using
|
||||
Catch
|
||||
MsgBox(e.GetType.Name + vbCrLf + vbCrLf + e.Message + vbCrLf + vbCrLf + e.ToString, MsgBoxStyle.Critical)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
Private Shared ShownMessages As String
|
||||
|
||||
Public Shared Sub ShowWarning(mainInstruction As String,
|
||||
Optional content As String = Nothing,
|
||||
Optional onlyOnce As Boolean = False)
|
||||
|
||||
If onlyOnce AndAlso ShownMessages?.Contains(mainInstruction + content) Then Exit Sub
|
||||
Show(mainInstruction, content, MsgIcon.Warning, MsgButtons.Ok)
|
||||
If onlyOnce Then ShownMessages += mainInstruction + content
|
||||
End Sub
|
||||
|
||||
Public Shared Function ShowQuestion(mainInstruction As String,
|
||||
Optional buttons As MsgButtons = MsgButtons.OkCancel) As MsgResult
|
||||
|
||||
Return Show(mainInstruction, Nothing, MsgIcon.None, buttons)
|
||||
End Function
|
||||
|
||||
Public Shared Function ShowQuestion(mainInstruction As String,
|
||||
content As String,
|
||||
Optional buttons As MsgButtons = MsgButtons.OkCancel) As MsgResult
|
||||
Return Show(mainInstruction, content, MsgIcon.None, buttons)
|
||||
End Function
|
||||
|
||||
Public Shared Function Show(mainInstruction As String,
|
||||
content As String,
|
||||
icon As MsgIcon,
|
||||
buttons As MsgButtons,
|
||||
Optional defaultButton As MsgResult = MsgResult.None) As MsgResult
|
||||
|
||||
If mainInstruction Is Nothing Then mainInstruction = ""
|
||||
|
||||
Using td As New TaskDialog(Of MsgResult)
|
||||
td.AllowCancel = False
|
||||
td.DefaultButton = defaultButton
|
||||
td.MainIcon = icon
|
||||
|
||||
If content Is Nothing Then
|
||||
If mainInstruction.Length < 80 Then
|
||||
td.MainInstruction = mainInstruction
|
||||
Else
|
||||
td.Content = mainInstruction
|
||||
End If
|
||||
Else
|
||||
td.MainInstruction = mainInstruction
|
||||
td.Content = content
|
||||
End If
|
||||
|
||||
If buttons = MsgButtons.OkCancel Then
|
||||
td.AddButton("OK", MsgResult.OK)
|
||||
td.AddButton("Cancel", MsgResult.Cancel) 'don't use system language
|
||||
Else
|
||||
td.CommonButtons = buttons
|
||||
End If
|
||||
|
||||
Return td.Show()
|
||||
End Using
|
||||
End Function
|
||||
End Class
|
||||
|
||||
Public Class TaskDialog(Of T)
|
||||
Inherits TaskDialogNative
|
||||
Implements IDisposable
|
||||
|
||||
Private IdValueDic As New Dictionary(Of Integer, T)
|
||||
Private IdTextDic As New Dictionary(Of Integer, String)
|
||||
Private CommandLinkShieldList As New List(Of Integer)
|
||||
Private ButtonArray As IntPtr, RadioButtonArray As IntPtr
|
||||
Private Buttons As New List(Of TASKDIALOG_BUTTON)
|
||||
Private RadioButtons As New List(Of TASKDIALOG_BUTTON)
|
||||
|
||||
Private Config As TASKDIALOGCONFIG
|
||||
|
||||
Sub New()
|
||||
Config = New TASKDIALOGCONFIG()
|
||||
|
||||
Config.cbSize = CUInt(Marshal.SizeOf(Config))
|
||||
Config.hwndParent = GetHandle()
|
||||
Config.hInstance = IntPtr.Zero
|
||||
Config.dwFlags = TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION
|
||||
Config.dwCommonButtons = MsgButtons.None
|
||||
Config.MainIcon = New TASKDIALOGCONFIG_ICON_UNION(0)
|
||||
Config.FooterIcon = New TASKDIALOGCONFIG_ICON_UNION(0)
|
||||
Config.cxWidth = 0
|
||||
|
||||
Config.cButtons = 0
|
||||
Config.cRadioButtons = 0
|
||||
Config.pButtons = IntPtr.Zero
|
||||
Config.pRadioButtons = IntPtr.Zero
|
||||
Config.nDefaultButton = 0
|
||||
Config.nDefaultRadioButton = 0
|
||||
|
||||
Config.pszWindowTitle = DirectCast(Assembly.GetEntryAssembly().GetCustomAttributes(GetType(AssemblyProductAttribute), True)(0), AssemblyProductAttribute).Product
|
||||
Config.pszMainInstruction = ""
|
||||
Config.pszContent = ""
|
||||
Config.pszVerificationText = Nothing
|
||||
Config.pszExpandedInformation = Nothing
|
||||
Config.pszExpandedControlText = Nothing
|
||||
Config.pszCollapsedControlText = Nothing
|
||||
Config.pszFooter = Nothing
|
||||
|
||||
Config.pfCallback = New PFTASKDIALOGCALLBACK(AddressOf DialogProc)
|
||||
End Sub
|
||||
|
||||
Function GetHandle() As IntPtr
|
||||
Dim sb As New StringBuilder(260)
|
||||
Dim foregroundHandle = GetForegroundWindow()
|
||||
GetWindowModuleFileName(foregroundHandle, sb, 260)
|
||||
|
||||
If Path.GetFileName(sb.ToString.Replace(".vshost", "")) =
|
||||
Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location) Then
|
||||
|
||||
Return foregroundHandle
|
||||
End If
|
||||
End Function
|
||||
|
||||
#Region "Constants"
|
||||
Const TDE_CONTENT As Integer = 0
|
||||
Const TDE_EXPANDED_INFORMATION As Integer = 1
|
||||
Const TDE_FOOTER As Integer = 2
|
||||
Const TDE_MAIN_INSTRUCTION As Integer = 3
|
||||
|
||||
Const TDN_CREATED As Integer = 0
|
||||
Const TDN_NAVIGATED As Integer = 1
|
||||
Const TDN_BUTTON_CLICKED As Integer = 2
|
||||
Const TDN_HYPERLINK_CLICKED As Integer = 3
|
||||
Const TDN_TIMER As Integer = 4
|
||||
Const TDN_DESTROYED As Integer = 5
|
||||
Const TDN_RADIO_BUTTON_CLICKED As Integer = 6
|
||||
Const TDN_DIALOG_CONSTRUCTED As Integer = 7
|
||||
Const TDN_VERIFICATION_CLICKED As Integer = 8
|
||||
Const TDN_HELP As Integer = 9
|
||||
Const TDN_EXPANDO_BUTTON_CLICKED As Integer = 10
|
||||
|
||||
Const TDM_NAVIGATE_PAGE As Integer = &H400 + 101
|
||||
Const TDM_CLICK_BUTTON As Integer = &H400 + 102 'wParam = Button ID
|
||||
Const TDM_SET_MARQUEE_PROGRESS_BAR As Integer = &H400 + 103 'wParam = 0 (nonMarque) wParam != 0 (Marquee)
|
||||
Const TDM_SET_PROGRESS_BAR_STATE As Integer = &H400 + 104 'wParam = new progress state
|
||||
Const TDM_SET_PROGRESS_BAR_RANGE As Integer = &H400 + 105 'lParam = MAKELPARAM(nMinRange, nMaxRange)
|
||||
Const TDM_SET_PROGRESS_BAR_POS As Integer = &H400 + 106 'wParam = new position
|
||||
Const TDM_SET_PROGRESS_BAR_MARQUEE As Integer = &H400 + 107 'wParam = 0 (stop marquee), wParam != 0 (start marquee), lparam = speed (milliseconds between repaints)
|
||||
Const TDM_SET_ELEMENT_TEXT As Integer = &H400 + 108 'wParam = element (TASKDIALOG_ELEMENTS), lParam = new element text (LPCWSTR)
|
||||
Const TDM_CLICK_RADIO_BUTTON As Integer = &H400 + 110 'wParam = Radio Button ID
|
||||
Const TDM_ENABLE_BUTTON As Integer = &H400 + 111 'lParam = 0 (disable), lParam != 0 (enable), wParam = Button ID
|
||||
Const TDM_ENABLE_RADIO_BUTTON As Integer = &H400 + 112 'lParam = 0 (disable), lParam != 0 (enable), wParam = Radio Button ID
|
||||
Const TDM_CLICK_VERIFICATION As Integer = &H400 + 113 'wParam = 0 (unchecked), 1 (checked), lParam = 1 (set key focus)
|
||||
Const TDM_UPDATE_ELEMENT_TEXT As Integer = &H400 + 114 'wParam = element (TASKDIALOG_ELEMENTS), lParam = new element text (LPCWSTR)
|
||||
Const TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE As Integer = &H400 + 115 'wParam = Button ID, lParam = 0 (elevation not required), lParam != 0 (elevation required)
|
||||
Const TDM_UPDATE_ICON As Integer = &H400 + 116 'wParam = icon element (TASKDIALOG_ICON_ELEMENTS), lParam = new icon (hIcon if TDF_USE_HICON_* was set, PCWSTR otherwise)
|
||||
#End Region
|
||||
|
||||
#Region "Properties"
|
||||
|
||||
Private AllowCancelValue As Boolean
|
||||
|
||||
WriteOnly Property AllowCancel() As Boolean
|
||||
Set(Value As Boolean)
|
||||
If Value Then
|
||||
Config.dwFlags = Config.dwFlags Or TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION
|
||||
ElseIf (Config.dwFlags And TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION) = TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION Then
|
||||
Config.dwFlags = Config.dwFlags Xor TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION
|
||||
End If
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property MainInstruction() As String
|
||||
Get
|
||||
Return Config.pszMainInstruction
|
||||
End Get
|
||||
Set(Value As String)
|
||||
Config.pszMainInstruction = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property Content() As String
|
||||
Get
|
||||
Return Config.pszContent
|
||||
End Get
|
||||
Set(Value As String)
|
||||
Config.pszContent = ExpandWikiMarkup(Value)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property ExpandedInformation() As String
|
||||
Get
|
||||
Return Config.pszExpandedInformation
|
||||
End Get
|
||||
Set(Value As String)
|
||||
Config.pszExpandedInformation = ExpandWikiMarkup(Value)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property VerificationText() As String
|
||||
Get
|
||||
Return Config.pszVerificationText
|
||||
End Get
|
||||
Set(Value As String)
|
||||
Config.pszVerificationText = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property DefaultButton() As MsgResult
|
||||
Get
|
||||
Return CType(Config.nDefaultButton, MsgResult)
|
||||
End Get
|
||||
Set(Value As MsgResult)
|
||||
Config.nDefaultButton = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property Footer() As String
|
||||
Get
|
||||
Return Config.pszFooter
|
||||
End Get
|
||||
Set(Value As String)
|
||||
Config.pszFooter = ExpandWikiMarkup(Value)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
WriteOnly Property MainIcon() As MsgIcon
|
||||
Set(Value As MsgIcon)
|
||||
Config.MainIcon = New TASKDIALOGCONFIG_ICON_UNION(Value)
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private SelectedIDValue As Integer = -1
|
||||
|
||||
Property SelectedID As Integer
|
||||
Get
|
||||
Return SelectedIDValue
|
||||
End Get
|
||||
Set(value As Integer)
|
||||
For Each i In IdValueDic
|
||||
If i.Key = value Then SelectedIDValue = value
|
||||
Next
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private SelectedValueValue As T
|
||||
|
||||
Property SelectedValue() As T
|
||||
Get
|
||||
If IdValueDic.ContainsKey(SelectedID) Then Return IdValueDic(SelectedID)
|
||||
Return SelectedValueValue
|
||||
End Get
|
||||
Set(value As T)
|
||||
SelectedValueValue = value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private SelectedTextValue As String
|
||||
|
||||
Property SelectedText() As String
|
||||
Get
|
||||
If IdTextDic.ContainsKey(SelectedID) Then Return IdTextDic(SelectedID)
|
||||
Return SelectedTextValue
|
||||
End Get
|
||||
Set(value As String)
|
||||
SelectedTextValue = value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Property CheckBoxChecked() As Boolean
|
||||
Get
|
||||
Return (Config.dwFlags And TASKDIALOG_FLAGS.TDF_VERIFICATION_FLAG_CHECKED) = TASKDIALOG_FLAGS.TDF_VERIFICATION_FLAG_CHECKED
|
||||
End Get
|
||||
Set(value As Boolean)
|
||||
If value Then
|
||||
Config.dwFlags = Config.dwFlags Or TASKDIALOG_FLAGS.TDF_VERIFICATION_FLAG_CHECKED
|
||||
ElseIf CheckBoxChecked Then
|
||||
Config.dwFlags = Config.dwFlags Xor TASKDIALOG_FLAGS.TDF_VERIFICATION_FLAG_CHECKED
|
||||
End If
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private CommonButtonsValue As MsgButtons
|
||||
|
||||
Property CommonButtons() As MsgButtons
|
||||
Get
|
||||
Return Config.dwCommonButtons
|
||||
End Get
|
||||
Set(Value As MsgButtons)
|
||||
Config.dwCommonButtons = Value
|
||||
End Set
|
||||
End Property
|
||||
|
||||
Private TimeoutValue As Integer
|
||||
|
||||
Property Timeout As Integer
|
||||
Get
|
||||
Return CInt(TimeoutValue / 1000)
|
||||
End Get
|
||||
Set(Value As Integer)
|
||||
TimeoutValue = Value * 1000
|
||||
|
||||
If Value > 0 Then
|
||||
Config.dwFlags = Config.dwFlags Or TASKDIALOG_FLAGS.TDF_CALLBACK_TIMER
|
||||
End If
|
||||
End Set
|
||||
End Property
|
||||
#End Region
|
||||
|
||||
#Region "Methods"
|
||||
|
||||
Sub AddButton(text As String, value As T)
|
||||
Dim id = 1000 + IdValueDic.Count + 1
|
||||
IdValueDic(id) = value
|
||||
Buttons.Add(New TASKDIALOG_BUTTON(id, text))
|
||||
End Sub
|
||||
|
||||
Function ExpandWikiMarkup(value As String) As String
|
||||
If value.Contains("[") Then
|
||||
Dim re As New Regex("\[(.*?) (.+?)\]")
|
||||
Dim m = re.Match(value)
|
||||
|
||||
If m.Success Then
|
||||
Config.dwFlags = Config.dwFlags Or TASKDIALOG_FLAGS.TDF_ENABLE_HYPERLINKS
|
||||
value = re.Replace(value, "<a href=""$1"">$2</a>")
|
||||
End If
|
||||
End If
|
||||
|
||||
Return value
|
||||
End Function
|
||||
|
||||
Sub AddCommandLink(text As String, Optional value As T = Nothing)
|
||||
Dim id = 1000 + IdValueDic.Count + 1
|
||||
Dim temp As Object = text
|
||||
IdValueDic(id) = If(value Is Nothing, CType(temp, T), value)
|
||||
IdTextDic(id) = text
|
||||
Buttons.Add(New TASKDIALOG_BUTTON(id, text))
|
||||
Config.dwFlags = Config.dwFlags Or TASKDIALOG_FLAGS.TDF_USE_COMMAND_LINKS
|
||||
End Sub
|
||||
|
||||
Sub AddCommandLink(text As String,
|
||||
description As String,
|
||||
value As T,
|
||||
Optional setShield As Boolean = False)
|
||||
|
||||
Dim id = 1000 + IdValueDic.Count + 1
|
||||
IdValueDic(id) = value
|
||||
If setShield Then CommandLinkShieldList.Add(id)
|
||||
If description <> "" Then text = text + vbCrLf + description
|
||||
Buttons.Add(New TASKDIALOG_BUTTON(id, text))
|
||||
Config.dwFlags = Config.dwFlags Or TASKDIALOG_FLAGS.TDF_USE_COMMAND_LINKS
|
||||
End Sub
|
||||
|
||||
Sub AddRadioButton(text As String, value As T)
|
||||
Dim id = 1000 + IdValueDic.Count + 1
|
||||
IdValueDic(id) = value
|
||||
RadioButtons.Add(New TASKDIALOG_BUTTON(id, text))
|
||||
End Sub
|
||||
|
||||
Function Show() As T
|
||||
MarshalDialogControlStructs()
|
||||
Dim isChecked As Boolean
|
||||
Dim hr = TaskDialogIndirect(Config, Nothing, Nothing, isChecked)
|
||||
CheckBoxChecked = isChecked
|
||||
If hr < 0 Then Marshal.ThrowExceptionForHR(hr)
|
||||
If TypeOf SelectedValue Is MsgResult Then SelectedValue = DirectCast(CObj(SelectedID), T)
|
||||
Return SelectedValue
|
||||
End Function
|
||||
|
||||
Private ExitTickCount As Integer
|
||||
|
||||
Private Function DialogProc(hwnd As IntPtr,
|
||||
msg As UInteger,
|
||||
wParam As IntPtr,
|
||||
lParam As IntPtr,
|
||||
lpRefData As IntPtr) As Integer
|
||||
Select Case msg
|
||||
Case TDN_BUTTON_CLICKED, TDN_RADIO_BUTTON_CLICKED
|
||||
If TypeOf SelectedValue Is MsgResult Then
|
||||
SelectedIDValue = wParam.ToInt32
|
||||
Else
|
||||
SelectedID = wParam.ToInt32
|
||||
End If
|
||||
Case TDN_TIMER
|
||||
If ExitTickCount = 0 Then
|
||||
ExitTickCount = Environment.TickCount + Timeout * 1000
|
||||
End If
|
||||
|
||||
If Environment.TickCount > ExitTickCount Then
|
||||
SendMessage(hwnd, TDM_CLICK_BUTTON, New IntPtr(MsgResult.OK), IntPtr.Zero)
|
||||
End If
|
||||
Case TDN_HYPERLINK_CLICKED
|
||||
Dim url = Marshal.PtrToStringUni(lParam)
|
||||
|
||||
If url.StartsWith("mailto") OrElse url.StartsWith("http") Then
|
||||
Process.Start(url)
|
||||
ElseIf url = "copymsg" Then
|
||||
Dim thread As New Thread(
|
||||
New ThreadStart(Sub()
|
||||
System.Windows.Forms.Clipboard.SetText(MainInstruction + vbCrLf + vbCrLf + Content + vbCrLf + vbCrLf + ExpandedInformation)
|
||||
MsgBox("Message was copied to clipboard.",
|
||||
MsgBoxStyle.Information,
|
||||
DirectCast(Assembly.GetEntryAssembly().GetCustomAttributes(GetType(AssemblyProductAttribute), True)(0), AssemblyProductAttribute).Product)
|
||||
End Sub))
|
||||
thread.SetApartmentState(ApartmentState.STA)
|
||||
thread.Start()
|
||||
End If
|
||||
Case TDN_CREATED
|
||||
For Each i In CommandLinkShieldList
|
||||
SendMessage(hwnd, TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, New IntPtr(i), New IntPtr(1))
|
||||
Next
|
||||
End Select
|
||||
End Function
|
||||
|
||||
Private Sub MarshalDialogControlStructs()
|
||||
If Not Buttons Is Nothing AndAlso Buttons.Count > 0 Then
|
||||
ButtonArray = AllocateAndMarshalButtons(Buttons)
|
||||
Config.pButtons = ButtonArray
|
||||
Config.cButtons = CUInt(Buttons.Count)
|
||||
End If
|
||||
|
||||
If Not RadioButtons Is Nothing AndAlso RadioButtons.Count > 0 Then
|
||||
RadioButtonArray = AllocateAndMarshalButtons(RadioButtons)
|
||||
Config.pRadioButtons = RadioButtonArray
|
||||
Config.cRadioButtons = CUInt(RadioButtons.Count)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Shared Function AllocateAndMarshalButtons(structs As List(Of TASKDIALOG_BUTTON)) As IntPtr
|
||||
Dim initialPtr = Marshal.AllocHGlobal(Marshal.SizeOf(GetType(TASKDIALOG_BUTTON)) * structs.Count)
|
||||
Dim currentPtr = initialPtr
|
||||
|
||||
For Each button In structs
|
||||
Marshal.StructureToPtr(button, currentPtr, False)
|
||||
currentPtr = CType((currentPtr.ToInt64 + Marshal.SizeOf(button)), IntPtr)
|
||||
Next
|
||||
|
||||
Return initialPtr
|
||||
End Function
|
||||
|
||||
#End Region
|
||||
|
||||
#Region "IDispose Pattern"
|
||||
|
||||
Private disposed As Boolean
|
||||
|
||||
Sub Dispose() Implements IDisposable.Dispose
|
||||
Dispose(True)
|
||||
GC.SuppressFinalize(Me)
|
||||
End Sub
|
||||
|
||||
Protected Overrides Sub Finalize()
|
||||
Try
|
||||
Dispose(False)
|
||||
Finally
|
||||
MyBase.Finalize()
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
Protected Sub Dispose(disposing As Boolean)
|
||||
If Not disposed Then
|
||||
disposed = True
|
||||
|
||||
If ButtonArray <> IntPtr.Zero Then
|
||||
Marshal.FreeHGlobal(ButtonArray)
|
||||
ButtonArray = IntPtr.Zero
|
||||
End If
|
||||
|
||||
If RadioButtonArray <> IntPtr.Zero Then
|
||||
Marshal.FreeHGlobal(RadioButtonArray)
|
||||
RadioButtonArray = IntPtr.Zero
|
||||
End If
|
||||
|
||||
If disposing Then
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
#End Region
|
||||
|
||||
End Class
|
||||
|
||||
Public Class TaskDialogNative
|
||||
<DllImport("comctl32", CharSet:=CharSet.Unicode, SetLastError:=True)>
|
||||
Shared Function TaskDialogIndirect(<[In]()> pTaskConfig As TASKDIALOGCONFIG, <Out()> ByRef pnButton As Integer, <Out()> ByRef pnRadioButton As Integer, <MarshalAs(UnmanagedType.Bool)> <Out()> ByRef pVerificationFlagChecked As Boolean) As Integer
|
||||
End Function
|
||||
|
||||
<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 SendMessage(handle As IntPtr,
|
||||
message As Int32,
|
||||
wParam As IntPtr,
|
||||
lParam As IntPtr) As IntPtr
|
||||
End Function
|
||||
|
||||
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode, Pack:=4)>
|
||||
Public Class TASKDIALOGCONFIG
|
||||
Public cbSize As UInteger
|
||||
Public hwndParent As IntPtr
|
||||
Public hInstance As IntPtr
|
||||
Public dwFlags As TASKDIALOG_FLAGS
|
||||
Public dwCommonButtons As MsgButtons
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszWindowTitle As String
|
||||
Public MainIcon As TASKDIALOGCONFIG_ICON_UNION
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszMainInstruction As String
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszContent As String
|
||||
Public cButtons As UInteger
|
||||
Public pButtons As IntPtr
|
||||
Public nDefaultButton As Integer
|
||||
Public cRadioButtons As UInteger
|
||||
Public pRadioButtons As IntPtr
|
||||
Public nDefaultRadioButton As Integer
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszVerificationText As String
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszExpandedInformation As String
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszExpandedControlText As String
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszCollapsedControlText As String
|
||||
Public FooterIcon As TASKDIALOGCONFIG_ICON_UNION
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszFooter As String
|
||||
Public pfCallback As PFTASKDIALOGCALLBACK
|
||||
Public lpCallbackData As IntPtr
|
||||
Public cxWidth As UInteger
|
||||
End Class
|
||||
|
||||
Public Enum TASKDIALOG_FLAGS
|
||||
NONE = 0
|
||||
TDF_ENABLE_HYPERLINKS = &H1
|
||||
TDF_USE_HICON_MAIN = &H2
|
||||
TDF_USE_HICON_FOOTER = &H4
|
||||
TDF_ALLOW_DIALOG_CANCELLATION = &H8
|
||||
TDF_USE_COMMAND_LINKS = &H10
|
||||
TDF_USE_COMMAND_LINKS_NO_ICON = &H20
|
||||
TDF_EXPAND_FOOTER_AREA = &H40
|
||||
TDF_EXPANDED_BY_DEFAULT = &H80
|
||||
TDF_VERIFICATION_FLAG_CHECKED = &H100
|
||||
TDF_SHOW_PROGRESS_BAR = &H200
|
||||
TDF_SHOW_MARQUEE_PROGRESS_BAR = &H400
|
||||
TDF_CALLBACK_TIMER = &H800
|
||||
TDF_POSITION_RELATIVE_TO_WINDOW = &H1000
|
||||
TDF_RTL_LAYOUT = &H2000
|
||||
TDF_NO_DEFAULT_RADIO_BUTTON = &H4000
|
||||
End Enum
|
||||
|
||||
<StructLayout(LayoutKind.Explicit, CharSet:=CharSet.Unicode)>
|
||||
Public Structure TASKDIALOGCONFIG_ICON_UNION
|
||||
Sub New(i As Integer)
|
||||
spacer = IntPtr.Zero
|
||||
pszIcon = 0
|
||||
hMainIcon = i
|
||||
End Sub
|
||||
|
||||
<FieldOffset(0)>
|
||||
Public hMainIcon As Integer
|
||||
<FieldOffset(0)>
|
||||
Public pszIcon As Integer
|
||||
<FieldOffset(0)>
|
||||
Public spacer As IntPtr
|
||||
End Structure
|
||||
|
||||
<StructLayout(LayoutKind.Sequential,
|
||||
CharSet:=CharSet.Unicode, Pack:=4)>
|
||||
Public Structure TASKDIALOG_BUTTON
|
||||
Sub New(n As Integer, txt As String)
|
||||
nButtonID = n
|
||||
pszButtonText = txt
|
||||
End Sub
|
||||
|
||||
Public nButtonID As Integer
|
||||
<MarshalAs(UnmanagedType.LPWStr)>
|
||||
Public pszButtonText As String
|
||||
End Structure
|
||||
End Class
|
||||
|
||||
Public Enum MsgButtons
|
||||
None = &H0
|
||||
Ok = &H1
|
||||
Yes = &H2
|
||||
No = &H4
|
||||
Cancel = &H8
|
||||
Retry = &H10
|
||||
RetryCancel = Retry Or Cancel
|
||||
Close = &H20
|
||||
OkCancel = Ok Or Cancel
|
||||
YesNo = Yes Or No
|
||||
YesNoCancel = YesNo Or Cancel
|
||||
End Enum
|
||||
|
||||
Public Enum MsgIcon
|
||||
None = 0
|
||||
Warning = 65535 'TD_WARNING_ICON
|
||||
[Error] = 65534 'TD_ERROR_ICON
|
||||
Info = 65533 'TD_INFORMATION_ICON
|
||||
Shield = 65532 'TD_SHIELD_ICON
|
||||
SecurityShieldBlue = 65531
|
||||
SecurityWarning = 65530
|
||||
SecurityError = 65529
|
||||
SecuritySuccess = 65528
|
||||
SecurityShieldGray = 65527
|
||||
End Enum
|
||||
|
||||
Public Enum MsgResult
|
||||
None = 0
|
||||
OK = 1
|
||||
Cancel = 2
|
||||
Abort = 3
|
||||
Retry = 4
|
||||
Ignore = 5
|
||||
Yes = 6
|
||||
No = 7
|
||||
End Enum
|
||||
107
VBNET/VBNET.vbproj
Normal file
107
VBNET/VBNET.vbproj
Normal file
@@ -0,0 +1,107 @@
|
||||
<?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>{A1D11294-05BF-4D77-B008-AECF1AA93C9F}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>VBNET</RootNamespace>
|
||||
<AssemblyName>VBNET</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<MyType>Windows</MyType>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<Deterministic>true</Deterministic>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DocumentationFile>VBNET.xml</DocumentationFile>
|
||||
<NoWarn>42353,42354,42355</NoWarn>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<DefineDebug>false</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DocumentationFile>VBNET.xml</DocumentationFile>
|
||||
<NoWarn>42353,42354,42355</NoWarn>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionExplicit>On</OptionExplicit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionCompare>Binary</OptionCompare>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionStrict>On</OptionStrict>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionInfer>On</OptionInfer>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<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="My Project\AssemblyInfo.vb" />
|
||||
<Compile Include="My Project\Application.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Application.myapp</DependentUpon>
|
||||
</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="TaskDialog.vb" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="My Project\Resources.resx">
|
||||
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||
<SubType>Designer</SubType>
|
||||
</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>
|
||||
18
mpv.net.sln
18
mpv.net.sln
@@ -1,7 +1,7 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26730.8
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.28729.10
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mpv.net", "mpv.net\mpv.net.csproj", "{1751F378-8EDF-4B62-BE6D-304C7C287089}"
|
||||
EndProject
|
||||
@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RatingAddon", "RatingAddon\
|
||||
EndProject
|
||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "CSScriptAddon", "CSScriptAddon\CSScriptAddon.vbproj", "{71808A87-8B1C-4DF8-957C-D79C3B164CCA}"
|
||||
EndProject
|
||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "VBNET", "VBNET\VBNET.vbproj", "{A1D11294-05BF-4D77-B008-AECF1AA93C9F}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -55,6 +57,18 @@ Global
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x64.Build.0 = Release|Any CPU
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A1D11294-05BF-4D77-B008-AECF1AA93C9F}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -5,6 +5,8 @@ using System.ComponentModel.Composition.Hosting;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using VBNET;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
public class Addon
|
||||
@@ -38,9 +40,9 @@ namespace mpvnet
|
||||
CompositionContainer.ComposeParts(this);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
catch (Exception ex)
|
||||
{
|
||||
MainForm.Instance.ShowMsgBox(e.ToString(), MessageBoxIcon.Error);
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using VBNET;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
public class Command
|
||||
@@ -54,7 +56,7 @@ namespace mpvnet
|
||||
}));
|
||||
}
|
||||
|
||||
public static void open_config_folder(string[] args)
|
||||
public static void open_conf_folder(string[] args)
|
||||
{
|
||||
Process.Start(mp.mpvConfFolderPath);
|
||||
}
|
||||
@@ -76,7 +78,8 @@ namespace mpvnet
|
||||
if (File.Exists(fp))
|
||||
Process.Start(fp);
|
||||
else
|
||||
if (MainForm.Instance.ShowMsgBox("Create history.txt file in config folder?\n\nmpv.net will write the date, time and filename of opened files to it.", MessageBoxIcon.Question) == DialogResult.OK)
|
||||
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)
|
||||
File.WriteAllText(fp, "");
|
||||
}
|
||||
|
||||
@@ -105,7 +108,7 @@ namespace mpvnet
|
||||
else
|
||||
File.WriteAllText(mp.mpvConfPath, File.ReadAllText(mp.mpvConfPath) + Environment.NewLine + args[0] + " = " + args[1]);
|
||||
|
||||
MainForm.Instance.ShowMsgBox("Please restart mpv.net", MessageBoxIcon.Information);
|
||||
Msg.Show("Changed settings are available on next startup.");
|
||||
}
|
||||
|
||||
public static void show_info(string[] args)
|
||||
|
||||
@@ -5,6 +5,9 @@ using System.Runtime.InteropServices;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using VBNET;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -30,6 +33,8 @@ namespace mpvnet
|
||||
{
|
||||
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
||||
Application.ThreadException += Application_ThreadException;
|
||||
Msg.SupportURL = "https://github.com/stax76/mpv.net#support";
|
||||
|
||||
Instance = this;
|
||||
Hwnd = Handle;
|
||||
MinimumSize = new Size(FontHeight * 16, FontHeight * 9);
|
||||
@@ -45,9 +50,9 @@ namespace mpvnet
|
||||
|
||||
ChangeFullscreen(mpvFullscreen);
|
||||
}
|
||||
catch (Exception e)
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowMsgBox(e.ToString(), MessageBoxIcon.Error);
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,32 +156,56 @@ namespace mpvnet
|
||||
|
||||
public void BuildMenu()
|
||||
{
|
||||
foreach (var i in File.ReadAllText(mp.InputConfPath).Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
|
||||
string content = File.ReadAllText(mp.InputConfPath);
|
||||
List<string> lines = null;
|
||||
Dictionary<string, string> commandInputDic = new Dictionary<string, string>();
|
||||
|
||||
if (content.Contains("#menu:"))
|
||||
lines = content.Split("\r\n".ToCharArray()).ToList();
|
||||
else
|
||||
{
|
||||
lines = Properties.Resources.input_conf.Split("\r\n".ToCharArray()).ToList();
|
||||
|
||||
foreach (string i in content.Split("\r\n".ToCharArray()))
|
||||
{
|
||||
string line = i.Trim();
|
||||
if (line.StartsWith("#") || !line.Contains(" ")) continue;
|
||||
string input = line.Substring(0, line.IndexOf(" ")).Trim();
|
||||
string command = line.Substring(line.IndexOf(" ") + 1).Trim();
|
||||
commandInputDic[command] = input;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (string i in lines)
|
||||
{
|
||||
if (!i.Contains("#menu:")) continue;
|
||||
var left = i.Substring(0, i.IndexOf("#menu:")).Trim();
|
||||
string left = i.Substring(0, i.IndexOf("#menu:")).Trim();
|
||||
if (left.StartsWith("#")) continue;
|
||||
var cmd = left.Substring(left.IndexOf(" ") + 1).Trim();
|
||||
var menu = i.Substring(i.IndexOf("#menu:") + "#menu:".Length).Trim();
|
||||
var key = left.Substring(0, left.IndexOf(" "));
|
||||
if (key == "_") key = "";
|
||||
if (menu.Contains(";")) key = menu.Substring(0, menu.IndexOf(";")).Trim();
|
||||
var path = menu.Substring(menu.IndexOf(";") + 1).Trim().Replace("&", "&&");
|
||||
if (path == "" || cmd == "") continue;
|
||||
string command = left.Substring(left.IndexOf(" ") + 1).Trim();
|
||||
string menu = i.Substring(i.IndexOf("#menu:") + "#menu:".Length).Trim();
|
||||
string input = left.Substring(0, left.IndexOf(" "));
|
||||
if (input == "_") input = "";
|
||||
if (menu.Contains(";")) input = menu.Substring(0, menu.IndexOf(";")).Trim();
|
||||
string path = menu.Substring(menu.IndexOf(";") + 1).Trim().Replace("&", "&&");
|
||||
if (path == "" || command == "") continue;
|
||||
|
||||
if (commandInputDic.Count > 0)
|
||||
if (commandInputDic.ContainsKey(command))
|
||||
input = commandInputDic[command];
|
||||
else
|
||||
input = "";
|
||||
|
||||
var menuItem = CMS.Add(path, () => {
|
||||
try
|
||||
{
|
||||
mp.command_string(cmd);
|
||||
try {
|
||||
mp.command_string(command);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
ShowMsgBox(e.ToString(), MessageBoxIcon.Error);
|
||||
catch (Exception ex) {
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
});
|
||||
|
||||
if (menuItem != null)
|
||||
menuItem.ShortcutKeyDisplayString = key.Replace("_","") + " ";
|
||||
menuItem.ShortcutKeyDisplayString = input.Replace("_","") + " ";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,12 +236,12 @@ namespace mpvnet
|
||||
|
||||
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
|
||||
{
|
||||
ShowMsgBox(e.Exception.ToString(), MessageBoxIcon.Error);
|
||||
Msg.ShowException(e.Exception);
|
||||
}
|
||||
|
||||
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||
{
|
||||
ShowMsgBox(e.ExceptionObject.ToString(), MessageBoxIcon.Error);
|
||||
Msg.ShowError(e.ExceptionObject.ToString());
|
||||
}
|
||||
|
||||
private void mp_VideoSizeChanged()
|
||||
@@ -431,7 +460,7 @@ namespace mpvnet
|
||||
if (clipboard.StartsWith("https://www.youtube.com/watch?") && LastURL != clipboard && Visible)
|
||||
{
|
||||
LastURL = clipboard;
|
||||
if (ShowMsgBox("Play YouTube URL?", MessageBoxIcon.Question) == DialogResult.OK)
|
||||
if (Msg.ShowQuestion("Play YouTube URL?") == MsgResult.OK)
|
||||
mp.LoadURL(clipboard);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ using System.Management.Automation.Runspaces;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using VBNET;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
@@ -47,12 +48,12 @@ Using namespace System;
|
||||
throw new Exception();
|
||||
}
|
||||
}
|
||||
catch
|
||||
catch (Exception ex2)
|
||||
{
|
||||
MainForm.Instance.ShowMsgBox("PowerShell Setup Problem\n\nEnsure you have at least PowerShell 5.1 installed.", MessageBoxIcon.Error);
|
||||
Msg.ShowError("PowerShell Setup Problem\n\nEnsure you have at least PowerShell 5.1 installed.", ex2.ToString());
|
||||
return null;
|
||||
}
|
||||
MainForm.Instance.ShowMsgBox(ex.ToString(), MessageBoxIcon.Error);
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// 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("2.4.0.0")]
|
||||
[assembly: AssemblyFileVersion("2.4.0.0")]
|
||||
[assembly: AssemblyVersion("2.5.0.0")]
|
||||
[assembly: AssemblyFileVersion("2.5.0.0")]
|
||||
|
||||
@@ -3,7 +3,7 @@ using System.Reflection;
|
||||
using System.Windows.Forms;
|
||||
using IronPython.Hosting;
|
||||
using Microsoft.Scripting.Hosting;
|
||||
|
||||
using VBNET;
|
||||
using PyRT = IronPython.Runtime;
|
||||
|
||||
namespace mpvnet
|
||||
@@ -27,7 +27,7 @@ namespace mpvnet
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MainForm.Instance.ShowMsgBox(ex.ToString(), MessageBoxIcon.Error);
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
_ ignore #menu: Seek > -
|
||||
Ctrl+Right no-osd seek 300 #menu: Seek > 5 min forward
|
||||
Ctrl+Left no-osd seek -300 #menu: Seek > 5 min backward
|
||||
|
||||
Ctrl++ add video-zoom 0.1 #menu: Pan & Scan > Increase Size
|
||||
Ctrl+- add video-zoom -0.1 #menu: Pan & Scan > Decrease Size
|
||||
_ ignore #menu: Pan & Scan > -
|
||||
@@ -66,6 +67,7 @@
|
||||
W add panscan 0.1 #menu: Pan & Scan > Increase Height
|
||||
_ ignore #menu: Pan & Scan > -
|
||||
Ctrl+BS set video-zoom 0; set video-pan-x 0; set video-pan-y 0 #menu: Pan & Scan > Reset
|
||||
|
||||
Ctrl+1 add contrast -1 #menu: Video > Decrease Contrast
|
||||
Ctrl+2 add contrast #menu: Video > Increase Contrast
|
||||
_ ignore #menu: Video > -
|
||||
@@ -81,10 +83,12 @@
|
||||
Ctrl+s async screenshot #menu: Video > Take Screenshot
|
||||
d cycle deinterlace #menu: Video > Toggle Deinterlace
|
||||
a cycle-values video-aspect "16:9" "4:3" "2.35:1" "-1" #menu: Video > Cycle Aspect Ratio
|
||||
|
||||
KP7 cycle audio #menu: Audio > Cycle/Next
|
||||
_ ignore #menu: Audio > -
|
||||
KP6 add audio-delay 0.100 #menu: Audio > Delay +0.1
|
||||
KP9 add audio-delay -0.100 #menu: Audio > Delay -0.1
|
||||
|
||||
KP8 cycle sub #menu: Subtitle > Cycle/Next
|
||||
v cycle sub-visibility #menu: Subtitle > Toggle Visibility
|
||||
_ ignore #menu: Subtitle > -
|
||||
@@ -96,10 +100,12 @@
|
||||
_ ignore #menu: Subtitle > -
|
||||
_ add sub-scale -0.1 #menu: Subtitle > Decrease Subtitle Font Size
|
||||
_ add sub-scale 0.1 #menu: Subtitle > Increase Subtitle Font Size
|
||||
|
||||
+ add volume 10 #menu: Volume > Up
|
||||
- add volume -10 #menu: Volume > Down
|
||||
_ ignore #menu: Volume > -
|
||||
m cycle mute #menu: Volume > Mute
|
||||
|
||||
[ multiply speed 0.9 #menu: Speed > -10%
|
||||
] multiply speed 1.1 #menu: Speed > +10%
|
||||
_ ignore #menu: Speed > -
|
||||
@@ -107,6 +113,7 @@
|
||||
} multiply speed 2.0 #menu: Speed > Double
|
||||
_ ignore #menu: Speed > -
|
||||
BS set speed 1 #menu: Speed > Reset
|
||||
|
||||
KP0 script-message rate-file 0 #menu: Addons > Rating > 0stars
|
||||
KP1 script-message rate-file 1 #menu: Addons > Rating > 1stars
|
||||
KP2 script-message rate-file 2 #menu: Addons > Rating > 2stars
|
||||
@@ -124,7 +131,7 @@
|
||||
_ script-message mpv.net set-setting hwdec no #menu: Settings > Hardware Decoding > Disable
|
||||
Ctrl+c script-message mpv.net show-conf-editor #menu: Settings > Show Config Editor
|
||||
Ctrl+i script-message mpv.net show-input-editor #menu: Settings > Show Input Editor
|
||||
Ctrl+f script-message mpv.net open-config-folder #menu: Settings > Open Config Folder
|
||||
Ctrl+f script-message mpv.net open-conf-folder #menu: Settings > Open Config Folder
|
||||
|
||||
h script-message mpv.net show-history #menu: Tools > Show History
|
||||
l ab-loop #menu: Tools > Set/clear A-B loop points
|
||||
|
||||
@@ -10,7 +10,7 @@ using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using VBNET;
|
||||
using static mpvnet.libmpv;
|
||||
using static mpvnet.Native;
|
||||
|
||||
@@ -216,7 +216,7 @@ namespace mpvnet
|
||||
{
|
||||
List<string> names = mpvnet.Command.Commands.Select((item) => item.Name).ToList();
|
||||
names.Sort();
|
||||
MainForm.Instance.ShowMsgBox($"No command '{args[1]}' found. Available commands are:\n\n{string.Join("\n", names)}\n\nHow to bind these commands can be seen in the default input bindings and menu definition located at:\n\nhttps://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt", MessageBoxIcon.Error);
|
||||
Msg.ShowError($"No command '{args[1]}' found.", $"Available commands are:\n\n{string.Join("\n", names)}\n\nHow to bind these commands can be seen in the [https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt default input bindings and menu definition].");
|
||||
}
|
||||
}
|
||||
ClientMessage?.Invoke(args);
|
||||
@@ -265,7 +265,7 @@ namespace mpvnet
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MainForm.Instance.ShowMsgBox(ex.ToString(), MessageBoxIcon.Error);
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,7 +193,12 @@
|
||||
<Content Include="screenshot.jpg" />
|
||||
<Content Include="Resources\input.conf.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\VBNET\VBNET.vbproj">
|
||||
<Project>{a1d11294-05bf-4d77-b008-aecf1aa93c9f}</Project>
|
||||
<Name>VBNET</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.
|
||||
|
||||
@@ -89,11 +89,11 @@ namespace mpvConfEdit
|
||||
switch (mpvSetting)
|
||||
{
|
||||
case StringSetting s:
|
||||
if ((s.Value ?? "") != s.Default)
|
||||
if ((s.Value ?? "") != s.Default || mpvConf.ContainsKey(s.Name) || mpvConf.ContainsKey(s.Alias ?? ""))
|
||||
mpvConf[s.Name] = s.Value;
|
||||
break;
|
||||
case OptionSetting s:
|
||||
if ((s.Value ?? "") != s.Default)
|
||||
if ((s.Value ?? "") != s.Default || mpvConf.ContainsKey(s.Name) || mpvConf.ContainsKey(s.Alias ?? ""))
|
||||
mpvConf[s.Name] = s.Value;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -51,5 +51,5 @@ using System.Windows;
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.2.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.2.0.0")]
|
||||
[assembly: AssemblyVersion("1.3.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.3.0.0")]
|
||||
|
||||
Reference in New Issue
Block a user