UI improvements

This commit is contained in:
whimsical-c4lic0 2026-02-18 01:48:28 -06:00
parent 34ad00ce03
commit ac4061f1ca
7 changed files with 1241 additions and 860 deletions

View File

@ -4,30 +4,113 @@
RequestedThemeVariant="Light" RequestedThemeVariant="Light"
x:Class="OF_DL.Gui.App"> x:Class="OF_DL.Gui.App">
<Application.Resources> <Application.Resources>
<SolidColorBrush x:Key="WindowBackgroundBrush" Color="#EEF3FB" /> <ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<!-- Light Theme -->
<ResourceDictionary x:Key="Light">
<SolidColorBrush x:Key="WindowBackgroundBrush" Color="#F8FAFC" />
<SolidColorBrush x:Key="SurfaceBackgroundBrush" Color="#FFFFFF" /> <SolidColorBrush x:Key="SurfaceBackgroundBrush" Color="#FFFFFF" />
<SolidColorBrush x:Key="SurfaceBorderBrush" Color="#DDE5F3" /> <SolidColorBrush x:Key="SurfaceBorderBrush" Color="#E2E8F0" />
<SolidColorBrush x:Key="PrimaryButtonBackgroundBrush" Color="#2E6EEA" />
<!-- Primary Button -->
<SolidColorBrush x:Key="PrimaryButtonBackgroundBrush" Color="#3B82F6" />
<SolidColorBrush x:Key="PrimaryButtonBackgroundHoverBrush" Color="#2563EB" />
<SolidColorBrush x:Key="PrimaryButtonBackgroundPressedBrush" Color="#1D4ED8" />
<SolidColorBrush x:Key="PrimaryButtonForegroundBrush" Color="#FFFFFF" /> <SolidColorBrush x:Key="PrimaryButtonForegroundBrush" Color="#FFFFFF" />
<!-- Secondary Button -->
<SolidColorBrush x:Key="SecondaryButtonBackgroundBrush" Color="#FFFFFF" /> <SolidColorBrush x:Key="SecondaryButtonBackgroundBrush" Color="#FFFFFF" />
<SolidColorBrush x:Key="SecondaryButtonForegroundBrush" Color="#1F2A44" /> <SolidColorBrush x:Key="SecondaryButtonBackgroundHoverBrush" Color="#F1F5F9" />
<SolidColorBrush x:Key="SecondaryButtonBorderBrush" Color="#CFD9EB" /> <SolidColorBrush x:Key="SecondaryButtonBackgroundPressedBrush" Color="#E2E8F0" />
<SolidColorBrush x:Key="TopBarBackgroundBrush" Color="#DDEAFF" /> <SolidColorBrush x:Key="SecondaryButtonForegroundBrush" Color="#1E293B" />
<SolidColorBrush x:Key="TopBarBorderBrush" Color="#CFD9EB" /> <SolidColorBrush x:Key="SecondaryButtonBorderBrush" Color="#CBD5E1" />
<SolidColorBrush x:Key="TopBarTextBrush" Color="#304261" />
<SolidColorBrush x:Key="TextPrimaryBrush" Color="#1F2A44" /> <!-- Top Bar -->
<SolidColorBrush x:Key="TextSecondaryBrush" Color="#4A5B78" /> <SolidColorBrush x:Key="TopBarBackgroundBrush" Color="#EFF6FF" />
<SolidColorBrush x:Key="HelpBadgeBackgroundBrush" Color="#EAF0FB" /> <SolidColorBrush x:Key="TopBarBorderBrush" Color="#DBEAFE" />
<SolidColorBrush x:Key="HelpBadgeBorderBrush" Color="#C5D4EC" /> <SolidColorBrush x:Key="TopBarTextBrush" Color="#1E40AF" />
<SolidColorBrush x:Key="ErrorTextBrush" Color="#FF5A5A" />
<SolidColorBrush x:Key="PreviewBackgroundBrush" Color="#F5F8FE" /> <!-- Text Colors -->
<SolidColorBrush x:Key="PreviewBorderBrush" Color="#D8E3F4" /> <SolidColorBrush x:Key="TextPrimaryBrush" Color="#0F172A" />
<SolidColorBrush x:Key="DangerSoftBackgroundBrush" Color="#FFE8E8" /> <SolidColorBrush x:Key="TextSecondaryBrush" Color="#475569" />
<SolidColorBrush x:Key="DangerSoftBorderBrush" Color="#E8C5C5" />
<SolidColorBrush x:Key="DangerButtonBackgroundBrush" Color="#D84E4E" /> <!-- Help Badge -->
<SolidColorBrush x:Key="OverlayBackgroundBrush" Color="#80000000" /> <SolidColorBrush x:Key="HelpBadgeBackgroundBrush" Color="#EFF6FF" />
<SolidColorBrush x:Key="HelpBadgeBorderBrush" Color="#BFDBFE" />
<!-- Error -->
<SolidColorBrush x:Key="ErrorTextBrush" Color="#EF4444" />
<!-- Preview/Item Background -->
<SolidColorBrush x:Key="PreviewBackgroundBrush" Color="#F8FAFC" />
<SolidColorBrush x:Key="PreviewBorderBrush" Color="#E2E8F0" />
<!-- Danger Button -->
<SolidColorBrush x:Key="DangerSoftBackgroundBrush" Color="#FEE2E2" />
<SolidColorBrush x:Key="DangerSoftBorderBrush" Color="#FECACA" />
<SolidColorBrush x:Key="DangerButtonBackgroundBrush" Color="#EF4444" />
<SolidColorBrush x:Key="DangerButtonBackgroundHoverBrush" Color="#DC2626" />
<SolidColorBrush x:Key="DangerButtonBackgroundPressedBrush" Color="#B91C1C" />
<!-- Modal -->
<SolidColorBrush x:Key="OverlayBackgroundBrush" Color="#99000000" />
<SolidColorBrush x:Key="ModalBackgroundBrush" Color="#FFFFFF" /> <SolidColorBrush x:Key="ModalBackgroundBrush" Color="#FFFFFF" />
<SolidColorBrush x:Key="ModalBorderBrush" Color="#DDE5F3" /> <SolidColorBrush x:Key="ModalBorderBrush" Color="#E2E8F0" />
</ResourceDictionary>
<!-- Dark Theme -->
<ResourceDictionary x:Key="Dark">
<SolidColorBrush x:Key="WindowBackgroundBrush" Color="#0F172A" />
<SolidColorBrush x:Key="SurfaceBackgroundBrush" Color="#1E293B" />
<SolidColorBrush x:Key="SurfaceBorderBrush" Color="#334155" />
<!-- Primary Button -->
<SolidColorBrush x:Key="PrimaryButtonBackgroundBrush" Color="#3B82F6" />
<SolidColorBrush x:Key="PrimaryButtonBackgroundHoverBrush" Color="#2563EB" />
<SolidColorBrush x:Key="PrimaryButtonBackgroundPressedBrush" Color="#1D4ED8" />
<SolidColorBrush x:Key="PrimaryButtonForegroundBrush" Color="#FFFFFF" />
<!-- Secondary Button - Fixed for dark theme -->
<SolidColorBrush x:Key="SecondaryButtonBackgroundBrush" Color="#334155" />
<SolidColorBrush x:Key="SecondaryButtonBackgroundHoverBrush" Color="#475569" />
<SolidColorBrush x:Key="SecondaryButtonBackgroundPressedBrush" Color="#1E293B" />
<SolidColorBrush x:Key="SecondaryButtonForegroundBrush" Color="#F1F5F9" />
<SolidColorBrush x:Key="SecondaryButtonBorderBrush" Color="#475569" />
<!-- Top Bar -->
<SolidColorBrush x:Key="TopBarBackgroundBrush" Color="#1E293B" />
<SolidColorBrush x:Key="TopBarBorderBrush" Color="#334155" />
<SolidColorBrush x:Key="TopBarTextBrush" Color="#93C5FD" />
<!-- Text Colors -->
<SolidColorBrush x:Key="TextPrimaryBrush" Color="#F1F5F9" />
<SolidColorBrush x:Key="TextSecondaryBrush" Color="#94A3B8" />
<!-- Help Badge -->
<SolidColorBrush x:Key="HelpBadgeBackgroundBrush" Color="#1E3A8A" />
<SolidColorBrush x:Key="HelpBadgeBorderBrush" Color="#3B82F6" />
<!-- Error -->
<SolidColorBrush x:Key="ErrorTextBrush" Color="#F87171" />
<!-- Preview/Item Background -->
<SolidColorBrush x:Key="PreviewBackgroundBrush" Color="#0F172A" />
<SolidColorBrush x:Key="PreviewBorderBrush" Color="#334155" />
<!-- Danger Button -->
<SolidColorBrush x:Key="DangerSoftBackgroundBrush" Color="#7F1D1D" />
<SolidColorBrush x:Key="DangerSoftBorderBrush" Color="#991B1B" />
<SolidColorBrush x:Key="DangerButtonBackgroundBrush" Color="#EF4444" />
<SolidColorBrush x:Key="DangerButtonBackgroundHoverBrush" Color="#DC2626" />
<SolidColorBrush x:Key="DangerButtonBackgroundPressedBrush" Color="#B91C1C" />
<!-- Modal -->
<SolidColorBrush x:Key="OverlayBackgroundBrush" Color="#CC000000" />
<SolidColorBrush x:Key="ModalBackgroundBrush" Color="#1E293B" />
<SolidColorBrush x:Key="ModalBorderBrush" Color="#334155" />
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</Application.Resources> </Application.Resources>
<Application.Styles> <Application.Styles>
<fluent:FluentTheme /> <fluent:FluentTheme />

