<UserControl x:Class="WpfDisplay.Views.PostFxPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
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:local="clr-namespace:WpfDisplay.Views"
xmlns:vm="clr-namespace:WpfDisplay.ViewModels"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="300"
Padding="8"
d:DataContext="{d:DesignInstance Type=vm:PostFxPanelViewModel}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--Header with controls-->
<Grid Grid.Row="0" Margin="0 4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<!--Add-layer dropdown-->
<Grid Grid.Column="0">
<ComboBox x:Name="addLayerCombo" ItemsSource="{Binding LoadedEffects}"
DisplayMemberPath="Name" Cursor="Hand">
<b:Interaction.Triggers>
<b:EventTrigger EventName="SelectionChanged">
<b:InvokeCommandAction Command="{Binding AddLayerCommand}"
CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType=ComboBox}}"/>
<b:ChangePropertyAction TargetObject="{Binding ElementName=addLayerCombo}" PropertyName="SelectedIndex" Value="-1"/>
</b:EventTrigger>
</b:Interaction.Triggers>
</ComboBox>
<TextBlock IsHitTestVisible="False" Margin="8">+ Add layer</TextBlock>
</Grid>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<Button Command="{Binding ReloadEffectsCommand}"
Style="{StaticResource MaterialDesignToolButton}"
ToolTip="Reload plugins">🔄</Button>
<Button Command="{Binding OpenPostFxDirectoryCommand}"
Style="{StaticResource MaterialDesignToolButton}"
ToolTip="Open plugin directory">📂</Button>
</StackPanel>
</Grid>
<Separator Grid.Row="1" Margin="0 0 0 4"/>
<!--Effects layers list-->
<ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
<Grid>
<ItemsControl ItemsSource="{Binding PostEffectLayers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander x:Name="layerItem" md:ExpanderAssist.HorizontalHeaderPadding="2" Margin="0 2" md:ExpanderAssist.ExpanderButtonPosition="Start">
<Expander.Header>
<Grid MinHeight="32">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="0"
IsChecked="{Binding Enabled}"
VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="{Binding Name}" VerticalAlignment="Center"/>
<StackPanel Grid.Column="3" Orientation="Horizontal">
<StackPanel.Resources>
<Style TargetType="StackPanel">
<Style.Triggers>
<!--Show header buttons on hover-->
<DataTrigger Binding="{Binding Path=IsMouseOver, ElementName=layerItem}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsMouseOver, ElementName=layerItem}" Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<Button x:Name="infoButton" Content="ℹ️"
Style="{StaticResource MaterialDesignToolButton}">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Click">
<b:ChangePropertyAction TargetObject="{Binding ContextMenu, ElementName=infoButton}" PropertyName="PlacementTarget" Value="{Binding ElementName=infoButton, Mode=OneWay}"/>
<b:ChangePropertyAction TargetObject="{Binding ContextMenu, ElementName=infoButton}" PropertyName="IsOpen" Value="True"/>
</b:EventTrigger>
</b:Interaction.Triggers>
<Button.ContextMenu>
<ContextMenu>
<MenuItem Height="auto" IsHitTestVisible="False" DataContext="{Binding Instance.Effect}">
<MenuItem.Header>
<StackPanel Orientation="Vertical">
<Label FontSize="18" FontWeight="Bold" Content="{Binding Name}"/>
<ItemsControl ItemsSource="{Binding Tags}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<md:Chip Content="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Label FontWeight="Bold">Description</Label>
<TextBlock Text="{Binding Description}"
Margin="4"
TextWrapping="Wrap"
MaxWidth="300"
Style="{StaticResource MaterialDesignHelperTextBlock}"/>
<Label FontWeight="Bold">Include uses</Label>
<ItemsControl ItemsSource="{Binding IncludeUses}" Margin="8 0"/>
<TextBlock Margin="8 0">
<TextBlock.Visibility>
<Binding Path="IncludeUses.Count"
Converter="{StaticResource equalityToVisibilityConverter}">
<Binding.ConverterParameter>
<sys:Int32>0</sys:Int32>
</Binding.ConverterParameter>
</Binding>
</TextBlock.Visibility>
None
</TextBlock>
</StackPanel>
</MenuItem.Header>
</MenuItem>
<Separator/>
<MenuItem DataContext="{Binding Instance.Effect}">
<MenuItem.Header>
<Hyperlink NavigateUri="{Binding ReferenceUrl}" ToolTip="{Binding ReferenceUrl}">ℹ️ Information...</Hyperlink>
</MenuItem.Header>
</MenuItem>
<MenuItem
Header="✏️ Edit source"
Command="{Binding EditPluginSourceCommand}"
CommandParameter="{Binding Instance.Effect.FilePath}"/>
</ContextMenu>
</Button.ContextMenu>
</Button>
<Button Content="▲" Margin="2 0"
Command="{Binding DataContext.MoveUpCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"
Style="{StaticResource MaterialDesignToolButton}"/>
<Button Content="▼" Margin="2 0"
Command="{Binding DataContext.MoveDownCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"
Style="{StaticResource MaterialDesignToolButton}"/>
<Button Margin="4 0"
Content="✕"
Command="{Binding DataContext.RemoveLayerCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"
Style="{StaticResource MaterialDesignToolButton}"
Foreground="Red"
ToolTip="Remove layer"/>
</StackPanel>
</Grid>
</Expander.Header>
<!--Parameters-->
<StackPanel>
<ItemsControl ItemsSource="{Binding Parameters}">
<ItemsControl.Resources>
<!--real param-->
<DataTemplate DataType="{x:Type vm:RealParamViewModel}">
<local:ValueSlider Value="{Binding RealParamValue}" SliderSettings="{Binding RealParamSlider}"/>
</DataTemplate>
<!--vec3 param-->
<DataTemplate DataType="{x:Type vm:Vec3ParamViewModel}">
<local:Vec3Control XValue="{Binding XValue}" YValue="{Binding YValue}" ZValue="{Binding ZValue}" Vec3Settings="{Binding}"/>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
</StackPanel>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Style.Triggers>
<DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}" Value="0">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
</ItemsControl>
<!--Empty state hint-->
<TextBlock Text="No post effects added."
HorizontalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignLabelSmallTextBlock}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding PostEffectLayers.Count}" Value="0">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</ScrollViewer>
</Grid>
</UserControl>