mirror of
https://github.com/wagesj45/butterflow-ui.git
synced 2024-12-22 17:12:42 -06:00
Advanced options and documentation
Added a lot of new advanced options and documented a lot of functions and members.
This commit is contained in:
parent
d0b29f20fd
commit
2e73a77538
10 changed files with 568 additions and 33 deletions
|
@ -8,6 +8,7 @@ using System.Windows.Controls;
|
||||||
|
|
||||||
namespace butterflow_ui
|
namespace butterflow_ui
|
||||||
{
|
{
|
||||||
|
/// <summary> A butterflowUI option. Contains layout information for use in butterflowUI. </summary>
|
||||||
public class ButterflowOption : ContentControl
|
public class ButterflowOption : ContentControl
|
||||||
{
|
{
|
||||||
#region Properties
|
#region Properties
|
||||||
|
|
|
@ -6,7 +6,8 @@ using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace butterflow_ui
|
namespace butterflow_ui
|
||||||
{
|
{
|
||||||
public class ButterflowSubregion : PropertyChangedAlerter, System.ComponentModel.INotifyPropertyChanged
|
/// <summary> A butterflow video subregion. Represents a snippet of a video on which butterflow will act. </summary>
|
||||||
|
public class ButterflowSubregion : PropertyChangedAlerter
|
||||||
{
|
{
|
||||||
#region Members
|
#region Members
|
||||||
|
|
||||||
|
|
|
@ -5,20 +5,27 @@ using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace butterflow_ui
|
namespace butterflow_ui
|
||||||
{
|
{
|
||||||
|
/// <summary> A butterflow wrapper. Provides interaction with the butterflow executable. </summary>
|
||||||
public class ButterflowWrapper : PropertyChangedAlerter
|
public class ButterflowWrapper : PropertyChangedAlerter
|
||||||
{
|
{
|
||||||
#region Members
|
#region Members
|
||||||
|
|
||||||
|
/// <summary> The RegEx string for matching probed resolution. </summary>
|
||||||
|
private const string REGEX_RESOLUTION = @"Resolution\s*:\s(?<Width>\d+)x(?<Height>\d+)";
|
||||||
|
/// <summary> The RegEx string for matching the probed playback rate.. </summary>
|
||||||
|
private const string REGEX_RATE = @"Rate\s*:\s(?<Rate>\d+\.\d+) fps";
|
||||||
|
|
||||||
/// <summary> Full pathname of the butterflow executable file. </summary>
|
/// <summary> Full pathname of the butterflow executable file. </summary>
|
||||||
private Lazy<string> executablePath = new Lazy<string>(() => Path.Combine(Directory.GetCurrentDirectory(), "ThirdPartyCompiled", "butterflow.exe"));
|
private Lazy<string> executablePath = new Lazy<string>(() => Path.Combine(Directory.GetCurrentDirectory(), "ThirdPartyCompiled", "butterflow.exe"));
|
||||||
/// <summary> The console output from butterflow. </summary>
|
/// <summary> The console output from butterflow. </summary>
|
||||||
private string consoleOutput = string.Empty;
|
private string consoleOutput = string.Empty;
|
||||||
/// <summary> Event queue for all listeners interested in ConsoleOutputRecieved events. </summary>
|
/// <summary> Event queue for all listeners interested in ParsedConsoleOutputRecieved events. </summary>
|
||||||
//public event EventHandler<ButterflowConsoleOutputArgs> ConsoleOutputRecieved;
|
public event EventHandler<ButterflowOutputArgs> ParsedConsoleOutputRecieved;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -71,35 +78,100 @@ namespace butterflow_ui
|
||||||
process.StartInfo.UseShellExecute = false;
|
process.StartInfo.UseShellExecute = false;
|
||||||
process.StartInfo.RedirectStandardOutput = true;
|
process.StartInfo.RedirectStandardOutput = true;
|
||||||
process.EnableRaisingEvents = true;
|
process.EnableRaisingEvents = true;
|
||||||
process.OutputDataReceived += ProcessOutputDataReceived;
|
process.OutputDataReceived += Process_OutputDataReceived; ;
|
||||||
|
|
||||||
process.Start();
|
process.Start();
|
||||||
process.BeginOutputReadLine();
|
process.BeginOutputReadLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Process the output data received from the butterflow executable. </summary>
|
/// <summary>
|
||||||
/// <param name="sender"> Source of the event. </param>
|
/// Parses console output and attempts to find known values. If a known value is found, the
|
||||||
/// <param name="e"> Data received event information. </param>
|
/// <seealso cref="ParsedConsoleOutputRecieved"/> event is triggered.
|
||||||
private void ProcessOutputDataReceived(object sender, DataReceivedEventArgs e)
|
/// </summary>
|
||||||
|
/// <param name="consoleOutput"> The console output from butterflow. </param>
|
||||||
|
private void ParseConsoleOutput(string consoleOutput)
|
||||||
{
|
{
|
||||||
this.ConsoleOutput += string.Format("{0}{1}", e.Data, Environment.NewLine);
|
if (string.IsNullOrWhiteSpace(consoleOutput))
|
||||||
//OnConsoleOutputRecieved(e.Data);
|
{
|
||||||
|
//Ignore null content and just escape.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Test for resolution
|
||||||
|
var regex = new Regex(REGEX_RESOLUTION);
|
||||||
|
foreach (Match match in regex.Matches(consoleOutput))
|
||||||
|
{
|
||||||
|
var width = match.Groups["Width"].Value;
|
||||||
|
var height = match.Groups["Height"].Value;
|
||||||
|
|
||||||
|
OnParsedConsoleOutputRecieved(ButterflowOutputType.Width, width, consoleOutput);
|
||||||
|
OnParsedConsoleOutputRecieved(ButterflowOutputType.Height, height, consoleOutput);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Test for playback rate
|
||||||
|
regex = new Regex(REGEX_RATE);
|
||||||
|
foreach(Match match in regex.Matches(consoleOutput))
|
||||||
|
{
|
||||||
|
var rate = match.Groups["Rate"].Value;
|
||||||
|
|
||||||
|
OnParsedConsoleOutputRecieved(ButterflowOutputType.Rate, rate, consoleOutput);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Executes the console output recieved event handler. </summary>
|
/// <summary> Executes the parsed console output recieved action. </summary>
|
||||||
/// <param name="output"> The output that has been recieved from butterflow. </param>
|
/// <param name="outputType"> Type of the output. </param>
|
||||||
//protected void OnConsoleOutputRecieved(string output)
|
/// <param name="value"> The value. </param>
|
||||||
//{
|
/// <param name="consoleOutput"> The console output from butterflow. </param>
|
||||||
// if (this.ConsoleOutputRecieved != null)
|
private void OnParsedConsoleOutputRecieved(ButterflowOutputType outputType, string value, string consoleOutput)
|
||||||
// {
|
{
|
||||||
// this.ConsoleOutputRecieved(this, new ButterflowConsoleOutputArgs(output));
|
if (this.ParsedConsoleOutputRecieved != null)
|
||||||
// }
|
{
|
||||||
//}
|
this.ParsedConsoleOutputRecieved(this, new ButterflowOutputArgs(outputType, value, consoleOutput));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Event handler. Called by Process for output data received events. </summary>
|
||||||
|
/// <param name="sender"> Source of the event. </param>
|
||||||
|
/// <param name="e"> Data received event information. </param>
|
||||||
|
private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
|
||||||
|
{
|
||||||
|
this.ConsoleOutput += string.Format("{0}{1}", e.Data, Environment.NewLine);
|
||||||
|
ParseConsoleOutput(e.Data);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Subclasses
|
#region Subclasses
|
||||||
|
|
||||||
|
/// <summary> Arguments for butterflow output events where a known value of type <seealso cref="ButterflowOutputType"/> can be parsed. </summary>
|
||||||
|
public class ButterflowOutputArgs : ButterflowConsoleOutputArgs
|
||||||
|
{
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
|
||||||
|
/// <summary> Gets or sets the type of the output detected from butterflow. </summary>
|
||||||
|
/// <value> The type of the output detected from butterflow. </value>
|
||||||
|
public ButterflowOutputType OutputType { get; private set; }
|
||||||
|
|
||||||
|
/// <summary> Gets or sets the value detected from butterflow. </summary>
|
||||||
|
/// <value> The value detected from butterflow. </value>
|
||||||
|
public string Value { get; private set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/// <summary> Constructor. </summary>
|
||||||
|
/// <param name="outputType"> The type of the output detected from butterflow. </param>
|
||||||
|
/// <param name="value"> The value detected from butterflow. </param>
|
||||||
|
/// <param name="consoleOutput"> The console output. </param>
|
||||||
|
public ButterflowOutputArgs(ButterflowOutputType outputType, string value, string consoleOutput)
|
||||||
|
: base(consoleOutput)
|
||||||
|
{
|
||||||
|
this.OutputType = outputType;
|
||||||
|
this.Value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Arguments for butterflow console output events. </summary>
|
||||||
public class ButterflowConsoleOutputArgs : EventArgs
|
public class ButterflowConsoleOutputArgs : EventArgs
|
||||||
{
|
{
|
||||||
#region Properties
|
#region Properties
|
||||||
|
@ -122,6 +194,19 @@ namespace butterflow_ui
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary> Values that represent butterflow output types. </summary>
|
||||||
|
public enum ButterflowOutputType
|
||||||
|
{
|
||||||
|
/// <summary> Video Width. </summary>
|
||||||
|
Width,
|
||||||
|
/// <summary> Video Height. </summary>
|
||||||
|
Height,
|
||||||
|
/// <summary> Video playback rate. </summary>
|
||||||
|
Rate,
|
||||||
|
/// <summary> Video processing progress. </summary>
|
||||||
|
Progress
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,4 +130,22 @@
|
||||||
</Path>
|
</Path>
|
||||||
</Viewbox>
|
</Viewbox>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
|
<ControlTemplate x:Key="LockedIcon">
|
||||||
|
<Viewbox>
|
||||||
|
<Path Fill="#000000">
|
||||||
|
<Path.Data>
|
||||||
|
<PathGeometry Figures="M18 10v-4c0-3.313-2.687-6-6-6s-6 2.687-6 6v4h-3v14h18v-14h-3zm-10 0v-4c0-2.206 1.794-4 4-4s4 1.794 4 4v4h-8z" FillRule="NonZero"/>
|
||||||
|
</Path.Data>
|
||||||
|
</Path>
|
||||||
|
</Viewbox>
|
||||||
|
</ControlTemplate>
|
||||||
|
<ControlTemplate x:Key="UnlockedIcon">
|
||||||
|
<Viewbox>
|
||||||
|
<Path Name="path885" Fill="#000000">
|
||||||
|
<Path.Data>
|
||||||
|
<PathGeometry Figures="M12 10v-4c0-3.313-2.687-6-6-6s-6 2.687-6 6v3h2v-3c0-2.206 1.794-4 4-4s4 1.794 4 4v4h-4v14h18v-14h-12z" FillRule="NonZero"/>
|
||||||
|
</Path.Data>
|
||||||
|
</Path>
|
||||||
|
</Viewbox>
|
||||||
|
</ControlTemplate>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
148
butterflow-ui/Localization/Localization.Designer.cs
generated
148
butterflow-ui/Localization/Localization.Designer.cs
generated
|
@ -124,7 +124,7 @@ namespace butterflow_ui.Localization {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to More about butterflow....
|
/// Looks up a localized string similar to butterflow on github....
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string AboutButterflowMenu {
|
public static string AboutButterflowMenu {
|
||||||
get {
|
get {
|
||||||
|
@ -133,7 +133,7 @@ namespace butterflow_ui.Localization {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to More about butterflow-ui....
|
/// Looks up a localized string similar to butterflow-ui on github....
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string AboutButterflowUIMenu {
|
public static string AboutButterflowUIMenu {
|
||||||
get {
|
get {
|
||||||
|
@ -204,6 +204,24 @@ namespace butterflow_ui.Localization {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Use Fast Pyramids.
|
||||||
|
/// </summary>
|
||||||
|
public static string FastPyramidsLabel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FastPyramidsLabel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to .
|
||||||
|
/// </summary>
|
||||||
|
public static string FastPyramidsTooltip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FastPyramidsTooltip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Input.
|
/// Looks up a localized string similar to Input.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -249,6 +267,24 @@ namespace butterflow_ui.Localization {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Pyramid iterations.
|
||||||
|
/// </summary>
|
||||||
|
public static string IterationsLabel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("IterationsLabel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to The number of iterations to use for each pyramid layer..
|
||||||
|
/// </summary>
|
||||||
|
public static string IterationsTooltip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("IterationsTooltip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Renders the output video with the audio from the original video. In unchecked, no sound will be included in the output video..
|
/// Looks up a localized string similar to Renders the output video with the audio from the original video. In unchecked, no sound will be included in the output video..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -267,6 +303,24 @@ namespace butterflow_ui.Localization {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Levels.
|
||||||
|
/// </summary>
|
||||||
|
public static string LevelsLabel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LevelsLabel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to The number of pyramid layers..
|
||||||
|
/// </summary>
|
||||||
|
public static string LevelsTooltip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LevelsTooltip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Renders the video without lossy compression. The video will not lose any visual quality, but it will result in a very large output file..
|
/// Looks up a localized string similar to Renders the video without lossy compression. The video will not lose any visual quality, but it will result in a very large output file..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -285,6 +339,24 @@ namespace butterflow_ui.Localization {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Pixel Neighborhood.
|
||||||
|
/// </summary>
|
||||||
|
public static string PixelNeighborhoodLabel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("PixelNeighborhoodLabel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Size of the pixel neighborhood..
|
||||||
|
/// </summary>
|
||||||
|
public static string PixelNeighborhoodTooltip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("PixelNeighborhoodTooltip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Controls the new framerate of the output video. This can be set in both absolute and relative terms..
|
/// Looks up a localized string similar to Controls the new framerate of the output video. This can be set in both absolute and relative terms..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -312,6 +384,24 @@ namespace butterflow_ui.Localization {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Pyramid Scale Factor.
|
||||||
|
/// </summary>
|
||||||
|
public static string PyramidScaleLabel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("PyramidScaleLabel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to .
|
||||||
|
/// </summary>
|
||||||
|
public static string PyramidScaleTooltip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("PyramidScaleTooltip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Video Rendering.
|
/// Looks up a localized string similar to Video Rendering.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -348,6 +438,42 @@ namespace butterflow_ui.Localization {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Smooth Derivative.
|
||||||
|
/// </summary>
|
||||||
|
public static string SmoothDerivativeLabel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SmoothDerivativeLabel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Size of the standard deviation used for smooth derivatives..
|
||||||
|
/// </summary>
|
||||||
|
public static string SmoothDerivativeTooltip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SmoothDerivativeTooltip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Smooth Motion.
|
||||||
|
/// </summary>
|
||||||
|
public static string SmoothMotionLabel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SmoothMotionLabel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Set to tune for smooth motion. This mode yields artifact-less frames by emphasizing blended frames over warping pixels..
|
||||||
|
/// </summary>
|
||||||
|
public static string SmoothMotionTooltip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("SmoothMotionTooltip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to S.
|
/// Looks up a localized string similar to S.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -410,5 +536,23 @@ namespace butterflow_ui.Localization {
|
||||||
return ResourceManager.GetString("WidthLabel", resourceCulture);
|
return ResourceManager.GetString("WidthLabel", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Window Size.
|
||||||
|
/// </summary>
|
||||||
|
public static string WindowSizeLabel {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("WindowSizeLabel", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to .
|
||||||
|
/// </summary>
|
||||||
|
public static string WindowSizeTooltip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("WindowSizeTooltip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,10 +118,10 @@
|
||||||
<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>
|
||||||
<data name="AboutButterflowMenu" xml:space="preserve">
|
<data name="AboutButterflowMenu" xml:space="preserve">
|
||||||
<value>More about butterflow...</value>
|
<value>butterflow on github...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AboutButterflowUIMenu" xml:space="preserve">
|
<data name="AboutButterflowUIMenu" xml:space="preserve">
|
||||||
<value>More about butterflow-ui...</value>
|
<value>butterflow-ui on github...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AboutMenu" xml:space="preserve">
|
<data name="AboutMenu" xml:space="preserve">
|
||||||
<value>About butterflow-ui</value>
|
<value>About butterflow-ui</value>
|
||||||
|
@ -234,4 +234,52 @@
|
||||||
<data name="_60fpsLabel" xml:space="preserve">
|
<data name="_60fpsLabel" xml:space="preserve">
|
||||||
<value>60 fps</value>
|
<value>60 fps</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="FastPyramidsLabel" xml:space="preserve">
|
||||||
|
<value>Use Fast Pyramids</value>
|
||||||
|
</data>
|
||||||
|
<data name="FastPyramidsTooltip" xml:space="preserve">
|
||||||
|
<value />
|
||||||
|
</data>
|
||||||
|
<data name="IterationsLabel" xml:space="preserve">
|
||||||
|
<value>Pyramid iterations</value>
|
||||||
|
</data>
|
||||||
|
<data name="IterationsTooltip" xml:space="preserve">
|
||||||
|
<value>The number of iterations to use for each pyramid layer.</value>
|
||||||
|
</data>
|
||||||
|
<data name="LevelsLabel" xml:space="preserve">
|
||||||
|
<value>Levels</value>
|
||||||
|
</data>
|
||||||
|
<data name="LevelsTooltip" xml:space="preserve">
|
||||||
|
<value>The number of pyramid layers.</value>
|
||||||
|
</data>
|
||||||
|
<data name="PixelNeighborhoodLabel" xml:space="preserve">
|
||||||
|
<value>Pixel Neighborhood</value>
|
||||||
|
</data>
|
||||||
|
<data name="PixelNeighborhoodTooltip" xml:space="preserve">
|
||||||
|
<value>Size of the pixel neighborhood.</value>
|
||||||
|
</data>
|
||||||
|
<data name="PyramidScaleLabel" xml:space="preserve">
|
||||||
|
<value>Pyramid Scale Factor</value>
|
||||||
|
</data>
|
||||||
|
<data name="PyramidScaleTooltip" xml:space="preserve">
|
||||||
|
<value />
|
||||||
|
</data>
|
||||||
|
<data name="SmoothDerivativeLabel" xml:space="preserve">
|
||||||
|
<value>Smooth Derivative</value>
|
||||||
|
</data>
|
||||||
|
<data name="SmoothDerivativeTooltip" xml:space="preserve">
|
||||||
|
<value>Size of the standard deviation used for smooth derivatives.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SmoothMotionLabel" xml:space="preserve">
|
||||||
|
<value>Smooth Motion</value>
|
||||||
|
</data>
|
||||||
|
<data name="SmoothMotionTooltip" xml:space="preserve">
|
||||||
|
<value>Set to tune for smooth motion. This mode yields artifact-less frames by emphasizing blended frames over warping pixels.</value>
|
||||||
|
</data>
|
||||||
|
<data name="WindowSizeLabel" xml:space="preserve">
|
||||||
|
<value>Window Size</value>
|
||||||
|
</data>
|
||||||
|
<data name="WindowSizeTooltip" xml:space="preserve">
|
||||||
|
<value />
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -127,13 +127,37 @@
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="16 " />
|
||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<butterflow_ui:ButterflowOption Grid.Column="0" LabelValue="{x:Static loc:Localization.WidthLabel}">
|
<butterflow_ui:ButterflowOption Grid.Column="0" LabelValue="{x:Static loc:Localization.WidthLabel}">
|
||||||
<TextBox Text="{Binding OptionsConfiguration.Width, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" />
|
<TextBox Text="{Binding OptionsConfiguration.Width, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" />
|
||||||
</butterflow_ui:ButterflowOption>
|
</butterflow_ui:ButterflowOption>
|
||||||
<butterflow_ui:ButterflowOption Grid.Column="1" LabelValue="{x:Static loc:Localization.HeightLabel}">
|
<ToggleButton Grid.Column="1" IsChecked="{Binding OptionsConfiguration.LockAspectRatio, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0" Background="{x:Null}">
|
||||||
<TextBox Text="{Binding OptionsConfiguration.Height, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" />
|
<ToggleButton.Style>
|
||||||
|
<Style TargetType="{x:Type ToggleButton}">
|
||||||
|
<Setter Property="Content">
|
||||||
|
<Setter.Value>
|
||||||
|
<ContentControl HorizontalAlignment="Center" Template="{StaticResource UnlockedIcon}" />
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsChecked" Value="True">
|
||||||
|
<Setter Property="Content">
|
||||||
|
<Setter.Value>
|
||||||
|
<ContentControl HorizontalAlignment="Center" Template="{StaticResource LockedIcon}" />
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</ToggleButton.Style>
|
||||||
|
</ToggleButton>
|
||||||
|
<Button BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Click="bntVideoStop_Click">
|
||||||
|
|
||||||
|
</Button>
|
||||||
|
<butterflow_ui:ButterflowOption Grid.Column="2" LabelValue="{x:Static loc:Localization.HeightLabel}">
|
||||||
|
<TextBox Text="{Binding OptionsConfiguration.Height, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" IsReadOnly="{Binding OptionsConfiguration.LockAspectRatio, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" />
|
||||||
</butterflow_ui:ButterflowOption>
|
</butterflow_ui:ButterflowOption>
|
||||||
</Grid>
|
</Grid>
|
||||||
</butterflow_ui:ButterflowOption>
|
</butterflow_ui:ButterflowOption>
|
||||||
|
@ -161,6 +185,30 @@
|
||||||
</ListView.ItemTemplate>
|
</ListView.ItemTemplate>
|
||||||
</ListView>
|
</ListView>
|
||||||
</butterflow_ui:ButterflowOption>
|
</butterflow_ui:ButterflowOption>
|
||||||
|
<butterflow_ui:ButterflowOption DescriptionValue="{x:Static loc:Localization.SmoothMotionTooltip}">
|
||||||
|
<CheckBox IsChecked="{Binding OptionsConfiguration.SmoothMotion, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" Content="{x:Static loc:Localization.SmoothMotionLabel}" />
|
||||||
|
</butterflow_ui:ButterflowOption>
|
||||||
|
<butterflow_ui:ButterflowOption DescriptionValue="{x:Static loc:Localization.FastPyramidsTooltip}">
|
||||||
|
<CheckBox IsChecked="{Binding OptionsConfiguration.FastPyramid, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" Content="{x:Static loc:Localization.FastPyramidsLabel}" />
|
||||||
|
</butterflow_ui:ButterflowOption>
|
||||||
|
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.PyramidScaleLabel}" DescriptionValue="{x:Static loc:Localization.PyramidScaleTooltip}">
|
||||||
|
<TextBox Text="{Binding OptionsConfiguration.PyramidScale, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" />
|
||||||
|
</butterflow_ui:ButterflowOption>
|
||||||
|
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.LevelsLabel}" DescriptionValue="{x:Static loc:Localization.LevelsTooltip}">
|
||||||
|
<TextBox Text="{Binding OptionsConfiguration.PyramidScale, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" />
|
||||||
|
</butterflow_ui:ButterflowOption>
|
||||||
|
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.WindowSizeLabel}" DescriptionValue="{x:Static loc:Localization.WindowSizeTooltip}">
|
||||||
|
<TextBox Text="{Binding OptionsConfiguration.PyramidScale, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" />
|
||||||
|
</butterflow_ui:ButterflowOption>
|
||||||
|
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.IterationsLabel}" DescriptionValue="{x:Static loc:Localization.IterationsTooltip}">
|
||||||
|
<TextBox Text="{Binding OptionsConfiguration.PyramidScale, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" />
|
||||||
|
</butterflow_ui:ButterflowOption>
|
||||||
|
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.PixelNeighborhoodLabel}" DescriptionValue="{x:Static loc:Localization.PixelNeighborhoodTooltip}">
|
||||||
|
<TextBox Text="{Binding OptionsConfiguration.PyramidScale, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" />
|
||||||
|
</butterflow_ui:ButterflowOption>
|
||||||
|
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.SmoothDerivativeLabel}" DescriptionValue="{x:Static loc:Localization.SmoothDerivativeTooltip}">
|
||||||
|
<TextBox Text="{Binding OptionsConfiguration.PyramidScale, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" />
|
||||||
|
</butterflow_ui:ButterflowOption>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
|
|
@ -43,9 +43,30 @@ namespace butterflow_ui
|
||||||
/// <summary> Default constructor. </summary>
|
/// <summary> Default constructor. </summary>
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
|
this.ButterflowWrapper.ParsedConsoleOutputRecieved += ButterflowWrapper_ParsedConsoleOutputRecieved;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary> Butterflow wrapper parsed console output recieved. </summary>
|
||||||
|
/// <param name="sender"> Source of the event. </param>
|
||||||
|
/// <param name="e"> The ButterflowOutputArgs to process. </param>
|
||||||
|
private void ButterflowWrapper_ParsedConsoleOutputRecieved(object sender, ButterflowWrapper.ButterflowOutputArgs e)
|
||||||
|
{
|
||||||
|
switch (e.OutputType)
|
||||||
|
{
|
||||||
|
case ButterflowWrapper.ButterflowOutputType.Width:
|
||||||
|
this.OptionsConfiguration.Width = e.Value;
|
||||||
|
break;
|
||||||
|
case ButterflowWrapper.ButterflowOutputType.Height:
|
||||||
|
this.OptionsConfiguration.Height = e.Value;
|
||||||
|
break;
|
||||||
|
case ButterflowWrapper.ButterflowOutputType.Progress:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary> Event handler. Called by btnFilePicker for click events. </summary>
|
/// <summary> Event handler. Called by btnFilePicker for click events. </summary>
|
||||||
/// <param name="sender"> Source of the event. </param>
|
/// <param name="sender"> Source of the event. </param>
|
||||||
/// <param name="e"> Routed event information. </param>
|
/// <param name="e"> Routed event information. </param>
|
||||||
|
@ -164,8 +185,8 @@ namespace butterflow_ui
|
||||||
/// <param name="e"> Routed event information. </param>
|
/// <param name="e"> Routed event information. </param>
|
||||||
private void mediaPreview_MediaOpened(object sender, RoutedEventArgs e)
|
private void mediaPreview_MediaOpened(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
this.OptionsConfiguration.Width = this.mediaPreview.NaturalVideoWidth.ToString();
|
//this.OptionsConfiguration.Width = this.mediaPreview.NaturalVideoWidth.ToString();
|
||||||
this.OptionsConfiguration.Height = this.mediaPreview.NaturalVideoHeight.ToString();
|
//this.OptionsConfiguration.Height = this.mediaPreview.NaturalVideoHeight.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Event handler. Called by mediaPreview for media ended events. </summary>
|
/// <summary> Event handler. Called by mediaPreview for media ended events. </summary>
|
||||||
|
|
|
@ -10,7 +10,7 @@ using csmic;
|
||||||
namespace butterflow_ui
|
namespace butterflow_ui
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary> (Serializable) the options configuration. </summary>
|
/// <summary> The butterflow options configuration. Contians all the options necessary to run butterflow and process a video. </summary>
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class OptionsConfiguration : PropertyChangedAlerter
|
public class OptionsConfiguration : PropertyChangedAlerter
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,8 @@ namespace butterflow_ui
|
||||||
|
|
||||||
/// <summary> An interpreter used to ensure numeric input is correctly calculated. </summary>
|
/// <summary> An interpreter used to ensure numeric input is correctly calculated. </summary>
|
||||||
private InputInterpreter interpreter = new InputInterpreter();
|
private InputInterpreter interpreter = new InputInterpreter();
|
||||||
|
/// <summary> The aspect ratio used for calculating heights when the aspect ratio is locked. </summary>
|
||||||
|
private decimal aspectRatio = 0;
|
||||||
|
|
||||||
private string playbackRate;
|
private string playbackRate;
|
||||||
private bool keepAudio;
|
private bool keepAudio;
|
||||||
|
@ -25,8 +27,17 @@ namespace butterflow_ui
|
||||||
private int height;
|
private int height;
|
||||||
private bool keepAspectRatio;
|
private bool keepAspectRatio;
|
||||||
private bool losslessQuality;
|
private bool losslessQuality;
|
||||||
|
private bool smoothMotion;
|
||||||
|
private bool lockAspectRatio;
|
||||||
private string videoInput;
|
private string videoInput;
|
||||||
private string videoOutput;
|
private string videoOutput;
|
||||||
|
private bool fastPyramid;
|
||||||
|
private decimal pyramidScale;
|
||||||
|
private int levels;
|
||||||
|
private int windowSize;
|
||||||
|
private int iterations;
|
||||||
|
private int pixelNeighborhood;
|
||||||
|
private decimal smoothDerivativeStandardDeviation;
|
||||||
private ObservableCollection<ButterflowSubregion> subregions = new ObservableCollection<ButterflowSubregion>();
|
private ObservableCollection<ButterflowSubregion> subregions = new ObservableCollection<ButterflowSubregion>();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -73,6 +84,41 @@ namespace butterflow_ui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets a value indicating whether the butterflow should be turned toward smooth motion. </summary>
|
||||||
|
/// <value> True if tuned toward smooth motion, false if not. </value>
|
||||||
|
public bool SmoothMotion
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.smoothMotion;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this.smoothMotion = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets a value indicating whether to lock aspect ratio of the video. </summary>
|
||||||
|
/// <value> True if locking aspect ratio of the video, false if not. </value>
|
||||||
|
public bool LockAspectRatio
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.lockAspectRatio;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
this.aspectRatio = Convert.ToDecimal(this.height) / Convert.ToDecimal(this.width);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lockAspectRatio = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary> Gets or sets the width of the video output. </summary>
|
/// <summary> Gets or sets the width of the video output. </summary>
|
||||||
/// <value> The width of the video output. </value>
|
/// <value> The width of the video output. </value>
|
||||||
public string Width
|
public string Width
|
||||||
|
@ -83,9 +129,20 @@ namespace butterflow_ui
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
var oldWidth = this.width;
|
||||||
|
|
||||||
interpreter.Interpret(value);
|
interpreter.Interpret(value);
|
||||||
this.width = interpreter.Int;
|
this.width = interpreter.Int;
|
||||||
|
|
||||||
OnPropertyChanged();
|
OnPropertyChanged();
|
||||||
|
|
||||||
|
if (this.lockAspectRatio)
|
||||||
|
{
|
||||||
|
interpreter.Interpret(string.Format("{0} * {1}", this.aspectRatio, this.width));
|
||||||
|
this.height = interpreter.Int;
|
||||||
|
|
||||||
|
OnPropertyChanged("Height");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,6 +222,117 @@ namespace butterflow_ui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets a value indicating whether to use fast pyramids. </summary>
|
||||||
|
/// <value> True if using fast pyramids, false if not. </value>
|
||||||
|
public bool FastPyramid
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.fastPyramid;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this.fastPyramid = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets the pyramid scale factor. </summary>
|
||||||
|
/// <value> The pyramid scale factor. </value>
|
||||||
|
public string PyramidScale
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.pyramidScale.ToString();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
interpreter.Interpret(value);
|
||||||
|
this.pyramidScale = interpreter.Decimal;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets the number of pyramid layers. </summary>
|
||||||
|
/// <value> The number of pyramid layers. </value>
|
||||||
|
public string Levels
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.levels.ToString();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
interpreter.Interpret(value);
|
||||||
|
this.levels = interpreter.Int;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets the size of the windowing average. </summary>
|
||||||
|
/// <value> The size of the windowing average. </value>
|
||||||
|
public string WindowSize
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.windowSize.ToString();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
interpreter.Interpret(value);
|
||||||
|
this.windowSize = interpreter.Int;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets the number of iterations at each pyramid level. </summary>
|
||||||
|
/// <value> The number of iterations at each pyramid level. </value>
|
||||||
|
public string Iterations
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.iterations.ToString();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
interpreter.Interpret(value);
|
||||||
|
this.iterations = interpreter.Int;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets the size of the pixel neighborhood. </summary>
|
||||||
|
/// <value> The size of the pixel neighborhood. </value>
|
||||||
|
public string PixelNeighborhood
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.pixelNeighborhood.ToString();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
interpreter.Interpret(value);
|
||||||
|
this.pixelNeighborhood = interpreter.Int;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary> Gets or sets the standard deviation of smooth derivatives. </summary>
|
||||||
|
/// <value> The standard deviation of smooth derivatives. </value>
|
||||||
|
public string SmoothDerivativeStandardDeviation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.smoothDerivativeStandardDeviation.ToString();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
interpreter.Interpret(value);
|
||||||
|
this.smoothDerivativeStandardDeviation = interpreter.Decimal;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary> Gets or sets the subregions of the video on which to work. </summary>
|
/// <summary> Gets or sets the subregions of the video on which to work. </summary>
|
||||||
/// <value> The subregions of the video. </value>
|
/// <value> The subregions of the video. </value>
|
||||||
public ObservableCollection<ButterflowSubregion> Subregions
|
public ObservableCollection<ButterflowSubregion> Subregions
|
||||||
|
@ -194,16 +362,16 @@ namespace butterflow_ui
|
||||||
|
|
||||||
private void SubregionsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
|
private void SubregionsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
if(e.NewItems != null)
|
if (e.NewItems != null)
|
||||||
{
|
{
|
||||||
foreach(ButterflowSubregion newItem in e.NewItems)
|
foreach (ButterflowSubregion newItem in e.NewItems)
|
||||||
{
|
{
|
||||||
newItem.PropertyChanged += SubregionPropertyChanged;
|
newItem.PropertyChanged += SubregionPropertyChanged;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(e.OldItems != null)
|
if (e.OldItems != null)
|
||||||
{
|
{
|
||||||
foreach(ButterflowSubregion oldItem in e.OldItems)
|
foreach (ButterflowSubregion oldItem in e.OldItems)
|
||||||
{
|
{
|
||||||
oldItem.PropertyChanged -= SubregionPropertyChanged;
|
oldItem.PropertyChanged -= SubregionPropertyChanged;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace butterflow_ui
|
namespace butterflow_ui
|
||||||
{
|
{
|
||||||
|
/// <summary> A class responsible for implementing the <see cref="INotifyPropertyChanged"/> interface and helper functions. </summary>
|
||||||
public abstract class PropertyChangedAlerter : INotifyPropertyChanged
|
public abstract class PropertyChangedAlerter : INotifyPropertyChanged
|
||||||
{
|
{
|
||||||
#region Members
|
#region Members
|
||||||
|
|
Loading…
Reference in a new issue