Fixed visibility for disabled equalizers, added reset button

This commit is contained in:
Darth Affe 2017-08-13 12:30:42 +02:00
parent 9dcf82e6aa
commit d4b5d186a4
10 changed files with 154 additions and 81 deletions

View File

@ -59,7 +59,7 @@ namespace KeyboardAudioVisualizer.AudioProcessing
_spectrumProvider.Initialize(); _spectrumProvider.Initialize();
//TODO DarthAffe 03.08.2017: Initialize correctly; Settings //TODO DarthAffe 03.08.2017: Initialize correctly; Settings
MultiBandEqualizer equalizer = new MultiBandEqualizer(); MultiBandEqualizer equalizer = new MultiBandEqualizer { IsEnabled = false };
PrimaryVisualizationProvider = new FrequencyBarsVisualizationProvider(new FrequencyBarsVisualizationProviderConfiguration(), _spectrumProvider) { Equalizer = equalizer }; PrimaryVisualizationProvider = new FrequencyBarsVisualizationProvider(new FrequencyBarsVisualizationProviderConfiguration(), _spectrumProvider) { Equalizer = equalizer };
//PrimaryVisualizationProvider = new BeatVisualizationProvider(new BeatVisualizationProviderConfiguration(), _spectrumProvider); //PrimaryVisualizationProvider = new BeatVisualizationProvider(new BeatVisualizationProviderConfiguration(), _spectrumProvider);
PrimaryVisualizationProvider.Initialize(); PrimaryVisualizationProvider.Initialize();

View File

@ -12,5 +12,7 @@ namespace KeyboardAudioVisualizer.AudioProcessing.Equalizer
EqualizerBand AddBand(float offset, float modification); EqualizerBand AddBand(float offset, float modification);
void RemoveBandBand(EqualizerBand band); void RemoveBandBand(EqualizerBand band);
void Reset();
} }
} }

View File