View File

@ -33,7 +33,10 @@ public sealed class ConfigCategoryViewModel : ViewModelBase
FolderPerMessageField = fieldList.FirstOrDefault(field => FolderPerMessageField = fieldList.FirstOrDefault(field =>
string.Equals(field.PropertyName, nameof(Config.FolderPerMessage), StringComparison.Ordinal)); string.Equals(field.PropertyName, nameof(Config.FolderPerMessage), StringComparison.Ordinal));
IEnumerable<ConfigFieldViewModel> visibleFields = IsDownloadBehavior IEnumerable<ConfigFieldViewModel> visibleFields = IsExternal
? fieldList.Where(field => field.PropertyName is not nameof(Config.FFmpegPath)
and not nameof(Config.FFprobePath))
: IsDownloadBehavior
? fieldList.Where(field => field.PropertyName is not nameof(Config.DownloadOnlySpecificDates) ? fieldList.Where(field => field.PropertyName is not nameof(Config.DownloadOnlySpecificDates)
and not nameof(Config.DownloadDateSelection) and not nameof(Config.DownloadDateSelection)
and not nameof(Config.CustomDate) and not nameof(Config.CustomDate)
@ -56,6 +59,9 @@ public sealed class ConfigCategoryViewModel : ViewModelBase
public string CategoryName { get; } public string CategoryName { get; }
public bool IsExternal =>
string.Equals(CategoryName, "External", StringComparison.Ordinal);
public bool IsDownloadBehavior => public bool IsDownloadBehavior =>
string.Equals(CategoryName, "Download Behavior", StringComparison.Ordinal); string.Equals(CategoryName, "Download Behavior", StringComparison.Ordinal);

View File

@ -485,7 +485,7 @@ public partial class MainWindowViewModel(
RefreshIgnoredUsersListsCommand.NotifyCanExecuteChanged(); RefreshIgnoredUsersListsCommand.NotifyCanExecuteChanged();
} }
[RelayCommand] [RelayCommand(CanExecute = nameof(CanEditConfig))]
private void EditConfig() private void EditConfig()
{ {
if (CurrentScreen == AppScreen.Config) if (CurrentScreen == AppScreen.Config)
@ -824,6 +824,8 @@ public partial class MainWindowViewModel(
private bool CanLogout() => IsAuthenticated && !IsDownloading; private bool CanLogout() => IsAuthenticated && !IsDownloading;
private bool CanEditConfig() => CurrentScreen != AppScreen.Config;
partial void OnCurrentScreenChanged(AppScreen value) partial void OnCurrentScreenChanged(AppScreen value)
{ {
OnPropertyChanged(nameof(IsLoadingScreen)); OnPropertyChanged(nameof(IsLoadingScreen));
@ -839,6 +841,7 @@ public partial class MainWindowViewModel(
RefreshUsersCommand.NotifyCanExecuteChanged(); RefreshUsersCommand.NotifyCanExecuteChanged();
RefreshIgnoredUsersListsCommand.NotifyCanExecuteChanged(); RefreshIgnoredUsersListsCommand.NotifyCanExecuteChanged();
LogoutCommand.NotifyCanExecuteChanged(); LogoutCommand.NotifyCanExecuteChanged();
EditConfigCommand.NotifyCanExecuteChanged();
} }
partial void OnIsDownloadingChanged(bool value) partial void OnIsDownloadingChanged(bool value)
@ -1649,8 +1652,6 @@ public partial class MainWindowViewModel(
or nameof(Config.NonInteractiveModeListName) or nameof(Config.NonInteractiveModeListName)
or nameof(Config.NonInteractiveModePurchasedTab) or nameof(Config.NonInteractiveModePurchasedTab)
or nameof(Config.DisableBrowserAuth) or nameof(Config.DisableBrowserAuth)
or nameof(Config.FFmpegPath)
or nameof(Config.FFprobePath)
or nameof(Config.DownloadPath) or nameof(Config.DownloadPath)
or nameof(Config.DrmVideoDurationMatchThreshold) or nameof(Config.DrmVideoDurationMatchThreshold)
or nameof(Config.DownloadVideos) or nameof(Config.DownloadVideos)
@ -1672,6 +1673,7 @@ public partial class MainWindowViewModel(
{ {
nameof(Config.DisableBrowserAuth) => "Auth", nameof(Config.DisableBrowserAuth) => "Auth",
nameof(Config.FFmpegPath) => "External", nameof(Config.FFmpegPath) => "External",
nameof(Config.FFprobePath) => "External",
nameof(Config.DownloadAvatarHeaderPhoto) => "Download Media Types", nameof(Config.DownloadAvatarHeaderPhoto) => "Download Media Types",
nameof(Config.DownloadPaidPosts) => "Download Media Types", nameof(Config.DownloadPaidPosts) => "Download Media Types",
@ -1743,7 +1745,7 @@ public partial class MainWindowViewModel(
}; };
private static bool IsLeftColumnCategory(string categoryName) => private static bool IsLeftColumnCategory(string categoryName) =>
categoryName is "Appearance" or "Logging" or "Download Behavior" or "Subscriptions"; categoryName is "Appearance" or "Logging" or "External" or "Download Behavior" or "Subscriptions";
private static bool IsRightColumnCategory(string categoryName) => private static bool IsRightColumnCategory(string categoryName) =>
categoryName is "File Naming" or "Folder Structure" or "Performance"; categoryName is "File Naming" or "Folder Structure" or "Performance";
@ -1753,8 +1755,9 @@ public partial class MainWindowViewModel(
{ {
"Appearance" => 1, "Appearance" => 1,
"Logging" => 2, "Logging" => 2,
"Download Behavior" => 3, "External" => 3,
"Subscriptions" => 4, "Download Behavior" => 4,
"Subscriptions" => 5,
_ => 100 _ => 100
}; };

View File

@ -5,99 +5,144 @@
xmlns:views="using:OF_DL.Gui.Views" xmlns:views="using:OF_DL.Gui.Views"
x:Class="OF_DL.Gui.Views.AboutWindow" x:Class="OF_DL.Gui.Views.AboutWindow"
x:DataType="views:AboutWindow" x:DataType="views:AboutWindow"
Width="760" Width="600"
Height="520" Height="520"
MinWidth="620" MinWidth="550"
MinHeight="440" MinHeight="420"
Title="About OF DL" Title="About OF DL"
Background="{DynamicResource WindowBackgroundBrush}" Background="{DynamicResource WindowBackgroundBrush}"
mc:Ignorable="d"> mc:Ignorable="d">
<Border Margin="14" <Window.Styles>
Padding="16" <Style Selector="Button.link">
Background="{DynamicResource SurfaceBackgroundBrush}" <Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource PrimaryButtonBackgroundBrush}" />
<Setter Property="Padding" Value="0" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Cursor" Value="Hand" />
</Style>
<Style Selector="Button.link:pointerover">
<Setter Property="Foreground" Value="{DynamicResource PrimaryButtonBackgroundHoverBrush}" />
</Style>
</Window.Styles>
<Grid Margin="24"
RowDefinitions="Auto,*">
<TextBlock Grid.Row="0"
FontSize="28"
FontWeight="Bold"
Foreground="{DynamicResource TextPrimaryBrush}"
Text="About OF DL"
Margin="0,0,0,20" />
<ScrollViewer Grid.Row="1">
<StackPanel Spacing="16">
<!-- Application Info Section -->
<Border Background="{DynamicResource SurfaceBackgroundBrush}"
BorderBrush="{DynamicResource SurfaceBorderBrush}" BorderBrush="{DynamicResource SurfaceBorderBrush}"
BorderThickness="1" BorderThickness="1"
CornerRadius="12"> CornerRadius="12"
<Grid RowDefinitions="Auto,*,Auto"> Padding="24"
<TextBlock Grid.Row="0" BoxShadow="0 1 3 0 #0F000000, 0 1 2 -1 #0F000000">
FontSize="24" <StackPanel Spacing="12">
FontWeight="SemiBold" <TextBlock FontSize="16"
FontWeight="Bold"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextPrimaryBrush}"
Text="About OF DL" /> Text="Application" />
<Grid Grid.Row="1" <Grid ColumnDefinitions="140,*" RowDefinitions="Auto,Auto">
Margin="0,14,0,0" <TextBlock Grid.Row="0" Grid.Column="0"
ColumnDefinitions="Auto,*"
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto">
<TextBlock Grid.Row="1"
Grid.Column="0"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextSecondaryBrush}"
Text="Version:" /> Text="Version" />
<TextBlock Grid.Row="1" <TextBlock Grid.Row="0" Grid.Column="1"
Grid.Column="1"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextPrimaryBrush}"
Text="{Binding ProgramVersion}" /> Text="{Binding ProgramVersion}" />
<TextBlock Grid.Row="2" <TextBlock Grid.Row="1" Grid.Column="0"
Grid.Column="0" Margin="0,10,0,0"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextSecondaryBrush}"
Text="Source Code:" /> Text="Source Code" />
<Button Grid.Row="2" <Button Grid.Row="1" Grid.Column="1"
Grid.Column="1" Margin="0,10,0,0"
Classes="link"
HorizontalAlignment="Left" HorizontalAlignment="Left"
Content="{Binding SourceCodeUrl}" Content="{Binding SourceCodeUrl}"
Click="OnOpenSourceCodeClick" /> Click="OnOpenSourceCodeClick" />
</Grid>
</StackPanel>
</Border>
<TextBlock Grid.Row="3" <!-- FFmpeg Info Section -->
Grid.Column="0" <Border Background="{DynamicResource SurfaceBackgroundBrush}"
FontWeight="SemiBold" BorderBrush="{DynamicResource SurfaceBorderBrush}"
BorderThickness="1"
CornerRadius="12"
Padding="24"
BoxShadow="0 1 3 0 #0F000000, 0 1 2 -1 #0F000000">
<StackPanel Spacing="12">
<TextBlock FontSize="16"
FontWeight="Bold"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextPrimaryBrush}"
Text="FFmpeg Version:" /> Text="External Tools" />
<TextBlock Grid.Row="3"
Grid.Column="1"
Foreground="{DynamicResource TextPrimaryBrush}"
Text="{Binding FfmpegVersion}" />
<TextBlock Grid.Row="4" <StackPanel Spacing="12">
Grid.Column="0" <!-- FFmpeg -->
<TextBlock Foreground="{DynamicResource TextPrimaryBrush}"
Text="FFmpeg" />
<Grid ColumnDefinitions="120,*" RowDefinitions="Auto,Auto" Margin="20,0,0,0">
<TextBlock Grid.Row="0" Grid.Column="0"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource TextSecondaryBrush}"
Text="Version" />
<TextBlock Grid.Row="0" Grid.Column="1"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextPrimaryBrush}"
Text="FFprobe Version:" /> Text="{Binding FfmpegVersion}"
<TextBlock Grid.Row="4" TextWrapping="Wrap" />
Grid.Column="1"
Foreground="{DynamicResource TextPrimaryBrush}"
Text="{Binding FfprobeVersion}" />
<TextBlock Grid.Row="5" <TextBlock Grid.Row="1" Grid.Column="0"
Grid.Column="0" Margin="0,8,0,0"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextSecondaryBrush}"
Text="FFmpeg License:" /> Text="License" />
<Button Grid.Row="5" <Button Grid.Row="1" Grid.Column="1"
Grid.Column="1" Margin="0,8,0,0"
Classes="link"
HorizontalAlignment="Left" HorizontalAlignment="Left"
Content="{Binding FfmpegLicenseUrl}" Content="{Binding FfmpegLicenseUrl}"
Click="OnOpenFfmpegLicenseClick" /> Click="OnOpenFfmpegLicenseClick" />
</Grid>
<TextBlock Grid.Row="6" <!-- FFprobe -->
Grid.Column="0" <TextBlock Foreground="{DynamicResource TextPrimaryBrush}"
Text="FFprobe"
Margin="0,4,0,0" />
<Grid ColumnDefinitions="120,*" RowDefinitions="Auto,Auto" Margin="20,0,0,0">
<TextBlock Grid.Row="0" Grid.Column="0"
FontWeight="SemiBold" FontWeight="SemiBold"
Foreground="{DynamicResource TextSecondaryBrush}"
Text="Version" />
<TextBlock Grid.Row="0" Grid.Column="1"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextPrimaryBrush}"
Text="FFprobe License:" /> Text="{Binding FfprobeVersion}"
<Button Grid.Row="6" TextWrapping="Wrap" />
Grid.Column="1"
<TextBlock Grid.Row="1" Grid.Column="0"
Margin="0,8,0,0"
FontWeight="SemiBold"
Foreground="{DynamicResource TextSecondaryBrush}"
Text="License" />
<Button Grid.Row="1" Grid.Column="1"
Margin="0,8,0,0"
Classes="link"
HorizontalAlignment="Left" HorizontalAlignment="Left"
Content="{Binding FfprobeLicenseUrl}" Content="{Binding FfprobeLicenseUrl}"
Click="OnOpenFfprobeLicenseClick" /> Click="OnOpenFfprobeLicenseClick" />
</Grid> </Grid>
</StackPanel>
<Button Grid.Row="2" </StackPanel>
Margin="0,18,0,0"
HorizontalAlignment="Right"
Content="Close"
Click="OnCloseClick" />
</Grid>
</Border> </Border>
</StackPanel>
</ScrollViewer>
</Grid>
</Window> </Window>

