<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>