Compare commits
49 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
660345d18a | ||
|
|
3844db6e79 | ||
|
|
5374e20757 | ||
|
|
bc6167c4ee | ||
|
|
7979f77284 | ||
|
|
71b90ed5cb | ||
|
|
9d2e236b3e | ||
|
|
d42657a3f0 | ||
|
|
e4818fae18 | ||
|
|
7b39bfcbc4 | ||
|
|
fd6f3c94dd | ||
|
|
dd10c07fb5 | ||
|
|
3bbfdcffdd | ||
|
|
6b7c4e1724 | ||
|
|
d3ad1091ec | ||
|
|
65177c448b | ||
|
|
1cdecb3810 | ||
|
|
20ea755a93 | ||
|
|
3b7bc95869 | ||
|
|
5380daad53 | ||
|
|
a5f4d848d4 | ||
|
|
cf0f9bfa01 | ||
|
|
68461e05da | ||
|
|
397b988851 | ||
|
|
eddb95e791 | ||
|
|
fa1183710b | ||
|
|
f468fd9c56 | ||
|
|
22f2aa93a8 | ||
|
|
c2c0a8f190 | ||
|
|
da3e6655c6 | ||
|
|
856959a4d1 | ||
|
|
9053ecb4ee | ||
|
|
33fd7fc09b | ||
|
|
d005f19755 | ||
|
|
1081007009 | ||
|
|
e6c0a67483 | ||
|
|
265e18985d | ||
|
|
8dc204e81a | ||
|
|
b9b604bfe3 | ||
|
|
05027cd458 | ||
|
|
9bbde49a5c | ||
|
|
cfca7786f3 | ||
|
|
be57edf2c5 | ||
|
|
f48901355a | ||
|
|
ca153fecfc | ||
|
|
e3227de8b4 | ||
|
|
4a202245b5 | ||
|
|
b94f9de582 | ||
|
|
7371949730 |
58
Changelog.md
58
Changelog.md
@@ -1,3 +1,57 @@
|
|||||||
|
|
||||||
|
### 5.4.4.0
|
||||||
|
|
||||||
|
- new: forecolors in the dark theme are slightly darker now
|
||||||
|
- new: readme/website and manual were improved
|
||||||
|
- new: source code includes now the release script to build the archives and setup files
|
||||||
|
- new: the history feature now uses the full path
|
||||||
|
- new: install via Scoop and Chocolatey added to readme/website (Restia666Ashdoll)
|
||||||
|
- new: update check, it must be enabled first in the conf editor under General
|
||||||
|
- new: update feature, requires PowerShell 5 and curl,
|
||||||
|
an up to date Windows 10 system has both included.
|
||||||
|
Main menu (input.conf) must be reset or updated manually ([defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
||||||
|
|
||||||
|
- update: libmpv shinchiro 2019-11-10
|
||||||
|
|
||||||
|
- fix: often the OSC was shown when fullscreen was entered
|
||||||
|
or on app startup, this is now suppressed
|
||||||
|
- fix: the file association routine uses no longer 'Play with mpv.net' for the
|
||||||
|
default open verb caption because it doesn't support multi selection,
|
||||||
|
it shows now only Open, the manual explains how to get multi selection
|
||||||
|
in File Explorer, read about it [here](https://github.com/stax76/mpv.net/blob/master/Manual.md#open-with)
|
||||||
|
- fix: x86 builds had an older version included because
|
||||||
|
of a misconfiguration in the solution file
|
||||||
|
|
||||||
|
### 5.4.3.0
|
||||||
|
|
||||||
|
- new: the color themes can now be customized ([manual](https://github.com/stax76/mpv.net/blob/master/Manual.md#color-theme))
|
||||||
|
- new: three new sections were added to the [manual](https://github.com/stax76/mpv.net/blob/master/Manual.md):
|
||||||
|
1. [Color Theme](https://github.com/stax76/mpv.net/blob/master/Manual.md#color-theme)
|
||||||
|
2. [Hidden and secret features](https://github.com/stax76/mpv.net/blob/master/Manual.md#hidden-and-secret-features)
|
||||||
|
3. [External Tools](https://github.com/stax76/mpv.net/blob/master/Manual.md#external-tools)
|
||||||
|
|
||||||
|
- fix: window restore from maximized and from minimized was broken
|
||||||
|
- fix: it's possible to multi select files in File Explorer and press
|
||||||
|
enter to open the files, this did however only work when the
|
||||||
|
auto load folder feature was disabled or the shift key was
|
||||||
|
pressed (blocks auto load folder). Now it should also work
|
||||||
|
without shift key and with auto load folder being enabled
|
||||||
|
|
||||||
|
- update: libmpv shinchiro 2019-10-27
|
||||||
|
- update: youtube-dl 2019-10-31
|
||||||
|
|
||||||
|
### 5.4.2.1 Beta
|
||||||
|
|
||||||
|
- pressing shift key suppresses auto-load-folder
|
||||||
|
- switch --queue added, this will not clear the playlist but append
|
||||||
|
and it will suppress auto-load-folder. To get a 'Add to mpv.net playlist'
|
||||||
|
context menu item in explorer with multi selection support use my
|
||||||
|
[Open with++](https://github.com/stax76/OpenWithPlusPlus#add-to-mpvnet-playlist) shell extension, as far as I know multi selection
|
||||||
|
can not be done using the Registry but only via shell extension
|
||||||
|
- window-size mpv property support added ([default bindings](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt#L137))
|
||||||
|
- the config editor keeps profiles and comments in mpv.conf intact!
|
||||||
|
- the options in the config editor are better organized
|
||||||
|
|
||||||
### 5.4.2
|
### 5.4.2
|
||||||
|
|
||||||
- new: the [scripting wiki page](https://github.com/stax76/mpv.net/wiki/Scripting#powershell) was improved
|
- new: the [scripting wiki page](https://github.com/stax76/mpv.net/wiki/Scripting#powershell) was improved
|
||||||
@@ -188,7 +242,7 @@
|
|||||||
- fix for middle mouse button not working
|
- fix for middle mouse button not working
|
||||||
- fix of logo overlay using a huge amount of memory (thx for the [ghacks article](https://www.ghacks.net/2019/07/05/a-look-at-mpv-net-a-mpv-frontend-with-everything-integration/))
|
- fix of logo overlay using a huge amount of memory (thx for the [ghacks article](https://www.ghacks.net/2019/07/05/a-look-at-mpv-net-a-mpv-frontend-with-everything-integration/))
|
||||||
- fix config dialog showing a message about app restart without reason
|
- fix config dialog showing a message about app restart without reason
|
||||||
- when multiple files are selected in Windows File Explorer and enter is
|
- when multiple files are selected in File Explorer and enter is
|
||||||
pressed, the files are opened as selected, the order is random though
|
pressed, the files are opened as selected, the order is random though
|
||||||
because Explorer starts multiple mpv.net processes concurrently
|
because Explorer starts multiple mpv.net processes concurrently
|
||||||
- libmpv was updated to shinchiro 2019-06-30
|
- libmpv was updated to shinchiro 2019-06-30
|
||||||
@@ -203,7 +257,7 @@
|
|||||||
|
|
||||||
- opening a URL manually no longer uses a input box but uses the clipboard directly
|
- opening a URL manually no longer uses a input box but uses the clipboard directly
|
||||||
- the manifest was missing the company attribute which caused
|
- the manifest was missing the company attribute which caused
|
||||||
mpv.net not appearing in the 'Open with' menu of the Windows File Explorer,
|
mpv.net not appearing in the 'Open with' menu of the File Explorer,
|
||||||
thanks to 44vince44 for pointing this out!!!
|
thanks to 44vince44 for pointing this out!!!
|
||||||
- new Python and C# script examples were added to the wiki and the scripting and
|
- new Python and C# script examples were added to the wiki and the scripting and
|
||||||
extension documentation was improved
|
extension documentation was improved
|
||||||
|
|||||||
31
LICENSE.txt
31
LICENSE.txt
@@ -1,21 +1,24 @@
|
|||||||
|
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2017-2019 Frank Skare (stax76)
|
Copyright (c) 2002-2017 Frank Skare (stax76)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person
|
||||||
a copy of this software and ssociated documentation files (the "Software"),
|
obtaining a copy of this software and ssociated documentation
|
||||||
to deal in the Software without restriction, including without limitation
|
files (the "Software"), to deal in the Software without restriction,
|
||||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
including without limitation the rights to use, copy, modify, merge,
|
||||||
and/or sell copies of the Software, and to permit persons to whom the
|
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||||
Software is furnished to do so, subject to the following conditions:
|
and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included
|
The above copyright notice and this permission notice shall be
|
||||||
in all copies or substantial portions of the Software.
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
||||||
|
THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|||||||
187
Manual.md
187
Manual.md
@@ -7,7 +7,15 @@
|
|||||||
* [Requirements](#requirements)
|
* [Requirements](#requirements)
|
||||||
* [Installation](#installation)
|
* [Installation](#installation)
|
||||||
+ [File Associations](#file-associations)
|
+ [File Associations](#file-associations)
|
||||||
+ [Chrome Extension](#chrome-extension)
|
* [External Tools](#external-tools)
|
||||||
|
+ [Play with mpv](#play-with-mpv)
|
||||||
|
+ [External Application Button](#external-application-button)
|
||||||
|
+ [Open with++](#open-with)
|
||||||
|
+ [MediaInfo.NET](#mediainfonet)
|
||||||
|
* [Command Line Interface](#command-line-interface)
|
||||||
|
* [Terminal](#terminal)
|
||||||
|
* [Color Theme](#color-theme)
|
||||||
|
* [Hidden and secret features](#hidden-and-secret-features)
|
||||||
* [Context Menu](#context-menu)
|
* [Context Menu](#context-menu)
|
||||||
+ [Open > Open Files](#open--open-files)
|
+ [Open > Open Files](#open--open-files)
|
||||||
+ [Open > Open URL](#open--open-url)
|
+ [Open > Open URL](#open--open-url)
|
||||||
@@ -79,57 +87,70 @@
|
|||||||
+ [Tools > Show History](#tools--show-history)
|
+ [Tools > Show History](#tools--show-history)
|
||||||
+ [Tools > Set/clear A-B loop points](#tools--set-clear-a-b-loop-points)
|
+ [Tools > Set/clear A-B loop points](#tools--set-clear-a-b-loop-points)
|
||||||
+ [Tools > Toggle infinite file looping](#tools--toggle-infinite-file-looping)
|
+ [Tools > Toggle infinite file looping](#tools--toggle-infinite-file-looping)
|
||||||
+ [Tools > Cycle Hardware Decoding](#tools--cycle-hardware-decoding)
|
+ [Tools > Toggle Hardware Decoding](#tools--toggle-hardware-decoding)
|
||||||
+ [Tools > Execute mpv command](#tools--execute-mpv-command)
|
+ [Tools > Show REPL](#tools--show-repl)
|
||||||
+ [Tools > Manage File Associations](#tools--manage-file-associations)
|
+ [Tools > OS Setup](#tools--os-setup)
|
||||||
+ [Help > Show mpv manual](#help--show-mpv-manual)
|
+ [Help > Show mpv manual](#help--show-mpv-manual)
|
||||||
+ [Help > Show mpv default keys](#help--show-mpv-default-keys)
|
|
||||||
+ [Help > Show mpv.net default keys](#help--show-mpvnet-default-keys)
|
|
||||||
+ [Help > Show mpv.net manual](#help--show-mpvnet-manual)
|
+ [Help > Show mpv.net manual](#help--show-mpvnet-manual)
|
||||||
|
+ [Help > Check for Updates](#help--check-for-updates)
|
||||||
+ [Help > About mpv.net](#help--about-mpvnet)
|
+ [Help > About mpv.net](#help--about-mpvnet)
|
||||||
+ [Exit](#exit)
|
+ [Exit](#exit)
|
||||||
+ [Exit Watch Later](#exit-watch-later)
|
+ [Exit Watch Later](#exit-watch-later)
|
||||||
* [Command Line Interface](#command-line-interface)
|
|
||||||
|
|
||||||
## About mpv.net
|
## About mpv.net
|
||||||
|
|
||||||
mpv.net is a modern media player for Windows. mpv is similar to VLC not based on DirectShow like MPC, mpv.net is based on libmpv which in return is based on ffmpeg.
|
mpv.net is a modern desktop media player for Windows. mpv is similar to VLC not based on DirectShow like MPC, mpv.net is based on libmpv which in return is based on ffmpeg.
|
||||||
|
|
||||||
libmpv provides the majority of the features of the mpv media player, a fork of mplayer. mpv focuses on the usage of the command line interface, mpv.net retains the ability to be used from the command line and adds a modern GUI on top of it.
|
libmpv provides the majority of the features of the mpv media player, a fork of mplayer. mpv focuses on the usage of the command line interface, mpv.net retains the ability to be used from the command line and adds a modern GUI on top of it.
|
||||||
|
|
||||||
mpv.net is meant to be a small single person project, it's designed to be mpv compatible, can use the same settings as mpv and offers almost all mpv features because they are all contained in libmpv, this means the official [mpv manual](https://mpv.io/manual/master/) fully applies to mpv.net.
|
mpv.net is designed to be mpv compatible, almost all mpv features are available because they are all contained in libmpv, this means the official [mpv manual](https://mpv.io/manual/master/) applies to mpv.net.
|
||||||
|
|
||||||
### Target Audience
|
### Target Audience
|
||||||
|
|
||||||
The target audience of mpv.net are programmers, nerds and software enthusiasts that need something more advanced than typical media players.
|
The target audience of mpv and mpv.net are programmers, nerds and software enthusiasts that need a desktop player that is more advanced than a normal desktop player. mpv.net is very similar to mpv so it's well suited to learn mpv.
|
||||||
|
|
||||||
Furthermore mpv.net is well suited for users who are interested to learn mpv, Linux, portable apps and the command line.
|
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
mpv.net is based on the .NET Framework and requires Windows 7 as minimum version of the Windows operating system. As of the writing of this manual the minimum required .NET Framework version is 4.7.2.
|
mpv.net requires minimum .NET Framework 4.8 and Windows 7. For optimal results a modern graphics card is recommended.
|
||||||
|
|
||||||
For optimal results a modern graphics card is recommended.
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
mpv.net is available as setup and as portable download in the 7zip and zip archive format, to unpack the portable download 7zip can be used, it is available at www.7-zip.org.
|
mpv.net is available as setup and as portable download in the 7zip and Zip archive format, to unpack the portable download 7zip can be used, it is available at www.7-zip.org.
|
||||||
|
|
||||||
If you are new to mpv.net the portable download is recommended, for regular mpv.net users the setup is typically more easy to use.
|
If you are new to mpv.net the portable download is recommended, for regular mpv.net users the setup is typically more easy to use.
|
||||||
|
|
||||||
The x64 editions require more memory and have the advantage of decoders being typically first and better optimized for x64.
|
The x64 editions require more memory and have the advantage of being typically first and better optimized for x64.
|
||||||
|
|
||||||
x86 should though still be well supported and work but it's not as well tested than x64.
|
x86 (32-bit) is not recommended but should still be well supported and work but it's not as well tested as x64.
|
||||||
|
|
||||||
|
Stable releases are compiled from the source and can be downloaded from the releases tab:
|
||||||
|
|
||||||
|
<https://github.com/stax76/mpv.net/releases>
|
||||||
|
|
||||||
|
Scoop can be used to install and update it:
|
||||||
|
|
||||||
|
```
|
||||||
|
scoop bucket add extras
|
||||||
|
scoop install mpv.net
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, Chocolatey can also be used:
|
||||||
|
|
||||||
|
`choco install mpvnet.install`
|
||||||
|
|
||||||
### File Associations
|
### File Associations
|
||||||
|
|
||||||
File Associations can be created using the setup or from within the apps context menu under 'Tools > Manage File Associations'.
|
File Associations can be created using the setup or with the context menu under 'Tools > OS Setup'.
|
||||||
|
|
||||||
Windows 10 prevents apps to register as the default app, to define the default video or audio player app in Windows 10 go to the Windows settings under 'Settings > Apps > Default apps' or shell execute 'ms-settings:defaultapps'.
|
After the file associations were registered go to the Windows settings under 'Settings > Apps > Default apps' or shell execute `ms-settings:defaultapps` and choose mpv.net as default app for Video and optionally for Audio and Images.
|
||||||
|
|
||||||
It's also possible to change the default application using the Open With feature of the context menu in Windows File Explorer.
|
It's also possible to change the default application using the 'Open with' feature of the context menu in File Explorer.
|
||||||
|
|
||||||
### Chrome Extension
|
[Open with++](#open-with) can be used to extend the File Explorer context menu to get menu items for 'Play with mpv.net' and 'Add to mpv.net playlist'.
|
||||||
|
|
||||||
|
## External Tools
|
||||||
|
|
||||||
|
### Play with mpv
|
||||||
|
|
||||||
In order to play videos from sites such as YouTube the Chrome Extension [Play with mpv](https://chrome.google.com/webstore/detail/play-with-mpv/hahklcmnfgffdlchjigehabfbiigleji) can be used.
|
In order to play videos from sites such as YouTube the Chrome Extension [Play with mpv](https://chrome.google.com/webstore/detail/play-with-mpv/hahklcmnfgffdlchjigehabfbiigleji) can be used.
|
||||||
|
|
||||||
@@ -137,17 +158,87 @@ Due to Chrome Extensions not being able to start a app, another app that communi
|
|||||||
|
|
||||||
`C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`
|
`C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`
|
||||||
|
|
||||||
This will start the app on system start and have it running in the background. When the file association registration of mpv.net was executed then the app should find the location of mpv.net, alternativly the mpv.net folder can be added to the PATH environment variable.
|
This will start the app on system start and have it running in the background. When the file association registration of mpv.net was executed then the app should find the location of mpv.net, alternativly the mpv.net folder can be added to the Path environment variable.
|
||||||
|
|
||||||
|
### External Application Button
|
||||||
|
|
||||||
|
Alternatively the Chrome extension [External Application Button](https://github.com/stax76/mpv.net/issues/106) can be used.
|
||||||
|
|
||||||
|
### Open with++
|
||||||
|
|
||||||
|
Open with++ allows to customize the File Explorer context menu to add menu items 'Play with mpv.net' and 'Add to mpv.net playlist'.
|
||||||
|
|
||||||
|
https://github.com/stax76/OpenWithPlusPlus
|
||||||
|
|
||||||
|
https://github.com/stax76/OpenWithPlusPlus#mpvnet
|
||||||
|
|
||||||
|
https://github.com/stax76/OpenWithPlusPlus#add-to-mpvnet-playlist
|
||||||
|
|
||||||
|
### MediaInfo.NET
|
||||||
|
|
||||||
|
MediaInfo.NET is a media info GUI.
|
||||||
|
|
||||||
|
https://github.com/stax76/MediaInfo.NET
|
||||||
|
|
||||||
|
To start a external application mpv has the run input command (it does not use the shell).
|
||||||
|
|
||||||
|
If the path has spaces then it must be enclosed in quotes and then double backslashes must be used for escaping or alternatively forward slashes.
|
||||||
|
|
||||||
|
`_ run D:\Software\MediaInfoNET.exe "${path}" #menu: Tools > Open file with MediaInfo.NET`
|
||||||
|
|
||||||
|
`_ run "D:\\Soft ware\\MediaInfoNET.exe" "${path}" #menu: Tools > Open file with MediaInfo.NET`
|
||||||
|
|
||||||
|
`_ run "D:/Soft ware/MediaInfoNET.exe" "${path}" #menu: Tools > Open file with MediaInfo.NET`
|
||||||
|
|
||||||
|
## Command Line Interface
|
||||||
|
|
||||||
|
mpvnet implements a command line interface to set mpv commands.
|
||||||
|
|
||||||
|
Supported are all mpv properties which are documented at:
|
||||||
|
|
||||||
|
<https://mpv.io/manual/master>
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
`mpvnet --mute=yes <file|URL>`
|
||||||
|
|
||||||
|
## Terminal
|
||||||
|
|
||||||
|
When mpv.net is started from a PowerShell terminal it will attach to the terminal and print status and debug messages.
|
||||||
|
|
||||||
|
Certain error and debug messages are only visible on the terminal, JavaScript and Lua scripts must be debugged with the terminal as there is no support for a debugger.
|
||||||
|
|
||||||
|
## Color Theme
|
||||||
|
|
||||||
|
mpv.net supports custom color themes, the definition of the built-in themes can be found at:
|
||||||
|
|
||||||
|
<https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/theme.txt>
|
||||||
|
|
||||||
|
Custom themes can be saved at:
|
||||||
|
|
||||||
|
`<conf folder>\theme.conf`
|
||||||
|
|
||||||
|
The theme.conf file may contain an unlimited amount of themes.
|
||||||
|
|
||||||
|
In the config editor under UI there are the settings dark-theme and light-theme to define the themes used in dark and in light mode.
|
||||||
|
|
||||||
|
## Hidden and secret features
|
||||||
|
|
||||||
|
Selecting multiple files in File Explorer and pressing enter will open the files in mpv.net. Explorer restricts this to maximum 15 files and the order will be random.
|
||||||
|
|
||||||
|
Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This works in all mpv.net features that open files or URLs.
|
||||||
|
|
||||||
|
Pressing the shift key while opening a single file will suppress loading all files in the folder.
|
||||||
|
|
||||||
## Context Menu
|
## Context Menu
|
||||||
|
|
||||||
The most important part of the user interface in mpv.net is the context menu, the menu can be customized as it is defined in the same file where the key bindings are defined.
|
The most important part of the user interface in mpv.net is the context menu, the menu can be customized as it's defined in the same file where the key and mouse bindings are defined (input.conf).
|
||||||
|
|
||||||
### Open > Open Files
|
### Open > Open Files
|
||||||
|
|
||||||
The Open Files menu entry is one way to open files in mpv.net, it supports multi selection.
|
The Open Files menu entry is one way to open files in mpv.net, it supports multi selection.
|
||||||
|
|
||||||
Another way to open files is the command line, it is used by the Windows File Explorer if file associations exist.
|
Another way to open files is the command line, it is used by the File Explorer if file associations exist.
|
||||||
|
|
||||||
When mpv.net is started from a terminal such as PowerShell, mpv.net attaches to the terminal and outputs status and debug messages.
|
When mpv.net is started from a terminal such as PowerShell, mpv.net attaches to the terminal and outputs status and debug messages.
|
||||||
|
|
||||||
@@ -155,6 +246,8 @@ A third way is to drag and drop files on the main window.
|
|||||||
|
|
||||||
Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This works in all mpv.net features that open files or URLs.
|
Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This works in all mpv.net features that open files or URLs.
|
||||||
|
|
||||||
|
Pressing the shift key while opening a single file will suppress loading all files in the folder.
|
||||||
|
|
||||||
### Open > Open URL
|
### Open > Open URL
|
||||||
|
|
||||||
The Open URL menu entry can be used to open URLs for example from YouTube.
|
The Open URL menu entry can be used to open URLs for example from YouTube.
|
||||||
@@ -727,13 +820,13 @@ mpv.conf file containing mpv settings
|
|||||||
|
|
||||||
mpvnet.conf file containing mpv.net settings
|
mpvnet.conf file containing mpv.net settings
|
||||||
|
|
||||||
input.conf containing mpv key bindings
|
input.conf containing mpv key and mouse bindings
|
||||||
|
|
||||||
User scripts and user extensions
|
User scripts and user extensions
|
||||||
|
|
||||||
### Tools > Command Palette
|
### Tools > Command Palette
|
||||||
|
|
||||||
Shows the command palette window which allows to find mpv.net commands, it shows the command's location in the context menu and the key shortcut.
|
Shows the command palette window which allows to quickly find and execute commands and key shortcuts.
|
||||||
|
|
||||||
### Tools > Show History
|
### Tools > Show History
|
||||||
|
|
||||||
@@ -757,7 +850,7 @@ cycle-values loop-file "inf" "no"
|
|||||||
|
|
||||||
[loop-file command](https://mpv.io/manual/master/#options-loop)
|
[loop-file command](https://mpv.io/manual/master/#options-loop)
|
||||||
|
|
||||||
### Tools > Cycle Hardware Decoding
|
### Tools > Toggle Hardware Decoding
|
||||||
|
|
||||||
Cycles the hwdec property to enable/disable hardware decoding using the following command:
|
Cycles the hwdec property to enable/disable hardware decoding using the following command:
|
||||||
|
|
||||||
@@ -767,11 +860,13 @@ Cycles the hwdec property to enable/disable hardware decoding using the followin
|
|||||||
|
|
||||||
[hwdec property](https://mpv.io/manual/master/#options-hwdec)
|
[hwdec property](https://mpv.io/manual/master/#options-hwdec)
|
||||||
|
|
||||||
### Tools > Execute mpv command
|
### Tools > Show REPL
|
||||||
|
|
||||||
Allows to execute mpv commands.
|
Shows a on screen REPL.
|
||||||
|
|
||||||
### Tools > Manage File Associations
|
https://github.com/rossy/mpv-repl
|
||||||
|
|
||||||
|
### Tools > OS Setup
|
||||||
|
|
||||||
Allows to manage file associations.
|
Allows to manage file associations.
|
||||||
|
|
||||||
@@ -779,25 +874,23 @@ Allows to manage file associations.
|
|||||||
|
|
||||||
Shows the [mpv manual](https://mpv.io/manual/stable/).
|
Shows the [mpv manual](https://mpv.io/manual/stable/).
|
||||||
|
|
||||||
### Help > Show mpv default keys
|
### Help > Show mpv.net web site
|
||||||
|
|
||||||
Shows the [mpv default keys](https://github.com/mpv-player/mpv/blob/master/etc/input.conf)
|
Shows the [mpv.net web site](https://mpv-net.github.io/mpv.net-web-site/).
|
||||||
|
|
||||||
### Help > Show mpv.net default keys
|
|
||||||
|
|
||||||
Shows the [mpv.net default keys](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt)
|
|
||||||
|
|
||||||
Help > Show mpv.net web site
|
|
||||||
|
|
||||||
Shows the [mpv.net web site](https://mpv-net.github.io/mpv.net-web-site/)
|
|
||||||
|
|
||||||
### Help > Show mpv.net manual
|
### Help > Show mpv.net manual
|
||||||
|
|
||||||
Shows the [mpv.net manual](https://github.com/stax76/mpv.net/blob/master/Manual.md)
|
Shows the [mpv.net manual](https://github.com/stax76/mpv.net/blob/master/Manual.md).
|
||||||
|
|
||||||
|
### Help > Check for Updates
|
||||||
|
|
||||||
|
Checks for updates and allows to execute the update routine.
|
||||||
|
|
||||||
|
The update routine requires PowerShell 5 and curl, an up to date Windows 10 system has both included.
|
||||||
|
|
||||||
### Help > About mpv.net
|
### Help > About mpv.net
|
||||||
|
|
||||||
Shows the mpv.net about dialog.
|
Shows the mpv.net about dialog which shows a copyright notice, the versions of mpv.net and libmpv and a license notice (MIT).
|
||||||
|
|
||||||
### Exit
|
### Exit
|
||||||
|
|
||||||
@@ -814,11 +907,3 @@ Exits mpv.net and remembers the position in the file using the following command
|
|||||||
`quit-watch-later`
|
`quit-watch-later`
|
||||||
|
|
||||||
[quit-watch-later command](https://mpv.io/manual/master/#command-interface-quit-watch-later)
|
[quit-watch-later command](https://mpv.io/manual/master/#command-interface-quit-watch-later)
|
||||||
|
|
||||||
## Command Line Interface
|
|
||||||
|
|
||||||
mpvnet implements a basic CLI to set mpv commands.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
mpvnet --mute=yes <file|URL>
|
|
||||||
47
README.md
47
README.md
@@ -6,9 +6,9 @@
|
|||||||
|
|
||||||
mpv.net is a modern media player for Windows that works just like [mpv](https://mpv.io).
|
mpv.net is a modern media player for Windows that works just like [mpv](https://mpv.io).
|
||||||
|
|
||||||
#### Based on libmpv
|
#### Graphical User Interface
|
||||||
|
|
||||||
mpv.net is based on libmpv which offers a straightforward C API that was designed from the ground up to make mpv usable as a library and facilitate easy integration into other applications. mpv is like vlc not based on DirectShow or Media Foundation.
|
Modern GUI that supports customizable color themes.
|
||||||
|
|
||||||
#### Command Line Interface
|
#### Command Line Interface
|
||||||
|
|
||||||
@@ -30,11 +30,16 @@ libmpv leverages the FFmpeg hwaccel APIs to support DXVA2 video decoding acceler
|
|||||||
|
|
||||||
mpv.net is under active development. Want a feature? Post a [patch](https://github.com/stax76/mpv.net/pulls) or [request it](https://github.com/stax76/mpv.net/issues)!
|
mpv.net is under active development. Want a feature? Post a [patch](https://github.com/stax76/mpv.net/pulls) or [request it](https://github.com/stax76/mpv.net/issues)!
|
||||||
|
|
||||||
|
#### Based on libmpv
|
||||||
|
|
||||||
|
mpv.net is based on libmpv which offers a straightforward C API that was designed from the ground up to make mpv usable as a library and facilitate easy integration into other applications. mpv is like vlc not based on DirectShow or Media Foundation.
|
||||||
|
|
||||||
Table of contents
|
Table of contents
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
- [Features](#features)
|
- [Features](#features)
|
||||||
- [Screenshots](#screenshots)
|
- [Screenshots](#screenshots)
|
||||||
|
- [Installation](#installation)
|
||||||
- [Manual](#manual)
|
- [Manual](#manual)
|
||||||
- [Context Menu](#context-menu)
|
- [Context Menu](#context-menu)
|
||||||
- [Settings](#settings)
|
- [Settings](#settings)
|
||||||
@@ -44,7 +49,6 @@ Table of contents
|
|||||||
- [Support](#support)
|
- [Support](#support)
|
||||||
- [Links](#links)
|
- [Links](#links)
|
||||||
- [Changelog](#changelog)
|
- [Changelog](#changelog)
|
||||||
- [Download](#download)
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
@@ -54,13 +58,13 @@ Table of contents
|
|||||||
- Customizable context menu defined in the same file as the key bindings ([Screenshot](#context-menu-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
- Customizable context menu defined in the same file as the key bindings ([Screenshot](#context-menu-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
||||||
- Searchable config dialog ([Screenshot](#config-editor-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt))
|
- Searchable config dialog ([Screenshot](#config-editor-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt))
|
||||||
- Searchable input (key/mouse) binding editor ([Screenshot](#input-editor-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
- Searchable input (key/mouse) binding editor ([Screenshot](#input-editor-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
||||||
- Configuration files that are easy to read and edit
|
- Configuration files that are easy to read and edit ([Manual](https://mpv.io/manual/master/#configuration-files))
|
||||||
- Searchable command palette to quickly launch commands and look for keys ([Screenshot](#command-palette-screenshot))
|
- Searchable command palette to quickly find commands and keys ([Screenshot](#command-palette-screenshot))
|
||||||
- Modern WPF based graphical user interface with dark mode ([Screenshot](#config-editor-screenshot))
|
- Modern graphical user interface with customizable color themes ([Screenshot](#config-editor-screenshot))
|
||||||
- Extension API for .NET languages
|
- [Extension API for .NET languages (C#, VB.NET and F#)](https://github.com/stax76/mpv.net/wiki/Extensions)
|
||||||
- Scripting API for Python, C#, Lua, JavaScript and PowerShell ([Wiki](https://github.com/stax76/mpv.net/wiki/Scripting))
|
- Scripting API for Python, C#, Lua, JavaScript and PowerShell ([Wiki](https://github.com/stax76/mpv.net/wiki/Scripting))
|
||||||
- Language agnostic JSON IPC to control the player with a external programs
|
- Language agnostic JSON IPC to control the player with a external programs
|
||||||
- On Screen Controler (OSC, play control buttons)
|
- On Screen Controler (OSC, play control buttons) ([Screenshot](#main-window-screenshot))
|
||||||
- [Command Line Interface](https://mpv.io/manual/master/#options)
|
- [Command Line Interface](https://mpv.io/manual/master/#options)
|
||||||
- If started from a PowerShell terminal mpv.net will attach to the terminal and print status and debug output ([Screenshot](#terminal-and-repl-screenshot))
|
- If started from a PowerShell terminal mpv.net will attach to the terminal and print status and debug output ([Screenshot](#terminal-and-repl-screenshot))
|
||||||
- [OSD REPL](https://github.com/rossy/mpv-repl)
|
- [OSD REPL](https://github.com/rossy/mpv-repl)
|
||||||
@@ -81,6 +85,8 @@ Table of contents
|
|||||||
- File history feature to log time and filename
|
- File history feature to log time and filename
|
||||||
- A-B loop feature
|
- A-B loop feature
|
||||||
- Watch later feature to save the position
|
- Watch later feature to save the position
|
||||||
|
- Files can be enqueued from File Explorer ([Manual](Manual.md#open-with))
|
||||||
|
- Update check and update routine ([Manual](Manual.md#help--check-for-updates))
|
||||||
- [Manual](#manual)
|
- [Manual](#manual)
|
||||||
|
|
||||||
### Screenshots
|
### Screenshots
|
||||||
@@ -126,6 +132,25 @@ Media search feature powered by [Everything](https://www.voidtools.com) to find
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
mpv.net requires minimum .NET Framework 4.8 and Windows 7. For optimal results a modern graphics card is recommended.
|
||||||
|
|
||||||
|
Stable releases are compiled from the source and can be downloaded from the releases tab:
|
||||||
|
|
||||||
|
<https://github.com/stax76/mpv.net/releases>
|
||||||
|
|
||||||
|
Scoop can be used to install and update it:
|
||||||
|
|
||||||
|
```
|
||||||
|
scoop bucket add extras
|
||||||
|
scoop install mpv.net
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, Chocolatey can also be used:
|
||||||
|
|
||||||
|
`choco install mpvnet.install`
|
||||||
|
|
||||||
### Manual
|
### Manual
|
||||||
|
|
||||||
[Manual](Manual.md)
|
[Manual](Manual.md)
|
||||||
@@ -200,7 +225,7 @@ this decision was made to keep the code simple and lightweight.
|
|||||||
|
|
||||||
Python scripting is implemented with IronPython which uses Python 2.7.
|
Python scripting is implemented with IronPython which uses Python 2.7.
|
||||||
|
|
||||||
The main window is WinForms based and uses less than 600 lines of code,
|
The main window is WinForms based and uses less than 750 lines of code,
|
||||||
all other windows are WPF based and use even less code.
|
all other windows are WPF based and use even less code.
|
||||||
|
|
||||||
The config editor adds it's controls dynamically and uses [TOML](https://en.wikipedia.org/wiki/TOML) to define it's
|
The config editor adds it's controls dynamically and uses [TOML](https://en.wikipedia.org/wiki/TOML) to define it's
|
||||||
@@ -256,7 +281,3 @@ If you want to support the development of mpv.net or express your appreciation y
|
|||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
[Changelog](Changelog.md)
|
[Changelog](Changelog.md)
|
||||||
|
|
||||||
### Download
|
|
||||||
|
|
||||||
<https://github.com/stax76/mpv.net/releases>
|
|
||||||
|
|||||||
66
Release.ps1
Normal file
66
Release.ps1
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
$desktopDir = [Environment]::GetFolderPath('Desktop')
|
||||||
|
$exePath = (Get-Location).Path + '\mpv.net\bin\x64\mpvnet.exe'
|
||||||
|
$version = [Reflection.Assembly]::LoadFile($exePath).GetName().Version
|
||||||
|
$msbuild = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe'
|
||||||
|
$iscc = 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe'
|
||||||
|
$7z = 'C:\Program Files\7-Zip\7z.exe'
|
||||||
|
|
||||||
|
if ($version.Revision -ne 0)
|
||||||
|
{
|
||||||
|
& $msbuild mpv.net.sln /p:Configuration=Debug /p:Platform=x64
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
$targetDir = "$desktopDir\mpv.net-portable-x64-$version-beta"
|
||||||
|
Copy-Item .\mpv.net\bin\x64 $targetDir -Recurse -Exclude System.Management.Automation.xml
|
||||||
|
& $7z a -t7z -mx9 "$targetDir.7z" -r "$targetDir\*"
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
$targetDirectories = 'C:\Users\frank\OneDrive\StaxRip\TestBuilds\',
|
||||||
|
'C:\Users\frank\Dropbox\public\StaxRip\Builds\'
|
||||||
|
|
||||||
|
foreach ($dir in $targetDirectories)
|
||||||
|
{
|
||||||
|
if (Test-Path $dir)
|
||||||
|
{
|
||||||
|
Copy-Item ($targetDir + '.7z') ($dir + (Split-Path $targetDir -Leaf) + '.7z')
|
||||||
|
Invoke-Item $dir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
& $msbuild mpv.net.sln /p:Configuration=Debug /p:Platform=x64
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
& $msbuild mpv.net.sln /p:Configuration=Debug /p:Platform=x86
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
& $iscc /Darch=x64 setup.iss
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
& $iscc /Darch=x86 setup.iss
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
$targetDir = $desktopDir + "\mpv.net-portable-x64-$version"
|
||||||
|
Copy-Item .\mpv.net\bin\x64 $targetDir -Recurse -Exclude System.Management.Automation.xml
|
||||||
|
|
||||||
|
& $7z a -t7z -mx9 "$targetDir.7z" -r "$targetDir\*"
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
& $7z a -tzip -mx9 "$targetDir.zip" -r "$targetDir\*"
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
$targetDir = $desktopDir + "\mpv.net-portable-x86-$version"
|
||||||
|
Copy-Item .\mpv.net\bin\x86 $targetDir -Recurse -Exclude System.Management.Automation.xml
|
||||||
|
|
||||||
|
& $7z a -t7z -mx9 "$targetDir.7z" -r "$targetDir\*"
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
& $7z a -tzip -mx9 "$targetDir.zip" -r "$targetDir\*"
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host 'successfully finished' -ForegroundColor Green
|
||||||
@@ -11,40 +11,32 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptingExtension", "exten
|
|||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
Debug|x86 = Debug|x86
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
Release|x64 = Release|x64
|
Release|x64 = Release|x64
|
||||||
Release|x86 = Release|x86
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|Any CPU.ActiveCfg = Debug|x86
|
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x64.ActiveCfg = Debug|x64
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x64.Build.0 = Debug|x64
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x64.Build.0 = Debug|x64
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x86.ActiveCfg = Debug|x86
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x86.Build.0 = Debug|x86
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x86.Build.0 = Debug|x86
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|Any CPU.ActiveCfg = Release|x86
|
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x64.ActiveCfg = Release|x64
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x64.ActiveCfg = Release|x64
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x64.Build.0 = Release|x64
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x64.Build.0 = Release|x64
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.ActiveCfg = Release|x86
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.ActiveCfg = Release|x86
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.Build.0 = Release|x86
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.Build.0 = Release|x86
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|Any CPU.ActiveCfg = Debug|x86
|
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x64.ActiveCfg = Debug|x64
|
{55C88710-539D-4402-84C8-31694841C731}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x64.Build.0 = Debug|x64
|
{55C88710-539D-4402-84C8-31694841C731}.Debug|x64.Build.0 = Debug|x64
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.ActiveCfg = Debug|x86
|
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.Build.0 = Debug|x86
|
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.Build.0 = Debug|x86
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.ActiveCfg = Release|x86
|
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.ActiveCfg = Release|x64
|
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.ActiveCfg = Release|x64
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.Build.0 = Release|x64
|
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.Build.0 = Release|x64
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.ActiveCfg = Release|x86
|
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.ActiveCfg = Release|x86
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.Build.0 = Release|x86
|
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.Build.0 = Release|x86
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|Any CPU.ActiveCfg = Debug|x86
|
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x64.ActiveCfg = Debug|x64
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x64.Build.0 = Debug|x64
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x64.Build.0 = Debug|x64
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x86.ActiveCfg = Debug|x86
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x86.Build.0 = Debug|x86
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x86.Build.0 = Debug|x86
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|Any CPU.ActiveCfg = Release|x86
|
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x64.ActiveCfg = Release|x64
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x64.ActiveCfg = Release|x64
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x64.Build.0 = Release|x64
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x64.Build.0 = Release|x64
|
||||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x86.ActiveCfg = Release|x86
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
<UserControl x:Class="Controls.SearchTextBoxUserControl"
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
mc:Ignorable="d"
|
|
||||||
d:DesignHeight="450" d:DesignWidth="800">
|
|
||||||
<Grid x:Name="SearchTextBoxUserControl1" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
|
|
||||||
<TextBlock x:Name="HintTextBlock" Margin="5,2" Text="Find a setting" Foreground="LightSteelBlue" VerticalAlignment="Center" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
|
|
||||||
<TextBox Name="SearchTextBox" Height="25" Padding="1,2,0,0" BorderThickness="2" Background="Transparent" TextChanged="SearchTextBox_TextChanged" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" CaretBrush="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
|
|
||||||
<Button x:Name="SearchClearButton" Background="Transparent" HorizontalAlignment="Right" Margin="2,0,4,0" FontSize="10" Width="17" Height="17" Visibility="Hidden" Click="SearchClearButton_Click" FontFamily="Marlett" Foreground="{Binding Path=Foreground2, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">r</Button>
|
|
||||||
</Grid>
|
|
||||||
</UserControl>
|
|
||||||
@@ -15,8 +15,10 @@ namespace DynamicGUI
|
|||||||
public static List<SettingBase> LoadSettings(string content)
|
public static List<SettingBase> LoadSettings(string content)
|
||||||
{
|
{
|
||||||
TomlTable table;
|
TomlTable table;
|
||||||
|
|
||||||
using (StringReader reader = new StringReader(content))
|
using (StringReader reader = new StringReader(content))
|
||||||
table = TOML.Parse(reader);
|
table = TOML.Parse(reader);
|
||||||
|
|
||||||
List<SettingBase> settingsList = new List<SettingBase>();
|
List<SettingBase> settingsList = new List<SettingBase>();
|
||||||
|
|
||||||
foreach (TomlTable setting in table["settings"])
|
foreach (TomlTable setting in table["settings"])
|
||||||
@@ -34,12 +36,15 @@ namespace DynamicGUI
|
|||||||
{
|
{
|
||||||
var opt = new OptionSettingOption();
|
var opt = new OptionSettingOption();
|
||||||
opt.Name = option["name"];
|
opt.Name = option["name"];
|
||||||
|
|
||||||
if (option.HasKey("help"))
|
if (option.HasKey("help"))
|
||||||
opt.Help = option["help"];
|
opt.Help = option["help"];
|
||||||
|
|
||||||
if (option.HasKey("text"))
|
if (option.HasKey("text"))
|
||||||
opt.Text = option["text"];
|
opt.Text = option["text"];
|
||||||
else if (opt.Name == optionSetting.Default)
|
else if (opt.Name == optionSetting.Default)
|
||||||
opt.Text = opt.Name + " (Default)";
|
opt.Text = opt.Name + " (Default)";
|
||||||
|
|
||||||
opt.OptionSetting = optionSetting;
|
opt.OptionSetting = optionSetting;
|
||||||
optionSetting.Options.Add(opt);
|
optionSetting.Options.Add(opt);
|
||||||
}
|
}
|
||||||
@@ -52,6 +57,7 @@ namespace DynamicGUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
baseSetting.Name = setting["name"];
|
baseSetting.Name = setting["name"];
|
||||||
|
baseSetting.File = setting["file"];
|
||||||
baseSetting.Filter = setting["filter"];
|
baseSetting.Filter = setting["filter"];
|
||||||
|
|
||||||
if (setting.HasKey("help")) baseSetting.Help = setting["help"];
|
if (setting.HasKey("help")) baseSetting.Help = setting["help"];
|
||||||
@@ -65,9 +71,22 @@ namespace DynamicGUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ConfItem
|
||||||
|
{
|
||||||
|
public string Name { get; set; } = "";
|
||||||
|
public string Value { get; set; } = "";
|
||||||
|
public string Comment { get; set; } = "";
|
||||||
|
public string LineComment { get; set; } = "";
|
||||||
|
public string Section { get; set; } = "";
|
||||||
|
public string File { get; set; } = "";
|
||||||
|
public bool IsSectionItem { get; set; }
|
||||||
|
public SettingBase SettingBase { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public abstract class SettingBase
|
public abstract class SettingBase
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
public string File { get; set; }
|
||||||
public string Value { get; set; }
|
public string Value { get; set; }
|
||||||
public string Help { get; set; }
|
public string Help { get; set; }
|
||||||
public string Default { get; set; }
|
public string Default { get; set; }
|
||||||
@@ -75,6 +94,7 @@ namespace DynamicGUI
|
|||||||
public string Filter { get; set; }
|
public string Filter { get; set; }
|
||||||
public string Type { get; set; }
|
public string Type { get; set; }
|
||||||
public int Width { get; set; }
|
public int Width { get; set; }
|
||||||
|
public ConfItem ConfItem { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StringSetting : SettingBase
|
public class StringSetting : SettingBase
|
||||||
@@ -104,7 +124,10 @@ namespace DynamicGUI
|
|||||||
public bool Checked
|
public bool Checked
|
||||||
{
|
{
|
||||||
get => OptionSetting.Value == Name ;
|
get => OptionSetting.Value == Name ;
|
||||||
set { if (value) OptionSetting.Value = Name; }
|
set {
|
||||||
|
if (value)
|
||||||
|
OptionSetting.Value = Name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Visibility Visibility
|
public Visibility Visibility
|
||||||
|
|||||||
@@ -4,22 +4,58 @@
|
|||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:local="clr-namespace:DynamicGUI"
|
xmlns:local="clr-namespace:DynamicGUI"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
d:DesignHeight="450" d:DesignWidth="800">
|
|
||||||
|
d:DesignHeight="450"
|
||||||
|
d:DesignWidth="800">
|
||||||
|
|
||||||
<Grid Margin="20,0">
|
<Grid Margin="20,0">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBox x:Name="TitleTextBox" FontSize="24" Margin="0,10" BorderThickness="0" IsReadOnly="True" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
<TextBox x:Name="TitleTextBox"
|
||||||
|
FontSize="24"
|
||||||
|
Margin="0,10"
|
||||||
|
BorderThickness="0"
|
||||||
|
IsReadOnly="True"
|
||||||
|
Foreground="{x:Static UI:Theme.Heading}"
|
||||||
|
Background="{x:Static UI:Theme.Background}" />
|
||||||
|
|
||||||
<ItemsControl x:Name="ItemsControl">
|
<ItemsControl x:Name="ItemsControl">
|
||||||
<ItemsControl.ItemTemplate>
|
<ItemsControl.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<WrapPanel Orientation="Vertical">
|
<WrapPanel Orientation="Vertical">
|
||||||
<RadioButton x:Name="RadioButton" VerticalContentAlignment="Center" IsChecked="{Binding Checked}" GroupName="{Binding OptionSetting.Name}" Content="{Binding Text}" FontSize="16" FontWeight="Normal" VerticalAlignment="Top" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></RadioButton>
|
<RadioButton x:Name="RadioButton"
|
||||||
<TextBox x:Name="ItemHelpTextBox" TextWrapping="WrapWithOverflow" Text="{Binding Help}" Visibility="{Binding Visibility}" Margin="10,0,0,0" BorderThickness="0" IsReadOnly="True" Padding="7,0,0,0" MinHeight="0" Foreground="{Binding Path=Foreground2, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
VerticalContentAlignment="Center"
|
||||||
|
IsChecked="{Binding Checked}"
|
||||||
|
GroupName="{Binding OptionSetting.Name}"
|
||||||
|
Content="{Binding Text}"
|
||||||
|
FontSize="16"
|
||||||
|
FontWeight="Normal"
|
||||||
|
VerticalAlignment="Top"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"/>
|
||||||
|
|
||||||
|
<TextBox x:Name="ItemHelpTextBox"
|
||||||
|
TextWrapping="WrapWithOverflow"
|
||||||
|
Text="{Binding Help}"
|
||||||
|
Visibility="{Binding Visibility}"
|
||||||
|
Margin="10,0,0,0" BorderThickness="0"
|
||||||
|
IsReadOnly="True" Padding="7,0,0,0"
|
||||||
|
MinHeight="0"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground2}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"/>
|
||||||
|
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ItemsControl.ItemTemplate>
|
</ItemsControl.ItemTemplate>
|
||||||
</ItemsControl>
|
</ItemsControl>
|
||||||
<TextBox x:Name="HelpTextBox" TextWrapping="WrapWithOverflow" BorderThickness="0" IsReadOnly="True" Margin="0,10,0,0" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"></TextBox>
|
|
||||||
|
<TextBox x:Name="HelpTextBox"
|
||||||
|
TextWrapping="WrapWithOverflow"
|
||||||
|
BorderThickness="0"
|
||||||
|
IsReadOnly="True"
|
||||||
|
Margin="0,10,0,0"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"/>
|
||||||
<TextBlock x:Name="LinkTextBlock" Margin="0,10">
|
<TextBlock x:Name="LinkTextBlock" Margin="0,10">
|
||||||
<local:HyperlinkEx x:Name="Link"></local:HyperlinkEx>
|
<local:HyperlinkEx x:Name="Link"></local:HyperlinkEx>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
|||||||
@@ -4,21 +4,52 @@
|
|||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:local="clr-namespace:DynamicGUI"
|
xmlns:local="clr-namespace:DynamicGUI"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
d:DesignHeight="450"
|
d:DesignHeight="450"
|
||||||
d:DesignWidth="800">
|
d:DesignWidth="800">
|
||||||
|
|
||||||
<Grid Margin="20,0">
|
<Grid Margin="20,0">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBox x:Name="TitleTextBox" FontSize="24" Margin="0,10" BorderThickness="0" IsReadOnly="True" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
<TextBox x:Name="TitleTextBox"
|
||||||
|
FontSize="24"
|
||||||
|
Margin="0,10"
|
||||||
|
BorderThickness="0"
|
||||||
|
IsReadOnly="True"
|
||||||
|
Foreground="{x:Static UI:Theme.Heading}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"/>
|
||||||
|
|
||||||
<Grid Margin="0,0,0,10">
|
<Grid Margin="0,0,0,10">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<TextBox x:Name="ValueTextBox" Text="{Binding Path=Text, ElementName=StringSettingControl1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="150" HorizontalAlignment="Left" Height="20" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" CaretBrush="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" TextChanged="ValueTextBox_TextChanged"/>
|
<TextBox x:Name="ValueTextBox"
|
||||||
<Button x:Name="Button" Height="20" Grid.Column="1" Visibility="{Binding Path=Text, ElementName=StringSettingControl1}" Margin="5,0,0,0" Width="20" Click="Button_Click">...</Button>
|
Text="{Binding Path=Text, ElementName=StringSettingControl1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||||
|
Width="150"
|
||||||
|
Height="20"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
CaretBrush="{x:Static UI:Theme.Foreground}"
|
||||||
|
TextChanged="ValueTextBox_TextChanged"/>
|
||||||
|
|
||||||
|
<Button x:Name="Button"
|
||||||
|
Height="20"
|
||||||
|
Grid.Column="1"
|
||||||
|
Visibility="{Binding Path=Text, ElementName=StringSettingControl1}"
|
||||||
|
Margin="5,0,0,0"
|
||||||
|
Width="20"
|
||||||
|
Click="Button_Click">...</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
<TextBox x:Name="HelpTextBox" TextWrapping="WrapWithOverflow" BorderThickness="0" IsReadOnly="True" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
|
||||||
|
<TextBox x:Name="HelpTextBox"
|
||||||
|
TextWrapping="WrapWithOverflow"
|
||||||
|
BorderThickness="0"
|
||||||
|
IsReadOnly="True"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"/>
|
||||||
|
|
||||||
<TextBlock x:Name="LinkTextBlock" Margin="0,10">
|
<TextBlock x:Name="LinkTextBlock" Margin="0,10">
|
||||||
<local:HyperlinkEx x:Name="Link"></local:HyperlinkEx>
|
<local:HyperlinkEx x:Name="Link"></local:HyperlinkEx>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
|||||||
@@ -61,18 +61,20 @@ namespace DynamicGUI
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "color":
|
case "color":
|
||||||
using (var d = new WinForms.ColorDialog())
|
using (var dialog = new WinForms.ColorDialog())
|
||||||
{
|
{
|
||||||
d.FullOpen = true;
|
dialog.FullOpen = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!string.IsNullOrEmpty(ValueTextBox.Text))
|
if (!string.IsNullOrEmpty(ValueTextBox.Text))
|
||||||
{
|
{
|
||||||
Color col = GetColor(ValueTextBox.Text);
|
Color col = GetColor(ValueTextBox.Text);
|
||||||
d.Color = System.Drawing.Color.FromArgb(col.A, col.R, col.G, col.B);
|
dialog.Color = System.Drawing.Color.FromArgb(col.A, col.R, col.G, col.B);
|
||||||
}
|
}
|
||||||
} catch {}
|
} catch {}
|
||||||
if (d.ShowDialog() == WinForms.DialogResult.OK)
|
|
||||||
ValueTextBox.Text = "#" + d.Color.ToArgb().ToString("X8");
|
if (dialog.ShowDialog() == WinForms.DialogResult.OK)
|
||||||
|
ValueTextBox.Text = "#" + dialog.Color.ToArgb().ToString("X8");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using UI;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -15,10 +16,10 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static string RegPath { get; } = @"HKCU\Software\" + Application.ProductName;
|
public static string RegPath { get; } = @"HKCU\Software\" + Application.ProductName;
|
||||||
public static string ConfPath { get => mp.ConfigFolder + "mpvnet.conf"; }
|
public static string ConfPath { get => mp.ConfigFolder + "mpvnet.conf"; }
|
||||||
public static string DarkMode { get; set; } = "always";
|
|
||||||
public static string ProcessInstance { get; set; } = "single";
|
public static string ProcessInstance { get; set; } = "single";
|
||||||
public static string DarkColor { get; set; }
|
public static string DarkMode { get; set; } = "always";
|
||||||
public static string LightColor { get; set; }
|
public static string DarkTheme { get; set; } = "dark";
|
||||||
|
public static string LightTheme { get; set; } = "light";
|
||||||
|
|
||||||
public static bool RememberHeight { get; set; } = true;
|
public static bool RememberHeight { get; set; } = true;
|
||||||
public static bool RememberPosition { get; set; }
|
public static bool RememberPosition { get; set; }
|
||||||
@@ -27,7 +28,8 @@ namespace mpvnet
|
|||||||
public static bool IsStartedFromTerminal { get; } = Environment.GetEnvironmentVariable("_started_from_console") == "yes";
|
public static bool IsStartedFromTerminal { get; } = Environment.GetEnvironmentVariable("_started_from_console") == "yes";
|
||||||
public static bool RememberVolume { get; set; } = true;
|
public static bool RememberVolume { get; set; } = true;
|
||||||
public static bool AutoLoadFolder { get; set; } = true;
|
public static bool AutoLoadFolder { get; set; } = true;
|
||||||
public static bool ThemedMenu { get; set; }
|
public static bool Queue { get; set; }
|
||||||
|
public static bool UpdateCheck { get; set; }
|
||||||
|
|
||||||
public static int StartThreshold { get; set; } = 1500;
|
public static int StartThreshold { get; set; } = 1500;
|
||||||
public static int RecentCount { get; set; } = 15;
|
public static int RecentCount { get; set; } = 15;
|
||||||
@@ -46,17 +48,22 @@ namespace mpvnet
|
|||||||
var dummy2 = mp.Conf;
|
var dummy2 = mp.Conf;
|
||||||
|
|
||||||
foreach (var i in Conf)
|
foreach (var i in Conf)
|
||||||
ProcessProperty(i.Key, i.Value);
|
ProcessProperty(i.Key, i.Value, true);
|
||||||
|
|
||||||
if (App.DebugMode)
|
if (App.DebugMode)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string filePath = mp.ConfigFolder + "mpvnet-debug.log";
|
string filePath = mp.ConfigFolder + "mpvnet-debug.log";
|
||||||
if (File.Exists(filePath)) File.Delete(filePath);
|
|
||||||
|
if (File.Exists(filePath))
|
||||||
|
File.Delete(filePath);
|
||||||
|
|
||||||
Trace.Listeners.Add(new TextWriterTraceListener(filePath));
|
Trace.Listeners.Add(new TextWriterTraceListener(filePath));
|
||||||
Trace.AutoFlush = true;
|
Trace.AutoFlush = true;
|
||||||
//if (App.DebugMode) Trace.WriteLine("");
|
|
||||||
|
//if (App.DebugMode)
|
||||||
|
// Trace.WriteLine("");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -64,6 +71,16 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string themeContent = null;
|
||||||
|
|
||||||
|
if (File.Exists(mp.ConfigFolder + "theme.conf"))
|
||||||
|
themeContent = File.ReadAllText(mp.ConfigFolder + "theme.conf");
|
||||||
|
|
||||||
|
Theme.Init(
|
||||||
|
themeContent,
|
||||||
|
Properties.Resources.theme,
|
||||||
|
IsDarkMode ? DarkTheme : LightTheme);
|
||||||
|
|
||||||
mp.Shutdown += Shutdown;
|
mp.Shutdown += Shutdown;
|
||||||
mp.Initialized += Initialized;
|
mp.Initialized += Initialized;
|
||||||
}
|
}
|
||||||
@@ -72,8 +89,8 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (RememberVolume)
|
if (RememberVolume)
|
||||||
{
|
{
|
||||||
mp.set_property_int("volume", RegHelp.GetInt(App.RegPath, "Volume", 70));
|
mp.set_property_int("volume", RegistryHelp.GetInt(App.RegPath, "Volume", 70));
|
||||||
mp.set_property_string("mute", RegHelp.GetString(App.RegPath, "Mute", "no"));
|
mp.set_property_string("mute", RegistryHelp.GetString(App.RegPath, "Mute", "no"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,8 +98,8 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (RememberVolume)
|
if (RememberVolume)
|
||||||
{
|
{
|
||||||
RegHelp.SetObject(App.RegPath, "Volume", mp.get_property_int("volume"));
|
RegistryHelp.SetValue(App.RegPath, "Volume", mp.get_property_int("volume"));
|
||||||
RegHelp.SetObject(App.RegPath, "Mute", mp.get_property_string("mute"));
|
RegistryHelp.SetValue(App.RegPath, "Mute", mp.get_property_string("mute"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,26 +120,30 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ProcessProperty(string name, string value)
|
public static bool ProcessProperty(string name, string value, bool writeError = false)
|
||||||
{
|
{
|
||||||
switch (name)
|
switch (name)
|
||||||
{
|
{
|
||||||
case "remember-position": RememberPosition = value == "yes"; return true;
|
case "remember-position": RememberPosition = value == "yes"; return true;
|
||||||
case "maximized": Maximized = value == "yes"; return true;
|
case "maximized": Maximized = value == "yes"; return true;
|
||||||
|
case "debug-mode": DebugMode = value == "yes"; return true;
|
||||||
|
case "remember-volume": RememberVolume = value == "yes"; return true;
|
||||||
|
case "queue": Queue = value == "yes"; return true;
|
||||||
|
case "auto-load-folder": AutoLoadFolder = value == "yes"; return true;
|
||||||
|
case "update-check": UpdateCheck = value == "yes"; return true;
|
||||||
case "start-size": RememberHeight = value == "previous"; return true;
|
case "start-size": RememberHeight = value == "previous"; return true;
|
||||||
case "process-instance": ProcessInstance = value; return true;
|
case "process-instance": ProcessInstance = value; return true;
|
||||||
case "dark-mode": DarkMode = value; return true;
|
case "dark-mode": DarkMode = value; return true;
|
||||||
case "debug-mode": DebugMode = value == "yes"; return true;
|
|
||||||
case "dark-color": DarkColor = value.Trim('\'', '"'); return true;
|
|
||||||
case "light-color": LightColor = value.Trim('\'', '"'); return true;
|
|
||||||
case "remember-volume": RememberVolume = value == "yes"; return true;
|
|
||||||
case "start-threshold": StartThreshold = value.Int(); return true;
|
case "start-threshold": StartThreshold = value.Int(); return true;
|
||||||
case "minimum-aspect-ratio": MinimumAspectRatio = value.Float(); return true;
|
|
||||||
case "auto-load-folder": AutoLoadFolder = value == "yes"; return true;
|
|
||||||
case "themed-menu": ThemedMenu = value == "yes"; return true;
|
|
||||||
case "recent-count": RecentCount = value.Int(); return true;
|
case "recent-count": RecentCount = value.Int(); return true;
|
||||||
|
case "minimum-aspect-ratio": MinimumAspectRatio = value.Float(); return true;
|
||||||
|
case "dark-theme": DarkTheme = value.Trim('\'', '"'); return true;
|
||||||
|
case "light-theme": LightTheme = value.Trim('\'', '"'); return true;
|
||||||
|
default:
|
||||||
|
if (writeError)
|
||||||
|
ConsoleHelp.WriteError($"unknown mpvnet.conf property: {name}");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -17,6 +18,7 @@ namespace mpvnet
|
|||||||
switch (id)
|
switch (id)
|
||||||
{
|
{
|
||||||
case "open-files": OpenFiles(args); break;
|
case "open-files": OpenFiles(args); break;
|
||||||
|
case "update-check": UpdateCheck.CheckOnline(true); break;
|
||||||
case "open-url": OpenURL(); break;
|
case "open-url": OpenURL(); break;
|
||||||
case "open-optical-media": Open_DVD_Or_BD_Folder(); break;
|
case "open-optical-media": Open_DVD_Or_BD_Folder(); break;
|
||||||
case "manage-file-associations": // deprecated 2019
|
case "manage-file-associations": // deprecated 2019
|
||||||
@@ -201,9 +203,9 @@ namespace mpvnet
|
|||||||
public static void ExecuteMpvCommand() // deprecated 2019
|
public static void ExecuteMpvCommand() // deprecated 2019
|
||||||
{
|
{
|
||||||
InvokeOnMainThread(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
string command = VB.Interaction.InputBox("Enter a mpv command to be executed.", "Execute Command", RegHelp.GetString(App.RegPath, "RecentExecutedCommand"));
|
string command = VB.Interaction.InputBox("Enter a mpv command to be executed.", "Execute Command", RegistryHelp.GetString(App.RegPath, "RecentExecutedCommand"));
|
||||||
if (string.IsNullOrEmpty(command)) return;
|
if (string.IsNullOrEmpty(command)) return;
|
||||||
RegHelp.SetObject(App.RegPath, "RecentExecutedCommand", command);
|
RegistryHelp.SetValue(App.RegPath, "RecentExecutedCommand", command);
|
||||||
mp.command(command, false);
|
mp.command(command, false);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|||||||
14
mpv.net/Misc/Help.cs
Normal file
14
mpv.net/Misc/Help.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
class ConsoleHelp
|
||||||
|
{
|
||||||
|
public static void WriteError(object obj)
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine(obj);
|
||||||
|
Console.ResetColor();
|
||||||
|
Trace.WriteLine(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
@@ -20,24 +21,13 @@ namespace mpvnet
|
|||||||
public static bool IsDarkTheme {
|
public static bool IsDarkTheme {
|
||||||
get {
|
get {
|
||||||
object value = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1);
|
object value = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1);
|
||||||
if (value is null) value = 1;
|
|
||||||
|
if (value is null)
|
||||||
|
value = 1;
|
||||||
|
|
||||||
return (int)value == 0;
|
return (int)value == 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsDirectoryWritable(string dirPath)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (FileStream fs = File.Create(Path.Combine(dirPath,
|
|
||||||
Path.GetRandomFileName()), 1, FileOptions.DeleteOnClose))
|
|
||||||
{ }
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{ }
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StringLogicalComparer : IComparer, IComparer<string>
|
public class StringLogicalComparer : IComparer, IComparer<string>
|
||||||
@@ -62,102 +52,51 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
Types = types;
|
Types = types;
|
||||||
|
|
||||||
RegHelp.SetObject($"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\{ExeFilename}", null, ExePath);
|
RegistryHelp.SetValue(@"HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\" + ExeFilename, null, ExePath);
|
||||||
RegHelp.SetObject($"HKCR\\Applications\\{ExeFilename}", "FriendlyAppName", "mpv.net media player");
|
RegistryHelp.SetValue(@"HKCR\Applications\" + ExeFilename, "FriendlyAppName", "mpv.net media player");
|
||||||
RegHelp.SetObject($"HKCR\\Applications\\{ExeFilename}\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
RegistryHelp.SetValue($@"HKCR\Applications\{ExeFilename}\shell\open\command", null, $"\"{ExePath}\" \"%1\"");
|
||||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities", "ApplicationDescription", "mpv.net media player");
|
RegistryHelp.SetValue(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities", "ApplicationDescription", "mpv.net media player");
|
||||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities", "ApplicationName", "mpv.net");
|
RegistryHelp.SetValue(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities", "ApplicationName", "mpv.net");
|
||||||
RegHelp.SetObject($"HKCR\\SystemFileAssociations\\video\\OpenWithList\\{ExeFilename}", null, "");
|
RegistryHelp.SetValue(@"HKCR\SystemFileAssociations\video\OpenWithList\" + ExeFilename, null, "");
|
||||||
RegHelp.SetObject($"HKCR\\SystemFileAssociations\\audio\\OpenWithList\\{ExeFilename}", null, "");
|
RegistryHelp.SetValue(@"HKCR\SystemFileAssociations\audio\OpenWithList\" + ExeFilename, null, "");
|
||||||
RegHelp.SetObject(@"HKLM\SOFTWARE\RegisteredApplications", "mpv.net", @"SOFTWARE\Clients\Media\mpv.net\Capabilities");
|
RegistryHelp.SetValue(@"HKLM\SOFTWARE\RegisteredApplications", "mpv.net", @"SOFTWARE\Clients\Media\mpv.net\Capabilities");
|
||||||
|
|
||||||
foreach (string ext in Types)
|
foreach (string ext in Types)
|
||||||
{
|
{
|
||||||
RegHelp.SetObject($"HKCR\\Applications\\{ExeFilename}\\SupportedTypes", "." + ext, "");
|
RegistryHelp.SetValue($@"HKCR\Applications\{ExeFilename}\SupportedTypes", "." + ext, "");
|
||||||
RegHelp.SetObject($"HKCR\\" + "." + ext, null, ExeFilenameNoExt + "." + ext);
|
RegistryHelp.SetValue($@"HKCR\" + "." + ext, null, ExeFilenameNoExt + "." + ext);
|
||||||
RegHelp.SetObject($"HKCR\\" + "." + ext + "\\OpenWithProgIDs", ExeFilenameNoExt + "." + ext, "");
|
RegistryHelp.SetValue($@"HKCR\" + "." + ext + @"\OpenWithProgIDs", ExeFilenameNoExt + "." + ext, "");
|
||||||
if (App.VideoTypes.Contains(ext)) RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "video");
|
|
||||||
if (App.AudioTypes.Contains(ext)) RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "audio");
|
if (App.VideoTypes.Contains(ext))
|
||||||
if (App.ImageTypes.Contains(ext)) RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "image");
|
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "video");
|
||||||
RegHelp.SetObject($"HKCR\\" + ExeFilenameNoExt + "." + ext + "\\shell\\open", null, "Play with " + Application.ProductName);
|
|
||||||
RegHelp.SetObject($"HKCR\\" + ExeFilenameNoExt + "." + ext + "\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
if (App.AudioTypes.Contains(ext))
|
||||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities\FileAssociations", "." + ext, ExeFilenameNoExt + "." + ext);
|
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "audio");
|
||||||
|
|
||||||
|
if (App.ImageTypes.Contains(ext))
|
||||||
|
RegistryHelp.SetValue(@"HKCR\" + "." + ext, "PerceivedType", "image");
|
||||||
|
|
||||||
|
RegistryHelp.SetValue($@"HKCR\" + ExeFilenameNoExt + "." + ext + @"\shell\open\command", null, $"\"{ExePath}\" \"%1\"");
|
||||||
|
RegistryHelp.SetValue(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities\FileAssociations", "." + ext, ExeFilenameNoExt + "." + ext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Unregister()
|
public static void Unregister()
|
||||||
{
|
{
|
||||||
RegHelp.RemoveKey($"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\{ExeFilename}");
|
RegistryHelp.RemoveKey($@"HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\" + ExeFilename);
|
||||||
RegHelp.RemoveKey($"HKCR\\Applications\\{ExeFilename}");
|
RegistryHelp.RemoveKey($@"HKCR\Applications\" + ExeFilename);
|
||||||
RegHelp.RemoveKey($"HKLM\\SOFTWARE\\Clients\\Media\\mpv.net");
|
RegistryHelp.RemoveKey($@"HKLM\SOFTWARE\Clients\Media\mpv.net");
|
||||||
RegHelp.RemoveKey($"HKCR\\SystemFileAssociations\\video\\OpenWithList\\{ExeFilename}");
|
RegistryHelp.RemoveKey($@"HKCR\SystemFileAssociations\video\OpenWithList\" + ExeFilename);
|
||||||
RegHelp.RemoveKey($"HKCR\\SystemFileAssociations\\audio\\OpenWithList\\{ExeFilename}");
|
RegistryHelp.RemoveKey($@"HKCR\SystemFileAssociations\audio\OpenWithList\" + ExeFilename);
|
||||||
RegHelp.RemoveValue(@"HKLM\SOFTWARE\RegisteredApplications", "mpv.net");
|
RegistryHelp.RemoveValue(@"HKLM\SOFTWARE\RegisteredApplications", "mpv.net");
|
||||||
|
|
||||||
foreach (string id in Registry.ClassesRoot.GetSubKeyNames())
|
foreach (string id in Registry.ClassesRoot.GetSubKeyNames())
|
||||||
{
|
{
|
||||||
if (id.StartsWith(ExeFilenameNoExt + ".")) Registry.ClassesRoot.DeleteSubKeyTree(id);
|
if (id.StartsWith(ExeFilenameNoExt + "."))
|
||||||
RegHelp.RemoveValue($"HKCR\\Software\\Classes\\" + id + "\\OpenWithProgIDs", ExeFilenameNoExt + id);
|
Registry.ClassesRoot.DeleteSubKeyTree(id);
|
||||||
RegHelp.RemoveValue($"HKLM\\Software\\Classes\\" + id + "\\OpenWithProgIDs", ExeFilenameNoExt + id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RegHelp
|
RegistryHelp.RemoveValue($@"HKCR\Software\Classes\{id}\OpenWithProgIDs", ExeFilenameNoExt + id);
|
||||||
{
|
RegistryHelp.RemoveValue($@"HKLM\Software\Classes\{id}\OpenWithProgIDs", ExeFilenameNoExt + id);
|
||||||
public static void SetObject(string path, string name, object value)
|
|
||||||
{
|
|
||||||
using (RegistryKey rk = GetRootKey(path).CreateSubKey(path.Substring(5), RegistryKeyPermissionCheck.ReadWriteSubTree))
|
|
||||||
rk.SetValue(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetString(string path, string name, string defaultValue = "")
|
|
||||||
{
|
|
||||||
object val = GetObject(path, name, defaultValue);
|
|
||||||
if (val == null || !(val is string)) return "";
|
|
||||||
return val.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int GetInt(string path, string name, int defaultValue = 0)
|
|
||||||
{
|
|
||||||
object val = GetObject(path, name, defaultValue);
|
|
||||||
if (val == null || !(val is int)) return 0;
|
|
||||||
return (int)val;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object GetObject(string path, string name, object defaultValue = null)
|
|
||||||
{
|
|
||||||
using (RegistryKey rk = GetRootKey(path).OpenSubKey(path.Substring(5)))
|
|
||||||
if (rk != null)
|
|
||||||
return rk.GetValue(name, defaultValue);
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void RemoveKey(string path)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
GetRootKey(path).DeleteSubKeyTree(path.Substring(5), false);
|
|
||||||
} catch { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void RemoveValue(string path, string name)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
using (RegistryKey rk = GetRootKey(path).OpenSubKey(path.Substring(5), true))
|
|
||||||
if (!(rk is null))
|
|
||||||
rk.DeleteValue(name, false);
|
|
||||||
} catch {}
|
|
||||||
}
|
|
||||||
|
|
||||||
static RegistryKey GetRootKey(string path)
|
|
||||||
{
|
|
||||||
switch (path.Substring(0, 4))
|
|
||||||
{
|
|
||||||
case "HKLM": return Registry.LocalMachine;
|
|
||||||
case "HKCU": return Registry.CurrentUser;
|
|
||||||
case "HKCR": return Registry.ClassesRoot;
|
|
||||||
default: throw new Exception();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -204,26 +143,38 @@ namespace mpvnet
|
|||||||
foreach (string line in content.Split('\r', '\n'))
|
foreach (string line in content.Split('\r', '\n'))
|
||||||
{
|
{
|
||||||
string val = line.Trim();
|
string val = line.Trim();
|
||||||
if (val.StartsWith("#")) continue;
|
|
||||||
if (!val.Contains(" ")) continue;
|
if (val.StartsWith("#"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!val.Contains(" "))
|
||||||
|
continue;
|
||||||
|
|
||||||
CommandItem item = new CommandItem();
|
CommandItem item = new CommandItem();
|
||||||
item.Input = val.Substring(0, val.IndexOf(" "));
|
item.Input = val.Substring(0, val.IndexOf(" "));
|
||||||
if (item.Input == "_") item.Input = "";
|
|
||||||
|
if (item.Input == "_")
|
||||||
|
item.Input = "";
|
||||||
|
|
||||||
val = val.Substring(val.IndexOf(" ") + 1);
|
val = val.Substring(val.IndexOf(" ") + 1);
|
||||||
|
|
||||||
if (val.Contains("#menu:"))
|
if (val.Contains("#menu:"))
|
||||||
{
|
{
|
||||||
item.Path = val.Substring(val.IndexOf("#menu:") + 6).Trim();
|
item.Path = val.Substring(val.IndexOf("#menu:") + 6).Trim();
|
||||||
val = val.Substring(0, val.IndexOf("#menu:"));
|
val = val.Substring(0, val.IndexOf("#menu:"));
|
||||||
|
|
||||||
if (item.Path.Contains(";"))
|
if (item.Path.Contains(";"))
|
||||||
item.Path = item.Path.Substring(item.Path.IndexOf(";") + 1).Trim();
|
item.Path = item.Path.Substring(item.Path.IndexOf(";") + 1).Trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
item.Command = val.Trim();
|
item.Command = val.Trim();
|
||||||
|
|
||||||
if (item.Command == "")
|
if (item.Command == "")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (item.Command.ToLower() == "ignore")
|
if (item.Command.ToLower() == "ignore")
|
||||||
item.Command = "";
|
item.Command = "";
|
||||||
|
|
||||||
MigrateCommands(item);
|
MigrateCommands(item);
|
||||||
items.Add(item);
|
items.Add(item);
|
||||||
}
|
}
|
||||||
@@ -237,10 +188,12 @@ namespace mpvnet
|
|||||||
get {
|
get {
|
||||||
if (_Items is null)
|
if (_Items is null)
|
||||||
_Items = GetItems(File.ReadAllText(mp.InputConfPath));
|
_Items = GetItems(File.ReadAllText(mp.InputConfPath));
|
||||||
|
|
||||||
return _Items;
|
return _Items;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// last change 2019
|
||||||
public static void MigrateCommands(CommandItem item)
|
public static void MigrateCommands(CommandItem item)
|
||||||
{
|
{
|
||||||
switch (item.Command)
|
switch (item.Command)
|
||||||
@@ -293,32 +246,6 @@ namespace mpvnet
|
|||||||
|
|
||||||
public class Folder
|
public class Folder
|
||||||
{
|
{
|
||||||
public static string Startup { get; } = Application.StartupPath + "\\";
|
public static string Startup { get; } = Application.StartupPath + @"\";
|
||||||
}
|
|
||||||
|
|
||||||
public class PathHelp
|
|
||||||
{
|
|
||||||
public static string GetBaseName(string value)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(value))
|
|
||||||
return "";
|
|
||||||
|
|
||||||
int index = value.IndexOf("/");
|
|
||||||
|
|
||||||
if (index > -1)
|
|
||||||
value = value.Substring(index + 1);
|
|
||||||
|
|
||||||
index = value.IndexOf("\\");
|
|
||||||
|
|
||||||
if (index > -1)
|
|
||||||
value = value.Substring(index + 1);
|
|
||||||
|
|
||||||
index = value.LastIndexOf(".");
|
|
||||||
|
|
||||||
if (index > -1)
|
|
||||||
value = value.Substring(0, index);
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
@@ -18,7 +18,11 @@ namespace mpvnet
|
|||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
|
||||||
if (mp.ConfigFolder == "") return;
|
if (App.IsStartedFromTerminal)
|
||||||
|
Native.AttachConsole(-1 /*ATTACH_PARENT_PROCESS*/);
|
||||||
|
|
||||||
|
if (mp.ConfigFolder == "")
|
||||||
|
return;
|
||||||
|
|
||||||
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
|
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
|
||||||
|
|
||||||
@@ -40,8 +44,14 @@ namespace mpvnet
|
|||||||
files.Add(App.ProcessInstance);
|
files.Add(App.ProcessInstance);
|
||||||
|
|
||||||
foreach (string arg in args)
|
foreach (string arg in args)
|
||||||
if (!arg.StartsWith("--") && (arg == "-" || arg.Contains("://") || arg.Contains(":\\") || arg.StartsWith("\\\\")))
|
{
|
||||||
|
if (!arg.StartsWith("--") && (arg == "-" || arg.Contains("://") ||
|
||||||
|
arg.Contains(":\\") || arg.StartsWith("\\\\")))
|
||||||
|
|
||||||
files.Add(arg);
|
files.Add(arg);
|
||||||
|
else if (arg == "--queue")
|
||||||
|
files[0] = "queue";
|
||||||
|
}
|
||||||
|
|
||||||
Process[] procs = Process.GetProcessesByName("mpvnet");
|
Process[] procs = Process.GetProcessesByName("mpvnet");
|
||||||
|
|
||||||
@@ -57,20 +67,26 @@ namespace mpvnet
|
|||||||
data.cbData = data.lpData.Length * 2 + 1;
|
data.cbData = data.lpData.Length * 2 + 1;
|
||||||
Native.SendMessage(proc.MainWindowHandle, 0x004A /*WM_COPYDATA*/, IntPtr.Zero, ref data);
|
Native.SendMessage(proc.MainWindowHandle, 0x004A /*WM_COPYDATA*/, IntPtr.Zero, ref data);
|
||||||
mutex.Dispose();
|
mutex.Dispose();
|
||||||
|
|
||||||
|
if (App.IsStartedFromTerminal)
|
||||||
|
Native.FreeConsole();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.Sleep(50);
|
Thread.Sleep(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex.Dispose();
|
mutex.Dispose();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (App.IsStartedFromTerminal)
|
|
||||||
Native.AttachConsole(-1 /*ATTACH_PARENT_PROCESS*/);
|
|
||||||
|
|
||||||
Application.Run(new MainForm());
|
Application.Run(new MainForm());
|
||||||
if (App.IsStartedFromTerminal) Native.FreeConsole();
|
|
||||||
|
if (App.IsStartedFromTerminal)
|
||||||
|
Native.FreeConsole();
|
||||||
|
|
||||||
mutex.Dispose();
|
mutex.Dispose();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
70
mpv.net/Misc/RegistryHelp.cs
Normal file
70
mpv.net/Misc/RegistryHelp.cs
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
|
using Microsoft.Win32;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
public class RegistryHelp
|
||||||
|
{
|
||||||
|
public static string ApplicationKey { get; } = @"HKCU\Software\" + Application.ProductName;
|
||||||
|
|
||||||
|
public static void SetValue(string path, string name, object value)
|
||||||
|
{
|
||||||
|
using (RegistryKey regKey = GetRootKey(path).CreateSubKey(path.Substring(5), RegistryKeyPermissionCheck.ReadWriteSubTree))
|
||||||
|
regKey.SetValue(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetString(string path, string name, string defaultValue = "")
|
||||||
|
{
|
||||||
|
object value = GetValue(path, name, defaultValue);
|
||||||
|
return !(value is string) ? defaultValue : value.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int GetInt(string path, string name, int defaultValue = 0)
|
||||||
|
{
|
||||||
|
object value = GetValue(path, name, defaultValue);
|
||||||
|
return !(value is int) ? defaultValue : (int)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool GetBool(string path, string name, bool defaultValue = false)
|
||||||
|
{
|
||||||
|
object val = GetValue(path, name, defaultValue);
|
||||||
|
return val is bool ? (bool)val : defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static object GetValue(string path, string name, object defaultValue = null)
|
||||||
|
{
|
||||||
|
using (RegistryKey regKey = GetRootKey(path).OpenSubKey(path.Substring(5)))
|
||||||
|
return regKey == null ? null : regKey.GetValue(name, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveKey(string path)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
GetRootKey(path).DeleteSubKeyTree(path.Substring(5), false);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveValue(string path, string name)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (RegistryKey regKey = GetRootKey(path).OpenSubKey(path.Substring(5), true))
|
||||||
|
if (regKey != null)
|
||||||
|
regKey.DeleteValue(name, false);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
static RegistryKey GetRootKey(string path)
|
||||||
|
{
|
||||||
|
switch (path.Substring(0, 4))
|
||||||
|
{
|
||||||
|
case "HKLM": return Registry.LocalMachine;
|
||||||
|
case "HKCU": return Registry.CurrentUser;
|
||||||
|
case "HKCR": return Registry.ClassesRoot;
|
||||||
|
default: throw new Exception();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
96
mpv.net/Misc/Theme.cs
Normal file
96
mpv.net/Misc/Theme.cs
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace UI
|
||||||
|
{
|
||||||
|
public class Theme
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public Dictionary<string, string> Dictionary { get; } = new Dictionary<string, string>();
|
||||||
|
|
||||||
|
public static List<Theme> DefaultThemes { get; set; }
|
||||||
|
public static List<Theme> CustomThemes { get; set; }
|
||||||
|
|
||||||
|
public static Theme Current { get; set; }
|
||||||
|
|
||||||
|
public static Brush Foreground { get; set; }
|
||||||
|
public static Brush Foreground2 { get; set; }
|
||||||
|
public static Brush Background { get; set; }
|
||||||
|
public static Brush Heading { get; set; }
|
||||||
|
|
||||||
|
public System.Drawing.Color GetWinFormsColor(string key)
|
||||||
|
{
|
||||||
|
return System.Drawing.ColorTranslator.FromHtml(Dictionary[key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Brush GetBrush(string key)
|
||||||
|
{
|
||||||
|
return new SolidColorBrush((Color)ColorConverter.ConvertFromString(Dictionary[key]));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Init(string customContent, string defaultContent, string activeTheme)
|
||||||
|
{
|
||||||
|
DefaultThemes = Load(defaultContent);
|
||||||
|
CustomThemes = Load(customContent);
|
||||||
|
|
||||||
|
foreach (Theme theme in CustomThemes)
|
||||||
|
{
|
||||||
|
if (theme.Name == activeTheme)
|
||||||
|
{
|
||||||
|
bool isKeyMissing = false;
|
||||||
|
|
||||||
|
foreach (string key in DefaultThemes[0].Dictionary.Keys)
|
||||||
|
{
|
||||||
|
if (!theme.Dictionary.ContainsKey(key))
|
||||||
|
{
|
||||||
|
isKeyMissing = true;
|
||||||
|
ConsoleHelp.WriteError($"Theme '{activeTheme}' misses '{key}'");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isKeyMissing)
|
||||||
|
Current = theme;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Current == null)
|
||||||
|
foreach (Theme theme in DefaultThemes)
|
||||||
|
if (theme.Name == activeTheme)
|
||||||
|
Current = theme;
|
||||||
|
|
||||||
|
if (Current == null)
|
||||||
|
Current = DefaultThemes[0];
|
||||||
|
|
||||||
|
Foreground = Current.GetBrush("foreground");
|
||||||
|
Foreground2 = Current.GetBrush("foreground2");
|
||||||
|
Background = Current.GetBrush("background");
|
||||||
|
Heading = Current.GetBrush("heading");
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<Theme> Load(string content)
|
||||||
|
{
|
||||||
|
List<Theme> list = new List<Theme>();
|
||||||
|
Theme theme = null;
|
||||||
|
|
||||||
|
foreach (string currentLine in (content ?? "").Split(new [] { '\r', '\n' }))
|
||||||
|
{
|
||||||
|
string line = currentLine.Trim();
|
||||||
|
|
||||||
|
if (line.StartsWith("[") && line.EndsWith("]"))
|
||||||
|
list.Add(theme = new Theme() { Name = line.Substring(1, line.Length - 2).Trim() });
|
||||||
|
|
||||||
|
if (line.Contains("=") && theme != null)
|
||||||
|
{
|
||||||
|
string left = line.Substring(0, line.IndexOf("=")).Trim();
|
||||||
|
theme.Dictionary[left] = line.Substring(line.IndexOf("=") + 1).Trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
74
mpv.net/Misc/UpdateCheck.cs
Normal file
74
mpv.net/Misc/UpdateCheck.cs
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace mpvnet
|
||||||
|
{
|
||||||
|
class UpdateCheck
|
||||||
|
{
|
||||||
|
public static void DailyCheck()
|
||||||
|
{
|
||||||
|
if (App.UpdateCheck && RegistryHelp.GetInt(RegistryHelp.ApplicationKey, "UpdateCheckLast")
|
||||||
|
!= DateTime.Now.DayOfYear)
|
||||||
|
|
||||||
|
CheckOnline();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async void CheckOnline(bool showUpToDateMessage = false)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (HttpClient client = new HttpClient())
|
||||||
|
{
|
||||||
|
RegistryHelp.SetValue(RegistryHelp.ApplicationKey, "UpdateCheckLast", 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-portable-x64-([\d\.]+)\.7z""");
|
||||||
|
Version onlineVersion = Version.Parse(match.Groups[1].Value);
|
||||||
|
Version currentVersion = Assembly.GetEntryAssembly().GetName().Version;
|
||||||
|
|
||||||
|
if (onlineVersion == currentVersion)
|
||||||
|
{
|
||||||
|
if (showUpToDateMessage)
|
||||||
|
Msg.Show($"{Application.ProductName} is up to date.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegistryHelp.GetString(RegistryHelp.ApplicationKey, "UpdateCheckVersion")
|
||||||
|
!= onlineVersion.ToString() && Msg.ShowQuestion(
|
||||||
|
$"New version {onlineVersion} is available, update now?") == MsgResult.OK)
|
||||||
|
{
|
||||||
|
string arch = IntPtr.Size == 8 ? "64" : "86";
|
||||||
|
string url = $"https://github.com/stax76/mpv.net/releases/download/{onlineVersion}/mpv.net-portable-x{arch}-{onlineVersion}.7z";
|
||||||
|
|
||||||
|
using (Process proc = new Process())
|
||||||
|
{
|
||||||
|
proc.StartInfo.FileName = "PowerShell";
|
||||||
|
proc.StartInfo.Arguments = $"-NoLogo -NoExit -File \"{Folder.Startup + "Update.ps1"}\" \"{url}\" \"{Application.StartupPath}\"";
|
||||||
|
|
||||||
|
if (Folder.Startup.Contains("Program Files"))
|
||||||
|
proc.StartInfo.Verb = "runas";
|
||||||
|
|
||||||
|
proc.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
mp.command("quit");
|
||||||
|
}
|
||||||
|
|
||||||
|
RegistryHelp.SetValue(RegistryHelp.ApplicationKey, "UpdateCheckVersion", onlineVersion.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (showUpToDateMessage)
|
||||||
|
Msg.ShowException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -56,9 +56,6 @@ public class MediaInfo : IDisposable
|
|||||||
|
|
||||||
~MediaInfo() { Dispose(); }
|
~MediaInfo() { Dispose(); }
|
||||||
|
|
||||||
[DllImport("kernel32.dll")]
|
|
||||||
public static extern IntPtr LoadLibrary(string path);
|
|
||||||
|
|
||||||
[DllImport("MediaInfo.dll")]
|
[DllImport("MediaInfo.dll")]
|
||||||
static extern IntPtr MediaInfo_New();
|
static extern IntPtr MediaInfo_New();
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ using System.Runtime.InteropServices;
|
|||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyTitle("mpv.net")]
|
[assembly: AssemblyTitle("mpv.net")]
|
||||||
[assembly: AssemblyDescription("media player")]
|
[assembly: AssemblyDescription("mpv based media player")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("Frank Skare (stax76)")]
|
[assembly: AssemblyCompany("Frank Skare (stax76)")]
|
||||||
[assembly: AssemblyProduct("mpv.net")]
|
[assembly: AssemblyProduct("mpv.net")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017-2019 Frank Skare (stax76)")]
|
[assembly: AssemblyCopyright("Copyright (c) 2017-2019 Frank Skare (stax76)")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("5.4.2.0")]
|
[assembly: AssemblyVersion("5.4.4.0")]
|
||||||
[assembly: AssemblyFileVersion("5.4.2.0")]
|
[assembly: AssemblyFileVersion("5.4.4.0")]
|
||||||
|
|||||||
82
mpv.net/Properties/Resources.Designer.cs
generated
82
mpv.net/Properties/Resources.Designer.cs
generated
@@ -60,6 +60,23 @@ namespace mpvnet.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to [[settings]]
|
||||||
|
///name = "hwdec"
|
||||||
|
///file = "mpv"
|
||||||
|
///default = "no"
|
||||||
|
///filter = "Video"
|
||||||
|
///url = "https://mpv.io/manual/master/#options-hwdec"
|
||||||
|
///help = "Specify the hardware video decoding API that should be used if possible. Whether hardware decoding is actually done depends on the video codec. If hardware decoding is not possible, mpv will fall back on software decoding.\n\nFor more information visit:"
|
||||||
|
///options = [{ name = "no", help = "always use software decoding" },
|
||||||
|
/// { name = "auto", hel [rest of string was truncated]";.
|
||||||
|
/// </summary>
|
||||||
|
internal static string confToml {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("confToml", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to
|
/// Looks up a localized string similar to
|
||||||
/// # This file defines the key and mouse bindings and the context menu
|
/// # This file defines the key and mouse bindings and the context menu
|
||||||
@@ -88,7 +105,7 @@ namespace mpvnet.Properties {
|
|||||||
///keep-open = yes
|
///keep-open = yes
|
||||||
///keep-open-pause = no
|
///keep-open-pause = no
|
||||||
///osd-playing-msg = '${filename}'
|
///osd-playing-msg = '${filename}'
|
||||||
///script-opts=osc-scalewindowed=1.5
|
///script-opts = osc-scalewindowed=1.5
|
||||||
///screenshot-directory = '~~desktop/'
|
///screenshot-directory = '~~desktop/'
|
||||||
///cscale = spline36
|
///cscale = spline36
|
||||||
///dscale = spline36
|
///dscale = spline36
|
||||||
@@ -104,22 +121,6 @@ namespace mpvnet.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to [[settings]]
|
|
||||||
///name = "hwdec"
|
|
||||||
///default = "no"
|
|
||||||
///filter = "Video"
|
|
||||||
///url = "https://mpv.io/manual/master/#options-hwdec"
|
|
||||||
///help = "Specify the hardware video decoding API that should be used if possible. Whether hardware decoding is actually done depends on the video codec. If hardware decoding is not possible, mpv will fall back on software decoding.\n\nFor more information visit:"
|
|
||||||
///options = [{ name = "no", help = "always use software decoding" },
|
|
||||||
/// { name = "auto", help = "enable be [rest of string was truncated]";.
|
|
||||||
/// </summary>
|
|
||||||
internal static string mpvConfToml {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("mpvConfToml", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -131,26 +132,37 @@ namespace mpvnet.Properties {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to dark-color = '#1E90FF'
|
/// Looks up a localized string similar to
|
||||||
///light-color = '#28394F'.
|
///[dark]
|
||||||
|
///
|
||||||
|
///heading = #1E90FF
|
||||||
|
///foreground = #FFFFFF
|
||||||
|
///foreground2 = #C0C0C0
|
||||||
|
///background = #323232
|
||||||
|
///
|
||||||
|
///menu-foreground = #FFFFFF
|
||||||
|
///menu-background = #323232
|
||||||
|
///menu-highlight = #505050
|
||||||
|
///menu-border = #FFFFFF
|
||||||
|
///menu-checked = #5A5A5A
|
||||||
|
///
|
||||||
|
///[light]
|
||||||
|
///
|
||||||
|
///heading = #0068B2
|
||||||
|
///foreground = #000000
|
||||||
|
///foreground2 = #4C4C4C
|
||||||
|
///background = #F7F7F7
|
||||||
|
///
|
||||||
|
///menu-foreground = #000000
|
||||||
|
///menu-background = #DFDFDF
|
||||||
|
///menu-highlight = #BFBFBF
|
||||||
|
///menu-border = #6A6A6A
|
||||||
|
///menu-checked = #AAAAAA
|
||||||
|
///.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static string mpvNetConf {
|
internal static string theme {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("mpvNetConf", resourceCulture);
|
return ResourceManager.GetString("theme", resourceCulture);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to [[settings]]
|
|
||||||
///name = "process-instance"
|
|
||||||
///default = "single"
|
|
||||||
///filter = "General"
|
|
||||||
///help = "Defines if more then one mpv.net process is allowed. (mpv.net specific setting)\n\nTip: Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This not only works on process startup but in all mpv.net features that open files and URLs."
|
|
||||||
///options = [{ name = "multi", help = "Create a new process everytime the shell starts mpv.net [rest of string was truncated]";.
|
|
||||||
/// </summary>
|
|
||||||
internal static string mpvNetConfToml {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("mpvNetConfToml", resourceCulture);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,22 +118,19 @@
|
|||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
<data name="confToml" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\ConfToml.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||||
|
</data>
|
||||||
<data name="inputConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="inputConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\inputConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
|
<value>..\Resources\inputConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="mpvConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="mpvConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\mpvConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
<value>..\Resources\mpvConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="mpvConfToml" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>..\Resources\mpvConfToml.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
|
||||||
</data>
|
|
||||||
<data name="mpvnet" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="mpvnet" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\mpvnet.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\mpvnet.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="mpvNetConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="theme" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\mpvNetConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
<value>..\Resources\theme.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||||
</data>
|
|
||||||
<data name="mpvNetConfToml" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
|
||||||
<value>..\Resources\mpvNetConfToml.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
[[settings]]
|
|
||||||
|
[[settings]]
|
||||||
name = "hwdec"
|
name = "hwdec"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
url = "https://mpv.io/manual/master/#options-hwdec"
|
url = "https://mpv.io/manual/master/#options-hwdec"
|
||||||
@@ -21,6 +23,7 @@ options = [{ name = "no", help = "always use software decoding" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "gpu-api"
|
name = "gpu-api"
|
||||||
|
file = "mpv"
|
||||||
default = "auto"
|
default = "auto"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "Controls which type of graphics APIs will be accepted. Auto uses d3d11, it should only be changed in case of problems, Vulkan is not recommended."
|
help = "Controls which type of graphics APIs will be accepted. Auto uses d3d11, it should only be changed in case of problems, Vulkan is not recommended."
|
||||||
@@ -31,6 +34,7 @@ options = [{ name = "auto", help = "Use any available API" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "gpu-context"
|
name = "gpu-context"
|
||||||
|
file = "mpv"
|
||||||
default = "auto"
|
default = "auto"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
options = [{ name = "auto", help = "auto-select" },
|
options = [{ name = "auto", help = "auto-select" },
|
||||||
@@ -42,6 +46,7 @@ options = [{ name = "auto", help = "auto-select" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "vo"
|
name = "vo"
|
||||||
|
file = "mpv"
|
||||||
default = "gpu"
|
default = "gpu"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "Video output drivers to be used.\n\nFor more information visit:"
|
help = "Video output drivers to be used.\n\nFor more information visit:"
|
||||||
@@ -51,6 +56,7 @@ options = [{ name = "gpu", help = "General purpose, customizable, GPU-accel
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "video-sync"
|
name = "video-sync"
|
||||||
|
file = "mpv"
|
||||||
default = "audio"
|
default = "audio"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "How the player synchronizes audio and video.\n\nFor more information visit:"
|
help = "How the player synchronizes audio and video.\n\nFor more information visit:"
|
||||||
@@ -66,6 +72,7 @@ options = [{ name = "audio" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "scale"
|
name = "scale"
|
||||||
|
file = "mpv"
|
||||||
default = "bilinear"
|
default = "bilinear"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "The GPU renderer filter function to use when upscaling video. There are some more filters, but most are not as useful. For a complete list, pass help as value, e.g.: mpv --scale=help"
|
help = "The GPU renderer filter function to use when upscaling video. There are some more filters, but most are not as useful. For a complete list, pass help as value, e.g.: mpv --scale=help"
|
||||||
@@ -80,6 +87,7 @@ options = [{ name = "bilinear", help = "Bilinear hardware texture filter
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "cscale"
|
name = "cscale"
|
||||||
|
file = "mpv"
|
||||||
default = "bilinear"
|
default = "bilinear"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "As scale, but for interpolating chroma information. If the image is not subsampled, this option is ignored entirely."
|
help = "As scale, but for interpolating chroma information. If the image is not subsampled, this option is ignored entirely."
|
||||||
@@ -94,6 +102,7 @@ options = [{ name = "bilinear", help = "Bilinear hardware texture filter
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "dscale"
|
name = "dscale"
|
||||||
|
file = "mpv"
|
||||||
default = "bilinear"
|
default = "bilinear"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "Like scale, but apply these filters on downscaling instead. If this option is unset, the filter implied by scale will be applied."
|
help = "Like scale, but apply these filters on downscaling instead. If this option is unset, the filter implied by scale will be applied."
|
||||||
@@ -108,6 +117,7 @@ options = [{ name = "bilinear", help = "Bilinear hardware texture filter
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "dither-depth"
|
name = "dither-depth"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "Set dither target depth to N. Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output."
|
help = "Set dither target depth to N. Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output."
|
||||||
@@ -117,6 +127,7 @@ options = [{ name = "no", help = "Disable any dithering done by mpv." },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "correct-downscaling"
|
name = "correct-downscaling"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.\n\nThis will perform slightly sub-optimally for anamorphic video (but still better than without it) since it will extend the size to match only the milder of the scale factors between the axes."
|
help = "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.\n\nThis will perform slightly sub-optimally for anamorphic video (but still better than without it) since it will extend the size to match only the milder of the scale factors between the axes."
|
||||||
@@ -125,6 +136,7 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "sigmoid-upscaling"
|
name = "sigmoid-upscaling"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts. This also implies linear-scaling."
|
help = "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts. This also implies linear-scaling."
|
||||||
@@ -133,6 +145,7 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "deband"
|
name = "deband"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "Enable the debanding algorithm. This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of very slightly blurring some of the finest details. In practice, it's virtually always an improvement - the only reason to disable it would be for performance."
|
help = "Enable the debanding algorithm. This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of very slightly blurring some of the finest details. In practice, it's virtually always an improvement - the only reason to disable it would be for performance."
|
||||||
@@ -141,18 +154,29 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "volume"
|
name = "volume"
|
||||||
default = "100"
|
file = "mpv"
|
||||||
filter = "Audio"
|
filter = "Audio"
|
||||||
help = "Set the startup volume. 0 means silence, 100 means no volume reduction or amplification. Negative values can be passed for compatibility, but are treated as 0. Since mpv 0.18.1, this always controls the internal mixer (aka \"softvol\"). Default: 100"
|
help = "Set the startup volume. 0 means silence, 100 means no volume reduction or amplification. Negative values can be passed for compatibility, but are treated as 0. Since mpv 0.18.1, this always controls the internal mixer (aka \"softvol\"). Default: 100"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "remember-volume"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "yes"
|
||||||
|
filter = "Audio"
|
||||||
|
help = "Save volume and mute on exit and restore it on start. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "alang"
|
name = "alang"
|
||||||
|
file = "mpv"
|
||||||
filter = "Audio"
|
filter = "Audio"
|
||||||
type = "string"
|
type = "string"
|
||||||
help = "Specify a priority list of audio languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two-letter language codes, Matroska, MPEG-TS and NUT use ISO 639-2 three-letter language codes, while OGM uses a free-form identifier. See also aid.\n\nExamples\n\nmpv dvd://1 alang=hu,en chooses the Hungarian language track on a DVD and falls back on English if Hungarian is not available.\n\nmpv alang=jpn example.mkv plays a Matroska file with Japanese audio."
|
help = "Specify a priority list of audio languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two-letter language codes, Matroska, MPEG-TS and NUT use ISO 639-2 three-letter language codes, while OGM uses a free-form identifier. See also aid.\n\nExamples\n\nmpv dvd://1 alang=hu,en chooses the Hungarian language track on a DVD and falls back on English if Hungarian is not available.\n\nmpv alang=jpn example.mkv plays a Matroska file with Japanese audio."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "audio-file-auto"
|
name = "audio-file-auto"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Audio"
|
filter = "Audio"
|
||||||
help = "Load additional audio files matching the video filename. The parameter specifies how external audio files are matched."
|
help = "Load additional audio files matching the video filename. The parameter specifies how external audio files are matched."
|
||||||
@@ -163,12 +187,14 @@ options = [{ name = "no", help = "Don't automatically load external audio fil
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "slang"
|
name = "slang"
|
||||||
|
file = "mpv"
|
||||||
filter = "Subtitle"
|
filter = "Subtitle"
|
||||||
type = "string"
|
type = "string"
|
||||||
help = "Specify a priority list of subtitle languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two letter language codes, Matroska uses ISO 639-2 three letter language codes while OGM uses a free-form identifier. See also sid."
|
help = "Specify a priority list of subtitle languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two letter language codes, Matroska uses ISO 639-2 three letter language codes while OGM uses a free-form identifier. See also sid."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "sub-auto"
|
name = "sub-auto"
|
||||||
|
file = "mpv"
|
||||||
default = "exact"
|
default = "exact"
|
||||||
filter = "Subtitle"
|
filter = "Subtitle"
|
||||||
help = "Load additional subtitle files matching the video filename. The parameter specifies how external subtitle files are matched. exact is enabled by default."
|
help = "Load additional subtitle files matching the video filename. The parameter specifies how external subtitle files are matched. exact is enabled by default."
|
||||||
@@ -179,35 +205,41 @@ options = [{ name = "no", help = "Don't automatically load external subtitle
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "sub-font"
|
name = "sub-font"
|
||||||
|
file = "mpv"
|
||||||
filter = "Subtitle"
|
filter = "Subtitle"
|
||||||
type = "string"
|
type = "string"
|
||||||
help = "Specify font to use for subtitles that do not themselves specify a particular font. The default is sans-serif."
|
help = "Specify font to use for subtitles that do not themselves specify a particular font. The default is sans-serif."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "sub-font-size"
|
name = "sub-font-size"
|
||||||
|
file = "mpv"
|
||||||
filter = "Subtitle"
|
filter = "Subtitle"
|
||||||
help = "Specify the sub font size. The unit is the size in scaled pixels at a window height of 720. The actual pixel size is scaled with the window height: if the window height is larger or smaller than 720, the actual size of the text increases or decreases as well. Default: 55"
|
help = "Specify the sub font size. The unit is the size in scaled pixels at a window height of 720. The actual pixel size is scaled with the window height: if the window height is larger or smaller than 720, the actual size of the text increases or decreases as well. Default: 55"
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "sub-color"
|
name = "sub-color"
|
||||||
|
file = "mpv"
|
||||||
type = "color"
|
type = "color"
|
||||||
filter = "Subtitle"
|
filter = "Subtitle"
|
||||||
help = "Specify the color used for unstyled text subtitles.\n\nThe color is specified in the form r/g/b, where each color component is specified as number in the range 0.0 to 1.0. It's also possible to specify the transparency by using r/g/b/a, where the alpha value 0 means fully transparent, and 1.0 means opaque. If the alpha component is not given, the color is 100% opaque.\n\nPassing a single number to the option sets the sub to gray, and the form gray/a lets you specify alpha additionally.\n\nExamples\n\n1.0/0.0/0.0 set sub to opaque red\n1.0/0.0/0.0/0.75 set sub to opaque red with 75% alpha\n0.5/0.75 set sub to 50% gray with 75% alpha\n\nAlternatively, the color can be specified as a RGB hex triplet in the form #RRGGBB, where each 2-digit group expresses a color value in the range 0 (00) to 255 (FF). For example, #FF0000 is red. This is similar to web colors. Alpha is given with #AARRGGBB.\n\nExamples\n\n#FF0000 set sub to opaque red\n#C0808080 set sub to 50% gray with 75% alpha"
|
help = "Specify the color used for unstyled text subtitles.\n\nThe color is specified in the form r/g/b, where each color component is specified as number in the range 0.0 to 1.0. It's also possible to specify the transparency by using r/g/b/a, where the alpha value 0 means fully transparent, and 1.0 means opaque. If the alpha component is not given, the color is 100% opaque.\n\nPassing a single number to the option sets the sub to gray, and the form gray/a lets you specify alpha additionally.\n\nExamples\n\n1.0/0.0/0.0 set sub to opaque red\n1.0/0.0/0.0/0.75 set sub to opaque red with 75% alpha\n0.5/0.75 set sub to 50% gray with 75% alpha\n\nAlternatively, the color can be specified as a RGB hex triplet in the form #RRGGBB, where each 2-digit group expresses a color value in the range 0 (00) to 255 (FF). For example, #FF0000 is red. This is similar to web colors. Alpha is given with #AARRGGBB.\n\nExamples\n\n#FF0000 set sub to opaque red\n#C0808080 set sub to 50% gray with 75% alpha"
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "sub-border-color"
|
name = "sub-border-color"
|
||||||
|
file = "mpv"
|
||||||
type = "color"
|
type = "color"
|
||||||
filter = "Subtitle"
|
filter = "Subtitle"
|
||||||
help = "See sub-color. Color used for the sub font border. Ignored when sub-back-color is specified (or more exactly: when that option is not set to completely transparent)."
|
help = "See sub-color. Color used for the sub font border. Ignored when sub-back-color is specified (or more exactly: when that option is not set to completely transparent)."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "sub-back-color"
|
name = "sub-back-color"
|
||||||
|
file = "mpv"
|
||||||
type = "color"
|
type = "color"
|
||||||
filter = "Subtitle"
|
filter = "Subtitle"
|
||||||
help = "See sub-color. Color used for sub text background. You can use sub-shadow-offset to change its size relative to the text."
|
help = "See sub-color. Color used for sub text background. You can use sub-shadow-offset to change its size relative to the text."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "fullscreen"
|
name = "fullscreen"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Start the player in fullscreen mode."
|
help = "Start the player in fullscreen mode."
|
||||||
@@ -216,6 +248,7 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "border"
|
name = "border"
|
||||||
|
file = "mpv"
|
||||||
default = "yes"
|
default = "yes"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Show window with decoration (titlebar, border)."
|
help = "Show window with decoration (titlebar, border)."
|
||||||
@@ -224,11 +257,13 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screen"
|
name = "screen"
|
||||||
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "<0-32> In multi-monitor configurations (i.e. a single desktop that spans across multiple displays), this option tells mpv which screen to display the video on."
|
help = "<0-32> In multi-monitor configurations (i.e. a single desktop that spans across multiple displays), this option tells mpv which screen to display the video on."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "osd-playing-msg"
|
name = "osd-playing-msg"
|
||||||
|
file = "mpv"
|
||||||
width = 300
|
width = 300
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
type = "string"
|
type = "string"
|
||||||
@@ -237,12 +272,13 @@ url = "https://mpv.io/manual/master/#property-expansion"
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "osd-font-size"
|
name = "osd-font-size"
|
||||||
default = "55"
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Specify the OSD font size. See sub-font-size for details. Default: 55"
|
help = "Specify the OSD font size. See sub-font-size for details. Default: 55"
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "osd-scale-by-window"
|
name = "osd-scale-by-window"
|
||||||
|
file = "mpv"
|
||||||
default = "yes"
|
default = "yes"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Whether to scale the OSD with the window size. If this is disabled, osd-font-size and other OSD options that use scaled pixels are always in actual pixels. The effect is that changing the window size won't change the OSD font size."
|
help = "Whether to scale the OSD with the window size. If this is disabled, osd-font-size and other OSD options that use scaled pixels are always in actual pixels. The effect is that changing the window size won't change the OSD font size."
|
||||||
@@ -251,21 +287,64 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "autofit"
|
name = "autofit"
|
||||||
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "<int> Initial window height in percent. Default: 50"
|
help = "<int> Initial window height in percent. Default: 50"
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "autofit-smaller"
|
name = "autofit-smaller"
|
||||||
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "<int> Minimum window height in percent. Default: 40"
|
help = "<int> Minimum window height in percent. Default: 40"
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "autofit-larger"
|
name = "autofit-larger"
|
||||||
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "<int> Maximum window height in percent. Default: 75"
|
help = "<int> Maximum window height in percent. Default: 75"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "start-size"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "previous"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "Setting to remember the window height in the current session, otherwise the video's native resolution is used. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "video", help = "Window size is set to native video resolution" },
|
||||||
|
{ name = "previous", help = "Window size is remembered but only from the current session" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "start-threshold"
|
||||||
|
file = "mpvnet"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "Threshold in milliseconds to wait for libmpv returning the video resolution before the window is shown, otherwise default dimensions are used as defined by autofit and start-size. Default: 1500 (mpv.net specific setting)"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "minimum-aspect-ratio"
|
||||||
|
file = "mpvnet"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "<float> Minimum aspect ratio for the window. Default: 1.3 (mpv.net specific setting)"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "remember-position"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "no"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "Save the window position on exit. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "maximized"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "no"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "Start with a maximized window. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-directory"
|
name = "screenshot-directory"
|
||||||
|
file = "mpv"
|
||||||
width = 500
|
width = 500
|
||||||
type = "folder"
|
type = "folder"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
@@ -273,6 +352,7 @@ help = "Store screenshots in this directory. This path is joined with the filena
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-format"
|
name = "screenshot-format"
|
||||||
|
file = "mpv"
|
||||||
default = "jpg"
|
default = "jpg"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Set the image file type used for saving screenshots."
|
help = "Set the image file type used for saving screenshots."
|
||||||
@@ -281,6 +361,7 @@ options = [{ name = "jpg" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-tag-colorspace"
|
name = "screenshot-tag-colorspace"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Tag screenshots with the appropriate colorspace. Note that not all formats are supported."
|
help = "Tag screenshots with the appropriate colorspace. Note that not all formats are supported."
|
||||||
@@ -289,6 +370,7 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-high-bit-depth"
|
name = "screenshot-high-bit-depth"
|
||||||
|
file = "mpv"
|
||||||
default = "yes"
|
default = "yes"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "If possible, write screenshots with a bit depth similar to the source video. This is interesting in particular for PNG, as this sometimes triggers writing 16 bit PNGs with huge file sizes. This will also include an unused alpha channel in the resulting files if 16 bit is used."
|
help = "If possible, write screenshots with a bit depth similar to the source video. This is interesting in particular for PNG, as this sometimes triggers writing 16 bit PNGs with huge file sizes. This will also include an unused alpha channel in the resulting files if 16 bit is used."
|
||||||
@@ -297,6 +379,7 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-jpeg-source-chroma"
|
name = "screenshot-jpeg-source-chroma"
|
||||||
|
file = "mpv"
|
||||||
default = "yes"
|
default = "yes"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Write JPEG files with the same chroma subsampling as the video. If disabled, the libjpeg default is used."
|
help = "Write JPEG files with the same chroma subsampling as the video. If disabled, the libjpeg default is used."
|
||||||
@@ -305,6 +388,7 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-template"
|
name = "screenshot-template"
|
||||||
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
type = "string"
|
type = "string"
|
||||||
help = "Specify the filename template used to save screenshots. The template specifies the filename without file extension, and can contain format specifiers, which will be substituted when taking a screenshot. By default, the template is mpv-shot%n, which results in filenames like mpv-shot0012.png for example.\n\nFind the full documentation here:"
|
help = "Specify the filename template used to save screenshots. The template specifies the filename without file extension, and can contain format specifiers, which will be substituted when taking a screenshot. By default, the template is mpv-shot%n, which results in filenames like mpv-shot0012.png for example.\n\nFind the full documentation here:"
|
||||||
@@ -312,21 +396,25 @@ url = "https://mpv.io/manual/master/#options-screenshot-template"
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-jpeg-quality"
|
name = "screenshot-jpeg-quality"
|
||||||
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "<0-100> Set the JPEG quality level. Higher means better quality. The default is 90."
|
help = "<0-100> Set the JPEG quality level. Higher means better quality. The default is 90."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-png-compression"
|
name = "screenshot-png-compression"
|
||||||
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "<0-9> Set the PNG compression level. Higher means better compression. This will affect the file size of the written screenshot file and the time it takes to write a screenshot. Too high compression might occupy enough CPU time to interrupt playback. The default is 7."
|
help = "<0-9> Set the PNG compression level. Higher means better compression. This will affect the file size of the written screenshot file and the time it takes to write a screenshot. Too high compression might occupy enough CPU time to interrupt playback. The default is 7."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-png-filter"
|
name = "screenshot-png-filter"
|
||||||
|
file = "mpv"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "<0-5> Set the filter applied prior to PNG compression. 0 is none, 1 is 'sub', 2 is 'up', 3 is 'average', 4 is 'Paeth', and 5 is 'mixed'. This affects the level of compression that can be achieved. For most images, 'mixed' achieves the best compression ratio, hence it is the default."
|
help = "<0-5> Set the filter applied prior to PNG compression. 0 is none, 1 is 'sub', 2 is 'up', 3 is 'average', 4 is 'Paeth', and 5 is 'mixed'. This affects the level of compression that can be achieved. For most images, 'mixed' achieves the best compression ratio, hence it is the default."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "taskbar-progress"
|
name = "taskbar-progress"
|
||||||
|
file = "mpv"
|
||||||
default = "yes"
|
default = "yes"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "Show progress in taskbar."
|
help = "Show progress in taskbar."
|
||||||
@@ -335,6 +423,7 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "keep-open-pause"
|
name = "keep-open-pause"
|
||||||
|
file = "mpv"
|
||||||
default = "yes"
|
default = "yes"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "If set to no, instead of pausing when keep-open is active, just stop at end of file and continue playing forward when you seek backwards until end where it stops again."
|
help = "If set to no, instead of pausing when keep-open is active, just stop at end of file and continue playing forward when you seek backwards until end where it stops again."
|
||||||
@@ -343,6 +432,7 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "keep-open"
|
name = "keep-open"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "Using no, mpv would terminate after the last file but mpv.net never terminates automatically."
|
help = "Using no, mpv would terminate after the last file but mpv.net never terminates automatically."
|
||||||
@@ -352,29 +442,22 @@ options = [{ name = "yes", help = "If the current file ends, go to the next f
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "loop-file"
|
name = "loop-file"
|
||||||
|
file = "mpv"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "<N|inf|no> Loop a single file N times. inf means forever, no means normal playback.\n\nThe difference to loop-playlist is that this doesn't loop the playlist, just the file itself. If the playlist contains only a single file, the difference between the two option is that this option performs a seek on loop, instead of reloading the file. loop is an alias for this option."
|
help = "<N|inf|no> Loop a single file N times. inf means forever, no means normal playback.\n\nThe difference to loop-playlist is that this doesn't loop the playlist, just the file itself. If the playlist contains only a single file, the difference between the two option is that this option performs a seek on loop, instead of reloading the file. loop is an alias for this option."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "save-position-on-quit"
|
name = "save-position-on-quit"
|
||||||
|
file = "mpv"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "Always save the current playback position on quit. When this file is played again later, the player will seek to the old playback position on start. This does not happen if playback of a file is stopped in any other way than quitting. For example, going to the next file in the playlist will not save the position, and start playback at beginning the next time the file is played.\n\nThis behavior is disabled by default, but is always available when quitting the player with Shift+Q."
|
help = "Always save the current playback position on quit. When this file is played again later, the player will seek to the old playback position on start. This does not happen if playback of a file is stopped in any other way than quitting. For example, going to the next file in the playlist will not save the position, and start playback at beginning the next time the file is played.\n\nThis behavior is disabled by default, but is always available when quitting the player with Shift+Q."
|
||||||
options = [{ name = "yes" },
|
options = [{ name = "yes" },
|
||||||
{ name = "no" }]
|
{ name = "no" }]
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "input-ar-delay"
|
|
||||||
filter = "Input"
|
|
||||||
help = "Delay in milliseconds before we start to autorepeat a key (0 to disable)."
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "input-ar-rate"
|
|
||||||
filter = "Input"
|
|
||||||
help = "Number of key presses to generate per second on autorepeat."
|
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "hr-seek"
|
name = "hr-seek"
|
||||||
|
file = "mpv"
|
||||||
default = "absolute"
|
default = "absolute"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "Select when to use precise seeks that are not limited to keyframes. Such seeks require decoding video from the previous keyframe up to the target position and so can take some time depending on decoding performance. For some video formats, precise seeks are disabled. This option selects the default choice to use for seeks; it is possible to explicitly override that default in the definition of key bindings and in input commands."
|
help = "Select when to use precise seeks that are not limited to keyframes. Such seeks require decoding video from the previous keyframe up to the target position and so can take some time depending on decoding performance. For some video formats, precise seeks are disabled. This option selects the default choice to use for seeks; it is possible to explicitly override that default in the definition of key bindings and in input commands."
|
||||||
@@ -385,6 +468,7 @@ options = [{ name = "yes", help = "Use precise seeks whenever possible." },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "track-auto-selection"
|
name = "track-auto-selection"
|
||||||
|
file = "mpv"
|
||||||
default = "yes"
|
default = "yes"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "Enable the default track auto-selection. Enabling this will make the player select streams according to aid, alang, and others. If it is disabled, no tracks are selected. In addition, the player will not exit if no tracks are selected, and wait instead (this wait mode is similar to pausing, but the pause option is not set).\n\nThis is useful with lavfi-complex: you can start playback in this mode, and then set select tracks at runtime by setting the filter graph. Note that if lavfi-complex is set before playback is started, the referenced tracks are always selected."
|
help = "Enable the default track auto-selection. Enabling this will make the player select streams according to aid, alang, and others. If it is disabled, no tracks are selected. In addition, the player will not exit if no tracks are selected, and wait instead (this wait mode is similar to pausing, but the pause option is not set).\n\nThis is useful with lavfi-complex: you can start playback in this mode, and then set select tracks at runtime by setting the filter graph. Note that if lavfi-complex is set before playback is started, the referenced tracks are always selected."
|
||||||
@@ -393,5 +477,85 @@ options = [{ name = "yes" },
|
|||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "loop-playlist"
|
name = "loop-playlist"
|
||||||
|
file = "mpv"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "<N|inf|force|no> Loops playback N times. A value of 1 plays it one time (default), 2 two times, etc. inf means forever. no is the same as 1 and disables looping. If several files are specified on command line, the entire playlist is looped. The force mode is like inf, but does not skip playlist entries which have been marked as failing. This means the player might waste CPU time trying to loop a file that doesn't exist. But it might be useful for playing webradios under very bad network conditions."
|
help = "<N|inf|force|no> Loops playback N times. A value of 1 plays it one time (default), 2 two times, etc. inf means forever. no is the same as 1 and disables looping. If several files are specified on command line, the entire playlist is looped. The force mode is like inf, but does not skip playlist entries which have been marked as failing. This means the player might waste CPU time trying to loop a file that doesn't exist. But it might be useful for playing webradios under very bad network conditions."
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "auto-load-folder"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "yes"
|
||||||
|
filter = "Playback"
|
||||||
|
help = "For single files automatically load the entire directory into the playlist. Can be suppressed via shift key. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "input-ar-delay"
|
||||||
|
file = "mpv"
|
||||||
|
filter = "Input"
|
||||||
|
help = "Delay in milliseconds before we start to autorepeat a key (0 to disable)."
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "input-ar-rate"
|
||||||
|
file = "mpv"
|
||||||
|
filter = "Input"
|
||||||
|
help = "Number of key presses to generate per second on autorepeat."
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "update-check"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "no"
|
||||||
|
filter = "General"
|
||||||
|
help = "Daily check for new version. (requires PowerShell 5 and curl. mpv.net specific setting)"
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "process-instance"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "single"
|
||||||
|
filter = "General"
|
||||||
|
help = "Defines if more then one mpv.net process is allowed. (mpv.net specific setting)\n\nTip: Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This not only works on process startup but in all mpv.net features that open files and URLs."
|
||||||
|
options = [{ name = "multi", help = "Create a new process everytime the shell starts mpv.net" },
|
||||||
|
{ name = "single", help = "Force a single process everytime the shell starts mpv.net" },
|
||||||
|
{ name = "queue", help = "Force a single process and add files to playlist" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "recent-count"
|
||||||
|
file = "mpvnet"
|
||||||
|
filter = "General"
|
||||||
|
help = "<int> Amount of recent files to be remembered. Default: 15 (mpv.net specific setting)"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "debug-mode"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "no"
|
||||||
|
filter = "General"
|
||||||
|
help = "Enable this only when a developer asks for it. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "dark-mode"
|
||||||
|
file = "mpvnet"
|
||||||
|
default = "always"
|
||||||
|
filter = "UI"
|
||||||
|
help = "Enables a dark theme. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "always" },
|
||||||
|
{ name = "system" , help = "Available on Windows 10 or higher" },
|
||||||
|
{ name = "never" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "dark-theme"
|
||||||
|
file = "mpvnet"
|
||||||
|
filter = "UI"
|
||||||
|
url = "https://github.com/stax76/mpv.net/blob/master/Manual.md#color-theme"
|
||||||
|
help = "Color theme used in dark mode. Default: dark"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "light-theme"
|
||||||
|
file = "mpvnet"
|
||||||
|
filter = "UI"
|
||||||
|
url = "https://github.com/stax76/mpv.net/blob/master/Manual.md#color-theme"
|
||||||
|
help = "Color theme used in light mode. Default: light"
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
# space character to make it easier to do a text search, so if you want to know
|
# space character to make it easier to do a text search, so if you want to know
|
||||||
# if 'o' has already a binding you can make a text search on ' o '.
|
# if 'o' has already a binding you can make a text search on ' o '.
|
||||||
|
|
||||||
# mpv input commands: https://github.com/stax76/mpv.net/wiki/mpv-input-commands
|
# mpv input commands: https://mpv.io/manual/master/#list-of-input-commands
|
||||||
|
|
||||||
# mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys
|
# mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys
|
||||||
|
|
||||||
@@ -134,6 +134,8 @@
|
|||||||
|
|
||||||
Ctrl+t set ontop yes #menu: View > On Top > Enable
|
Ctrl+t set ontop yes #menu: View > On Top > Enable
|
||||||
Ctrl+T set ontop no #menu: View > On Top > Disable
|
Ctrl+T set ontop no #menu: View > On Top > Disable
|
||||||
|
Alt++ no-osd set window-scale 1.2 #menu: View > Window Size > Enlarge
|
||||||
|
Alt+- no-osd set window-scale 0.8 #menu: View > Window Size > Shrink
|
||||||
b cycle border #menu: View > Toggle Border
|
b cycle border #menu: View > Toggle Border
|
||||||
i script-message mpv.net show-info #menu: View > File/Stream Info
|
i script-message mpv.net show-info #menu: View > File/Stream Info
|
||||||
t script-binding stats/display-stats #menu: View > Show Statistics
|
t script-binding stats/display-stats #menu: View > Show Statistics
|
||||||
@@ -155,21 +157,14 @@
|
|||||||
Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Toggle Hardware Decoding
|
Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Toggle Hardware Decoding
|
||||||
_ script-message mpv.net show-setup-dialog #menu: Tools > OS Setup...
|
_ script-message mpv.net show-setup-dialog #menu: Tools > OS Setup...
|
||||||
|
|
||||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/Manual.md #menu: Help > mpv.net Manual
|
_ script-message mpv.net shell-execute https://mpv.io #menu: Help > Website mpv
|
||||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net #menu: Help > mpv.net GitHub
|
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net #menu: Help > Website mpv.net
|
||||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/wiki #menu: Help > mpv.net Wiki
|
_ ignore #menu: Help > -
|
||||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net#support #menu: Help > mpv.net Support
|
_ script-message mpv.net shell-execute https://mpv.io/manual/stable/ #menu: Help > Manual mpv
|
||||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/releases #menu: Help > mpv.net Download
|
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/Manual.md #menu: Help > Manual mpv.net
|
||||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt #menu: Help > mpv.net Default Key Bindings
|
_ ignore #menu: Help > -
|
||||||
_ ignore #menu: Help > -
|
_ script-message mpv.net update-check #menu: Help > Check for Updates
|
||||||
_ script-message mpv.net shell-execute https://mpv.io/manual/stable/ #menu: Help > mpv Manual
|
_ script-message mpv.net show-about #menu: Help > About mpv.net
|
||||||
_ script-message mpv.net shell-execute https://github.com/mpv-player/mpv/wiki #menu: Help > mpv Wiki
|
|
||||||
_ script-message mpv.net shell-execute https://github.com/mpv-player/mpv/wiki/User-Scripts #menu: Help > mpv User Scripts
|
|
||||||
_ script-message mpv.net shell-execute https://mpv.io/bug-reports/ #menu: Help > mpv Bugs and Requests
|
|
||||||
_ script-message mpv.net shell-execute https://mpv.io/installation/ #menu: Help > mpv Download
|
|
||||||
_ script-message mpv.net shell-execute https://github.com/mpv-player/mpv/blob/master/etc/input.conf #menu: Help > mpv Default Key Bindings
|
|
||||||
_ ignore #menu: Help > -
|
|
||||||
_ script-message mpv.net show-about #menu: Help > About mpv.net
|
|
||||||
|
|
||||||
_ ignore #menu: -
|
_ ignore #menu: -
|
||||||
Esc quit #menu: Exit
|
Esc quit #menu: Exit
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ input-ar-rate = 20
|
|||||||
keep-open = yes
|
keep-open = yes
|
||||||
keep-open-pause = no
|
keep-open-pause = no
|
||||||
osd-playing-msg = '${filename}'
|
osd-playing-msg = '${filename}'
|
||||||
script-opts=osc-scalewindowed=1.5
|
script-opts = osc-scalewindowed=1.5
|
||||||
screenshot-directory = '~~desktop/'
|
screenshot-directory = '~~desktop/'
|
||||||
cscale = spline36
|
cscale = spline36
|
||||||
dscale = spline36
|
dscale = spline36
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
dark-color = '#1E90FF'
|
|
||||||
light-color = '#28394F'
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
[[settings]]
|
|
||||||
name = "process-instance"
|
|
||||||
default = "single"
|
|
||||||
filter = "General"
|
|
||||||
help = "Defines if more then one mpv.net process is allowed. (mpv.net specific setting)\n\nTip: Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This not only works on process startup but in all mpv.net features that open files and URLs."
|
|
||||||
options = [{ name = "multi", help = "Create a new process everytime the shell starts mpv.net" },
|
|
||||||
{ name = "single", help = "Force a single process everytime the shell starts mpv.net" },
|
|
||||||
{ name = "queue", help = "Force a single process and add files to playlist" }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "recent-count"
|
|
||||||
filter = "General"
|
|
||||||
help = "<int> Amount of recent files to be remembered. Default: 15 (mpv.net specific setting)"
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "start-size"
|
|
||||||
default = "previous"
|
|
||||||
filter = "Screen"
|
|
||||||
help = "Setting to remember the window height in the current session, otherwise the video's native resolution is used. (mpv.net specific setting)"
|
|
||||||
options = [{ name = "video", help = "Window size is set to native video resolution" },
|
|
||||||
{ name = "previous", help = "Window size is remembered but only from the current session" }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "start-threshold"
|
|
||||||
filter = "Screen"
|
|
||||||
help = "Threshold in milliseconds to wait for libmpv returning the video resolution before the window is shown, otherwise default dimensions are used as defined by autofit and start-size. Default: 1500 (mpv.net specific setting)"
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "minimum-aspect-ratio"
|
|
||||||
filter = "Screen"
|
|
||||||
help = "<float> Minimum aspect ratio for the window. Default: 1.3 (mpv.net specific setting)"
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "remember-position"
|
|
||||||
default = "no"
|
|
||||||
filter = "Screen"
|
|
||||||
help = "Save the window position on exit. (mpv.net specific setting)"
|
|
||||||
options = [{ name = "yes" },
|
|
||||||
{ name = "no" }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "maximized"
|
|
||||||
default = "no"
|
|
||||||
filter = "Screen"
|
|
||||||
help = "Start with a maximized window. (mpv.net specific setting)"
|
|
||||||
options = [{ name = "yes" },
|
|
||||||
{ name = "no" }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "remember-volume"
|
|
||||||
default = "yes"
|
|
||||||
filter = "Audio"
|
|
||||||
help = "Save volume and mute on exit and restore it on start. (mpv.net specific setting)"
|
|
||||||
options = [{ name = "yes" },
|
|
||||||
{ name = "no" }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "auto-load-folder"
|
|
||||||
default = "yes"
|
|
||||||
filter = "Playback"
|
|
||||||
help = "For single files automatically load the entire directory into the playlist. (mpv.net specific setting)"
|
|
||||||
options = [{ name = "yes" },
|
|
||||||
{ name = "no" }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "dark-mode"
|
|
||||||
default = "always"
|
|
||||||
filter = "UI"
|
|
||||||
help = "Enables a dark theme. (mpv.net specific setting)"
|
|
||||||
options = [{ name = "always" },
|
|
||||||
{ name = "system" , help = "Available on Windows 10 or higher" },
|
|
||||||
{ name = "never" }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "dark-color"
|
|
||||||
type = "color"
|
|
||||||
filter = "UI"
|
|
||||||
help = "Theme color used in dark-mode. Leave empty to use OS theme. (mpv.net specific setting)"
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "light-color"
|
|
||||||
type = "color"
|
|
||||||
filter = "UI"
|
|
||||||
help = "Theme color used when dark-mode is disabled. Leave empty to use OS theme. (mpv.net specific setting)"
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "themed-menu"
|
|
||||||
default = "no"
|
|
||||||
filter = "UI"
|
|
||||||
help = "Follow theme color in context menu. (mpv.net specific setting)"
|
|
||||||
options = [{ name = "yes" },
|
|
||||||
{ name = "no" }]
|
|
||||||
|
|
||||||
[[settings]]
|
|
||||||
name = "debug-mode"
|
|
||||||
default = "no"
|
|
||||||
filter = "General"
|
|
||||||
help = "Enable this only when a developer asks for it. (mpv.net specific setting)"
|
|
||||||
options = [{ name = "yes" },
|
|
||||||
{ name = "no" }]
|
|
||||||
27
mpv.net/Resources/theme.txt
Normal file
27
mpv.net/Resources/theme.txt
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
[dark]
|
||||||
|
|
||||||
|
heading = #1E90FF
|
||||||
|
foreground = #DDDDDD
|
||||||
|
foreground2 = #AAAAAA
|
||||||
|
background = #323232
|
||||||
|
|
||||||
|
menu-foreground = #DDDDDD
|
||||||
|
menu-background = #323232
|
||||||
|
menu-highlight = #505050
|
||||||
|
menu-border = #FFFFFF
|
||||||
|
menu-checked = #5A5A5A
|
||||||
|
|
||||||
|
|
||||||
|
[light]
|
||||||
|
|
||||||
|
heading = #0068B2
|
||||||
|
foreground = #000000
|
||||||
|
foreground2 = #4C4C4C
|
||||||
|
background = #F7F7F7
|
||||||
|
|
||||||
|
menu-foreground = #000000
|
||||||
|
menu-background = #DFDFDF
|
||||||
|
menu-highlight = #BFBFBF
|
||||||
|
menu-border = #6A6A6A
|
||||||
|
menu-checked = #AAAAAA
|
||||||
@@ -94,20 +94,24 @@ namespace mpvnet
|
|||||||
|
|
||||||
public void Output_DataReady(object sender, EventArgs e)
|
public void Output_DataReady(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (!WriteStandard) return;
|
if (!WriteStandard)
|
||||||
|
return;
|
||||||
|
|
||||||
var output = sender as PipelineReader<PSObject>;
|
var output = sender as PipelineReader<PSObject>;
|
||||||
|
|
||||||
while (output.Count > 0)
|
while (output.Count > 0)
|
||||||
Console.WriteLine("[" + ModuleName + "] " + output.Read().ToString());
|
Console.WriteLine("[" + ModuleName + "] " + output.Read().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Error_DataReady(object sender, EventArgs e)
|
public void Error_DataReady(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (!WriteError) return;
|
if (!WriteError)
|
||||||
|
return;
|
||||||
|
|
||||||
var output = sender as PipelineReader<Object>;
|
var output = sender as PipelineReader<Object>;
|
||||||
Console.ForegroundColor = ConsoleColor.Red;
|
|
||||||
while (output.Count > 0)
|
while (output.Count > 0)
|
||||||
Console.WriteLine("[" + ModuleName + "] " + output.Read().ToString());
|
ConsoleHelp.WriteError("[" + ModuleName + "] " + output.Read().ToString());
|
||||||
Console.ResetColor();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
23
mpv.net/Update.ps1
Normal file
23
mpv.net/Update.ps1
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
$targetDir = (Split-Path $args[1]) + "\new version"
|
||||||
|
$targetFile = $targetDir + '.7z'
|
||||||
|
|
||||||
|
Write-Host 'Download new version' -ForegroundColor Green
|
||||||
|
curl.exe $args[0] --location --output $targetFile
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
Write-Host 'Unpack new version' -ForegroundColor Green
|
||||||
|
& ($args[1] + '\7z\7za.exe') x -y $targetFile -o"$targetDir"
|
||||||
|
if ($LastExitCode) { throw $LastExitCode }
|
||||||
|
|
||||||
|
Write-Host 'Delete downloaded file' -ForegroundColor Green
|
||||||
|
Remove-Item $targetFile -Force -Recurse
|
||||||
|
|
||||||
|
Write-Host 'Delete current version' -ForegroundColor Green
|
||||||
|
Remove-Item $args[1] -Force -Recurse
|
||||||
|
|
||||||
|
Write-Host 'Rename directory' -ForegroundColor Green
|
||||||
|
Rename-Item $targetDir (Split-Path $args[1] -Leaf)
|
||||||
|
|
||||||
|
Write-Host 'Update is complete' -ForegroundColor Green
|
||||||
@@ -3,9 +3,19 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="About mpv.net" Height="230" Width="400" FontSize="16" ShowInTaskbar="False"
|
|
||||||
WindowStartupLocation="CenterOwner" ResizeMode="NoResize">
|
Title="About mpv.net"
|
||||||
|
Height="230"
|
||||||
|
Width="400"
|
||||||
|
FontSize="16"
|
||||||
|
ShowInTaskbar="False"
|
||||||
|
WindowStartupLocation="CenterOwner"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}">
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
|
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||||
<TextBlock FontSize="48" HorizontalAlignment="Center" Margin="0,0,0,10">mpv.net</TextBlock>
|
<TextBlock FontSize="48" HorizontalAlignment="Center" Margin="0,0,0,10">mpv.net</TextBlock>
|
||||||
|
|||||||
@@ -3,21 +3,41 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Command Palette" Height="295" Width="400" ResizeMode="NoResize"
|
|
||||||
WindowStartupLocation="CenterOwner" Loaded="Window_Loaded" FontSize="13">
|
Title="Command Palette"
|
||||||
|
Height="295"
|
||||||
|
Width="400"
|
||||||
|
FontSize="13"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
WindowStartupLocation="CenterOwner"
|
||||||
|
Loaded="Window_Loaded">
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition></RowDefinition>
|
<RowDefinition></RowDefinition>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<TextBox Name="FilterTextBox" PreviewKeyDown="FilterTextBox_PreviewKeyDown" TextChanged="FilterTextBox_TextChanged"></TextBox>
|
|
||||||
<ListView Name="ListView" Grid.Row="1" MouseUp="ListView_MouseUp">
|
<TextBox Name="FilterTextBox"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
PreviewKeyDown="FilterTextBox_PreviewKeyDown"
|
||||||
|
TextChanged="FilterTextBox_TextChanged"/>
|
||||||
|
|
||||||
|
<ListView Name="ListView"
|
||||||
|
Grid.Row="1"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
MouseUp="ListView_MouseUp">
|
||||||
|
|
||||||
<ListView.ItemContainerStyle>
|
<ListView.ItemContainerStyle>
|
||||||
<Style TargetType="ListBoxItem">
|
<Style TargetType="ListBoxItem">
|
||||||
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
|
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
|
||||||
</Style>
|
</Style>
|
||||||
</ListView.ItemContainerStyle>
|
</ListView.ItemContainerStyle>
|
||||||
|
|
||||||
<ListView.ItemTemplate>
|
<ListView.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<Grid>
|
<Grid>
|
||||||
@@ -25,8 +45,12 @@
|
|||||||
<ColumnDefinition />
|
<ColumnDefinition />
|
||||||
<ColumnDefinition />
|
<ColumnDefinition />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<TextBlock Text="{Binding Path}"></TextBlock>
|
<TextBlock Text="{Binding Path}"></TextBlock>
|
||||||
<TextBlock Grid.Column="1" Text="{Binding Input}" HorizontalAlignment="Right"></TextBlock>
|
|
||||||
|
<TextBlock Grid.Column="1"
|
||||||
|
Text="{Binding Input}"
|
||||||
|
HorizontalAlignment="Right"></TextBlock>
|
||||||
</Grid>
|
</Grid>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ListView.ItemTemplate>
|
</ListView.ItemTemplate>
|
||||||
|
|||||||
@@ -23,14 +23,6 @@ namespace mpvnet
|
|||||||
var yourCostumFilter = new Predicate<object>(item => Filter((CommandItem)item));
|
var yourCostumFilter = new Predicate<object>(item => Filter((CommandItem)item));
|
||||||
CollectionView.Filter = yourCostumFilter;
|
CollectionView.Filter = yourCostumFilter;
|
||||||
ListView.ItemsSource = CollectionView;
|
ListView.ItemsSource = CollectionView;
|
||||||
|
|
||||||
if (App.IsDarkMode)
|
|
||||||
{
|
|
||||||
ListView.Foreground = Brushes.White;
|
|
||||||
ListView.Background = Brushes.Black;
|
|
||||||
FilterTextBox.Foreground = Brushes.White;
|
|
||||||
FilterTextBox.Background = Brushes.Black;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Filter(CommandItem item)
|
bool Filter(CommandItem item)
|
||||||
|
|||||||
@@ -3,35 +3,63 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:WPF="clr-namespace:WPF"
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Height="530" Width="700" Loaded="ConfWindow1_Loaded" ShowInTaskbar="False"
|
|
||||||
WindowStartupLocation="CenterScreen" Title="Config Editor">
|
Title="Config Editor"
|
||||||
|
Height="530"
|
||||||
|
Width="700"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
ShowInTaskbar="False"
|
||||||
|
WindowStartupLocation="CenterScreen"
|
||||||
|
Loaded="ConfWindow1_Loaded">
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="100" />
|
<ColumnDefinition Width="100" />
|
||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Controls:SearchTextBoxUserControl HintText="Find a setting" x:Name="SearchControl" Width="250" Margin="0,20,0,0" Grid.ColumnSpan="2"/>
|
|
||||||
<ScrollViewer x:Name="MainScrollViewer" VerticalScrollBarVisibility="Auto" Grid.Row="1" Grid.Column="2" Margin="0,0,0,10">
|
<Controls:SearchTextBoxUserControl HintText="Find a setting"
|
||||||
|
x:Name="SearchControl"
|
||||||
|
Width="250"
|
||||||
|
Margin="0,20,0,0"
|
||||||
|
Grid.ColumnSpan="2"/>
|
||||||
|
|
||||||
|
<ScrollViewer x:Name="MainScrollViewer"
|
||||||
|
VerticalScrollBarVisibility="Auto"
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="0,0,0,10">
|
||||||
|
|
||||||
<StackPanel x:Name="MainStackPanel"></StackPanel>
|
<StackPanel x:Name="MainStackPanel"></StackPanel>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
||||||
<StackPanel Margin="20,0,0,0" Grid.Row="1">
|
<StackPanel Margin="20,0,0,0" Grid.Row="1">
|
||||||
<ListBox x:Name="FilterListBox" ItemsSource="{Binding FilterStrings}" BorderThickness="0" SelectionChanged="FilterListBox_SelectionChanged" Foreground="{x:Static WPF:WPF.ThemeBrush}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
|
<ListBox x:Name="FilterListBox"
|
||||||
|
ItemsSource="{Binding FilterStrings}"
|
||||||
|
BorderThickness="0"
|
||||||
|
SelectionChanged="FilterListBox_SelectionChanged"
|
||||||
|
Foreground="{x:Static UI:Theme.Heading}"
|
||||||
|
Background="{x:Static UI:Theme.Background}">
|
||||||
|
|
||||||
<ListBox.ItemTemplate>
|
<ListBox.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<TextBlock Text="{Binding}" FontSize="16" />
|
<TextBlock Text="{Binding}" FontSize="16" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ListBox.ItemTemplate>
|
</ListBox.ItemTemplate>
|
||||||
</ListBox>
|
</ListBox>
|
||||||
<TextBlock x:Name="OpenSettingsTextBlock" Margin="0,30,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static WPF:WPF.ThemeBrush}" MouseUp="OpenSettingsTextBlock_MouseUp">Open config folder</TextBlock>
|
|
||||||
<TextBlock x:Name="PreviewTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static WPF:WPF.ThemeBrush}" MouseUp="PreviewTextBlock_MouseUp">Preview mpv.conf</TextBlock>
|
<TextBlock x:Name="OpenSettingsTextBlock" Margin="0,30,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static UI:Theme.Heading}" MouseUp="OpenSettingsTextBlock_MouseUp">Open config folder</TextBlock>
|
||||||
<TextBlock x:Name="ShowManualTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static WPF:WPF.ThemeBrush}" MouseUp="ShowManualTextBlock_MouseUp">Show mpv manual</TextBlock>
|
<TextBlock x:Name="PreviewTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static UI:Theme.Heading}" MouseUp="PreviewTextBlock_MouseUp">Preview mpv.conf</TextBlock>
|
||||||
<TextBlock x:Name="SupportTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static WPF:WPF.ThemeBrush}" MouseUp="SupportTextBlock_MouseUp">Show support forum</TextBlock>
|
<TextBlock x:Name="ShowManualTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static UI:Theme.Heading}" MouseUp="ShowManualTextBlock_MouseUp">Show mpv manual</TextBlock>
|
||||||
|
<TextBlock x:Name="SupportTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static UI:Theme.Heading}" MouseUp="SupportTextBlock_MouseUp">Show support forum</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Media;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
using DynamicGUI;
|
using DynamicGUI;
|
||||||
|
|
||||||
@@ -15,8 +16,8 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
public partial class ConfWindow : Window
|
public partial class ConfWindow : Window
|
||||||
{
|
{
|
||||||
private List<SettingBase> SettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvConfToml);
|
List<SettingBase> SettingsDefinitions = Settings.LoadSettings(Properties.Resources.confToml);
|
||||||
private List<SettingBase> NetSettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvNetConfToml);
|
List<ConfItem> ConfItems = new List<ConfItem>();
|
||||||
public ObservableCollection<string> FilterStrings { get; } = new ObservableCollection<string>();
|
public ObservableCollection<string> FilterStrings { get; } = new ObservableCollection<string>();
|
||||||
string InitialContent;
|
string InitialContent;
|
||||||
|
|
||||||
@@ -25,41 +26,27 @@ namespace mpvnet
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
DataContext = this;
|
DataContext = this;
|
||||||
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
||||||
LoadSettings(SettingsDefinitions, Conf);
|
LoadConf(mp.ConfPath);
|
||||||
LoadSettings(NetSettingsDefinitions, NetConf);
|
LoadConf(App.ConfPath);
|
||||||
InitialContent = GetContent(mp.ConfPath, Conf, SettingsDefinitions) +
|
LoadSettings();
|
||||||
GetContent(App.ConfPath, NetConf, NetSettingsDefinitions);
|
InitialContent = GetCompareString();
|
||||||
SearchControl.Text = RegHelp.GetString(App.RegPath, "ConfigEditorSearch");
|
SearchControl.Text = RegistryHelp.GetString(App.RegPath, "ConfigEditorSearch");
|
||||||
|
|
||||||
if (App.IsDarkMode)
|
|
||||||
{
|
|
||||||
Foreground = Brushes.White;
|
|
||||||
Foreground2 = Brushes.Silver;
|
|
||||||
Background = Brushes.Black;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Brush Foreground2 {
|
private void LoadSettings()
|
||||||
get { return (Brush)GetValue(Foreground2Property); }
|
|
||||||
set { SetValue(Foreground2Property, value); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public static readonly DependencyProperty Foreground2Property =
|
|
||||||
DependencyProperty.Register("Foreground2", typeof(Brush), typeof(ConfWindow), new PropertyMetadata(Brushes.DarkSlateGray));
|
|
||||||
|
|
||||||
private void LoadSettings(List<SettingBase> settingsDefinitions,
|
|
||||||
Dictionary<string, string> confSettings)
|
|
||||||
{
|
{
|
||||||
foreach (SettingBase setting in settingsDefinitions)
|
foreach (SettingBase setting in SettingsDefinitions)
|
||||||
{
|
{
|
||||||
if (!FilterStrings.Contains(setting.Filter))
|
if (!FilterStrings.Contains(setting.Filter))
|
||||||
FilterStrings.Add(setting.Filter);
|
FilterStrings.Add(setting.Filter);
|
||||||
|
|
||||||
foreach (var pair in confSettings)
|
foreach (ConfItem confItem in ConfItems)
|
||||||
{
|
{
|
||||||
if (setting.Name == pair.Key)
|
if (setting.Name == confItem.Name && confItem.Section == "" && !confItem.IsSectionItem)
|
||||||
{
|
{
|
||||||
setting.Value = pair.Value.Trim('\'', '"');
|
setting.Value = confItem.Value.Trim('\'', '"');
|
||||||
|
setting.ConfItem = confItem;
|
||||||
|
confItem.SettingBase = setting;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,97 +55,196 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
case StringSetting s:
|
case StringSetting s:
|
||||||
var sc = new StringSettingControl(s);
|
var sc = new StringSettingControl(s);
|
||||||
sc.TitleTextBox.Foreground = WPF.WPF.ThemeBrush;
|
|
||||||
MainStackPanel.Children.Add(sc);
|
MainStackPanel.Children.Add(sc);
|
||||||
break;
|
break;
|
||||||
case OptionSetting s:
|
case OptionSetting s:
|
||||||
var oc = new OptionSettingControl(s);
|
var oc = new OptionSettingControl(s);
|
||||||
oc.TitleTextBox.Foreground = WPF.WPF.ThemeBrush;
|
|
||||||
MainStackPanel.Children.Add(oc);
|
MainStackPanel.Children.Add(oc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dictionary<string, string> _Conf;
|
|
||||||
|
|
||||||
public Dictionary<string, string> Conf {
|
|
||||||
get {
|
|
||||||
if (_Conf == null) _Conf = LoadConf(mp.ConfPath);
|
|
||||||
return _Conf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Dictionary<string, string> _NetConf;
|
|
||||||
|
|
||||||
public Dictionary<string, string> NetConf {
|
|
||||||
get {
|
|
||||||
if (_NetConf == null) _NetConf = LoadConf(App.ConfPath);
|
|
||||||
return _NetConf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Dictionary<string, string> LoadConf(string filePath)
|
|
||||||
{
|
|
||||||
Dictionary<string, string> conf = new Dictionary<string, string>();
|
|
||||||
|
|
||||||
if (File.Exists(filePath))
|
|
||||||
{
|
|
||||||
foreach (string i in File.ReadAllLines(filePath))
|
|
||||||
{
|
|
||||||
if (i.Contains("="))
|
|
||||||
{
|
|
||||||
int pos = i.IndexOf("=");
|
|
||||||
string left = i.Substring(0, pos).Trim().ToLower();
|
|
||||||
string right = i.Substring(pos + 1).Trim();
|
|
||||||
if (left.StartsWith("#")) continue;
|
|
||||||
if (left == "fs") left = "fullscreen";
|
|
||||||
if (left == "loop") left = "loop-file";
|
|
||||||
conf[left] = right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnClosed(EventArgs e)
|
protected override void OnClosed(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnClosed(e);
|
base.OnClosed(e);
|
||||||
RegHelp.SetObject(App.RegPath, "ConfigEditorSearch", SearchControl.Text);
|
RegistryHelp.SetValue(App.RegPath, "ConfigEditorSearch", SearchControl.Text);
|
||||||
string content = GetContent(mp.ConfPath, Conf, SettingsDefinitions);
|
|
||||||
string netContent = GetContent(App.ConfPath, NetConf, NetSettingsDefinitions);
|
if (InitialContent == GetCompareString())
|
||||||
if (InitialContent == content + netContent) return;
|
return;
|
||||||
File.WriteAllText(mp.ConfPath, content);
|
|
||||||
File.WriteAllText(App.ConfPath, netContent);
|
File.WriteAllText(mp.ConfPath, GetContent("mpv"));
|
||||||
|
File.WriteAllText(App.ConfPath, GetContent("mpvnet"));
|
||||||
Msg.Show("Changes will be available on next mpv.net startup.");
|
Msg.Show("Changes will be available on next mpv.net startup.");
|
||||||
}
|
}
|
||||||
|
|
||||||
string GetContent(string filePath, Dictionary<string, string> confSettings, List<SettingBase> settings)
|
string GetCompareString()
|
||||||
{
|
{
|
||||||
string content = "";
|
return string.Join("", SettingsDefinitions.Select(item => item.Name + item.Value).ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
foreach (SettingBase setting in settings)
|
void LoadConf(string file)
|
||||||
|
{
|
||||||
|
if (!File.Exists(file))
|
||||||
|
return;
|
||||||
|
|
||||||
|
string comment = "";
|
||||||
|
string section = "";
|
||||||
|
bool isSectionItem = false;
|
||||||
|
|
||||||
|
foreach (string currentLine in File.ReadAllLines(file))
|
||||||
{
|
{
|
||||||
|
string line = currentLine.Trim();
|
||||||
|
|
||||||
|
if (line == "")
|
||||||
|
{
|
||||||
|
comment += "\r\n";
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("#"))
|
||||||
|
{
|
||||||
|
comment += line.Trim() + "\r\n";
|
||||||
|
}
|
||||||
|
else if (line.StartsWith("[") && line.Contains("]"))
|
||||||
|
{
|
||||||
|
if (!isSectionItem && comment != "" && comment != "\r\n")
|
||||||
|
ConfItems.Add(new ConfItem() {
|
||||||
|
Comment = comment, File = Path.GetFileNameWithoutExtension(file)});
|
||||||
|
|
||||||
|
section = line.Substring(0, line.IndexOf("]") + 1);
|
||||||
|
comment = "";
|
||||||
|
isSectionItem = true;
|
||||||
|
}
|
||||||
|
else if (line.Contains("="))
|
||||||
|
{
|
||||||
|
ConfItem item = new ConfItem();
|
||||||
|
item.File = Path.GetFileNameWithoutExtension(file);
|
||||||
|
item.IsSectionItem = isSectionItem;
|
||||||
|
item.Comment = comment;
|
||||||
|
comment = "";
|
||||||
|
item.Section = section;
|
||||||
|
section = "";
|
||||||
|
|
||||||
|
if (line.Contains("#") && !line.Contains("'") && !line.Contains("\""))
|
||||||
|
{
|
||||||
|
item.LineComment = line.Substring(line.IndexOf("#")).Trim();
|
||||||
|
line = line.Substring(0, line.IndexOf("#")).Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
int pos = line.IndexOf("=");
|
||||||
|
string left = line.Substring(0, pos).Trim().ToLower();
|
||||||
|
string right = line.Substring(pos + 1).Trim();
|
||||||
|
|
||||||
|
if (left == "fs")
|
||||||
|
left = "fullscreen";
|
||||||
|
|
||||||
|
if (left == "loop")
|
||||||
|
left = "loop-file";
|
||||||
|
|
||||||
|
item.Name = left;
|
||||||
|
item.Value = right;
|
||||||
|
ConfItems.Add(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetContent(string filename)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
List<string> namesWritten = new List<string>();
|
||||||
|
|
||||||
|
foreach (ConfItem item in ConfItems)
|
||||||
|
{
|
||||||
|
if (filename != item.File || item.Section != "" || item.IsSectionItem)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (item.Comment != "")
|
||||||
|
sb.Append(item.Comment);
|
||||||
|
|
||||||
|
if (item.SettingBase == null)
|
||||||
|
{
|
||||||
|
if (item.Name != "")
|
||||||
|
{
|
||||||
|
sb.Append(item.Name + " = " + item.Value);
|
||||||
|
|
||||||
|
if (item.LineComment != "")
|
||||||
|
sb.Append(" " + item.LineComment);
|
||||||
|
|
||||||
|
sb.AppendLine();
|
||||||
|
namesWritten.Add(item.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((item.SettingBase.Value ?? "") != item.SettingBase.Default)
|
||||||
|
{
|
||||||
|
string value = "";
|
||||||
|
|
||||||
|
if (item.SettingBase.Type == "string" ||
|
||||||
|
item.SettingBase.Type == "folder" ||
|
||||||
|
item.SettingBase.Type == "color")
|
||||||
|
|
||||||
|
value = "'" + item.SettingBase.Value + "'";
|
||||||
|
else
|
||||||
|
value = item.SettingBase.Value;
|
||||||
|
|
||||||
|
sb.Append(item.Name + " = " + value);
|
||||||
|
|
||||||
|
if (item.LineComment != "")
|
||||||
|
sb.Append(" " + item.LineComment);
|
||||||
|
|
||||||
|
sb.AppendLine();
|
||||||
|
namesWritten.Add(item.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sb.ToString().Contains("# Editor"))
|
||||||
|
sb.AppendLine("# Editor");
|
||||||
|
|
||||||
|
foreach (SettingBase setting in SettingsDefinitions)
|
||||||
|
{
|
||||||
|
if (filename != setting.File || namesWritten.Contains(setting.Name))
|
||||||
|
continue;
|
||||||
|
|
||||||
if ((setting.Value ?? "") != setting.Default)
|
if ((setting.Value ?? "") != setting.Default)
|
||||||
|
{
|
||||||
|
string value = "";
|
||||||
|
|
||||||
if (setting.Type == "string" ||
|
if (setting.Type == "string" ||
|
||||||
setting.Type == "folder" ||
|
setting.Type == "folder" ||
|
||||||
setting.Type == "color")
|
setting.Type == "color")
|
||||||
|
|
||||||
confSettings[setting.Name] = "'" + setting.Value + "'";
|
value = "'" + setting.Value + "'";
|
||||||
else
|
else
|
||||||
confSettings[setting.Name] = setting.Value;
|
value = setting.Value;
|
||||||
|
|
||||||
if (confSettings.ContainsKey(setting.Name) &&
|
sb.AppendLine(setting.Name + " = " + value);
|
||||||
(setting.Value ?? "") == setting.Default ||
|
}
|
||||||
(setting.Value ?? "") == "")
|
|
||||||
|
|
||||||
confSettings.Remove(setting.Name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var i in confSettings)
|
foreach (ConfItem item in ConfItems)
|
||||||
content = content + $"{i.Key} = {i.Value}\r\n";
|
{
|
||||||
|
if (filename != item.File || (item.Section == "" && !item.IsSectionItem))
|
||||||
|
continue;
|
||||||
|
|
||||||
return content;
|
if (item.Section != "")
|
||||||
|
{
|
||||||
|
if (!sb.ToString().EndsWith("\r\n\r\n"))
|
||||||
|
sb.AppendLine();
|
||||||
|
|
||||||
|
sb.AppendLine(item.Section);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.Comment != "")
|
||||||
|
sb.Append(item.Comment);
|
||||||
|
|
||||||
|
sb.Append(item.Name + " = " + item.Value);
|
||||||
|
|
||||||
|
if (item.LineComment != "")
|
||||||
|
sb.Append(" " + item.LineComment);
|
||||||
|
|
||||||
|
sb.AppendLine();
|
||||||
|
namesWritten.Add(item.Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return "\r\n" + sb.ToString().Trim() + "\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||||
@@ -210,7 +296,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
private void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
private void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||||
{
|
{
|
||||||
Msg.Show("mpv.conf Preview", GetContent(mp.ConfPath, Conf, SettingsDefinitions));
|
Msg.Show("mpv.conf Preview", GetContent("mpv"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
private void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||||
@@ -226,6 +312,7 @@ namespace mpvnet
|
|||||||
protected override void OnKeyDown(KeyEventArgs e)
|
protected override void OnKeyDown(KeyEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnKeyDown(e);
|
base.OnKeyDown(e);
|
||||||
|
|
||||||
if (e.Key == Key.Escape)
|
if (e.Key == Key.Escape)
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,21 +3,42 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Media File Search" Height="300" Width="600" ResizeMode="NoResize"
|
|
||||||
WindowStartupLocation="CenterOwner" Loaded="Window_Loaded" FontSize="13">
|
Title="Media File Search"
|
||||||
|
FontSize="13"
|
||||||
|
Height="300"
|
||||||
|
Width="600"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
WindowStartupLocation="CenterOwner"
|
||||||
|
Loaded="Window_Loaded">
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition></RowDefinition>
|
<RowDefinition></RowDefinition>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<TextBox Name="FilterTextBox" PreviewKeyDown="FilterTextBox_PreviewKeyDown" TextChanged="FilterTextBox_TextChanged"></TextBox>
|
|
||||||
<ListView Name="ListView" Grid.Row="1" MouseUp="ListView_MouseUp" PreviewKeyDown="ListView_PreviewKeyDown">
|
<TextBox Name="FilterTextBox"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
PreviewKeyDown="FilterTextBox_PreviewKeyDown"
|
||||||
|
TextChanged="FilterTextBox_TextChanged"/>
|
||||||
|
|
||||||
|
<ListView Name="ListView"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
Grid.Row="1"
|
||||||
|
MouseUp="ListView_MouseUp"
|
||||||
|
PreviewKeyDown="ListView_PreviewKeyDown">
|
||||||
|
|
||||||
<ListView.ItemContainerStyle>
|
<ListView.ItemContainerStyle>
|
||||||
<Style TargetType="ListBoxItem">
|
<Style TargetType="ListBoxItem">
|
||||||
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
|
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
|
||||||
</Style>
|
</Style>
|
||||||
</ListView.ItemContainerStyle>
|
</ListView.ItemContainerStyle>
|
||||||
|
|
||||||
</ListView>
|
</ListView>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
@@ -8,7 +9,6 @@ using System.Windows;
|
|||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Interop;
|
using System.Windows.Interop;
|
||||||
using System.Windows.Media;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -17,19 +17,10 @@ namespace mpvnet
|
|||||||
public EverythingWindow()
|
public EverythingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
if (App.IsDarkMode)
|
|
||||||
{
|
|
||||||
ListView.Foreground = Brushes.White;
|
|
||||||
ListView.Background = Brushes.Black;
|
|
||||||
FilterTextBox.Foreground = Brushes.White;
|
|
||||||
FilterTextBox.Background = Brushes.Black;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const int EVERYTHING_REQUEST_FILE_NAME = 0x00000001;
|
const int EVERYTHING_REQUEST_FILE_NAME = 0x00000001;
|
||||||
const int EVERYTHING_REQUEST_PATH = 0x00000002;
|
const int EVERYTHING_REQUEST_PATH = 0x00000002;
|
||||||
const int EVERYTHING_SORT_SIZE_DESCENDING = 6;
|
|
||||||
|
|
||||||
[DllImport("Everything.dll", CharSet = CharSet.Unicode)]
|
[DllImport("Everything.dll", CharSet = CharSet.Unicode)]
|
||||||
public static extern int Everything_SetSearch(string lpSearchString);
|
public static extern int Everything_SetSearch(string lpSearchString);
|
||||||
@@ -69,6 +60,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (msg == 0x200 /*WM_MOUSEMOVE*/ && Mouse.LeftButton != MouseButtonState.Pressed)
|
if (msg == 0x200 /*WM_MOUSEMOVE*/ && Mouse.LeftButton != MouseButtonState.Pressed)
|
||||||
handled = true;
|
handled = true;
|
||||||
|
|
||||||
return IntPtr.Zero;
|
return IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,14 +93,18 @@ namespace mpvnet
|
|||||||
|
|
||||||
private void ListView_PreviewKeyDown(object sender, KeyEventArgs e)
|
private void ListView_PreviewKeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.Key == Key.Escape) Close();
|
if (e.Key == Key.Escape)
|
||||||
if (e.Key == Key.Enter) Execute();
|
Close();
|
||||||
|
|
||||||
|
if (e.Key == Key.Enter)
|
||||||
|
Execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Execute()
|
void Execute()
|
||||||
{
|
{
|
||||||
if (ListView.SelectedItem != null)
|
if (ListView.SelectedItem != null)
|
||||||
mp.Load(new[] { ListView.SelectedItem as string }, true, Keyboard.Modifiers == ModifierKeys.Control);
|
mp.Load(new[] { ListView.SelectedItem as string }, true, Keyboard.Modifiers == ModifierKeys.Control);
|
||||||
|
|
||||||
Keyboard.Focus(FilterTextBox);
|
Keyboard.Focus(FilterTextBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,19 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Input Editor" Height="500" Width="750" FontSize="13"
|
|
||||||
Loaded="Window_Loaded" Closed="Window_Closed" ShowInTaskbar="False">
|
Title="Input Editor"
|
||||||
|
Height="500"
|
||||||
|
Width="750"
|
||||||
|
FontSize="13"
|
||||||
|
ShowInTaskbar="False"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
Loaded="Window_Loaded"
|
||||||
|
Closed="Window_Closed">
|
||||||
|
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<Style x:Key="DataGrid_Font_Centering" TargetType="{x:Type DataGridCell}">
|
<Style x:Key="DataGrid_Font_Centering" TargetType="{x:Type DataGridCell}">
|
||||||
<Setter Property="Template">
|
<Setter Property="Template">
|
||||||
@@ -19,15 +29,29 @@
|
|||||||
</Setter>
|
</Setter>
|
||||||
</Style>
|
</Style>
|
||||||
</Window.Resources>
|
</Window.Resources>
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Controls:SearchTextBoxUserControl HintText="Type ? to get help." x:Name="SearchControl" Width="300" Margin="0,20,0,20" Grid.ColumnSpan="2" />
|
|
||||||
<DataGrid Grid.Row="1" x:Name="DataGrid" CommandManager.PreviewCanExecute="DataGrid_PreviewCanExecute" AutoGenerateColumns="False" CellStyle="{StaticResource DataGrid_Font_Centering}">
|
<Controls:SearchTextBoxUserControl
|
||||||
|
HintText="Type ? to get help."
|
||||||
|
x:Name="SearchControl"
|
||||||
|
Width="300"
|
||||||
|
Margin="0,20,0,20"
|
||||||
|
Grid.ColumnSpan="2" />
|
||||||
|
|
||||||
|
<DataGrid x:Name="DataGrid"
|
||||||
|
Grid.Row="1"
|
||||||
|
CommandManager.PreviewCanExecute="DataGrid_PreviewCanExecute"
|
||||||
|
AutoGenerateColumns="False"
|
||||||
|
CellStyle="{StaticResource DataGrid_Font_Centering}" >
|
||||||
|
|
||||||
<DataGrid.Columns>
|
<DataGrid.Columns>
|
||||||
<DataGridTextColumn Header="Menu" Binding="{Binding Path}"/>
|
<DataGridTextColumn Header="Menu" Binding="{Binding Path}"/>
|
||||||
|
|
||||||
<DataGridTemplateColumn Header="Input">
|
<DataGridTemplateColumn Header="Input">
|
||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
@@ -37,7 +61,9 @@
|
|||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</DataGridTemplateColumn.CellTemplate>
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
</DataGridTemplateColumn>
|
</DataGridTemplateColumn>
|
||||||
|
|
||||||
<DataGridTextColumn Header="Command" Binding="{Binding Command}" MaxWidth="330" />
|
<DataGridTextColumn Header="Command" Binding="{Binding Command}" MaxWidth="330" />
|
||||||
|
|
||||||
</DataGrid.Columns>
|
</DataGrid.Columns>
|
||||||
</DataGrid>
|
</DataGrid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
@@ -6,7 +7,6 @@ using System.Windows;
|
|||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Data;
|
using System.Windows.Data;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Media;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -26,23 +26,8 @@ namespace mpvnet
|
|||||||
var yourCostumFilter = new Predicate<object>(item => Filter((CommandItem)item));
|
var yourCostumFilter = new Predicate<object>(item => Filter((CommandItem)item));
|
||||||
CollectionView.Filter = yourCostumFilter;
|
CollectionView.Filter = yourCostumFilter;
|
||||||
DataGrid.ItemsSource = CollectionView;
|
DataGrid.ItemsSource = CollectionView;
|
||||||
|
|
||||||
if (App.IsDarkMode)
|
|
||||||
{
|
|
||||||
Foreground = Brushes.White;
|
|
||||||
Foreground2 = Brushes.Silver;
|
|
||||||
Background = Brushes.Black;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Brush Foreground2 {
|
|
||||||
get { return (Brush)GetValue(Foreground2Property); }
|
|
||||||
set { SetValue(Foreground2Property, value); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public static readonly DependencyProperty Foreground2Property =
|
|
||||||
DependencyProperty.Register("Foreground2", typeof(Brush), typeof(InputWindow), new PropertyMetadata(Brushes.DarkSlateGray));
|
|
||||||
|
|
||||||
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||||
{
|
{
|
||||||
CollectionView.Refresh();
|
CollectionView.Refresh();
|
||||||
|
|||||||
@@ -3,21 +3,47 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Learn Input" Height="200" Width="400" WindowStartupLocation="CenterOwner"
|
|
||||||
ResizeMode="NoResize" Loaded="Window_Loaded" Background="Black" MouseWheel="Window_MouseWheel" MouseUp="Window_MouseUp" MouseDoubleClick="Window_MouseDoubleClick" TextInput="Window_TextInput">
|
Title="Learn Input"
|
||||||
|
Height="200"
|
||||||
|
Width="400"
|
||||||
|
WindowStartupLocation="CenterOwner"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
Loaded="Window_Loaded"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
MouseWheel="Window_MouseWheel"
|
||||||
|
MouseUp="Window_MouseUp"
|
||||||
|
MouseDoubleClick="Window_MouseDoubleClick"
|
||||||
|
TextInput="Window_TextInput">
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
<RowDefinition Height="40" />
|
<RowDefinition Height="40" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<TextBlock x:Name="MenuTextBlock" Grid.ColumnSpan="2" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="16"></TextBlock>
|
|
||||||
<TextBlock x:Name="KeyTextBlock" Grid.Row="1" Grid.ColumnSpan="2" Foreground="White" VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="16"></TextBlock>
|
<TextBlock x:Name="MenuTextBlock"
|
||||||
|
Grid.ColumnSpan="2"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
FontSize="16"></TextBlock>
|
||||||
|
|
||||||
|
<TextBlock x:Name="KeyTextBlock"
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.ColumnSpan="2"
|
||||||
|
VerticalAlignment="Top"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
FontSize="16" />
|
||||||
|
|
||||||
<Button x:Name="ConfirmButton" Grid.Row="2" Click="ConfirmButton_Click">Confirm</Button>
|
<Button x:Name="ConfirmButton" Grid.Row="2" Click="ConfirmButton_Click">Confirm</Button>
|
||||||
<Button x:Name="ClearButton" Grid.Row="2" Click="ClearButton_Click" Grid.Column="1">Clear</Button>
|
<Button x:Name="ClearButton" Grid.Row="2" Click="ClearButton_Click" Grid.Column="1">Clear</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Interop;
|
using System.Windows.Interop;
|
||||||
using WF = System.Windows.Forms;
|
|
||||||
|
using WinForms = System.Windows.Forms;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -17,7 +19,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
|
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
|
||||||
{
|
{
|
||||||
WF.Message m = new WF.Message();
|
WinForms.Message m = new WinForms.Message();
|
||||||
m.HWnd = hwnd;
|
m.HWnd = hwnd;
|
||||||
m.Msg = msg;
|
m.Msg = msg;
|
||||||
m.WParam = wParam;
|
m.WParam = wParam;
|
||||||
@@ -26,10 +28,10 @@ namespace mpvnet
|
|||||||
return m.Result;
|
return m.Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnKeyUp(WF.KeyEventArgs e)
|
void OnKeyUp(WinForms.KeyEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.KeyCode == WF.Keys.ControlKey || e.KeyCode == WF.Keys.ShiftKey ||
|
if (e.KeyCode == WinForms.Keys.ControlKey || e.KeyCode == WinForms.Keys.ShiftKey ||
|
||||||
e.KeyCode == WF.Keys.Menu || e.KeyCode == WF.Keys.None)
|
e.KeyCode == WinForms.Keys.Menu || e.KeyCode == WinForms.Keys.None)
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -49,70 +51,70 @@ namespace mpvnet
|
|||||||
|
|
||||||
switch (e.KeyCode)
|
switch (e.KeyCode)
|
||||||
{
|
{
|
||||||
case WF.Keys.NumPad0:
|
case WinForms.Keys.NumPad0:
|
||||||
case WF.Keys.NumPad1:
|
case WinForms.Keys.NumPad1:
|
||||||
case WF.Keys.NumPad2:
|
case WinForms.Keys.NumPad2:
|
||||||
case WF.Keys.NumPad3:
|
case WinForms.Keys.NumPad3:
|
||||||
case WF.Keys.NumPad4:
|
case WinForms.Keys.NumPad4:
|
||||||
case WF.Keys.NumPad5:
|
case WinForms.Keys.NumPad5:
|
||||||
case WF.Keys.NumPad6:
|
case WinForms.Keys.NumPad6:
|
||||||
case WF.Keys.NumPad7:
|
case WinForms.Keys.NumPad7:
|
||||||
case WF.Keys.NumPad8:
|
case WinForms.Keys.NumPad8:
|
||||||
case WF.Keys.NumPad9:
|
case WinForms.Keys.NumPad9:
|
||||||
text = "KP" + e.KeyCode.ToString()[6]; break;
|
text = "KP" + e.KeyCode.ToString()[6]; break;
|
||||||
case WF.Keys.Space:
|
case WinForms.Keys.Space:
|
||||||
text = "Space"; break;
|
text = "Space"; break;
|
||||||
case WF.Keys.Enter:
|
case WinForms.Keys.Enter:
|
||||||
text = "Enter"; break;
|
text = "Enter"; break;
|
||||||
case WF.Keys.Tab:
|
case WinForms.Keys.Tab:
|
||||||
text = "TAB"; break;
|
text = "TAB"; break;
|
||||||
case WF.Keys.Back:
|
case WinForms.Keys.Back:
|
||||||
text = "BS"; break;
|
text = "BS"; break;
|
||||||
case WF.Keys.Delete:
|
case WinForms.Keys.Delete:
|
||||||
text = "DEL"; break;
|
text = "DEL"; break;
|
||||||
case WF.Keys.Insert:
|
case WinForms.Keys.Insert:
|
||||||
text = "INS"; break;
|
text = "INS"; break;
|
||||||
case WF.Keys.Home:
|
case WinForms.Keys.Home:
|
||||||
text = "Home"; break;
|
text = "Home"; break;
|
||||||
case WF.Keys.End:
|
case WinForms.Keys.End:
|
||||||
text = "END"; break;
|
text = "END"; break;
|
||||||
case WF.Keys.PageUp:
|
case WinForms.Keys.PageUp:
|
||||||
text = "PGUP"; break;
|
text = "PGUP"; break;
|
||||||
case WF.Keys.PageDown:
|
case WinForms.Keys.PageDown:
|
||||||
text = "PGDWN"; break;
|
text = "PGDWN"; break;
|
||||||
case WF.Keys.Escape:
|
case WinForms.Keys.Escape:
|
||||||
text = "ESC"; break;
|
text = "ESC"; break;
|
||||||
case WF.Keys.PrintScreen:
|
case WinForms.Keys.PrintScreen:
|
||||||
text = "Print"; break;
|
text = "Print"; break;
|
||||||
case WF.Keys.Play:
|
case WinForms.Keys.Play:
|
||||||
text = "Play"; break;
|
text = "Play"; break;
|
||||||
case WF.Keys.Pause:
|
case WinForms.Keys.Pause:
|
||||||
text = "Pause"; break;
|
text = "Pause"; break;
|
||||||
case WF.Keys.MediaPlayPause:
|
case WinForms.Keys.MediaPlayPause:
|
||||||
text = "PlayPause"; break;
|
text = "PlayPause"; break;
|
||||||
case WF.Keys.MediaStop:
|
case WinForms.Keys.MediaStop:
|
||||||
text = "Stop"; break;
|
text = "Stop"; break;
|
||||||
case WF.Keys.MediaNextTrack:
|
case WinForms.Keys.MediaNextTrack:
|
||||||
text = "Next"; break;
|
text = "Next"; break;
|
||||||
case WF.Keys.MediaPreviousTrack:
|
case WinForms.Keys.MediaPreviousTrack:
|
||||||
text = "Prev"; break;
|
text = "Prev"; break;
|
||||||
case WF.Keys.VolumeUp:
|
case WinForms.Keys.VolumeUp:
|
||||||
text = "Volume_Up"; break;
|
text = "Volume_Up"; break;
|
||||||
case WF.Keys.VolumeDown:
|
case WinForms.Keys.VolumeDown:
|
||||||
text = "Volume_Down"; break;
|
text = "Volume_Down"; break;
|
||||||
case WF.Keys.VolumeMute:
|
case WinForms.Keys.VolumeMute:
|
||||||
text = "Mute"; break;
|
text = "Mute"; break;
|
||||||
case WF.Keys.BrowserHome:
|
case WinForms.Keys.BrowserHome:
|
||||||
text = "Homepage"; break;
|
text = "Homepage"; break;
|
||||||
case WF.Keys.LaunchMail:
|
case WinForms.Keys.LaunchMail:
|
||||||
text = "Mail"; break;
|
text = "Mail"; break;
|
||||||
case WF.Keys.BrowserFavorites:
|
case WinForms.Keys.BrowserFavorites:
|
||||||
text = "Favorites"; break;
|
text = "Favorites"; break;
|
||||||
case WF.Keys.BrowserSearch:
|
case WinForms.Keys.BrowserSearch:
|
||||||
text = "Search"; break;
|
text = "Search"; break;
|
||||||
case WF.Keys.Sleep:
|
case WinForms.Keys.Sleep:
|
||||||
text = "Sleep"; break;
|
text = "Sleep"; break;
|
||||||
case WF.Keys.Cancel:
|
case WinForms.Keys.Cancel:
|
||||||
text = "Cancel"; break;
|
text = "Cancel"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,9 +132,14 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (text == "#") text = "SHARP";
|
if (text == "#") text = "SHARP";
|
||||||
|
|
||||||
if (isAlt && !wasModified) text = "ALT+" + text;
|
if (isAlt && !wasModified)
|
||||||
if (isShift && !wasModified) text = "SHIFT+" + text;
|
text = "ALT+" + text;
|
||||||
if (isCtrl && !wasModified) text = "CTRL+" + text;
|
|
||||||
|
if (isShift && !wasModified)
|
||||||
|
text = "SHIFT+" + text;
|
||||||
|
|
||||||
|
if (isCtrl && !wasModified)
|
||||||
|
text = "CTRL+" + text;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(text))
|
if (!string.IsNullOrEmpty(text))
|
||||||
SetKey(text);
|
SetKey(text);
|
||||||
@@ -151,25 +158,29 @@ namespace mpvnet
|
|||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
static extern uint MapVirtualKey(uint uCode, uint uMapType);
|
static extern uint MapVirtualKey(uint uCode, uint uMapType);
|
||||||
|
|
||||||
public static WF.Keys ModifierKeys {
|
public static WinForms.Keys ModifierKeys {
|
||||||
get {
|
get {
|
||||||
WF.Keys keys = WF.Keys.None;
|
WinForms.Keys keys = WinForms.Keys.None;
|
||||||
|
|
||||||
if (GetKeyState(17) < (short)0)
|
if (GetKeyState(17) < (short)0)
|
||||||
keys |= WF.Keys.Control;
|
keys |= WinForms.Keys.Control;
|
||||||
|
|
||||||
if (GetKeyState(16) < (short)0)
|
if (GetKeyState(16) < (short)0)
|
||||||
keys |= WF.Keys.Shift;
|
keys |= WinForms.Keys.Shift;
|
||||||
|
|
||||||
if (GetKeyState(18) < (short)0)
|
if (GetKeyState(18) < (short)0)
|
||||||
keys |= WF.Keys.Alt;
|
keys |= WinForms.Keys.Alt;
|
||||||
|
|
||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessKeyEventArgs(ref WF.Message m)
|
void ProcessKeyEventArgs(ref WinForms.Message m)
|
||||||
{
|
{
|
||||||
int WM_KEYUP = 0x0101, WM_SYSKEYUP = 0x0105, WM_APPCOMMAND = 0x0319;
|
int WM_KEYUP = 0x0101, WM_SYSKEYUP = 0x0105, WM_APPCOMMAND = 0x0319;
|
||||||
|
|
||||||
if (m.Msg == WM_KEYUP || m.Msg == WM_SYSKEYUP)
|
if (m.Msg == WM_KEYUP || m.Msg == WM_SYSKEYUP)
|
||||||
OnKeyUp(new WF.KeyEventArgs((WF.Keys)(unchecked((int)(long)m.WParam)) | ModifierKeys));
|
OnKeyUp(new WinForms.KeyEventArgs((WinForms.Keys)(unchecked((int)(long)m.WParam)) | ModifierKeys));
|
||||||
else if (m.Msg == WM_APPCOMMAND)
|
else if (m.Msg == WM_APPCOMMAND)
|
||||||
{
|
{
|
||||||
var value = (AppCommand)(m.LParam.ToInt64() >> 16 & ~0xf000);
|
var value = (AppCommand)(m.LParam.ToInt64() >> 16 & ~0xf000);
|
||||||
|
|||||||
@@ -1,14 +1,23 @@
|
|||||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:WPF="clr-namespace:WPF">
|
xmlns:UI="clr-namespace:UI">
|
||||||
|
|
||||||
<Style TargetType="TextBox">
|
<Style TargetType="TextBox">
|
||||||
<Setter Property="Template">
|
<Setter Property="Template">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<ControlTemplate TargetType="{x:Type TextBox}">
|
<ControlTemplate TargetType="{x:Type TextBox}">
|
||||||
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
|
<Border x:Name="border"
|
||||||
<ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
|
BorderBrush="{TemplateBinding BorderBrush}"
|
||||||
|
BorderThickness="{TemplateBinding BorderThickness}"
|
||||||
|
Background="{TemplateBinding Background}"
|
||||||
|
SnapsToDevicePixels="True">
|
||||||
|
|
||||||
|
<ScrollViewer x:Name="PART_ContentHost"
|
||||||
|
Focusable="false"
|
||||||
|
HorizontalScrollBarVisibility="Hidden"
|
||||||
|
VerticalScrollBarVisibility="Hidden"/>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<ControlTemplate.Triggers>
|
<ControlTemplate.Triggers>
|
||||||
<Trigger Property="IsEnabled" Value="false">
|
<Trigger Property="IsEnabled" Value="false">
|
||||||
<Setter Property="Opacity" TargetName="border" Value="0.56"/>
|
<Setter Property="Opacity" TargetName="border" Value="0.56"/>
|
||||||
@@ -17,7 +26,7 @@
|
|||||||
<Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
|
<Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
|
||||||
</Trigger>
|
</Trigger>
|
||||||
<Trigger Property="IsFocused" Value="true">
|
<Trigger Property="IsFocused" Value="true">
|
||||||
<Setter Property="BorderBrush" TargetName="border" Value="{x:Static WPF:WPF.ThemeBrush}"/>
|
<Setter Property="BorderBrush" TargetName="border" Value="{x:Static UI:Theme.Heading}"/>
|
||||||
</Trigger>
|
</Trigger>
|
||||||
</ControlTemplate.Triggers>
|
</ControlTemplate.Triggers>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
@@ -34,13 +43,14 @@
|
|||||||
<ColumnDefinition x:Name="LeftCol" Width="18" />
|
<ColumnDefinition x:Name="LeftCol" Width="18" />
|
||||||
<ColumnDefinition x:Name="RightCol" Width="*" />
|
<ColumnDefinition x:Name="RightCol" Width="*" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Grid x:Name="PART_CHECKBOX">
|
<Grid x:Name="PART_CHECKBOX">
|
||||||
<Ellipse
|
<Ellipse
|
||||||
x:Name="normal"
|
x:Name="normal"
|
||||||
Width="18"
|
Width="18"
|
||||||
Height="18"
|
Height="18"
|
||||||
Fill="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"
|
Fill="{x:Static UI:Theme.Background}"
|
||||||
Stroke="{x:Static WPF:WPF.ThemeBrush}"
|
Stroke="{x:Static UI:Theme.Heading}"
|
||||||
StrokeThickness="2" />
|
StrokeThickness="2" />
|
||||||
<Ellipse
|
<Ellipse
|
||||||
x:Name="Checked1"
|
x:Name="Checked1"
|
||||||
@@ -56,6 +66,7 @@
|
|||||||
Opacity="0"
|
Opacity="0"
|
||||||
StrokeThickness="{TemplateBinding BorderThickness}" />
|
StrokeThickness="{TemplateBinding BorderThickness}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<ContentPresenter
|
<ContentPresenter
|
||||||
x:Name="contentPresenter"
|
x:Name="contentPresenter"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
@@ -67,6 +78,7 @@
|
|||||||
ContentTemplate="{TemplateBinding ContentTemplate}"
|
ContentTemplate="{TemplateBinding ContentTemplate}"
|
||||||
ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"
|
ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"
|
||||||
RecognizesAccessKey="True" />
|
RecognizesAccessKey="True" />
|
||||||
|
|
||||||
<VisualStateManager.VisualStateGroups>
|
<VisualStateManager.VisualStateGroups>
|
||||||
<VisualStateGroup x:Name="CommonStates">
|
<VisualStateGroup x:Name="CommonStates">
|
||||||
<VisualState x:Name="Normal" />
|
<VisualState x:Name="Normal" />
|
||||||
|
|||||||
68
mpv.net/WPF/SearchTextBoxUserControl.xaml
Normal file
68
mpv.net/WPF/SearchTextBoxUserControl.xaml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
<UserControl x:Class="Controls.SearchTextBoxUserControl"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
d:DesignHeight="450"
|
||||||
|
d:DesignWidth="800">
|
||||||
|
|
||||||
|
<Grid Name="SearchTextBoxUserControl1"
|
||||||
|
Background="{x:Static UI:Theme.Background}">
|
||||||
|
|
||||||
|
<TextBlock Name="HintTextBlock"
|
||||||
|
Margin="5,2"
|
||||||
|
Text="Find a setting"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground2}"
|
||||||
|
Background="{x:Static UI:Theme.Background}" />
|
||||||
|
|
||||||
|
<TextBox Name="SearchTextBox"
|
||||||
|
Height="25"
|
||||||
|
Padding="1,2,0,0"
|
||||||
|
BorderThickness="2"
|
||||||
|
Background="Transparent"
|
||||||
|
TextChanged="SearchTextBox_TextChanged"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
CaretBrush="{x:Static UI:Theme.Foreground}" />
|
||||||
|
|
||||||
|
<Button Name="SearchClearButton"
|
||||||
|
Background="Transparent"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
FontFamily="Marlett"
|
||||||
|
FontSize="10"
|
||||||
|
Width="17"
|
||||||
|
Height="17"
|
||||||
|
Margin="2,0,4,0"
|
||||||
|
Visibility="Hidden"
|
||||||
|
Click="SearchClearButton_Click" >r
|
||||||
|
|
||||||
|
<Button.Style>
|
||||||
|
<Style TargetType="Button">
|
||||||
|
<Setter Property="Background" Value="{x:Static UI:Theme.Background}"/>
|
||||||
|
<Setter Property="Foreground" Value="{x:Static UI:Theme.Foreground2}"/>
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="Button">
|
||||||
|
<Border BorderThickness="1"
|
||||||
|
BorderBrush="{TemplateBinding Foreground}"
|
||||||
|
SnapsToDevicePixels="True">
|
||||||
|
|
||||||
|
<ContentPresenter HorizontalAlignment="Center"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
|
</Border>
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsMouseOver" Value="True">
|
||||||
|
<Setter Property="Foreground" Value="{x:Static UI:Theme.Heading}"/>
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Button.Style>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</UserControl>
|
||||||
@@ -3,17 +3,31 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:UI="clr-namespace:UI"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="mpv.net OS Setup" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterOwner">
|
|
||||||
|
Title="mpv.net OS Setup"
|
||||||
|
FontSize="13"
|
||||||
|
Foreground="{x:Static UI:Theme.Foreground}"
|
||||||
|
Background="{x:Static UI:Theme.Background}"
|
||||||
|
SizeToContent="WidthAndHeight"
|
||||||
|
WindowStartupLocation="CenterOwner" >
|
||||||
|
|
||||||
|
<Window.Resources>
|
||||||
|
<Style TargetType="Button">
|
||||||
|
<Setter Property="Padding" Value="10"></Setter>
|
||||||
|
<Setter Property="Margin" Value="5"></Setter>
|
||||||
|
</Style>
|
||||||
|
</Window.Resources>
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<StackPanel>
|
<StackPanel Margin="10">
|
||||||
<Button Name="RegisterVideo" Margin="5" Click="RegisterVideo_Click">Register video file extensions (requires elevated privileges)</Button>
|
<Button Name="RegisterVideo" Click="RegisterVideo_Click">Register video file extensions (requires admin rights)</Button>
|
||||||
<Button Name="RegisterAudio" Margin="5" Click="RegisterAudio_Click">Register audio file extensions (requires elevated privileges)</Button>
|
<Button Name="RegisterAudio" Click="RegisterAudio_Click">Register audio file extensions (requires admin rights)</Button>
|
||||||
<Button Name="RegisterImage" Margin="5" Click="RegisterImage_Click">Register image file extensions (requires elevated privileges)</Button>
|
<Button Name="RegisterImage" Click="RegisterImage_Click">Register image file extensions (requires admin rights)</Button>
|
||||||
<Button Name="AddToPathEnvVar" Margin="5" Click="AddToPathEnvVar_Click">Add mpv.net to Path environment variable</Button>
|
<Button Name="UnregisterFileAssociations" Click="UnregisterFileAssociations_Click">Unregister file extensions (requires admin rights)</Button>
|
||||||
<Button Name="ManageDefaultApps" Margin="5" Click="ManageDefaultApps_Click">Manage Default Apps (Win 10 or higher)</Button>
|
<Button Name="AddToPathEnvVar" Click="AddToPathEnvVar_Click">Add mpv.net to Path environment variable</Button>
|
||||||
<Button Name="UnregisterFileAssociations" Margin="5,20,5,5" Click="UnregisterFileAssociations_Click">Unregister file extensions (requires elevated privileges)</Button>
|
<Button Name="RemoveFromPathEnvVar" Click="RemoveFromPathEnvVar_Click">Remove mpv.net from Path environment variable</Button>
|
||||||
<Button Name="RemoveFromPathEnvVar" Margin="5" Click="RemoveFromPathEnvVar_Click">Remove mpv.net from Path environment variable</Button>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using WF = System.Windows.Forms;
|
|
||||||
|
using WinForms = System.Windows.Forms;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -11,24 +13,29 @@ namespace mpvnet
|
|||||||
|
|
||||||
void RegisterFileAssociations(string value)
|
void RegisterFileAssociations(string value)
|
||||||
{
|
{
|
||||||
using (var proc = new Process())
|
try
|
||||||
{
|
{
|
||||||
proc.StartInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
|
using (Process proc = new Process())
|
||||||
proc.StartInfo.Arguments = "--reg-file-assoc " + value;
|
{
|
||||||
proc.StartInfo.Verb = "runas";
|
proc.StartInfo.FileName = WinForms.Application.ExecutablePath;
|
||||||
try { proc.Start(); } catch { }
|
proc.StartInfo.Arguments = "--reg-file-assoc " + value;
|
||||||
}
|
proc.StartInfo.Verb = "runas";
|
||||||
|
proc.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
Process.Start("ms-settings:defaultapps");
|
||||||
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RegisterVideo_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("video");
|
private void RegisterVideo_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("video");
|
||||||
private void RegisterAudio_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("audio");
|
private void RegisterAudio_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("audio");
|
||||||
private void RegisterImage_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("image");
|
private void RegisterImage_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("image");
|
||||||
|
|
||||||
private void UnregisterFileAssociations_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("unreg");
|
private void UnregisterFileAssociations_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("unreg");
|
||||||
private void ManageDefaultApps_Click(object sender, RoutedEventArgs e) => Process.Start("ms-settings:defaultapps");
|
|
||||||
|
|
||||||
private void AddToPathEnvVar_Click(object sender, RoutedEventArgs e)
|
private void AddToPathEnvVar_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
string var = WF.Application.StartupPath + ";";
|
string var = WinForms.Application.StartupPath + ";";
|
||||||
string path = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.User);
|
string path = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.User);
|
||||||
|
|
||||||
if (path.Contains(var))
|
if (path.Contains(var))
|
||||||
@@ -42,7 +49,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
private void RemoveFromPathEnvVar_Click(object sender, RoutedEventArgs e)
|
private void RemoveFromPathEnvVar_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
string var = WF.Application.StartupPath + ";";
|
string var = WinForms.Application.StartupPath + ";";
|
||||||
string path = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.User);
|
string path = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.User);
|
||||||
|
|
||||||
if (path.Contains(var))
|
if (path.Contains(var))
|
||||||
|
|||||||
@@ -1,69 +1,20 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Media;
|
|
||||||
|
|
||||||
using Microsoft.Win32;
|
|
||||||
using mpvnet;
|
|
||||||
|
|
||||||
namespace WPF
|
namespace WPF
|
||||||
{
|
{
|
||||||
public class WPF
|
public class WPF
|
||||||
{
|
{
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
|
||||||
EnsureApplicationResources();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnsureApplicationResources()
|
|
||||||
{
|
{
|
||||||
if (Application.Current == null)
|
if (Application.Current == null)
|
||||||
{
|
{
|
||||||
new Application();
|
new Application();
|
||||||
|
|
||||||
Application.Current.Resources.MergedDictionaries.Add(
|
Application.Current.Resources.MergedDictionaries.Add(
|
||||||
Application.LoadComponent(new Uri("mpvnet;component/WPF/Resources.xaml",
|
Application.LoadComponent(new Uri("mpvnet;component/WPF/Resources.xaml",
|
||||||
UriKind.Relative)) as ResourceDictionary);
|
UriKind.Relative)) as ResourceDictionary);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Brush ThemeBrush { get; } = new SolidColorBrush(ThemeColor);
|
|
||||||
|
|
||||||
static bool WasThemeColorSet;
|
|
||||||
|
|
||||||
static Color _ThemeColor;
|
|
||||||
|
|
||||||
public static Color ThemeColor {
|
|
||||||
get {
|
|
||||||
if (!WasThemeColorSet)
|
|
||||||
{
|
|
||||||
Color? color = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (App.IsDarkMode && !string.IsNullOrEmpty(App.DarkColor))
|
|
||||||
color = (Color)ColorConverter.ConvertFromString(App.DarkColor);
|
|
||||||
else if (!App.IsDarkMode && !string.IsNullOrEmpty(App.LightColor))
|
|
||||||
color = (Color)ColorConverter.ConvertFromString(App.LightColor);
|
|
||||||
} catch { }
|
|
||||||
|
|
||||||
if (!color.HasValue)
|
|
||||||
{
|
|
||||||
if (Environment.OSVersion.Version.Major < 10)
|
|
||||||
{
|
|
||||||
int argb = Convert.ToInt32(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", 0));
|
|
||||||
var wfc = System.Drawing.Color.FromArgb(argb);
|
|
||||||
color = Color.FromArgb(wfc.A, wfc.R, wfc.G, wfc.B);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
color = SystemParameters.WindowGlassColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (App.IsDarkMode && color == Colors.Black) color = Colors.Orange;
|
|
||||||
if (!App.IsDarkMode && color == Colors.White) color = Colors.Orange;
|
|
||||||
_ThemeColor = color.Value;
|
|
||||||
WasThemeColorSet = true;
|
|
||||||
}
|
|
||||||
return _ThemeColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
@@ -10,6 +11,8 @@ using System.Globalization;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using UI;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
public partial class MainForm : Form
|
public partial class MainForm : Form
|
||||||
@@ -21,7 +24,8 @@ namespace mpvnet
|
|||||||
int LastCursorChangedTickCount;
|
int LastCursorChangedTickCount;
|
||||||
int TaskbarButtonCreatedMessage;
|
int TaskbarButtonCreatedMessage;
|
||||||
bool WasShown;
|
bool WasShown;
|
||||||
Taskbar Taskbar;
|
DateTime LastCycleFullscreen;
|
||||||
|
Taskbar Taskbar;
|
||||||
List<string> RecentFiles;
|
List<string> RecentFiles;
|
||||||
|
|
||||||
public MainForm()
|
public MainForm()
|
||||||
@@ -30,6 +34,13 @@ namespace mpvnet
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
object recent = RegistryHelp.GetValue(App.RegPath, "Recent");
|
||||||
|
|
||||||
|
if (recent is string[] r)
|
||||||
|
RecentFiles = new List<string>(r);
|
||||||
|
else
|
||||||
|
RecentFiles = new List<string>();
|
||||||
|
|
||||||
Instance = this;
|
Instance = this;
|
||||||
Hwnd = Handle;
|
Hwnd = Handle;
|
||||||
mp.Init();
|
mp.Init();
|
||||||
@@ -48,6 +59,7 @@ namespace mpvnet
|
|||||||
mp.observe_property_string("aid", PropChangeAid);
|
mp.observe_property_string("aid", PropChangeAid);
|
||||||
mp.observe_property_string("vid", PropChangeVid);
|
mp.observe_property_string("vid", PropChangeVid);
|
||||||
mp.observe_property_int("edition", PropChangeEdition);
|
mp.observe_property_int("edition", PropChangeEdition);
|
||||||
|
mp.observe_property_double("window-scale", PropChangeWindowScale);
|
||||||
|
|
||||||
if (mp.GPUAPI != "vulkan")
|
if (mp.GPUAPI != "vulkan")
|
||||||
mp.ProcessCommandLine(false);
|
mp.ProcessCommandLine(false);
|
||||||
@@ -58,13 +70,6 @@ namespace mpvnet
|
|||||||
Text = "mpv.net " + Application.ProductVersion;
|
Text = "mpv.net " + Application.ProductVersion;
|
||||||
TaskbarButtonCreatedMessage = Native.RegisterWindowMessage("TaskbarButtonCreated");
|
TaskbarButtonCreatedMessage = Native.RegisterWindowMessage("TaskbarButtonCreated");
|
||||||
|
|
||||||
object recent = RegHelp.GetObject(App.RegPath, "Recent");
|
|
||||||
|
|
||||||
if (recent is string[] r)
|
|
||||||
RecentFiles = new List<string>(r);
|
|
||||||
else
|
|
||||||
RecentFiles = new List<string>();
|
|
||||||
|
|
||||||
ContextMenu = new ContextMenuStripEx(components);
|
ContextMenu = new ContextMenuStripEx(components);
|
||||||
ContextMenu.Opened += ContextMenu_Opened;
|
ContextMenu.Opened += ContextMenu_Opened;
|
||||||
ContextMenu.Opening += ContextMenu_Opening;
|
ContextMenu.Opening += ContextMenu_Opening;
|
||||||
@@ -86,8 +91,8 @@ namespace mpvnet
|
|||||||
Left = target.X + (target.Width - Width) / 2;
|
Left = target.X + (target.Width - Width) / 2;
|
||||||
Top = target.Y + (target.Height - Height) / 2;
|
Top = target.Y + (target.Height - Height) / 2;
|
||||||
|
|
||||||
int posX = RegHelp.GetInt(App.RegPath, "PosX");
|
int posX = RegistryHelp.GetInt(App.RegPath, "PosX");
|
||||||
int posY = RegHelp.GetInt(App.RegPath, "PosY");
|
int posY = RegistryHelp.GetInt(App.RegPath, "PosY");
|
||||||
|
|
||||||
if (posX != 0 && posY != 0 && App.RememberPosition)
|
if (posX != 0 && posY != 0 && App.RememberPosition)
|
||||||
{
|
{
|
||||||
@@ -96,7 +101,10 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (App.Maximized)
|
if (App.Maximized)
|
||||||
|
{
|
||||||
|
SetFormPosAndSize(1, true);
|
||||||
WindowState = FormWindowState.Maximized;
|
WindowState = FormWindowState.Maximized;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -233,6 +241,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (mi.Text.StartsWith(text) && mi.Text.Trim() == text)
|
if (mi.Text.StartsWith(text) && mi.Text.Trim() == text)
|
||||||
return mi;
|
return mi;
|
||||||
|
|
||||||
if (mi.DropDownItems.Count > 0)
|
if (mi.DropDownItems.Count > 0)
|
||||||
{
|
{
|
||||||
MenuItem val = FindMenuItem(text, mi.DropDownItems);
|
MenuItem val = FindMenuItem(text, mi.DropDownItems);
|
||||||
@@ -245,15 +254,18 @@ namespace mpvnet
|
|||||||
|
|
||||||
bool WasInitialSizeSet;
|
bool WasInitialSizeSet;
|
||||||
|
|
||||||
void SetFormPosAndSize()
|
void SetFormPosAndSize(double scale = 1, bool force = false)
|
||||||
{
|
{
|
||||||
if (WindowState == FormWindowState.Maximized)
|
if (!force)
|
||||||
return;
|
|
||||||
|
|
||||||
if (mp.Fullscreen)
|
|
||||||
{
|
{
|
||||||
CycleFullscreen(true);
|
if (WindowState == FormWindowState.Maximized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (mp.Fullscreen)
|
||||||
|
{
|
||||||
|
CycleFullscreen(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Screen screen = Screen.FromControl(this);
|
Screen screen = Screen.FromControl(this);
|
||||||
@@ -265,7 +277,6 @@ namespace mpvnet
|
|||||||
mp.VideoSize = new Size((int)(autoFitHeight * (16 / 9.0)), autoFitHeight);
|
mp.VideoSize = new Size((int)(autoFitHeight * (16 / 9.0)), autoFitHeight);
|
||||||
|
|
||||||
Size size = mp.VideoSize;
|
Size size = mp.VideoSize;
|
||||||
|
|
||||||
int height = size.Height;
|
int height = size.Height;
|
||||||
|
|
||||||
if (App.RememberHeight)
|
if (App.RememberHeight)
|
||||||
@@ -279,6 +290,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
height = Convert.ToInt32(height * scale);
|
||||||
int width = Convert.ToInt32(height * size.Width / (double)size.Height);
|
int width = Convert.ToInt32(height * size.Width / (double)size.Height);
|
||||||
|
|
||||||
if (height > screen.WorkingArea.Height * 0.9)
|
if (height > screen.WorkingArea.Height * 0.9)
|
||||||
@@ -317,16 +329,24 @@ namespace mpvnet
|
|||||||
int minTop = screens.Select(val => val.WorkingArea.Y).Min();
|
int minTop = screens.Select(val => val.WorkingArea.Y).Min();
|
||||||
int maxBottom = screens.Select(val => val.WorkingArea.Bottom).Max();
|
int maxBottom = screens.Select(val => val.WorkingArea.Bottom).Max();
|
||||||
|
|
||||||
if (left < minLeft) left = minLeft;
|
if (left < minLeft)
|
||||||
if (left + rect.Width > maxRight) left = maxRight - rect.Width;
|
left = minLeft;
|
||||||
if (top < minTop) top = minTop;
|
|
||||||
if (top + rect.Height > maxBottom) top = maxBottom - rect.Height;
|
if (left + rect.Width > maxRight)
|
||||||
|
left = maxRight - rect.Width;
|
||||||
|
|
||||||
|
if (top < minTop)
|
||||||
|
top = minTop;
|
||||||
|
|
||||||
|
if (top + rect.Height > maxBottom)
|
||||||
|
top = maxBottom - rect.Height;
|
||||||
|
|
||||||
Native.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
|
Native.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CycleFullscreen(bool enabled)
|
public void CycleFullscreen(bool enabled)
|
||||||
{
|
{
|
||||||
|
LastCycleFullscreen = DateTime.Now;
|
||||||
mp.Fullscreen = enabled;
|
mp.Fullscreen = enabled;
|
||||||
|
|
||||||
if (enabled)
|
if (enabled)
|
||||||
@@ -364,17 +384,22 @@ namespace mpvnet
|
|||||||
if (!content.Contains("#menu:"))
|
if (!content.Contains("#menu:"))
|
||||||
{
|
{
|
||||||
var defaultItems = CommandItem.GetItems(Properties.Resources.inputConf);
|
var defaultItems = CommandItem.GetItems(Properties.Resources.inputConf);
|
||||||
|
|
||||||
foreach (CommandItem item in items)
|
foreach (CommandItem item in items)
|
||||||
foreach (CommandItem defaultItem in defaultItems)
|
foreach (CommandItem defaultItem in defaultItems)
|
||||||
if (item.Command == defaultItem.Command)
|
if (item.Command == defaultItem.Command)
|
||||||
defaultItem.Input = item.Input;
|
defaultItem.Input = item.Input;
|
||||||
|
|
||||||
items = defaultItems;
|
items = defaultItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (CommandItem item in items)
|
foreach (CommandItem item in items)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(item.Path)) continue;
|
if (string.IsNullOrEmpty(item.Path))
|
||||||
|
continue;
|
||||||
|
|
||||||
string path = item.Path.Replace("&", "&&");
|
string path = item.Path.Replace("&", "&&");
|
||||||
|
|
||||||
MenuItem menuItem = ContextMenu.Add(path, () => {
|
MenuItem menuItem = ContextMenu.Add(path, () => {
|
||||||
try {
|
try {
|
||||||
mp.command(item.Command);
|
mp.command(item.Command);
|
||||||
@@ -382,7 +407,9 @@ namespace mpvnet
|
|||||||
Msg.ShowException(ex);
|
Msg.ShowException(ex);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (menuItem != null) menuItem.ShortcutKeyDisplayString = item.Input + " ";
|
|
||||||
|
if (menuItem != null)
|
||||||
|
menuItem.ShortcutKeyDisplayString = item.Input + " ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,9 +432,13 @@ namespace mpvnet
|
|||||||
UpdateProgressBar();
|
UpdateProgressBar();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (RecentFiles.Contains(path)) RecentFiles.Remove(path);
|
if (RecentFiles.Contains(path))
|
||||||
|
RecentFiles.Remove(path);
|
||||||
|
|
||||||
RecentFiles.Insert(0, path);
|
RecentFiles.Insert(0, path);
|
||||||
while (RecentFiles.Count > App.RecentCount) RecentFiles.RemoveAt(App.RecentCount);
|
|
||||||
|
while (RecentFiles.Count > App.RecentCount)
|
||||||
|
RecentFiles.RemoveAt(App.RecentCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override CreateParams CreateParams {
|
protected override CreateParams CreateParams {
|
||||||
@@ -420,7 +451,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
protected override void WndProc(ref Message m)
|
protected override void WndProc(ref Message m)
|
||||||
{
|
{
|
||||||
Debug.WriteLine(m);
|
//Debug.WriteLine(m);
|
||||||
|
|
||||||
switch (m.Msg)
|
switch (m.Msg)
|
||||||
{
|
{
|
||||||
@@ -441,67 +472,80 @@ namespace mpvnet
|
|||||||
break;
|
break;
|
||||||
case 0x0200: // WM_MOUSEMOVE
|
case 0x0200: // WM_MOUSEMOVE
|
||||||
{
|
{
|
||||||
Point pos = PointToClient(Cursor.Position);
|
if ((DateTime.Now - LastCycleFullscreen).TotalMilliseconds > 500)
|
||||||
mp.command($"mouse {pos.X} {pos.Y}");
|
{
|
||||||
if (CursorHelp.IsPosDifferent(LastCursorPosChanged)) CursorHelp.Show();
|
Point pos = PointToClient(Cursor.Position);
|
||||||
|
mp.command($"mouse {pos.X} {pos.Y}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CursorHelp.IsPosDifferent(LastCursorPosChanged))
|
||||||
|
CursorHelp.Show();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x2a3: // WM_MOUSELEAVE
|
case 0x2a3: // WM_MOUSELEAVE
|
||||||
mp.command("mouse 1 1"); // osc won't always auto hide
|
// osc won't always auto hide
|
||||||
|
mp.command("mouse 1 1");
|
||||||
break;
|
break;
|
||||||
case 0x203: // Native.WM.LBUTTONDBLCLK
|
case 0x203: // WM_LBUTTONDBLCLK
|
||||||
{
|
{
|
||||||
Point pos = PointToClient(Cursor.Position);
|
Point pos = PointToClient(Cursor.Position);
|
||||||
mp.command($"mouse {pos.X} {pos.Y} 0 double");
|
mp.command($"mouse {pos.X} {pos.Y} 0 double");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x02E0: // WM_DPICHANGED
|
case 0x02E0: // WM_DPICHANGED
|
||||||
if (!WasShown)
|
{
|
||||||
break;
|
if (!WasShown)
|
||||||
var r2 = Marshal.PtrToStructure<Native.RECT>(m.LParam);
|
break;
|
||||||
Native.SetWindowPos(Handle, IntPtr.Zero, r2.Left, r2.Top, r2.Width, r2.Height, 0);
|
|
||||||
break;
|
Native.RECT rect = Marshal.PtrToStructure<Native.RECT>(m.LParam);
|
||||||
case 0x112: // WM_SYSCOMMAND
|
Native.SetWindowPos(Handle, IntPtr.Zero, rect.Left, rect.Top, rect.Width, rect.Height, 0);
|
||||||
if (m.WParam.ToInt32() == 0xf120) // SC_RESTORE
|
}
|
||||||
SetFormPosAndSize();
|
|
||||||
break;
|
break;
|
||||||
case 0x0214: // WM_SIZING
|
case 0x0214: // WM_SIZING
|
||||||
var rc = Marshal.PtrToStructure<Native.RECT>(m.LParam);
|
{
|
||||||
var r = rc;
|
var rc = Marshal.PtrToStructure<Native.RECT>(m.LParam);
|
||||||
NativeHelp.SubtractWindowBorders(Handle, ref r);
|
var r = rc;
|
||||||
int c_w = r.Right - r.Left, c_h = r.Bottom - r.Top;
|
NativeHelp.SubtractWindowBorders(Handle, ref r);
|
||||||
Size s = mp.VideoSize;
|
int c_w = r.Right - r.Left, c_h = r.Bottom - r.Top;
|
||||||
if (s == Size.Empty)
|
Size s = mp.VideoSize;
|
||||||
s = new Size(16, 9);
|
|
||||||
float aspect = s.Width / (float)s.Height;
|
if (s == Size.Empty)
|
||||||
int d_w = Convert.ToInt32(c_h * aspect - c_w);
|
s = new Size(16, 9);
|
||||||
int d_h = Convert.ToInt32(c_w / aspect - c_h);
|
|
||||||
int[] d_corners = { d_w, d_h, -d_w, -d_h };
|
float aspect = s.Width / (float)s.Height;
|
||||||
int[] corners = { rc.Left, rc.Top, rc.Right, rc.Bottom };
|
int d_w = Convert.ToInt32(c_h * aspect - c_w);
|
||||||
int corner = NativeHelp.GetResizeBorder(m.WParam.ToInt32());
|
int d_h = Convert.ToInt32(c_w / aspect - c_h);
|
||||||
if (corner >= 0)
|
int[] d_corners = { d_w, d_h, -d_w, -d_h };
|
||||||
corners[corner] -= d_corners[corner];
|
int[] corners = { rc.Left, rc.Top, rc.Right, rc.Bottom };
|
||||||
Marshal.StructureToPtr<Native.RECT>(new Native.RECT(corners[0], corners[1], corners[2], corners[3]), m.LParam, false);
|
int corner = NativeHelp.GetResizeBorder(m.WParam.ToInt32());
|
||||||
m.Result = new IntPtr(1);
|
|
||||||
|
if (corner >= 0)
|
||||||
|
corners[corner] -= d_corners[corner];
|
||||||
|
|
||||||
|
Marshal.StructureToPtr<Native.RECT>(new Native.RECT(corners[0], corners[1], corners[2], corners[3]), m.LParam, false);
|
||||||
|
m.Result = new IntPtr(1);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case 0x004A: // WM_COPYDATA
|
case 0x004A: // WM_COPYDATA
|
||||||
var copyData = (Native.COPYDATASTRUCT)m.GetLParam(typeof(Native.COPYDATASTRUCT));
|
|
||||||
string[] files = copyData.lpData.Split('\n');
|
|
||||||
string mode = files[0];
|
|
||||||
files = files.Skip(1).ToArray();
|
|
||||||
|
|
||||||
switch (mode)
|
|
||||||
{
|
{
|
||||||
case "single":
|
var copyData = (Native.COPYDATASTRUCT)m.GetLParam(typeof(Native.COPYDATASTRUCT));
|
||||||
mp.Load(files, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
string[] files = copyData.lpData.Split('\n');
|
||||||
break;
|
string mode = files[0];
|
||||||
case "queue":
|
files = files.Skip(1).ToArray();
|
||||||
foreach (string file in files)
|
|
||||||
mp.commandv("loadfile", file, "append");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Activate();
|
switch (mode)
|
||||||
|
{
|
||||||
|
case "single":
|
||||||
|
mp.Load(files, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||||
|
break;
|
||||||
|
case "queue":
|
||||||
|
foreach (string file in files)
|
||||||
|
mp.commandv("loadfile", file, "append");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Activate();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,6 +590,15 @@ namespace mpvnet
|
|||||||
|
|
||||||
void PropChangeEdition(int value) => mp.Edition = value;
|
void PropChangeEdition(int value) => mp.Edition = value;
|
||||||
|
|
||||||
|
void PropChangeWindowScale(double value)
|
||||||
|
{
|
||||||
|
if (value != 1)
|
||||||
|
{
|
||||||
|
BeginInvoke(new Action(() => SetFormPosAndSize(value)));
|
||||||
|
mp.command("no-osd set window-scale 1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PropChangeBorder(bool enabled) {
|
void PropChangeBorder(bool enabled) {
|
||||||
mp.Border = enabled;
|
mp.Border = enabled;
|
||||||
|
|
||||||
@@ -554,6 +607,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (mp.Border && FormBorderStyle == FormBorderStyle.None)
|
if (mp.Border && FormBorderStyle == FormBorderStyle.None)
|
||||||
FormBorderStyle = FormBorderStyle.Sizable;
|
FormBorderStyle = FormBorderStyle.Sizable;
|
||||||
|
|
||||||
if (!mp.Border && FormBorderStyle == FormBorderStyle.Sizable)
|
if (!mp.Border && FormBorderStyle == FormBorderStyle.Sizable)
|
||||||
FormBorderStyle = FormBorderStyle.None;
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
}
|
}
|
||||||
@@ -574,25 +628,36 @@ namespace mpvnet
|
|||||||
protected override void OnLoad(EventArgs e)
|
protected override void OnLoad(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnLoad(e);
|
base.OnLoad(e);
|
||||||
if (mp.GPUAPI != "vulkan") mp.VideoSizeAutoResetEvent.WaitOne(App.StartThreshold);
|
|
||||||
|
if (mp.GPUAPI != "vulkan")
|
||||||
|
mp.VideoSizeAutoResetEvent.WaitOne(App.StartThreshold);
|
||||||
|
|
||||||
|
LastCycleFullscreen = DateTime.Now;
|
||||||
SetFormPosAndSize();
|
SetFormPosAndSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnShown(EventArgs e)
|
protected override void OnShown(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnShown(e);
|
base.OnShown(e);
|
||||||
if (mp.GPUAPI == "vulkan") mp.ProcessCommandLine(false);
|
|
||||||
var wpfColor = WPF.WPF.ThemeColor;
|
if (mp.GPUAPI == "vulkan")
|
||||||
Color color = Color.FromArgb(wpfColor.A, wpfColor.R, wpfColor.G, wpfColor.B);
|
mp.ProcessCommandLine(false);
|
||||||
ToolStripRendererEx.InitColors(color, App.IsDarkMode, App.ThemedMenu);
|
|
||||||
|
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();
|
BuildMenu();
|
||||||
ContextMenuStrip = ContextMenu;
|
ContextMenuStrip = ContextMenu;
|
||||||
WPF.WPF.Init();
|
WPF.WPF.Init();
|
||||||
System.Windows.Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
|
System.Windows.Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
|
||||||
Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);
|
Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);
|
||||||
WasShown = true;
|
UpdateCheck.DailyCheck();
|
||||||
mp.LoadScripts();
|
mp.LoadScripts();
|
||||||
Task.Run(() => App.Extension = new Extension());
|
Task.Run(() => App.Extension = new Extension());
|
||||||
|
WasShown = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnResize(EventArgs e)
|
protected override void OnResize(EventArgs e)
|
||||||
@@ -609,11 +674,11 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (WindowState == FormWindowState.Normal)
|
if (WindowState == FormWindowState.Normal)
|
||||||
{
|
{
|
||||||
RegHelp.SetObject(App.RegPath, "PosX", Left + Width / 2);
|
RegistryHelp.SetValue(App.RegPath, "PosX", Left + Width / 2);
|
||||||
RegHelp.SetObject(App.RegPath, "PosY", Top + Height / 2);
|
RegistryHelp.SetValue(App.RegPath, "PosY", Top + Height / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
RegHelp.SetObject(App.RegPath, "Recent", RecentFiles.ToArray());
|
RegistryHelp.SetValue(App.RegPath, "Recent", RecentFiles.ToArray());
|
||||||
|
|
||||||
if (mp.IsQuitNeeded)
|
if (mp.IsQuitNeeded)
|
||||||
mp.commandv("quit");
|
mp.commandv("quit");
|
||||||
@@ -642,6 +707,7 @@ namespace mpvnet
|
|||||||
protected override void OnDragEnter(DragEventArgs e)
|
protected override void OnDragEnter(DragEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnDragEnter(e);
|
base.OnDragEnter(e);
|
||||||
|
|
||||||
if (e.Data.GetDataPresent(DataFormats.FileDrop) || e.Data.GetDataPresent(DataFormats.Text))
|
if (e.Data.GetDataPresent(DataFormats.FileDrop) || e.Data.GetDataPresent(DataFormats.Text))
|
||||||
e.Effect = DragDropEffects.Copy;
|
e.Effect = DragDropEffects.Copy;
|
||||||
}
|
}
|
||||||
@@ -649,8 +715,10 @@ namespace mpvnet
|
|||||||
protected override void OnDragDrop(DragEventArgs e)
|
protected override void OnDragDrop(DragEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnDragDrop(e);
|
base.OnDragDrop(e);
|
||||||
|
|
||||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||||
mp.Load(e.Data.GetData(DataFormats.FileDrop) as String[], true, Control.ModifierKeys.HasFlag(Keys.Control));
|
mp.Load(e.Data.GetData(DataFormats.FileDrop) as String[], true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||||
|
|
||||||
if (e.Data.GetDataPresent(DataFormats.Text))
|
if (e.Data.GetDataPresent(DataFormats.Text))
|
||||||
mp.Load(new[] { e.Data.GetData(DataFormats.Text).ToString() }, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
mp.Load(new[] { e.Data.GetData(DataFormats.Text).ToString() }, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||||
}
|
}
|
||||||
@@ -660,5 +728,11 @@ namespace mpvnet
|
|||||||
base.OnLostFocus(e);
|
base.OnLostFocus(e);
|
||||||
CursorHelp.Show();
|
CursorHelp.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnKeyDown(KeyEventArgs e)
|
||||||
|
{
|
||||||
|
e.SuppressKeyPress = true; // prevent beep using alt key
|
||||||
|
base.OnKeyDown(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -130,49 +130,29 @@ public class MenuItem : ToolStripMenuItem
|
|||||||
|
|
||||||
public class ToolStripRendererEx : ToolStripSystemRenderer
|
public class ToolStripRendererEx : ToolStripSystemRenderer
|
||||||
{
|
{
|
||||||
public static Color ColorForeground { get; set; } = Color.Black;
|
public static Color ForegroundColor { get; set; }
|
||||||
public static Color ColorTheme { get; set; }
|
public static Color BackgroundColor { get; set; }
|
||||||
public static Color ColorChecked { get; set; }
|
public static Color SelectionColor { get; set; }
|
||||||
public static Color ColorBorder { get; set; }
|
public static Color CheckedColor { get; set; }
|
||||||
public static Color ColorTop { get; set; }
|
public static Color BorderColor { get; set; }
|
||||||
public static Color ColorSelection { get; set; }
|
|
||||||
public static Color ColorBackground { get; set; }
|
|
||||||
|
|
||||||
int TextOffset;
|
int TextOffset;
|
||||||
|
|
||||||
public static void InitColors(Color themeColor, bool darkMode, bool themed)
|
public static void SetDefaultColors()
|
||||||
{
|
{
|
||||||
if (darkMode)
|
ForegroundColor = Color.FromArgb(unchecked((int)0xFF000000));
|
||||||
{
|
BackgroundColor = Color.FromArgb(unchecked((int)0xFFDFDFDF));
|
||||||
ColorBorder = Color.White;
|
SelectionColor = Color.FromArgb(unchecked((int)0xFFBFBFBF));
|
||||||
ColorBackground = Color.FromArgb(50, 50, 50);
|
CheckedColor = Color.FromArgb(unchecked((int)0xFFAAAAAA));
|
||||||
ColorSelection = Color.FromArgb(80, 80, 80);
|
BorderColor = Color.FromArgb(unchecked((int)0xFF6A6A6A));
|
||||||
|
|
||||||
if (themed)
|
|
||||||
ColorForeground = themeColor;
|
|
||||||
else
|
|
||||||
ColorForeground = Color.White;
|
|
||||||
|
|
||||||
ColorChecked = Color.FromArgb(90, 90, 90);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!themed) themeColor = Color.FromArgb(238, 238, 238);
|
|
||||||
|
|
||||||
ColorBorder = HSLColor.Convert(themeColor).ToColorSetLuminosity(100);
|
|
||||||
ColorChecked = HSLColor.Convert(themeColor).ToColorSetLuminosity(160);
|
|
||||||
ColorSelection = HSLColor.Convert(themeColor).ToColorSetLuminosity(180);
|
|
||||||
ColorBackground = HSLColor.Convert(themeColor).ToColorSetLuminosity(210);
|
|
||||||
ColorTop = HSLColor.Convert(themeColor).ToColorSetLuminosity(240);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
|
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
|
||||||
{
|
{
|
||||||
Rectangle r = e.AffectedBounds;
|
Rectangle r = e.AffectedBounds;
|
||||||
r.Inflate(-1, -1);
|
r.Inflate(-1, -1);
|
||||||
ControlPaint.DrawBorder(e.Graphics, r, ColorBackground, ButtonBorderStyle.Solid);
|
ControlPaint.DrawBorder(e.Graphics, r, BackgroundColor, ButtonBorderStyle.Solid);
|
||||||
ControlPaint.DrawBorder(e.Graphics, e.AffectedBounds, ColorBorder, ButtonBorderStyle.Solid);
|
ControlPaint.DrawBorder(e.Graphics, e.AffectedBounds, BorderColor, ButtonBorderStyle.Solid);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
|
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
|
||||||
@@ -189,7 +169,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
else
|
else
|
||||||
TextOffset = Convert.ToInt32(e.Item.Height * 0.2);
|
TextOffset = Convert.ToInt32(e.Item.Height * 0.2);
|
||||||
|
|
||||||
e.TextColor = ColorForeground;
|
e.TextColor = ForegroundColor;
|
||||||
e.TextRectangle = new Rectangle(TextOffset, Convert.ToInt32((e.Item.Height - rect.Height) / 2.0), rect.Width, rect.Height);
|
e.TextRectangle = new Rectangle(TextOffset, Convert.ToInt32((e.Item.Height - rect.Height) / 2.0), rect.Width, rect.Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,14 +181,14 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
Rectangle rect = new Rectangle(Point.Empty, e.Item.Size);
|
Rectangle rect = new Rectangle(Point.Empty, e.Item.Size);
|
||||||
|
|
||||||
if (!(e.Item.Owner is MenuStrip))
|
if (!(e.Item.Owner is MenuStrip))
|
||||||
e.Graphics.Clear(ColorBackground);
|
e.Graphics.Clear(BackgroundColor);
|
||||||
|
|
||||||
if (e.Item.Selected && e.Item.Enabled)
|
if (e.Item.Selected && e.Item.Enabled)
|
||||||
{
|
{
|
||||||
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
||||||
rect = new Rectangle(rect.X + 2, rect.Y, rect.Width - 4, rect.Height - 1);
|
rect = new Rectangle(rect.X + 2, rect.Y, rect.Width - 4, rect.Height - 1);
|
||||||
rect.Inflate(-1, -1);
|
rect.Inflate(-1, -1);
|
||||||
using (SolidBrush b = new SolidBrush(ColorSelection))
|
using (SolidBrush b = new SolidBrush(SelectionColor))
|
||||||
e.Graphics.FillRectangle(b, rect);
|
e.Graphics.FillRectangle(b, rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,7 +204,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
float y3 = e.Item.Height * 0.75f;
|
float y3 = e.Item.Height * 0.75f;
|
||||||
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
|
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
|
||||||
|
|
||||||
using (Brush b = new SolidBrush(ColorForeground))
|
using (Brush b = new SolidBrush(ForegroundColor))
|
||||||
{
|
{
|
||||||
using (Pen p = new Pen(b, Control.DefaultFont.Height / 20f))
|
using (Pen p = new Pen(b, Control.DefaultFont.Height / 20f))
|
||||||
{
|
{
|
||||||
@@ -250,7 +230,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
rect = new Rectangle(rect.X + 2, rect.Y, rect.Height - 1, rect.Height - 1);
|
rect = new Rectangle(rect.X + 2, rect.Y, rect.Height - 1, rect.Height - 1);
|
||||||
rect.Inflate(-1, -1);
|
rect.Inflate(-1, -1);
|
||||||
|
|
||||||
using (Brush brush = new SolidBrush(ColorChecked))
|
using (Brush brush = new SolidBrush(CheckedColor))
|
||||||
e.Graphics.FillRectangle(brush, rect);
|
e.Graphics.FillRectangle(brush, rect);
|
||||||
|
|
||||||
float ellipseWidth = rect.Height / 3f;
|
float ellipseWidth = rect.Height / 3f;
|
||||||
@@ -260,17 +240,17 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
ellipseWidth,
|
ellipseWidth,
|
||||||
ellipseWidth);
|
ellipseWidth);
|
||||||
|
|
||||||
using (Brush brush = new SolidBrush(ColorForeground))
|
using (Brush brush = new SolidBrush(ForegroundColor))
|
||||||
e.Graphics.FillEllipse(brush, rectF);
|
e.Graphics.FillEllipse(brush, rectF);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
|
protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
|
||||||
{
|
{
|
||||||
e.Graphics.Clear(ColorBackground);
|
e.Graphics.Clear(BackgroundColor);
|
||||||
int top = e.Item.Height / 2;
|
int top = e.Item.Height / 2;
|
||||||
top -= 1;
|
top -= 1;
|
||||||
int offset = Convert.ToInt32(e.Item.Font.Height * 0.7);
|
int offset = Convert.ToInt32(e.Item.Font.Height * 0.7);
|
||||||
using (Pen p = new Pen(ColorBorder))
|
using (Pen p = new Pen(BorderColor))
|
||||||
e.Graphics.DrawLine(p,
|
e.Graphics.DrawLine(p,
|
||||||
new Point(offset, top),
|
new Point(offset, top),
|
||||||
new Point(e.Item.Width - offset, top));
|
new Point(e.Item.Width - offset, top));
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
|
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
|
||||||
<LangVersion>7.3</LangVersion>
|
<LangVersion>7.3</LangVersion>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
@@ -52,6 +52,7 @@
|
|||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
@@ -59,7 +60,7 @@
|
|||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
|
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
|
||||||
<LangVersion>7.3</LangVersion>
|
<LangVersion>7.3</LangVersion>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
@@ -72,6 +73,7 @@
|
|||||||
<PlatformTarget>x64</PlatformTarget>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
|
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="IKVM.Reflection, Version=7.2.4630.5, Culture=neutral, PublicKeyToken=13235d27fcbfff58, processorArchitecture=MSIL">
|
<Reference Include="IKVM.Reflection, Version=7.2.4630.5, Culture=neutral, PublicKeyToken=13235d27fcbfff58, processorArchitecture=MSIL">
|
||||||
@@ -108,6 +110,7 @@
|
|||||||
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Microsoft.PowerShell.5.ReferenceAssemblies.1.1.0\lib\net4\System.Management.Automation.dll</HintPath>
|
<HintPath>..\packages\Microsoft.PowerShell.5.ReferenceAssemblies.1.1.0\lib\net4\System.Management.Automation.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xaml" />
|
<Reference Include="System.Xaml" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
@@ -116,7 +119,15 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Misc\App.cs" />
|
<Compile Include="Misc\App.cs" />
|
||||||
<Compile Include="Misc\Extension.cs" />
|
<Compile Include="Misc\Extension.cs" />
|
||||||
<Page Include="Controls\SearchTextBoxUserControl.xaml">
|
<Content Include="..\License.txt">
|
||||||
|
<Link>License.txt</Link>
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Resources\theme.txt" />
|
||||||
|
<None Include="Update.ps1">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<Page Include="WPF\SearchTextBoxUserControl.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Page>
|
||||||
@@ -140,7 +151,11 @@
|
|||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
</Page>
|
</Page>
|
||||||
<Compile Include="Controls\SearchTextBoxUserControl.xaml.cs">
|
<Compile Include="Misc\Help.cs" />
|
||||||
|
<Compile Include="Misc\UpdateCheck.cs" />
|
||||||
|
<Compile Include="Misc\RegistryHelp.cs" />
|
||||||
|
<Compile Include="Misc\Theme.cs" />
|
||||||
|
<Compile Include="WPF\SearchTextBoxUserControl.xaml.cs">
|
||||||
<DependentUpon>SearchTextBoxUserControl.xaml</DependentUpon>
|
<DependentUpon>SearchTextBoxUserControl.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="DynamicGUI\DynamicGUI.cs" />
|
<Compile Include="DynamicGUI\DynamicGUI.cs" />
|
||||||
@@ -212,15 +227,12 @@
|
|||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<None Include="..\Changelog.md">
|
<None Include="..\Changelog.md">
|
||||||
<Link>Changelog.md</Link>
|
<Link>Changelog.md</Link>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
</None>
|
||||||
<None Include="..\Manual.md">
|
<None Include="..\Manual.md">
|
||||||
<Link>Manual.md</Link>
|
<Link>Manual.md</Link>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
</None>
|
||||||
<None Include="..\README.md">
|
<None Include="..\README.md">
|
||||||
<Link>README.md</Link>
|
<Link>README.md</Link>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
</None>
|
||||||
<None Include="app.manifest" />
|
<None Include="app.manifest" />
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
@@ -233,17 +245,11 @@
|
|||||||
<DependentUpon>Settings.settings</DependentUpon>
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Content Include="..\LICENSE.txt">
|
|
||||||
<Link>LICENSE.txt</Link>
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="mpvnet.ico" />
|
<Content Include="mpvnet.ico" />
|
||||||
<Content Include="Resources\mpvConf.txt" />
|
<Content Include="Resources\mpvConf.txt" />
|
||||||
<Content Include="Resources\mpvConfToml.txt" />
|
<Content Include="Resources\confToml.txt" />
|
||||||
<None Include="Resources\mpvnet.ico" />
|
<None Include="Resources\mpvnet.ico" />
|
||||||
<None Include="Resources\mpvnet.png" />
|
<None Include="Resources\mpvnet.png" />
|
||||||
<None Include="Resources\mpvNetConf.txt" />
|
|
||||||
<Content Include="Resources\mpvNetConfToml.txt" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="App.config" />
|
<None Include="App.config" />
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
@@ -58,6 +59,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static List<KeyValuePair<string, Action<bool>>> BoolPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<bool>>>();
|
public static List<KeyValuePair<string, Action<bool>>> BoolPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<bool>>>();
|
||||||
public static List<KeyValuePair<string, Action<int>>> IntPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<int>>>();
|
public static List<KeyValuePair<string, Action<int>>> IntPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<int>>>();
|
||||||
|
public static List<KeyValuePair<string, Action<double>>> DoublePropChangeActions { get; set; } = new List<KeyValuePair<string, Action<double>>>();
|
||||||
public static List<KeyValuePair<string, Action<string>>> StringPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<string>>>();
|
public static List<KeyValuePair<string, Action<string>>> StringPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<string>>>();
|
||||||
public static List<MediaTrack> MediaTracks { get; set; } = new List<MediaTrack>();
|
public static List<MediaTrack> MediaTracks { get; set; } = new List<MediaTrack>();
|
||||||
public static List<KeyValuePair<string, double>> Chapters { get; set; } = new List<KeyValuePair<string, double>>();
|
public static List<KeyValuePair<string, double>> Chapters { get; set; } = new List<KeyValuePair<string, double>>();
|
||||||
@@ -91,7 +93,6 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
LoadLibrary("mpv-1.dll");
|
|
||||||
Handle = mpv_create();
|
Handle = mpv_create();
|
||||||
Task.Run(() => EventLoop());
|
Task.Run(() => EventLoop());
|
||||||
|
|
||||||
@@ -117,7 +118,9 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void ProcessProperty(string name, string value)
|
public static void ProcessProperty(string name, string value)
|
||||||
{
|
{
|
||||||
if (name.Any(char.IsUpper)) Msg.ShowError("Uppercase char detected: " + name, "mpv properties using the command line and the mpv.conf config file are required to be lowercase.");
|
if (name.Any(char.IsUpper))
|
||||||
|
Msg.ShowError("Uppercase char detected: " + name,
|
||||||
|
"mpv properties using the command line and the mpv.conf config file are required to be lowercase.");
|
||||||
|
|
||||||
switch (name)
|
switch (name)
|
||||||
{
|
{
|
||||||
@@ -148,23 +151,21 @@ namespace mpvnet
|
|||||||
get {
|
get {
|
||||||
if (_ConfigFolder == null)
|
if (_ConfigFolder == null)
|
||||||
{
|
{
|
||||||
string portableFolder = Folder.Startup + "portable_config\\";
|
string portableFolder = Folder.Startup + @"portable_config\";
|
||||||
_ConfigFolder = portableFolder;
|
_ConfigFolder = portableFolder;
|
||||||
|
|
||||||
if (!Directory.Exists(_ConfigFolder))
|
if (!Directory.Exists(_ConfigFolder))
|
||||||
_ConfigFolder = RegHelp.GetString(App.RegPath, "ConfigFolder");
|
_ConfigFolder = RegistryHelp.GetString(App.RegPath, "ConfigFolder");
|
||||||
|
|
||||||
if (!Directory.Exists(_ConfigFolder))
|
if (!Directory.Exists(_ConfigFolder))
|
||||||
{
|
{
|
||||||
string appdataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv.net\\";
|
string appdataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\mpv.net\";
|
||||||
string appdataFolderMpv = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\";
|
|
||||||
|
|
||||||
using (TaskDialog<string> td = new TaskDialog<string>())
|
using (TaskDialog<string> td = new TaskDialog<string>())
|
||||||
{
|
{
|
||||||
td.MainInstruction = "Choose a settings folder.";
|
td.MainInstruction = "Choose a settings folder.";
|
||||||
td.AddCommandLink(@"AppData\Roaming\mpv.net", appdataFolder, appdataFolder);
|
td.AddCommandLink(@"AppData\Roaming\mpv.net", appdataFolder, appdataFolder);
|
||||||
td.AddCommandLink(@"AppData\Roaming\mpv", appdataFolderMpv, appdataFolderMpv);
|
td.AddCommandLink(@"<startup>\portable_config", portableFolder, portableFolder);
|
||||||
td.AddCommandLink("<startup>\\portable_config", portableFolder, portableFolder);
|
|
||||||
td.AddCommandLink("Choose custom folder", "custom");
|
td.AddCommandLink("Choose custom folder", "custom");
|
||||||
_ConfigFolder = td.Show();
|
_ConfigFolder = td.Show();
|
||||||
}
|
}
|
||||||
@@ -182,7 +183,7 @@ namespace mpvnet
|
|||||||
d.Description = "Choose a folder.";
|
d.Description = "Choose a folder.";
|
||||||
|
|
||||||
if (d.ShowDialog() == WinForms.DialogResult.OK)
|
if (d.ShowDialog() == WinForms.DialogResult.OK)
|
||||||
_ConfigFolder = d.SelectedPath + "\\";
|
_ConfigFolder = d.SelectedPath + @"\";
|
||||||
else
|
else
|
||||||
_ConfigFolder = appdataFolder;
|
_ConfigFolder = appdataFolder;
|
||||||
}
|
}
|
||||||
@@ -199,17 +200,15 @@ namespace mpvnet
|
|||||||
Directory.CreateDirectory(_ConfigFolder);
|
Directory.CreateDirectory(_ConfigFolder);
|
||||||
|
|
||||||
if (!_ConfigFolder.Contains("portable_config"))
|
if (!_ConfigFolder.Contains("portable_config"))
|
||||||
RegHelp.SetObject(App.RegPath, "ConfigFolder", _ConfigFolder);
|
RegistryHelp.SetValue(App.RegPath, "ConfigFolder", _ConfigFolder);
|
||||||
|
|
||||||
if (!File.Exists(_ConfigFolder + "input.conf"))
|
if (!File.Exists(_ConfigFolder + "input.conf"))
|
||||||
File.WriteAllText(_ConfigFolder + "input.conf", Properties.Resources.inputConf);
|
File.WriteAllText(_ConfigFolder + "input.conf", Properties.Resources.inputConf);
|
||||||
|
|
||||||
if (!File.Exists(_ConfigFolder + "mpv.conf"))
|
if (!File.Exists(_ConfigFolder + "mpv.conf"))
|
||||||
File.WriteAllText(_ConfigFolder + "mpv.conf", Properties.Resources.mpvConf);
|
File.WriteAllText(_ConfigFolder + "mpv.conf", Properties.Resources.mpvConf);
|
||||||
|
|
||||||
if (!File.Exists(_ConfigFolder + "mpvnet.conf"))
|
|
||||||
File.WriteAllText(_ConfigFolder + "mpvnet.conf", Properties.Resources.mpvNetConf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return _ConfigFolder;
|
return _ConfigFolder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -381,22 +380,33 @@ namespace mpvnet
|
|||||||
var propData = (mpv_event_property)Marshal.PtrToStructure(evt.data, typeof(mpv_event_property));
|
var propData = (mpv_event_property)Marshal.PtrToStructure(evt.data, typeof(mpv_event_property));
|
||||||
|
|
||||||
if (propData.format == mpv_format.MPV_FORMAT_FLAG)
|
if (propData.format == mpv_format.MPV_FORMAT_FLAG)
|
||||||
|
{
|
||||||
lock (BoolPropChangeActions)
|
lock (BoolPropChangeActions)
|
||||||
foreach (var i in BoolPropChangeActions)
|
foreach (var i in BoolPropChangeActions)
|
||||||
if (i.Key== propData.name)
|
if (i.Key== propData.name)
|
||||||
i.Value.Invoke(Marshal.PtrToStructure<int>(propData.data) == 1);
|
i.Value.Invoke(Marshal.PtrToStructure<int>(propData.data) == 1);
|
||||||
|
}
|
||||||
if (propData.format == mpv_format.MPV_FORMAT_STRING)
|
else if (propData.format == mpv_format.MPV_FORMAT_STRING)
|
||||||
|
{
|
||||||
lock (StringPropChangeActions)
|
lock (StringPropChangeActions)
|
||||||
foreach (var i in StringPropChangeActions)
|
foreach (var i in StringPropChangeActions)
|
||||||
if (i.Key == propData.name)
|
if (i.Key == propData.name)
|
||||||
i.Value.Invoke(StringFromNativeUtf8(Marshal.PtrToStructure<IntPtr>(propData.data)));
|
i.Value.Invoke(StringFromNativeUtf8(Marshal.PtrToStructure<IntPtr>(propData.data)));
|
||||||
|
}
|
||||||
if (propData.format == mpv_format.MPV_FORMAT_INT64)
|
else if(propData.format == mpv_format.MPV_FORMAT_INT64)
|
||||||
|
{
|
||||||
lock (IntPropChangeActions)
|
lock (IntPropChangeActions)
|
||||||
foreach (var i in IntPropChangeActions)
|
foreach (var i in IntPropChangeActions)
|
||||||
if (i.Key == propData.name)
|
if (i.Key == propData.name)
|
||||||
i.Value.Invoke(Marshal.PtrToStructure<int>(propData.data));
|
i.Value.Invoke(Marshal.PtrToStructure<int>(propData.data));
|
||||||
|
}
|
||||||
|
else if (propData.format == mpv_format.MPV_FORMAT_DOUBLE)
|
||||||
|
{
|
||||||
|
lock (DoublePropChangeActions)
|
||||||
|
foreach (var i in DoublePropChangeActions)
|
||||||
|
if (i.Key == propData.name)
|
||||||
|
i.Value.Invoke(Marshal.PtrToStructure<double>(propData.data));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case mpv_event_id.MPV_EVENT_PLAYBACK_RESTART:
|
case mpv_event_id.MPV_EVENT_PLAYBACK_RESTART:
|
||||||
PlaybackRestart?.Invoke();
|
PlaybackRestart?.Invoke();
|
||||||
@@ -556,6 +566,17 @@ namespace mpvnet
|
|||||||
IntPropChangeActions.Add(new KeyValuePair<string, Action<int>>(name, action));
|
IntPropChangeActions.Add(new KeyValuePair<string, Action<int>>(name, action));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void observe_property_double(string name, Action<double> action)
|
||||||
|
{
|
||||||
|
int err = mpv_observe_property(Handle, (ulong)action.GetHashCode(), name, mpv_format.MPV_FORMAT_DOUBLE);
|
||||||
|
|
||||||
|
if (err < 0)
|
||||||
|
throw new Exception($"{name}: {(mpv_error)err}");
|
||||||
|
else
|
||||||
|
lock (DoublePropChangeActions)
|
||||||
|
DoublePropChangeActions.Add(new KeyValuePair<string, Action<double>>(name, action));
|
||||||
|
}
|
||||||
|
|
||||||
public static void observe_property_bool(string name, Action<bool> action)
|
public static void observe_property_bool(string name, Action<bool> action)
|
||||||
{
|
{
|
||||||
int err = mpv_observe_property(Handle, (ulong)action.GetHashCode(), name, mpv_format.MPV_FORMAT_FLAG);
|
int err = mpv_observe_property(Handle, (ulong)action.GetHashCode(), name, mpv_format.MPV_FORMAT_FLAG);
|
||||||
@@ -637,7 +658,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Load(files.ToArray(), App.ProcessInstance != "queue", Control.ModifierKeys.HasFlag(Keys.Control));
|
Load(files.ToArray(), !App.Queue, Control.ModifierKeys.HasFlag(Keys.Control) || App.Queue);
|
||||||
|
|
||||||
if (files.Count == 0 || files[0].Contains("://"))
|
if (files.Count == 0 || files[0].Contains("://"))
|
||||||
{
|
{
|
||||||
@@ -665,10 +686,12 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void Load(string[] files, bool loadFolder, bool append)
|
public static void Load(string[] files, bool loadFolder, bool append)
|
||||||
{
|
{
|
||||||
if (files is null || files.Length == 0) return;
|
if (files is null || files.Length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
HideLogo();
|
HideLogo();
|
||||||
|
|
||||||
if ((DateTime.Now - LastLoad).TotalMilliseconds < 500)
|
if ((DateTime.Now - LastLoad).TotalMilliseconds < 1000)
|
||||||
append = true;
|
append = true;
|
||||||
|
|
||||||
LastLoad = DateTime.Now;
|
LastLoad = DateTime.Now;
|
||||||
@@ -685,26 +708,37 @@ namespace mpvnet
|
|||||||
if (string.IsNullOrEmpty(get_property_string("path")))
|
if (string.IsNullOrEmpty(get_property_string("path")))
|
||||||
set_property_int("playlist-pos", 0);
|
set_property_int("playlist-pos", 0);
|
||||||
|
|
||||||
if (loadFolder && !append) Task.Run(() => LoadFolder()); // user reported race condition
|
if (loadFolder && !append)
|
||||||
|
Task.Run(() => LoadFolder());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void LoadFolder()
|
public static void LoadFolder()
|
||||||
{
|
{
|
||||||
if (!App.AutoLoadFolder) return;
|
if (!App.AutoLoadFolder || Control.ModifierKeys.HasFlag(Keys.Shift))
|
||||||
Thread.Sleep(200); // user reported race condition
|
return;
|
||||||
|
|
||||||
|
Thread.Sleep(1000);
|
||||||
string path = get_property_string("path");
|
string path = get_property_string("path");
|
||||||
if (!File.Exists(path) || get_property_int("playlist-count") != 1) return;
|
|
||||||
|
if (!File.Exists(path) || get_property_int("playlist-count") != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
List<string> files = Directory.GetFiles(Path.GetDirectoryName(path)).ToList();
|
List<string> files = Directory.GetFiles(Path.GetDirectoryName(path)).ToList();
|
||||||
|
|
||||||
files = files.Where(file =>
|
files = files.Where(file =>
|
||||||
App.VideoTypes.Contains(file.ShortExt()) ||
|
App.VideoTypes.Contains(file.ShortExt()) ||
|
||||||
App.AudioTypes.Contains(file.ShortExt()) ||
|
App.AudioTypes.Contains(file.ShortExt()) ||
|
||||||
App.ImageTypes.Contains(file.ShortExt())).ToList();
|
App.ImageTypes.Contains(file.ShortExt())).ToList();
|
||||||
|
|
||||||
files.Sort(new StringLogicalComparer());
|
files.Sort(new StringLogicalComparer());
|
||||||
int index = files.IndexOf(path);
|
int index = files.IndexOf(path);
|
||||||
files.Remove(path);
|
files.Remove(path);
|
||||||
|
|
||||||
foreach (string i in files)
|
foreach (string i in files)
|
||||||
commandv("loadfile", i, "append");
|
commandv("loadfile", i, "append");
|
||||||
if (index > 0) commandv("playlist-move", "0", (index + 1).ToString());
|
|
||||||
|
if (index > 0)
|
||||||
|
commandv("playlist-move", "0", (index + 1).ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IntPtr AllocateUtf8IntPtrArrayWithSentinel(string[] arr, out IntPtr[] byteArrayPointers)
|
public static IntPtr AllocateUtf8IntPtrArrayWithSentinel(string[] arr, out IntPtr[] byteArrayPointers)
|
||||||
@@ -758,9 +792,9 @@ namespace mpvnet
|
|||||||
|
|
||||||
int totalMinutes = Convert.ToInt32((DateTime.Now - LastHistoryStartDateTime).TotalMinutes);
|
int totalMinutes = Convert.ToInt32((DateTime.Now - LastHistoryStartDateTime).TotalMinutes);
|
||||||
|
|
||||||
if (PathHelp.GetBaseName(LastHistoryPath) != "" && totalMinutes > 1)
|
if (LastHistoryPath != null && totalMinutes > 1)
|
||||||
File.AppendAllText(ConfigFolder + "history.txt", DateTime.Now.ToString().Substring(0, 16) +
|
File.AppendAllText(ConfigFolder + "history.txt", DateTime.Now.ToString().Substring(0, 16) +
|
||||||
" " + totalMinutes.ToString().PadLeft(3) + " " + PathHelp.GetBaseName(LastHistoryPath) + "\r\n");
|
" " + totalMinutes.ToString().PadLeft(3) + " " + LastHistoryPath + "\r\n");
|
||||||
|
|
||||||
LastHistoryPath = path;
|
LastHistoryPath = path;
|
||||||
LastHistoryStartDateTime = DateTime.Now;
|
LastHistoryStartDateTime = DateTime.Now;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
#define MyAppName "mpv.net"
|
#define MyAppName "mpv.net"
|
||||||
#define MyAppExeName "mpvnet.exe"
|
#define MyAppExeName "mpvnet.exe"
|
||||||
|
|
||||||
@@ -18,9 +19,11 @@ AppId={{9AA2B100-BEF3-44D0-B819-D8FC3C4D557D}}
|
|||||||
AppName={#MyAppName}
|
AppName={#MyAppName}
|
||||||
AppVersion={#MyAppVersion}
|
AppVersion={#MyAppVersion}
|
||||||
AppPublisher=Frank Skare (stax76)
|
AppPublisher=Frank Skare (stax76)
|
||||||
|
|
||||||
#if arch == "x64"
|
#if arch == "x64"
|
||||||
ArchitecturesInstallIn64BitMode=x64
|
ArchitecturesInstallIn64BitMode=x64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Compression=lzma2
|
Compression=lzma2
|
||||||
DefaultDirName={commonpf}\{#MyAppName}
|
DefaultDirName={commonpf}\{#MyAppName}
|
||||||
OutputBaseFilename=mpv.net-setup-{#arch}-{#MyAppVersion}
|
OutputBaseFilename=mpv.net-setup-{#arch}-{#MyAppVersion}
|
||||||
@@ -34,7 +37,7 @@ Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
|||||||
|
|
||||||
[Files]
|
[Files]
|
||||||
Source: "{#MyAppSourceDir}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
|
Source: "{#MyAppSourceDir}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
|
||||||
Source: "{#MyAppSourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: "System.Management.Automation.xml"
|
Source: "{#MyAppSourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
|
||||||
|
|
||||||
[Run]
|
[Run]
|
||||||
Filename: "{app}\{#MyAppExeName}"; Description: "Associate video file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc video"
|
Filename: "{app}\{#MyAppExeName}"; Description: "Associate video file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc video"
|
||||||
|
|||||||
Reference in New Issue
Block a user