@ -14,7 +14,12 @@ namespace KeyboardAudioVisualizer.AudioProcessing.Equalizer
private readonly Dictionary<int, float[]> _values = new Dictionary<int, float[]>(); private readonly Dictionary<int, float[]> _values = new Dictionary<int, float[]>();
public bool IsEnabled { get; set; } = true; private bool _isEnabled;
public bool IsEnabled
{
get => _isEnabled;
set => SetProperty(ref _isEnabled, value);
}
#endregion #endregion
@ -22,8 +27,7 @@ namespace KeyboardAudioVisualizer.AudioProcessing.Equalizer
public MultiBandEqualizer() public MultiBandEqualizer()
{ {
AddBand(0, 0, true); Reset();
AddBand(1, 0, true);
} }
#endregion #endregion
@ -51,6 +55,13 @@ namespace KeyboardAudioVisualizer.AudioProcessing.Equalizer
InvalidateCache(); InvalidateCache();
} }
public void Reset()
{
Bands.Clear();
AddBand(0, 0, true);
AddBand(1, 0, true);
}
public float[] CalculateValues(int count) public float[] CalculateValues(int count)
{ {
if (!_values.TryGetValue(count, out float[] values)) if (!_values.TryGetValue(count, out float[] values))
@ -66,6 +77,7 @@ namespace KeyboardAudioVisualizer.AudioProcessing.Equalizer
float[] values = new float[count]; float[] values = new float[count];
List<EqualizerBand> orderedBands = Bands.OrderBy(x => x.Offset).ToList(); List<EqualizerBand> orderedBands = Bands.OrderBy(x => x.Offset).ToList();
if (orderedBands.Count < 2) return values;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {

View File

@ -10,7 +10,9 @@ namespace KeyboardAudioVisualizer.Converter
{ {
#region Methods #region Methods
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => (value as bool?) == true ? Visibility.Visible : Visibility.Collapsed; public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
=> (value as bool?) == true ? Visibility.Visible
: (string.Equals(parameter?.ToString(), "true", StringComparison.OrdinalIgnoreCase) ? Visibility.Hidden : Visibility.Collapsed);
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => value as Visibility? == Visibility.Visible; public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => value as Visibility? == Visibility.Visible;

View File

@ -206,6 +206,10 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Page> </Page>
<Page Include="Styles\Button.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Styles\ImageButton.xaml"> <Page Include="Styles\ImageButton.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>

View File

@ -12,6 +12,7 @@
<styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/GroupBox.xaml" /> <styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/GroupBox.xaml" />
<styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/ToolTip.xaml" /> <styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/ToolTip.xaml" />
<styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/ComboBox.xaml" /> <styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/ComboBox.xaml" />
<styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/Button.xaml" />
</styles:CachedResourceDictionary.MergedDictionaries> </styles:CachedResourceDictionary.MergedDictionaries>
<converter:EqualsToBoolConverter x:Key="EqualsToBoolConverter" /> <converter:EqualsToBoolConverter x:Key="EqualsToBoolConverter" />
@ -24,6 +25,7 @@
<Style TargetType="GroupBox" BasedOn="{StaticResource StyleGroupBoxBox}" /> <Style TargetType="GroupBox" BasedOn="{StaticResource StyleGroupBoxBox}" />
<Style TargetType="ToolTip" BasedOn="{StaticResource StyleToolTip}" /> <Style TargetType="ToolTip" BasedOn="{StaticResource StyleToolTip}" />
<Style TargetType="ComboBox" BasedOn="{StaticResource StyleComboBox}" /> <Style TargetType="ComboBox" BasedOn="{StaticResource StyleComboBox}" />
<Style TargetType="Button" BasedOn="{StaticResource StyleButton}" />
</styles:CachedResourceDictionary> </styles:CachedResourceDictionary>

View File

@ -0,0 +1,41 @@
<styles:CachedResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:styles="clr-namespace:KeyboardAudioVisualizer.Styles">
<styles:CachedResourceDictionary.MergedDictionaries>
<styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/FrameworkElement.xaml" />
<styles:CachedResourceDictionary Source="/KeyboardAudioVisualizer;component/Styles/Theme.xaml" />
</styles:CachedResourceDictionary.MergedDictionaries>
<Style x:Key="StyleButton"
BasedOn="{StaticResource StyleFrameworkElement}"
TargetType="Button">
<Setter Property="Foreground" Value="{StaticResource BrushButtonForeground}" />
<Setter Property="FontSize" Value="{StaticResource FontSizeDefault}" />
<Setter Property="FontFamily" Value="pack://application:,,,/Resources/#Cinzel" />
<Setter Property="Background" Value="{StaticResource BrushButtonBackground}" />
<Setter Property="BorderBrush" Value="{StaticResource BrushButtonBorder}" />
<Setter Property="BorderThickness" Value="2" />
<Setter Property="Padding" Value="4,2" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<ContentPresenter Margin="{TemplateBinding Padding}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource BrushButtonHover}" />
</Trigger>
</Style.Triggers>
</Style>
</styles:CachedResourceDictionary>

View File

@ -29,12 +29,19 @@
<SolidColorBrush x:Key="BrushTooltipBorder" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlack}" /> <SolidColorBrush x:Key="BrushTooltipBorder" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlack}" />
<SolidColorBrush x:Key="BrushTooltipBackground" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlackTransparent}" /> <SolidColorBrush x:Key="BrushTooltipBackground" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlackTransparent}" />
<!-- GroupBox -->
<SolidColorBrush x:Key="BrushComboBoxForeground" presentationOptions:Freeze="True" Color="{StaticResource ColorGainsboro}" /> <SolidColorBrush x:Key="BrushComboBoxForeground" presentationOptions:Freeze="True" Color="{StaticResource ColorGainsboro}" />
<SolidColorBrush x:Key="BrushComboBoxBackground" presentationOptions:Freeze="True" Color="{StaticResource ColorBuckinghamGrayTransparent}" /> <SolidColorBrush x:Key="BrushComboBoxBackground" presentationOptions:Freeze="True" Color="{StaticResource ColorBuckinghamGrayTransparent}" />
<SolidColorBrush x:Key="BrushComboBoxBackgroundPopup" presentationOptions:Freeze="True" Color="{StaticResource ColorBuckinghamGray}" /> <SolidColorBrush x:Key="BrushComboBoxBackgroundPopup" presentationOptions:Freeze="True" Color="{StaticResource ColorBuckinghamGray}" />
<SolidColorBrush x:Key="BrushComboBoxBorder" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlackTransparent}" /> <SolidColorBrush x:Key="BrushComboBoxBorder" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlackTransparent}" />
<SolidColorBrush x:Key="BrushComboBoxHover" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlack}" /> <SolidColorBrush x:Key="BrushComboBoxHover" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlack}" />
<!-- Button -->
<SolidColorBrush x:Key="BrushButtonForeground" presentationOptions:Freeze="True" Color="{StaticResource ColorGainsboro}" />
<SolidColorBrush x:Key="BrushButtonBackground" presentationOptions:Freeze="True" Color="{StaticResource ColorBuckinghamGrayTransparent}" />
<SolidColorBrush x:Key="BrushButtonBorder" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlackTransparent}" />
<SolidColorBrush x:Key="BrushButtonHover" presentationOptions:Freeze="True" Color="{StaticResource ColorJetBlack}" />
<!-- Navigation --> <!-- Navigation -->
<SolidColorBrush x:Key="BrushNavigationItem" presentationOptions:Freeze="True" Color="{StaticResource ColorGainsboro}" /> <SolidColorBrush x:Key="BrushNavigationItem" presentationOptions:Freeze="True" Color="{StaticResource ColorGainsboro}" />
<SolidColorBrush x:Key="BrushNavigationItemBlur" presentationOptions:Freeze="True" Color="{StaticResource ColorBananaYellow}" /> <SolidColorBrush x:Key="BrushNavigationItemBlur" presentationOptions:Freeze="True" Color="{StaticResource ColorBananaYellow}" />

