OverviewFilesCommitsIssuesDocsReleasesPeers

ifsrenderer-linux / WpfDisplay / Views / SettingsWindow.xaml

281 lines · xaml ref:
<Window x:Class="WpfDisplay.Views.SettingsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"
        xmlns:vm="clr-namespace:WpfDisplay.ViewModels"
        xmlns:local="clr-namespace:WpfDisplay.Views"         
        xmlns:conv="clr-namespace:WpfDisplay.Converters"
        TextElement.FontWeight="Regular"
        TextElement.FontSize="13"
        TextOptions.TextFormattingMode="Ideal"
        TextOptions.TextRenderingMode="Auto"
        Background="{DynamicResource MaterialDesignPaper}"
        FontFamily="{DynamicResource MaterialDesignFont}"
        WindowStartupLocation="CenterOwner" 
        ShowInTaskbar="False"
        WindowStyle="ToolWindow"
        mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=vm:SettingsViewModel, IsDesignTimeCreatable=False}"
        Title="⚙️ Settings" x:Name="settingsWindow"
        Width="500" Height="500" MinWidth="500" MinHeight="500">
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="auto" MinHeight="50"/>
        </Grid.RowDefinitions>
        <TabControl Grid.Row="0" Style="{StaticResource MaterialDesignNavigationRailTabControl}">
            <TabItem Header="👤 User settings" MinWidth="150">
                <Grid Margin="8">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.75*"/>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition Width="1*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource MaterialDesignHeadline6TextBlock}" TextAlignment="Center">
                        User settings
                    </TextBlock>
                    <!--Author name-->
                    <TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                        Author name
                    </TextBlock>
                    <Label Grid.Row="1" Grid.Column="1"
                        ToolTip="Optionally provide your name to be embedded in params and image metadata." HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <TextBox Grid.Row="1" Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Center"
                        Text="{Binding AuthorName}" md:HintAssist.Hint="Provide an author name"/>
                    <!--Author link-->
                    <TextBlock Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                        Author link
                    </TextBlock>
                    <Label Grid.Row="2" Grid.Column="1" 
                        ToolTip="Optionally provide a link to be embedded in params and image metadata." HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <TextBox Grid.Row="2" Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Center"
                        Text="{Binding AuthorLink}" md:HintAssist.Hint="https://example.com"/>
                    <!--UseWhiteForBlankParams-->
                    <TextBlock Grid.Row="3" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                        White blank params
                    </TextBlock>
                    <Label Grid.Row="3" Grid.Column="1"
                        ToolTip="Check this to use a simple white palette instead of random colors When starting from scratch in blank params." HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <CheckBox Grid.Row="3" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"
                        IsChecked="{Binding UseWhiteForBlankParams}"/>
                    <!--IsWelcomeShownOnStartup-->
                    <TextBlock Grid.Row="4" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                        Welcome screen
                    </TextBlock>
                    <Label Grid.Row="4" Grid.Column="1"
                        ToolTip="Option to hide or show the welcome screen when IFSRenderer starts." HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <CheckBox Grid.Row="4" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"
                        IsChecked="{Binding IsWelcomeShownOnStartup}"/>
                    <!--Notification-->
                    <TextBlock Grid.Row="5" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Foreground="Gray">
                        Notifications
                    </TextBlock>
                    <Label Grid.Row="5" Grid.Column="1"
                        ToolTip="Display a Windows notification when a render finishes. (coming soon)" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <CheckBox Grid.Row="5" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"
                        IsChecked="{Binding Notifications}" IsEnabled="False"/>
                </Grid>
            </TabItem>
            <TabItem Header="🕹️ Controls" MinWidth="150">
                <Grid Margin="8">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.75*"/>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition Width="1*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource MaterialDesignHeadline6TextBlock}" TextAlignment="Center">
                        Controls
                    </TextBlock>
                    <!--Invert Axis-->
                    <TextBlock Grid.Row="1" Grid.Column="0" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Center">
                        Invert Y axis (pitch)
                    </TextBlock>
                    <StackPanel Grid.Row="1" Grid.Column="2" Orientation="Horizontal"
                        HorizontalAlignment="Center" VerticalAlignment="Center">
                        <CheckBox IsChecked="{Binding InvertAxisY}" Margin="10">Enable</CheckBox>
                    </StackPanel>
                    <!--Sensitivity-->
                    <TextBlock Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                        Movement sensitivity
                    </TextBlock>
                    <Label Grid.Row="2" Grid.Column="1"
                        ToolTip="{Binding SensitivitySlider.ToolTip}" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <local:ValueSlider Value="{Binding Sensitivity}" SliderSettings="{Binding SensitivitySlider}" Grid.Row="2" Grid.Column="3" VerticalAlignment="Center"/>
                </Grid>
            </TabItem>
            <TabItem Header="🖼 Export options" MinWidth="150">
                <StackPanel Margin="8">
                    <TextBlock Style="{StaticResource MaterialDesignHeadline6TextBlock}" TextAlignment="Center">
                        Export options
                    </TextBlock>
                    <Grid Margin="8">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="auto" MinHeight="50"/>
                            <RowDefinition Height="auto" MinHeight="50"/>
                            <RowDefinition Height="auto" MinHeight="50"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="0.75*"/>
                            <ColumnDefinition Width="auto"/>
                            <ColumnDefinition Width="1*"/>
                        </Grid.ColumnDefinitions>
                        <!--Metadata-->
                        <TextBlock Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                            Save metadata
                        </TextBlock>
                        <Label Grid.Row="0" Grid.Column="1"
                            ToolTip="Whether to write metadata in the exported images. This includes title, authors, copyright, date of creation and keywords." HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                        <CheckBox Grid.Row="0" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"
                            IsChecked="{Binding SaveMetadata}"/>
                        <!--Params in metadata-->
                        <TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                            Include params
                        </TextBlock>
                        <Label Grid.Row="1" Grid.Column="1"
                        ToolTip="Whether to include fractal params in the image metadata. This makes it possible to drop or paste the image in the editor instead of loading param files." HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                        <CheckBox Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"
                            IsEnabled="{Binding SaveMetadata}"
                            IsChecked="{Binding IncludeParamsInMetadata}"/>
                        <!--Watermark-->
                        <TextBlock Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                            Apply watermark
                        </TextBlock>
                        <Label Grid.Row="2" Grid.Column="1"
                            ToolTip="Print the author name on exported images. (coming soon)" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                        <CheckBox Grid.Row="2" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"
                            IsChecked="{Binding ApplyWatermark}" IsEnabled="False"/>
                    </Grid>
                </StackPanel>
            </TabItem>
            <TabItem Header="🎥 Animations" MinWidth="150">
                <StackPanel Margin="8">
                    <TextBlock Style="{StaticResource MaterialDesignHeadline6TextBlock}" TextAlignment="Center">
                        Animation export options
                    </TextBlock>
                    <StackPanel Margin="16 0">
                        <Label>Frame export format:</Label>
                        <ListBox
                            HorizontalAlignment="Right"
                            Style="{StaticResource MaterialDesignToolToggleListBox}" Margin="4">
                            <ListBoxItem IsSelected="{Binding IsRawFrameExportEnabled, Converter={StaticResource invertBooleanConverter}}">png (8-bit)</ListBoxItem>
                            <ListBoxItem IsSelected="{Binding IsRawFrameExportEnabled}">exr (32-bit)</ListBoxItem>
                        </ListBox>
                        <StackPanel Orientation="Horizontal" Margin="0,8">
                            <Button Command="{Binding ShowFfmpegPathSelectorDialogCommand}"
                                    Content="ffmpeg.exe:"
                                    Style="{StaticResource MaterialDesignOutlinedButton}" Padding="8"/>
                            <Label Visibility="{Binding IsFfmpegPathSet, Converter={StaticResource invertBooleanToVisibilityConverter}}"
                                ToolTip="In order to save video files, install ffmpeg and select the executable." Content="{md:PackIcon InformationOutline}"/>
                            <Label Content="{Binding FfmpegPath}"
                                   VerticalAlignment="Center"/>
                        </StackPanel>
                        <CheckBox 
                            IsChecked="{Binding IsExportVideoFileEnabled}"
                            IsEnabled="{Binding IsFfmpegPathSet}">
                            Save video file after frames have rendered
                        </CheckBox>
                        <StackPanel IsEnabled="{Binding IsExportVideoFileEnabled}">
                            <Grid>
                                <TextBlock>
                                    <Run BaselineAlignment="Center">ffmpeg args: </Run>
                                    <Label ToolTip="Provide additional ffmpeg settings here. IFSRenderer handles the following arguments: input, output, fps, audio." Content="{md:PackIcon InformationOutline}"/>
                                </TextBlock>
                                <Menu HorizontalAlignment="Right" Height="22">
                                    <MenuItem Header="▼ Presets" 
                                              ItemsSource="{Binding FfmpegPresets}"
                                              HorizontalAlignment="Right" Padding="4" FontSize="12" Height="22">
                                        <MenuItem.ItemContainerStyle>
                                            <Style TargetType="MenuItem" BasedOn="{StaticResource MaterialDesignMenuItem}">
                                                <Setter Property="Header" Value="{Binding Key}"/>
                                                <Setter Property="Command" Value="{Binding DataContext.ApplyFfmpegPresetCommand, ElementName=settingsWindow}"/>
                                                <Setter Property="CommandParameter" Value="{Binding Value}"/>
                                            </Style>
                                        </MenuItem.ItemContainerStyle>
                                    </MenuItem>
                                </Menu>
                            </Grid>
                            <TextBox Text="{Binding FfmpegArgs}"
                                TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible" MinLines="5" 
                                Style="{StaticResource MaterialDesignFilledTextBox}" TextAlignment="Left"/>
                        </StackPanel>
                    </StackPanel>
                </StackPanel>
            </TabItem>
            <TabItem Header="⏱️ Performance" MinWidth="150">
                <Grid Margin="8">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                        <RowDefinition Height="auto" MinHeight="50"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.75*"/>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition Width="1*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Style="{StaticResource MaterialDesignHeadline6TextBlock}" TextAlignment="Center">
                        Performance settings
                    </TextBlock>
                    <!--Perceptually uniform updates-->
                    <TextBlock Grid.Row="1" Grid.Column="0" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Center">
                        Perceptually uniform updates
                    </TextBlock>
                    <Label Grid.Row="1" Grid.Column="1"
                        ToolTip="This option decreases the display framerate to allow more computing power on the iteration loop. Checked by default." HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <CheckBox Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"
                        IsChecked="{Binding PerceptuallyUniformUpdates}"/>
                    <!--Target Framerate-->
                    <TextBlock Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                        Target Framerate
                    </TextBlock>
                    <Label Grid.Row="2" Grid.Column="1"
                         ToolTip="{Binding TargetFramerateSlider.ToolTip}" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <local:ValueSlider Value="{Binding TargetFramerate}" SliderSettings="{Binding TargetFramerateSlider}" Grid.Row="2" Grid.Column="3" VerticalAlignment="Center"/>
                    <!--Workgroup-->
                    <TextBlock Grid.Row="3" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                        Workgroups
                    </TextBlock>
                    <Label Grid.Row="3" Grid.Column="1"
                        ToolTip="{Binding WorkgroupCountSlider.ToolTip}" HorizontalAlignment="Center" VerticalAlignment="Center" Content="{md:PackIcon InformationOutline}"/>
                    <local:ValueSlider Value="{Binding WorkgroupCount}" SliderSettings="{Binding WorkgroupCountSlider}" Grid.Row="3" Grid.Column="3" VerticalAlignment="Center"/>
                </Grid>
            </TabItem>
        </TabControl>
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <!--Dialog Buttons-->
            <Button Grid.Column="0" Style="{StaticResource MaterialDesignFlatButton}"
                    Command="{Binding CancelDialogCommand}"
                    IsCancel="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="15">
                Cancel
            </Button>
            <Button Grid.Column="1"
                    Command="{Binding OkDialogCommand}"
                    IsDefault="True" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="15">
                <StackPanel Orientation="Horizontal">
                    <md:PackIcon Kind="ContentSave" Margin="4,0"/>
                    <TextBlock Text="Save"/>
                </StackPanel>
            </Button>
        </Grid>
    </Grid>
</Window>