View File

@ -5,10 +5,10 @@
xmlns:views="using:OF_DL.Gui.Views" xmlns:views="using:OF_DL.Gui.Views"
x:Class="OF_DL.Gui.Views.FaqWindow" x:Class="OF_DL.Gui.Views.FaqWindow"
x:DataType="views:FaqWindow" x:DataType="views:FaqWindow"
Width="760" Width="800"
Height="640" Height="680"
MinWidth="600" MinWidth="650"
MinHeight="500" MinHeight="550"
Title="FAQ" Title="FAQ"
Background="{DynamicResource WindowBackgroundBrush}" Background="{DynamicResource WindowBackgroundBrush}"
mc:Ignorable="d"> mc:Ignorable="d">
@ -17,58 +17,102 @@
<Setter Property="Background" Value="{DynamicResource SurfaceBackgroundBrush}" /> <Setter Property="Background" Value="{DynamicResource SurfaceBackgroundBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource SurfaceBorderBrush}" /> <Setter Property="BorderBrush" Value="{DynamicResource SurfaceBorderBrush}" />
<Setter Property="BorderThickness" Value="1" /> <Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="10" /> <Setter Property="CornerRadius" Value="12" />
<Setter Property="Padding" Value="14" /> <Setter Property="Padding" Value="20" />
<Setter Property="Margin" Value="0,0,0,10" /> <Setter Property="Margin" Value="0,0,0,16" />
<Setter Property="BoxShadow" Value="0 1 3 0 #0F000000, 0 1 2 -1 #0F000000" />
<Setter Property="Transitions">
<Transitions>
<BoxShadowsTransition Property="BoxShadow" Duration="0:0:0.2" />
</Transitions>
</Setter>
</Style>
<Style Selector="Border.faqCard:pointerover">
<Setter Property="BoxShadow" Value="0 4 6 -1 #19000000, 0 2 4 -1 #0F000000" />
</Style>
<Style Selector="TextBlock.question">
<Setter Property="FontSize" Value="18" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Foreground" Value="{DynamicResource TextPrimaryBrush}" />
<Setter Property="TextWrapping" Value="Wrap" />
</Style>
<Style Selector="TextBlock.answer">
<Setter Property="FontSize" Value="14" />
<Setter Property="Foreground" Value="{DynamicResource TextSecondaryBrush}" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="LineHeight" Value="22" />
</Style>
<Style Selector="Button.link">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Padding" Value="0" />
<Setter Property="Foreground" Value="{DynamicResource PrimaryButtonBackgroundBrush}" />
<Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="HorizontalAlignment" Value="Left" />
</Style>
<Style Selector="Button.link:pointerover">
<Setter Property="Foreground" Value="{DynamicResource PrimaryButtonBackgroundHoverBrush}" />
</Style>
<Style Selector="Border.codeBlock">
<Setter Property="Background" Value="{DynamicResource PreviewBackgroundBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource PreviewBorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Padding" Value="12" />
<Setter Property="Margin" Value="0,8,0,0" />
</Style> </Style>
</Window.Styles> </Window.Styles>
<Border Margin="14" <Grid Margin="24"
Padding="16" RowDefinitions="Auto,*">
Background="{DynamicResource SurfaceBackgroundBrush}" <!-- Header -->
BorderBrush="{DynamicResource SurfaceBorderBrush}"
BorderThickness="1"
CornerRadius="12">
<Grid RowDefinitions="Auto,Auto,*,Auto">
<TextBlock Grid.Row="0" <TextBlock Grid.Row="0"
FontSize="24" FontSize="32"
FontWeight="SemiBold" FontWeight="Bold"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextPrimaryBrush}"
Text="Frequently Asked Questions" /> Text="Frequently Asked Questions"
Margin="0,0,0,20" />
<ScrollViewer Grid.Row="2" <!-- FAQ Items -->
Margin="0,14,0,0"> <ScrollViewer Grid.Row="1">
<ItemsControl ItemsSource="{Binding Entries}"> <ItemsControl ItemsSource="{Binding Entries}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="views:FaqEntry"> <DataTemplate x:DataType="views:FaqEntry">
<Border Classes="faqCard"> <Border Classes="faqCard">
<StackPanel Spacing="8"> <StackPanel Spacing="12">
<TextBlock FontSize="18" <!-- Question -->
FontWeight="SemiBold" <TextBlock Classes="question"
Foreground="{DynamicResource TextPrimaryBrush}" Text="{Binding Question}" />
Text="{Binding Question}"
TextWrapping="Wrap" />
<!-- Answer Paragraphs -->
<ItemsControl ItemsSource="{Binding Paragraphs}"> <ItemsControl ItemsSource="{Binding Paragraphs}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="x:String"> <DataTemplate x:DataType="x:String">
<TextBlock Foreground="{DynamicResource TextSecondaryBrush}" <TextBlock Classes="answer"
Text="{Binding .}" Text="{Binding .}"
TextWrapping="Wrap" /> Margin="0,0,0,8" />
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
<!-- Links -->
<ItemsControl IsVisible="{Binding HasLinks}" <ItemsControl IsVisible="{Binding HasLinks}"
ItemsSource="{Binding Links}"> ItemsSource="{Binding Links}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Spacing="8" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="views:FaqLink"> <DataTemplate x:DataType="views:FaqLink">
<Button HorizontalAlignment="Left" <Button Classes="link"
Background="Transparent"
BorderThickness="0"
Padding="0"
Foreground="{DynamicResource PrimaryButtonBackgroundBrush}"
FontWeight="SemiBold"
Content="{Binding Label}" Content="{Binding Label}"
ToolTip.Tip="{Binding Url}" ToolTip.Tip="{Binding Url}"
CommandParameter="{Binding Url}" CommandParameter="{Binding Url}"
@ -77,16 +121,12 @@
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
<!-- Code Snippet -->
<Border IsVisible="{Binding HasCodeSnippet}" <Border IsVisible="{Binding HasCodeSnippet}"
Margin="0,2,0,0" Classes="codeBlock">
Padding="10"
CornerRadius="8"
Background="{DynamicResource PreviewBackgroundBrush}"
BorderBrush="{DynamicResource PreviewBorderBrush}"
BorderThickness="1">
<TextBlock Text="{Binding CodeSnippet}" <TextBlock Text="{Binding CodeSnippet}"
FontFamily="Consolas" FontFamily="Consolas,Courier New,monospace"
FontSize="12" FontSize="13"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextPrimaryBrush}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
</Border> </Border>
@ -96,12 +136,5 @@
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
</ScrollViewer> </ScrollViewer>
<Button Grid.Row="3"
Margin="0,18,0,0"
HorizontalAlignment="Right"
Content="Close"
Click="OnCloseClick" />
</Grid> </Grid>
</Border>
</Window> </Window>