View File

@ -23,100 +23,90 @@
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="{x:Type visualization:EqualizerVisualizer}"> <ControlTemplate TargetType="{x:Type visualization:EqualizerVisualizer}">
<Grid x:Name="Container" Background="Transparent"> <Grid>
<Polyline x:Name="PART_Line" Stroke="White" StrokeThickness="2" StrokeLineJoin="Round"> <Grid x:Name="Container" Background="Transparent"
<Polyline.Points> Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Equalizer.IsEnabled, Converter={StaticResource BoolToVisibilityConverter}}">
<MultiBinding Converter="{StaticResource EqualizerBandsToPointsConverter}" ConverterParameter="120"> <Polyline x:Name="PART_Line" Stroke="White" StrokeThickness="2" StrokeLineJoin="Round">
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Equalizer" /> <Polyline.Points>
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Equalizer.Bands" /> <MultiBinding Converter="{StaticResource EqualizerBandsToPointsConverter}" ConverterParameter="120">
<Binding Path="ActualWidth" ElementName="Container" /> <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Equalizer" />
<Binding Path="ActualHeight" ElementName="Container" /> <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Equalizer.Bands" />
</MultiBinding> <Binding Path="ActualWidth" ElementName="Container" />
</Polyline.Points> <Binding Path="ActualHeight" ElementName="Container" />
</Polyline> </MultiBinding>
</Polyline.Points>
</Polyline>
<ItemsControl x:Name="PART_Grips" Opacity="0" <ItemsControl x:Name="PART_Grips" Opacity="0"
Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Equalizer.IsEnabled, Converter={StaticResource BoolToVisibilityConverter}}" ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Equalizer.Bands}">
ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Equalizer.Bands}"> <ItemsControl.ItemsPanel>
<ItemsControl.ItemsPanel> <ItemsPanelTemplate>
<ItemsPanelTemplate> <Canvas />
<Canvas /> </ItemsPanelTemplate>
</ItemsPanelTemplate> </ItemsControl.ItemsPanel>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate DataType="equalizer:EqualizerBand"> <DataTemplate DataType="equalizer:EqualizerBand">
<Border Width="24" Height="24" CornerRadius="12" <Border Width="24" Height="24" CornerRadius="12"
BorderThickness="3" BorderBrush="{StaticResource BrushEqualizerBorder}" BorderThickness="3" BorderBrush="{StaticResource BrushEqualizerBorder}"
Background="{StaticResource BrushEqualizerBackground}" /> Background="{StaticResource BrushEqualizerBackground}" />
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle> <ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter"> <Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left"> <Setter Property="Canvas.Left">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource OffsetToPosXConverter}" ConverterParameter="12"> <MultiBinding Converter="{StaticResource OffsetToPosXConverter}" ConverterParameter="12">
<Binding Path="Offset" /> <Binding Path="Offset" />
<Binding Path="ActualWidth" ElementName="PART_Grips" /> <Binding Path="ActualWidth" ElementName="PART_Grips" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="Canvas.Top"> <Setter Property="Canvas.Top">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource ValueToPosYConverter}" ConverterParameter="12"> <MultiBinding Converter="{StaticResource ValueToPosYConverter}" ConverterParameter="12">
<Binding Path="Value" /> <Binding Path="Value" />
<Binding Path="ActualHeight" ElementName="PART_Grips" /> <Binding Path="ActualHeight" ElementName="PART_Grips" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
</Style> </Style>
</ItemsControl.ItemContainerStyle> </ItemsControl.ItemContainerStyle>
</ItemsControl> </ItemsControl>
</Grid>
<StackPanel VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="0,-4,0,0" Orientation="Horizontal">
<CheckBox VerticalAlignment="Center" Content="Enable Equalizer"
Foreground="{StaticResource BrushForeground}"
IsChecked="{Binding Path=Equalizer.IsEnabled, RelativeSource={RelativeSource TemplatedParent}}" />
<Button VerticalAlignment="Center" Margin="12,0,0,0"
Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Equalizer.IsEnabled, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=True}"
Content="Reset" Command="{TemplateBinding ResetCommand}" />
</StackPanel>
</Grid> </Grid>
<ControlTemplate.Triggers> <ControlTemplate.Triggers>
<MultiDataTrigger> <Trigger Property="IsMouseOver" Value="True">
<MultiDataTrigger.Conditions> <Trigger.EnterActions>
<Condition Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource TemplatedParent}}" Value="True" />
<!--<Condition Binding="{Binding Path=Equalizer.IsEnabled, RelativeSource={RelativeSource AncestorType={x:Type visualization:EqualizerVisualizer}}}" Value="True" />-->
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard> <BeginStoryboard>
<Storyboard> <Storyboard>
<DoubleAnimation Duration="0:0:0.2" To="1" <DoubleAnimation Duration="0:0:0.2" To="1"
Storyboard.TargetName="PART_Grips" Storyboard.TargetProperty="Opacity" /> Storyboard.TargetName="PART_Grips" Storyboard.TargetProperty="Opacity" />
</Storyboard> </Storyboard>
</BeginStoryboard> </BeginStoryboard>
</MultiDataTrigger.EnterActions> </Trigger.EnterActions>
<MultiDataTrigger.ExitActions> <Trigger.ExitActions>
<BeginStoryboard> <BeginStoryboard>
<Storyboard> <Storyboard>
<DoubleAnimation Duration="0:0:0.25" To="0" <DoubleAnimation Duration="0:0:0.25" To="0"
Storyboard.TargetName="PART_Grips" Storyboard.TargetProperty="Opacity" /> Storyboard.TargetName="PART_Grips" Storyboard.TargetProperty="Opacity" />
</Storyboard> </Storyboard>
</BeginStoryboard> </BeginStoryboard>
</MultiDataTrigger.ExitActions> </Trigger.ExitActions>
</MultiDataTrigger> </Trigger>
<!--<DataTrigger Binding="{Binding Path=Equalizer.IsEnabled, RelativeSource={RelativeSource AncestorType={x:Type visualization:EqualizerVisualizer}}}" Value="False">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.2" To="1"
Storyboard.TargetName="PART_Line" Storyboard.TargetProperty="Opacity" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.25" To="0"
Storyboard.TargetName="PART_Line" Storyboard.TargetProperty="Opacity" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>-->
</ControlTemplate.Triggers> </ControlTemplate.Triggers>
</ControlTemplate> </ControlTemplate>
</Setter.Value> </Setter.Value>

View File

@ -22,6 +22,15 @@ namespace KeyboardAudioVisualizer.UI.Visualization
set => SetValue(EqualizerProperty, value); set => SetValue(EqualizerProperty, value);
} }
public static readonly DependencyProperty ResetCommandProperty = DependencyProperty.Register(
"ResetCommand", typeof(ICommand), typeof(EqualizerVisualizer), new PropertyMetadata(null));
public ICommand ResetCommand
{
get => (ICommand)GetValue(ResetCommandProperty);
set => SetValue(ResetCommandProperty, value);
}
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming
#endregion #endregion
@ -34,6 +43,10 @@ namespace KeyboardAudioVisualizer.UI.Visualization
#region Constructors #region Constructors
public EqualizerVisualizer()
{
ResetCommand = new ActionCommand(() => Equalizer?.Reset());
}
#endregion #endregion