OverviewFilesCommitsIssuesDocsReleasesPeers

ifsrenderer-linux / WpfDisplay / Views / PostFxPanel.xaml

210 lines · xaml ref:
<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>