View File

@ -20,29 +20,130 @@
<Setter Property="BorderBrush" Value="{DynamicResource SurfaceBorderBrush}" /> <Setter Property="BorderBrush" Value="{DynamicResource SurfaceBorderBrush}" />
<Setter Property="BorderThickness" Value="1" /> <Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="12" /> <Setter Property="CornerRadius" Value="12" />
<Setter Property="BoxShadow" Value="0 1 3 0 #0F000000, 0 1 2 -1 #0F000000" />
</Style> </Style>
<Style Selector="Button.primary"> <Style Selector="Button.primary">
<Setter Property="Background" Value="{DynamicResource PrimaryButtonBackgroundBrush}" /> <Setter Property="Background" Value="{DynamicResource PrimaryButtonBackgroundBrush}" />
<Setter Property="Foreground" Value="{DynamicResource PrimaryButtonForegroundBrush}" /> <Setter Property="Foreground" Value="{DynamicResource PrimaryButtonForegroundBrush}" />
<Setter Property="Padding" Value="14,8" /> <Setter Property="Padding" Value="16,8" />
<Setter Property="CornerRadius" Value="8" /> <Setter Property="CornerRadius" Value="8" />
<Setter Property="FontWeight" Value="SemiBold" /> <Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Transitions">
<Transitions>
<TransformOperationsTransition Property="RenderTransform" Duration="0:0:0.15" />
<BrushTransition Property="Background" Duration="0:0:0.15" />
</Transitions>
</Setter>
</Style>
<Style Selector="Button.primary:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource PrimaryButtonBackgroundHoverBrush}" />
</Style>
<Style Selector="Button.primary:pressed /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource PrimaryButtonBackgroundPressedBrush}" />
<Setter Property="RenderTransform" Value="scale(0.98)" />
</Style> </Style>
<Style Selector="Button.secondary"> <Style Selector="Button.secondary">
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBackgroundBrush}" /> <Setter Property="Background" Value="{DynamicResource SecondaryButtonBackgroundBrush}" />
<Setter Property="Foreground" Value="{DynamicResource SecondaryButtonForegroundBrush}" /> <Setter Property="Foreground" Value="{DynamicResource SecondaryButtonForegroundBrush}" />
<Setter Property="Padding" Value="14,8" /> <Setter Property="Padding" Value="16,7" />
<Setter Property="CornerRadius" Value="8" /> <Setter Property="CornerRadius" Value="8" />
<Setter Property="BorderBrush" Value="{DynamicResource SecondaryButtonBorderBrush}" /> <Setter Property="BorderBrush" Value="{DynamicResource SecondaryButtonBorderBrush}" />
<Setter Property="BorderThickness" Value="1" /> <Setter Property="BorderThickness" Value="1" />
<Setter Property="FontWeight" Value="SemiBold" /> <Setter Property="FontWeight" Value="SemiBold" />
<Setter Property="Transitions">
<Transitions>
<TransformOperationsTransition Property="RenderTransform" Duration="0:0:0.15" />
<BrushTransition Property="Background" Duration="0:0:0.15" />
</Transitions>
</Setter>
</Style>
<Style Selector="Button.secondary:pointerover /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBackgroundHoverBrush}" />
</Style>
<Style Selector="Button.secondary:pressed /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Background" Value="{DynamicResource SecondaryButtonBackgroundPressedBrush}" />
<Setter Property="RenderTransform" Value="scale(0.98)" />
</Style> </Style>
<Style Selector="TextBox.fileNameOverlayInput:not(:empty)"> <Style Selector="TextBox.fileNameOverlayInput:not(:empty)">
<Setter Property="Foreground" Value="Transparent" /> <Setter Property="Foreground" Value="Transparent" />
</Style> </Style>
<!-- Modern TextBox Styling -->
<Style Selector="TextBox">
<Setter Property="CornerRadius" Value="8" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="10,7" />
<Setter Property="Transitions">
<Transitions>
<BrushTransition Property="BorderBrush" Duration="0:0:0.15" />
</Transitions>
</Setter>
</Style>
<Style Selector="TextBox:focus">
<Setter Property="BorderBrush" Value="{DynamicResource PrimaryButtonBackgroundBrush}" />
</Style>
<!-- Modern ComboBox Styling -->
<Style Selector="ComboBox">
<Setter Property="CornerRadius" Value="8" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="10,8" />
</Style>
<!-- Modern AutoCompleteBox Styling -->
<Style Selector="AutoCompleteBox">
<Setter Property="CornerRadius" Value="8" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="10,8" />
</Style>
<!-- Modern DatePicker Styling -->
<Style Selector="DatePicker">
<Setter Property="CornerRadius" Value="8" />
<Setter Property="BorderThickness" Value="1" />
</Style>
<Style Selector="DatePicker /template/ Button">
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Padding" Value="10,8" />
<Setter Property="MinHeight" Value="36" />
</Style>
<Style Selector="DatePicker /template/ TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="0" />
</Style>
<!-- Modern NumericUpDown Styling -->
<Style Selector="NumericUpDown">
<Setter Property="CornerRadius" Value="8" />
<Setter Property="BorderThickness" Value="1" />
</Style>
<!-- Modern CheckBox Styling -->
<Style Selector="CheckBox">
<Setter Property="Padding" Value="8,6" />
</Style>
<!-- Modern ProgressBar Styling -->
<Style Selector="ProgressBar">
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Height" Value="8" />
</Style>
<!-- Modern ListBox Styling -->
<Style Selector="ListBox">
<Setter Property="CornerRadius" Value="8" />
<Setter Property="BorderThickness" Value="1" />
</Style>
</Window.Styles> </Window.Styles>
<Grid RowDefinitions="Auto,Auto,*"> <Grid RowDefinitions="Auto,Auto,*">
@ -69,7 +170,7 @@
</Menu> </Menu>
<Border Grid.Row="1" <Border Grid.Row="1"
Padding="16" Padding="18,14"
BorderThickness="0,0,0,1" BorderThickness="0,0,0,1"
BorderBrush="{DynamicResource TopBarBorderBrush}" BorderBrush="{DynamicResource TopBarBorderBrush}"
Background="{DynamicResource TopBarBackgroundBrush}"> Background="{DynamicResource TopBarBackgroundBrush}">
@ -93,7 +194,7 @@
</Grid> </Grid>
</Border> </Border>
<Grid Grid.Row="2" Margin="14"> <Grid Grid.Row="2" Margin="20">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="*" /> <RowDefinition Height="*" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
@ -113,11 +214,13 @@
<TextBlock HorizontalAlignment="Center" Text="{Binding LoadingMessage}" TextWrapping="Wrap" /> <TextBlock HorizontalAlignment="Center" Text="{Binding LoadingMessage}" TextWrapping="Wrap" />
</StackPanel> </StackPanel>
<ScrollViewer IsVisible="{Binding IsConfigScreen}"> <ScrollViewer IsVisible="{Binding IsConfigScreen}"
<StackPanel Spacing="14" Margin="2,0,4,0"> VerticalScrollBarVisibility="Auto">
<TextBlock FontSize="22" FontWeight="SemiBold" Text="Configuration" /> <StackPanel Spacing="20" Margin="2,0,4,0">
<TextBlock FontSize="24" FontWeight="SemiBold" Text="Configuration"
Foreground="{DynamicResource TextPrimaryBrush}" />
<Border Classes="surface" Padding="12" Margin="0,0,0,2"> <Border Classes="surface" Padding="20" Margin="0,0,0,2">
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<TextBlock FontSize="16" <TextBlock FontSize="16"
FontWeight="Bold" FontWeight="Bold"
@ -214,14 +317,95 @@
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:ConfigCategoryViewModel"> <DataTemplate x:DataType="vm:ConfigCategoryViewModel">
<Border Classes="surface" <Border Classes="surface"
Margin="0,0,0,12" Margin="0,0,0,16"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
Padding="10"> Padding="20">
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<TextBlock FontSize="16" <TextBlock FontSize="16"
FontWeight="Bold" FontWeight="Bold"
Foreground="{DynamicResource TextPrimaryBrush}" Foreground="{DynamicResource TextPrimaryBrush}"
Text="{Binding CategoryName}" /> Text="{Binding CategoryName}" />
<StackPanel IsVisible="{Binding IsExternal}"
Spacing="10"
Margin="0,0,0,0">
<StackPanel Orientation="Horizontal" Spacing="6">
<TextBlock FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimaryBrush}"
Text="FFmpeg Path" />
<Button Width="20"
Height="20"
MinWidth="20"
MinHeight="20"
Padding="0"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
FontSize="12"
FontWeight="Bold"
Background="{DynamicResource HelpBadgeBackgroundBrush}"
BorderBrush="{DynamicResource HelpBadgeBorderBrush}"
BorderThickness="1"
CornerRadius="10"
Content="?"
ToolTip.Tip="{Binding ViewModel.FfmpegPathHelpText, RelativeSource={RelativeSource AncestorType=views:MainWindow}, FallbackValue=''}" />
</StackPanel>
<Grid ColumnDefinitions="*,Auto">
<TextBox Grid.Column="0"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Text="{Binding ViewModel.FfmpegPath, RelativeSource={RelativeSource AncestorType=views:MainWindow}, FallbackValue=''}"
Watermark="Optional: path to FFmpeg executable" />
<Button Grid.Column="1"
Margin="8,0,0,0"
Classes="secondary"
Content="Browse..."
Click="OnBrowseFfmpegPathClick" />
</Grid>
<TextBlock
IsVisible="{Binding ViewModel.HasFfmpegPathError, RelativeSource={RelativeSource AncestorType=views:MainWindow}, FallbackValue=False}"
Foreground="{DynamicResource ErrorTextBrush}"
Text="{Binding ViewModel.FfmpegPathError, RelativeSource={RelativeSource AncestorType=views:MainWindow}, FallbackValue=''}"
TextWrapping="Wrap" />
<StackPanel Orientation="Horizontal" Spacing="6">
<TextBlock FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimaryBrush}"
Text="FFprobe Path" />
<Button Width="20"
Height="20"
MinWidth="20"
MinHeight="20"
Padding="0"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
FontSize="12"
FontWeight="Bold"
Background="{DynamicResource HelpBadgeBackgroundBrush}"
BorderBrush="{DynamicResource HelpBadgeBorderBrush}"
BorderThickness="1"
CornerRadius="10"
Content="?"
ToolTip.Tip="{Binding ViewModel.FfprobePathHelpText, RelativeSource={RelativeSource AncestorType=views:MainWindow}, FallbackValue=''}" />
</StackPanel>
<Grid ColumnDefinitions="*,Auto">
<TextBox Grid.Column="0"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Text="{Binding ViewModel.FfprobePath, RelativeSource={RelativeSource AncestorType=views:MainWindow}, FallbackValue=''}"
Watermark="Optional: path to FFprobe executable" />
<Button Grid.Column="1"
Margin="8,0,0,0"
Classes="secondary"
Content="Browse..."
Click="OnBrowseFfprobePathClick" />
</Grid>
<TextBlock
IsVisible="{Binding ViewModel.HasFfprobePathError, RelativeSource={RelativeSource AncestorType=views:MainWindow}, FallbackValue=False}"
Foreground="{DynamicResource ErrorTextBrush}"
Text="{Binding ViewModel.FfprobePathError, RelativeSource={RelativeSource AncestorType=views:MainWindow}, FallbackValue=''}"
TextWrapping="Wrap" />
</StackPanel>
<StackPanel IsVisible="{Binding IsDownloadBehavior}" <StackPanel IsVisible="{Binding IsDownloadBehavior}"
Spacing="10" Spacing="10"
Margin="0,0,0,0"> Margin="0,0,0,0">
@ -356,7 +540,8 @@
MinWidth="160" MinWidth="160"
ItemsSource="{Binding DownloadVideoResolutionField.EnumOptions, FallbackValue={x:Null}}" ItemsSource="{Binding DownloadVideoResolutionField.EnumOptions, FallbackValue={x:Null}}"
SelectedItem="{Binding DownloadVideoResolutionField.EnumValue, FallbackValue={x:Null}}" /> SelectedItem="{Binding DownloadVideoResolutionField.EnumValue, FallbackValue={x:Null}}" />
<TextBlock IsVisible="{Binding DownloadVideoResolutionField.HasError, FallbackValue=False}" <TextBlock
IsVisible="{Binding DownloadVideoResolutionField.HasError, FallbackValue=False}"
Foreground="{DynamicResource ErrorTextBrush}" Foreground="{DynamicResource ErrorTextBrush}"
Text="{Binding DownloadVideoResolutionField.ErrorMessage, FallbackValue=''}" Text="{Binding DownloadVideoResolutionField.ErrorMessage, FallbackValue=''}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
@ -809,8 +994,8 @@
ColumnDefinitions="2*,3*"> ColumnDefinitions="2*,3*">
<Border Grid.Row="0" <Border Grid.Row="0"
Grid.ColumnSpan="2" Grid.ColumnSpan="2"
Padding="10" Padding="16"
Margin="0,0,0,10" Margin="0,0,0,16"
Classes="surface"> Classes="surface">
<Grid ColumnDefinitions="*,Auto"> <Grid ColumnDefinitions="*,Auto">
<StackPanel Grid.Column="0" <StackPanel Grid.Column="0"
@ -836,7 +1021,7 @@
<Border Grid.Row="1" <Border Grid.Row="1"
Grid.Column="0" Grid.Column="0"
Margin="0,0,8,0" Margin="0,0,8,0"
Padding="10" Padding="16"
Classes="surface"> Classes="surface">
<Grid RowDefinitions="Auto,*"> <Grid RowDefinitions="Auto,*">
<Grid Grid.Row="0" ColumnDefinitions="*,Auto" VerticalAlignment="Center"> <Grid Grid.Row="0" ColumnDefinitions="*,Auto" VerticalAlignment="Center">
@ -858,16 +1043,28 @@
</Grid> </Grid>
<ListBox Grid.Row="1" Margin="0,8,0,0" ItemsSource="{Binding AvailableUsers}" <ListBox Grid.Row="1" Margin="0,8,0,0" ItemsSource="{Binding AvailableUsers}"
Background="{DynamicResource SurfaceBackgroundBrush}" Background="{DynamicResource SurfaceBackgroundBrush}"
BorderBrush="{DynamicResource SurfaceBorderBrush}" BorderBrush="Transparent"
BorderThickness="0"
IsEnabled="{Binding !IsDownloading}"> IsEnabled="{Binding !IsDownloading}">
<ListBox.Styles> <ListBox.Styles>
<Style Selector="ListBoxItem"> <Style Selector="ListBoxItem">
<Setter Property="Padding" Value="0" /> <Setter Property="Padding" Value="0" />
</Style> </Style>
<Style Selector="ListBoxItem:selected /template/ ContentPresenter">
<Setter Property="Background" Value="Transparent" />
</Style>
<Style Selector="ListBoxItem:selected:focus /template/ ContentPresenter">
<Setter Property="Background" Value="Transparent" />
</Style>
<Style Selector="ListBoxItem:selected:pointerover /template/ ContentPresenter">
<Setter Property="Background" Value="Transparent" />
</Style>
</ListBox.Styles> </ListBox.Styles>
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:SelectableUserViewModel"> <DataTemplate x:DataType="vm:SelectableUserViewModel">
<CheckBox Content="{Binding Username}" IsChecked="{Binding IsSelected}" /> <CheckBox Content="{Binding Username}"
IsChecked="{Binding IsSelected}"
HorizontalAlignment="Stretch" />
</DataTemplate> </DataTemplate>
</ListBox.ItemTemplate> </ListBox.ItemTemplate>
</ListBox> </ListBox>
@ -877,7 +1074,7 @@
<Border Grid.Row="1" <Border Grid.Row="1"
Grid.Column="1" Grid.Column="1"
Margin="8,0,0,0" Margin="8,0,0,0"
Padding="10" Padding="16"
Classes="surface"> Classes="surface">
<Grid RowDefinitions="Auto,*"> <Grid RowDefinitions="Auto,*">
<TextBlock Grid.Row="0" FontWeight="SemiBold" <TextBlock Grid.Row="0" FontWeight="SemiBold"
@ -886,14 +1083,22 @@
Margin="0,8,0,0" Margin="0,8,0,0"
ItemsSource="{Binding ActivityLog}" ItemsSource="{Binding ActivityLog}"
Background="{DynamicResource SurfaceBackgroundBrush}" Background="{DynamicResource SurfaceBackgroundBrush}"
BorderBrush="{DynamicResource SurfaceBorderBrush}" /> BorderBrush="Transparent"
BorderThickness="0"
SelectionMode="Single">
<ListBox.Styles>
<Style Selector="ListBoxItem">
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.Styles>
</ListBox>
</Grid> </Grid>
</Border> </Border>
<Border Grid.Row="2" <Border Grid.Row="2"
Grid.ColumnSpan="2" Grid.Column="0" Grid.ColumnSpan="2" Grid.Column="0"
Margin="0,10,0,0" Margin="0,16,0,0"
Padding="10" Padding="16"
Classes="surface" Classes="surface"
IsVisible="{Binding IsDownloadProgressVisible}"> IsVisible="{Binding IsDownloadProgressVisible}">
<StackPanel Spacing="8"> <StackPanel Spacing="8">
@ -933,13 +1138,13 @@
<Border Background="{DynamicResource ModalBackgroundBrush}" <Border Background="{DynamicResource ModalBackgroundBrush}"
BorderBrush="{DynamicResource ModalBorderBrush}" BorderBrush="{DynamicResource ModalBorderBrush}"
BorderThickness="1" BorderThickness="1"
CornerRadius="12" CornerRadius="16"
Padding="24" Padding="32"
Width="700" Width="700"
MaxHeight="750" MaxHeight="750"
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center" VerticalAlignment="Center"
BoxShadow="0 8 32 0 #26000000" BoxShadow="0 20 25 -5 #19000000, 0 10 10 -5 #0F000000"
PointerPressed="OnModalContentClicked"> PointerPressed="OnModalContentClicked">
<ScrollViewer DataContext="{Binding CreatorConfigEditor.ModalViewModel}"> <ScrollViewer DataContext="{Binding CreatorConfigEditor.ModalViewModel}">
<StackPanel Spacing="14" Margin="8,4,8,4" x:DataType="vm:CreatorConfigModalViewModel"> <StackPanel Spacing="14" Margin="8,4,8,4" x:DataType="vm:CreatorConfigModalViewModel">
@ -975,7 +1180,7 @@
<TextBox x:Name="PostFileNameFormatTextBox" <TextBox x:Name="PostFileNameFormatTextBox"
Classes="fileNameOverlayInput" Classes="fileNameOverlayInput"
Text="{Binding PostFileNameFormat}" Text="{Binding PostFileNameFormat}"
Watermark="Optional: override global post format" Watermark="Optional: override global free post format"
Padding="8,6" Padding="8,6"
CaretBrush="{DynamicResource TextPrimaryBrush}" /> CaretBrush="{DynamicResource TextPrimaryBrush}" />
<controls:FileNameFormatOverlayTextBlock IsHitTestVisible="False" <controls:FileNameFormatOverlayTextBlock IsHitTestVisible="False"
@ -996,7 +1201,7 @@
<Button Grid.Column="1" <Button Grid.Column="1"
Margin="8,0,0,0" Margin="8,0,0,0"
Classes="secondary" Classes="secondary"
Content="Insert" Content="Insert Variable"
Command="{Binding InsertPostVariableCommand}" /> Command="{Binding InsertPostVariableCommand}" />
</Grid> </Grid>
<TextBlock IsVisible="{Binding HasUnknownPostVariables}" <TextBlock IsVisible="{Binding HasUnknownPostVariables}"
@ -1037,7 +1242,7 @@
<Button Grid.Column="1" <Button Grid.Column="1"
Margin="8,0,0,0" Margin="8,0,0,0"
Classes="secondary" Classes="secondary"
Content="Insert" Content="Insert Variable"
Command="{Binding InsertPaidPostVariableCommand}" /> Command="{Binding InsertPaidPostVariableCommand}" />
</Grid> </Grid>
<TextBlock IsVisible="{Binding HasUnknownPaidPostVariables}" <TextBlock IsVisible="{Binding HasUnknownPaidPostVariables}"
@ -1057,7 +1262,7 @@
<TextBox x:Name="MessageFileNameFormatTextBox" <TextBox x:Name="MessageFileNameFormatTextBox"
Classes="fileNameOverlayInput" Classes="fileNameOverlayInput"
Text="{Binding MessageFileNameFormat}" Text="{Binding MessageFileNameFormat}"
Watermark="Optional: override global message format" Watermark="Optional: override global free message format"
Padding="8,6" Padding="8,6"
CaretBrush="{DynamicResource TextPrimaryBrush}" /> CaretBrush="{DynamicResource TextPrimaryBrush}" />
<controls:FileNameFormatOverlayTextBlock IsHitTestVisible="False" <controls:FileNameFormatOverlayTextBlock IsHitTestVisible="False"
@ -1078,7 +1283,7 @@
<Button Grid.Column="1" <Button Grid.Column="1"
Margin="8,0,0,0" Margin="8,0,0,0"
Classes="secondary" Classes="secondary"
Content="Insert" Content="Insert Variable"
Command="{Binding InsertMessageVariableCommand}" /> Command="{Binding InsertMessageVariableCommand}" />
</Grid> </Grid>
<TextBlock IsVisible="{Binding HasUnknownMessageVariables}" <TextBlock IsVisible="{Binding HasUnknownMessageVariables}"
@ -1119,7 +1324,7 @@
<Button Grid.Column="1" <Button Grid.Column="1"
Margin="8,0,0,0" Margin="8,0,0,0"
Classes="secondary" Classes="secondary"
Content="Insert" Content="Insert Variable"
Command="{Binding InsertPaidMessageVariableCommand}" /> Command="{Binding InsertPaidMessageVariableCommand}" />
</Grid> </Grid>
<TextBlock IsVisible="{Binding HasUnknownPaidMessageVariables}" <TextBlock IsVisible="{Binding HasUnknownPaidMessageVariables}"

View File

@ -140,7 +140,10 @@ public partial class MainWindow : Window
private void OnFaqClick(object? sender, RoutedEventArgs e) private void OnFaqClick(object? sender, RoutedEventArgs e)
{ {
FaqWindow faqWindow = new(); FaqWindow faqWindow = new()
{
WindowStartupLocation = WindowStartupLocation.CenterOwner
};
faqWindow.Show(this); faqWindow.Show(this);
} }
@ -151,7 +154,10 @@ public partial class MainWindow : Window
return; return;
} }
AboutWindow aboutWindow = new(vm.ProgramVersion, vm.FfmpegVersion, vm.FfprobeVersion); AboutWindow aboutWindow = new(vm.ProgramVersion, vm.FfmpegVersion, vm.FfprobeVersion)
{
WindowStartupLocation = WindowStartupLocation.CenterOwner
};
aboutWindow.Show(this); aboutWindow.Show(this);
} }