Skip to content

Commit

Permalink
WinGui: Make the "Presets" menu grouped by category.
Browse files Browse the repository at this point in the history
  • Loading branch information
sr55 committed Jun 16, 2016
1 parent 44a359d commit dab0d2e
Show file tree
Hide file tree
Showing 6 changed files with 141 additions and 14 deletions.
48 changes: 48 additions & 0 deletions win/CS/HandBrakeWPF/Commands/PresetMenuSelectCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="PresetsMenuConverter.cs" company="HandBrake Project (http://handbrake.fr)">
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
// </copyright>
// <summary>
// A Command to handle the Preset Menu Clicks.
// </summary>
// --------------------------------------------------------------------------------------------------------------------

namespace HandBrakeWPF.Commands
{
using System;
using System.Windows.Input;

using Caliburn.Micro;

using HandBrakeWPF.Services.Presets.Model;
using HandBrakeWPF.ViewModels.Interfaces;

public class PresetMenuSelectCommand : ICommand
{
private readonly Preset preset;

/// <summary>Initializes a new instance of the <see cref="T:System.Object" /> class.</summary>
public PresetMenuSelectCommand(Preset preset)
{
this.preset = preset;
}

/// <summary>Defines the method that determines whether the command can execute in its current state.</summary>
/// <returns>true if this command can be executed; otherwise, false.</returns>
/// <param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to null.</param>
public bool CanExecute(object parameter)
{
return true;
}

/// <summary>Defines the method to be called when the command is invoked.</summary>
/// <param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to null.</param>
public void Execute(object parameter)
{
IMainViewModel mvm = IoC.Get<IMainViewModel>();
mvm.PresetSelect(this.preset);
}

public event EventHandler CanExecuteChanged;
}
}
83 changes: 83 additions & 0 deletions win/CS/HandBrakeWPF/Converters/PresetsMenuConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="PresetsMenuConverter.cs" company="HandBrake Project (http://handbrake.fr)">
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
// </copyright>
// <summary>
// A Converter to manage the Presets list and turn it into a grouped set of MenuItems
// </summary>
// --------------------------------------------------------------------------------------------------------------------

namespace HandBrakeWPF.Converters
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

using HandBrakeWPF.Commands;
using HandBrakeWPF.Services.Presets.Model;

public class PresetsMenuConverter : IValueConverter
{
/// <summary>Converts a value. </summary>
/// <returns>A converted value. If the method returns null, the valid null value is used.</returns>
/// <param name="value">The value produced by the binding source.</param>
/// <param name="targetType">The type of the binding target property.</param>
/// <param name="parameter">The converter parameter to use.</param>
/// <param name="culture">The culture to use in the converter.</param>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
IEnumerable<Preset> presets = value as IEnumerable<Preset>;

if (presets ==null)
{
return null;
}

Dictionary<string, MenuItem> groupedMenu = new Dictionary<string, MenuItem>();
foreach (Preset item in presets)
{
if (groupedMenu.ContainsKey(item.Category))
{
MenuItem newMeuItem = new MenuItem { Header = item.Name, Tag = item, Command = new PresetMenuSelectCommand(item)};
if (item.IsDefault)
{
newMeuItem.FontStyle = FontStyles.Italic;
}

groupedMenu[item.Category].Items.Add(newMeuItem);
}
else
{
MenuItem group = new MenuItem();
group.Header = item.Category;

MenuItem newMeuItem = new MenuItem { Header = item.Name, Tag = item, Command = new PresetMenuSelectCommand(item) };
if (item.IsDefault)
{
newMeuItem.FontStyle = FontStyles.Italic;
}

group.Items.Add(newMeuItem);
groupedMenu[item.Category] = group;
}
}

return groupedMenu.Values.ToList();
}

/// <summary>Converts a value. </summary>
/// <returns>A converted value. If the method returns null, the valid null value is used.</returns>
/// <param name="value">The value that is produced by the binding target.</param>
/// <param name="targetType">The type to convert to.</param>
/// <param name="parameter">The converter parameter to use.</param>
/// <param name="culture">The culture to use in the converter.</param>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
2 changes: 2 additions & 0 deletions win/CS/HandBrakeWPF/HandBrakeWPF.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@
<Compile Include="Commands\Menu\QueueCommandParams.cs" />
<Compile Include="Commands\Menu\QueueCommands.cs" />
<Compile Include="Commands\OpenOptionsScreenCommand.cs" />
<Compile Include="Commands\PresetMenuSelectCommand.cs" />
<Compile Include="Commands\ProcessShortcutCommand.cs" />
<Compile Include="Commands\SourceMenuCommand.cs" />
<Compile Include="Commands\AdvancedEncoderOptionsCommand.cs" />
Expand All @@ -154,6 +155,7 @@
<Compile Include="Converters\EnumToDescConverter.cs" />
<Compile Include="Converters\Filters\DenoisePresetConverter.cs" />
<Compile Include="Converters\Options\LogLevelConverter.cs" />
<Compile Include="Converters\PresetsMenuConverter.cs" />
<Compile Include="Converters\Queue\PictureSettingsDescConveter.cs" />
<Compile Include="Converters\Subtitles\SubtitleBurnInBehaviourConverter.cs" />
<Compile Include="Converters\Subtitles\SubtitleBehaviourConverter.cs" />
Expand Down
2 changes: 2 additions & 0 deletions win/CS/HandBrakeWPF/ViewModels/Interfaces/IMainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public interface IMainViewModel
/// </summary>
Preset SelectedPreset { set; }

void PresetSelect(object tag);

/// <summary>
/// Shutdown the Application
/// </summary>
Expand Down
2 changes: 2 additions & 0 deletions win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1204,6 +1204,7 @@ public override void OnLoad()

// Setup the presets.
this.presetService.Load();
this.NotifyOfPropertyChange(() => this.Presets);

// Queue Recovery
bool queueRecovered = QueueRecoveryHelper.RecoverQueue(this.queueProcessor, this.errorService, StartupOptions.AutoRestartQueue);
Expand Down Expand Up @@ -1874,6 +1875,7 @@ public void PresetSetDefault()
if (this.selectedPreset != null)
{
this.presetService.SetDefault(this.selectedPreset);
this.NotifyOfPropertyChange(() => this.Presets);
MessageBox.Show(string.Format(Resources.Main_NewDefaultPreset, this.selectedPreset.Name), Resources.Main_Presets, MessageBoxButton.OK, MessageBoxImage.Information);
}
else
Expand Down
18 changes: 4 additions & 14 deletions win/CS/HandBrakeWPF/Views/MainView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
<UserControl.Resources>
<Converters:BooleanConverter x:Key="booleanConverter" />
<Converters:EnumComboConverter x:Key="enumComboConverter" />
<Converters:PresetsMenuConverter x:Key="presetsMenuConverter"/>


<Style TargetType="Button">

Expand Down Expand Up @@ -100,20 +102,8 @@


<MenuItem Header="_Presets" x:Name="presetMenu" IsEnabled="{Binding HasSource, Converter={StaticResource booleanConverter}, ConverterParameter=false}">
<MenuItem Header="_Presets" ItemsSource="{Binding Presets}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Tag" Value="{Binding}" />
<Setter Property="cal:Action.TargetWithoutContext" Value="{Binding DataContext, ElementName=presetMenu}"/>
<Setter Property="cal:Message.Attach" Value="[Event Click] = [Action PresetSelect($this.Tag)]"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsDefault}" Value="True">
<Setter Property="FontStyle" Value="Italic" />
</DataTrigger>
</Style.Triggers>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>

<MenuItem Header="_Presets" ItemsSource="{Binding Presets, Converter={StaticResource presetsMenuConverter}}" />
<Separator />
<MenuItem Header="_Import from file" cal:Message.Attach="[Event Click] = [Action PresetImport]" />
<MenuItem Header="_Export to file" cal:Message.Attach="[Event Click] = [Action PresetExport]" />
Expand Down

0 comments on commit dab0d2e

Please sign in to comment.