fix(ui): unify titlebar centerline vertical alignment and eliminate redundant brand container (v1.0.14)
This commit is contained in:
parent
8eb48ed854
commit
1f794e9e08
14 changed files with 2323 additions and 660 deletions
|
|
@ -3,30 +3,46 @@
|
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||
Title="진단"
|
||||
Width="640" Height="540"
|
||||
Width="680" Height="580"
|
||||
MinWidth="560" MinHeight="480"
|
||||
ExtendsContentIntoTitleBar="True"
|
||||
WindowBackdropType="Mica"
|
||||
WindowBackdropType="None"
|
||||
WindowCornerPreference="Round"
|
||||
WindowStartupLocation="CenterOwner">
|
||||
<Grid>
|
||||
<Window.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="FormatShiftTheme.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Window.Resources>
|
||||
|
||||
<Grid Background="{StaticResource FsBgBase}">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<ui:TitleBar Grid.Row="0" Title="진단"/>
|
||||
<ScrollViewer Grid.Row="1" Margin="32,8,32,16" VerticalScrollBarVisibility="Auto">
|
||||
<ui:TitleBar Grid.Row="0" Title="진단" Height="32"/>
|
||||
<ScrollViewer Grid.Row="1" Margin="24,8,24,16" VerticalScrollBarVisibility="Auto">
|
||||
<StackPanel x:Name="ItemsPanel"/>
|
||||
</ScrollViewer>
|
||||
<Border Grid.Row="2" Padding="32,16"
|
||||
Background="{DynamicResource LayerOnAcrylicFillColorDefaultBrush}"
|
||||
<Border Grid.Row="2" Padding="24,14"
|
||||
Background="{StaticResource FsBgPanel}"
|
||||
BorderThickness="0,1,0,0"
|
||||
BorderBrush="{DynamicResource ControlStrokeColorDefaultBrush}">
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
|
||||
<ui:Button Content="새로고침" Icon="{ui:SymbolIcon ArrowClockwise24}"
|
||||
Click="OnRefreshClick" Margin="0,0,8,0"/>
|
||||
<ui:Button Content="닫기" Click="OnCloseClick" Appearance="Primary"/>
|
||||
BorderBrush="{StaticResource FsBorderSubtle}">
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
|
||||
<Button Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Click="OnRefreshClick" Margin="0,0,8,0" Padding="14,6">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<ui:SymbolIcon Symbol="ArrowClockwise24" FontSize="13" VerticalAlignment="Center" Margin="0,0,6,0"/>
|
||||
<TextBlock Text="새로고침" VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
<Button Content="닫기" Style="{StaticResource FsPrimaryButtonStyle}"
|
||||
Click="OnCloseClick" Padding="18,6"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
</ui:FluentWindow>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ public partial class DiagnoseWindow : FluentWindow
|
|||
Loaded += async (_, _) => await PopulateAsync();
|
||||
}
|
||||
|
||||
private async Task PopulateAsync()
|
||||
public async Task PopulateAsync()
|
||||
{
|
||||
ItemsPanel.Children.Clear();
|
||||
|
||||
|
|
@ -36,83 +36,229 @@ public partial class DiagnoseWindow : FluentWindow
|
|||
}
|
||||
}
|
||||
|
||||
private static UIElement BuildSection(string title, IEnumerable<(string Key, string Value)> items)
|
||||
private Brush SafeBrush(string key, Brush fallback)
|
||||
{
|
||||
var card = new CardControl { Padding = new Thickness(16, 12, 16, 12), Margin = new Thickness(0, 0, 0, 12) };
|
||||
return (TryFindResource(key) as Brush)
|
||||
?? (Application.Current?.TryFindResource(key) as Brush)
|
||||
?? fallback;
|
||||
}
|
||||
|
||||
private UIElement BuildSection(string title, IEnumerable<(string Key, string Value)> items)
|
||||
{
|
||||
var card = new Border
|
||||
{
|
||||
Background = SafeBrush("FsBgSurface", new SolidColorBrush(Color.FromRgb(0x1B, 0x1D, 0x22))),
|
||||
BorderBrush = SafeBrush("FsBorderHairline", new SolidColorBrush(Color.FromRgb(0x33, 0x38, 0x42))),
|
||||
BorderThickness = new Thickness(1),
|
||||
CornerRadius = new CornerRadius(10),
|
||||
Padding = new Thickness(16, 14, 16, 14),
|
||||
Margin = new Thickness(0, 0, 0, 12),
|
||||
};
|
||||
|
||||
var stack = new StackPanel();
|
||||
stack.Children.Add(new TextBlock
|
||||
{
|
||||
Text = title,
|
||||
FontSize = 14,
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontSans"),
|
||||
FontSize = 13,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Margin = new Thickness(0, 0, 0, 8),
|
||||
Foreground = SafeBrush("FsTextPrimary", Brushes.White),
|
||||
Margin = new Thickness(0, 0, 0, 10),
|
||||
});
|
||||
|
||||
foreach (var (k, v) in items)
|
||||
{
|
||||
var row = new Grid { Margin = new Thickness(0, 2, 0, 2) };
|
||||
row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(120) });
|
||||
var row = new Grid { Margin = new Thickness(0, 3, 0, 3) };
|
||||
row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(90) });
|
||||
row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
|
||||
var keyText = new TextBlock { Text = k, FontSize = 12, Foreground = (Brush)Application.Current.FindResource("TextFillColorSecondaryBrush") };
|
||||
var valueText = new TextBlock { Text = v, FontSize = 12, TextTrimming = TextTrimming.CharacterEllipsis };
|
||||
|
||||
var keyText = new TextBlock
|
||||
{
|
||||
Text = k,
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontSans"),
|
||||
FontSize = 12,
|
||||
Foreground = SafeBrush("FsTextSecondary", new SolidColorBrush(Color.FromRgb(0x9B, 0xA1, 0xAB))),
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
};
|
||||
|
||||
var valueText = new TextBlock
|
||||
{
|
||||
Text = v,
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontMono"),
|
||||
FontSize = 12,
|
||||
Foreground = SafeBrush("FsTextPrimary", Brushes.White),
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
TextTrimming = TextTrimming.CharacterEllipsis,
|
||||
};
|
||||
|
||||
Grid.SetColumn(valueText, 1);
|
||||
row.Children.Add(keyText);
|
||||
row.Children.Add(valueText);
|
||||
stack.Children.Add(row);
|
||||
}
|
||||
card.Content = stack;
|
||||
|
||||
card.Child = stack;
|
||||
return card;
|
||||
}
|
||||
|
||||
private UIElement BuildProviderCard(IConverterProvider provider, ProviderAvailability availability)
|
||||
{
|
||||
var card = new CardControl { Padding = new Thickness(16, 12, 16, 12), Margin = new Thickness(0, 0, 0, 12) };
|
||||
var card = new Border
|
||||
{
|
||||
Background = SafeBrush("FsBgSurface", new SolidColorBrush(Color.FromRgb(0x1B, 0x1D, 0x22))),
|
||||
BorderBrush = SafeBrush("FsBorderHairline", new SolidColorBrush(Color.FromRgb(0x33, 0x38, 0x42))),
|
||||
BorderThickness = new Thickness(1),
|
||||
CornerRadius = new CornerRadius(10),
|
||||
Padding = new Thickness(16, 14, 16, 14),
|
||||
Margin = new Thickness(0, 0, 0, 12),
|
||||
};
|
||||
|
||||
var stack = new StackPanel();
|
||||
var header = new StackPanel { Orientation = Orientation.Horizontal };
|
||||
header.Children.Add(new TextBlock
|
||||
|
||||
// 1. 헤더 (공급자 명칭 + 상태 뱃지 우측 정렬)
|
||||
var headerGrid = new Grid { Margin = new Thickness(0, 0, 0, 10) };
|
||||
headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
|
||||
headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
|
||||
|
||||
var titleText = new TextBlock
|
||||
{
|
||||
Text = provider.Capability.DisplayName,
|
||||
FontSize = 14,
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontSans"),
|
||||
FontSize = 13,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
});
|
||||
var (badgeText, brushKey) = (provider.Capability.Status, availability.IsReady) switch
|
||||
{
|
||||
(ProviderStatus.ComingSoon, _) => ("개발 중", "BadgeMutedBrush"),
|
||||
(ProviderStatus.Disabled, _) => ("비활성", "BadgeMutedBrush"),
|
||||
(_, true) => ("준비됨", "BadgeReadyBrush"),
|
||||
_ => ("점검 필요", "BadgeWarnBrush"),
|
||||
Foreground = SafeBrush("FsTextPrimary", Brushes.White),
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
};
|
||||
header.Children.Add(new Border
|
||||
|
||||
var (badgeText, badgeBgKey) = (provider.Capability.Status, availability.IsReady) switch
|
||||
{
|
||||
Background = (Brush)Application.Current.FindResource(brushKey),
|
||||
(ProviderStatus.ComingSoon, _) => ("개발 중", "FsTextTertiary"),
|
||||
(ProviderStatus.Disabled, _) => ("비활성", "FsTextTertiary"),
|
||||
(_, true) => ("준비됨", "FsAccentGreen"),
|
||||
_ => ("점검 필요", "FsAccentAmber"),
|
||||
};
|
||||
|
||||
var badge = new Border
|
||||
{
|
||||
Background = SafeBrush(badgeBgKey, new SolidColorBrush(Color.FromRgb(0x10, 0xB9, 0x81))),
|
||||
CornerRadius = new CornerRadius(10),
|
||||
Padding = new Thickness(8, 2, 8, 2),
|
||||
Margin = new Thickness(8, 0, 0, 0),
|
||||
Child = new TextBlock { Text = badgeText, FontSize = 11, Foreground = Brushes.White },
|
||||
});
|
||||
stack.Children.Add(header);
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
Child = new TextBlock
|
||||
{
|
||||
Text = badgeText,
|
||||
FontSize = 11,
|
||||
FontWeight = FontWeights.Medium,
|
||||
Foreground = Brushes.White,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
HorizontalAlignment = HorizontalAlignment.Center,
|
||||
},
|
||||
};
|
||||
|
||||
stack.Children.Add(new TextBlock
|
||||
Grid.SetColumn(badge, 1);
|
||||
headerGrid.Children.Add(titleText);
|
||||
headerGrid.Children.Add(badge);
|
||||
stack.Children.Add(headerGrid);
|
||||
|
||||
// 2. 미세 구분선
|
||||
stack.Children.Add(new Border
|
||||
{
|
||||
Text = $"입력: {string.Join(", ", provider.Capability.InputExtensions)} → 출력: {string.Join(", ", provider.Capability.OutputExtensions)}",
|
||||
FontSize = 11,
|
||||
Foreground = (Brush)Application.Current.FindResource("TextFillColorTertiaryBrush"),
|
||||
Margin = new Thickness(0, 4, 0, 0),
|
||||
Height = 1,
|
||||
Background = SafeBrush("FsBorderSubtle", new SolidColorBrush(Color.FromRgb(0x24, 0x27, 0x30))),
|
||||
Margin = new Thickness(0, 0, 0, 8),
|
||||
});
|
||||
|
||||
// 3. 정형화된 입력/출력 격자 (Grid 컬럼 분리 정렬)
|
||||
var extGrid = new Grid();
|
||||
extGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(70) });
|
||||
extGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
|
||||
|
||||
extGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
|
||||
extGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
|
||||
|
||||
// 입력 형식 행
|
||||
var inputLabel = new TextBlock
|
||||
{
|
||||
Text = "입력 형식",
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontSans"),
|
||||
FontSize = 11,
|
||||
Foreground = SafeBrush("FsTextSecondary", new SolidColorBrush(Color.FromRgb(0x9B, 0xA1, 0xAB))),
|
||||
VerticalAlignment = VerticalAlignment.Top,
|
||||
Margin = new Thickness(0, 2, 0, 4),
|
||||
};
|
||||
var inputValue = new TextBlock
|
||||
{
|
||||
Text = string.Join(", ", provider.Capability.InputExtensions),
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontMono"),
|
||||
FontSize = 11,
|
||||
Foreground = SafeBrush("FsTextPrimary", Brushes.White),
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
LineHeight = 16,
|
||||
VerticalAlignment = VerticalAlignment.Top,
|
||||
Margin = new Thickness(0, 2, 0, 4),
|
||||
};
|
||||
Grid.SetRow(inputLabel, 0); Grid.SetColumn(inputLabel, 0);
|
||||
Grid.SetRow(inputValue, 0); Grid.SetColumn(inputValue, 1);
|
||||
extGrid.Children.Add(inputLabel);
|
||||
extGrid.Children.Add(inputValue);
|
||||
|
||||
// 출력 형식 행
|
||||
var outputLabel = new TextBlock
|
||||
{
|
||||
Text = "출력 형식",
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontSans"),
|
||||
FontSize = 11,
|
||||
Foreground = SafeBrush("FsTextSecondary", new SolidColorBrush(Color.FromRgb(0x9B, 0xA1, 0xAB))),
|
||||
VerticalAlignment = VerticalAlignment.Top,
|
||||
Margin = new Thickness(0, 2, 0, 4),
|
||||
};
|
||||
var outputValue = new TextBlock
|
||||
{
|
||||
Text = string.Join(", ", provider.Capability.OutputExtensions),
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontMono"),
|
||||
FontSize = 11,
|
||||
Foreground = SafeBrush("FsAccentBlue", new SolidColorBrush(Color.FromRgb(0x3B, 0x82, 0xF6))),
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
LineHeight = 16,
|
||||
VerticalAlignment = VerticalAlignment.Top,
|
||||
Margin = new Thickness(0, 2, 0, 4),
|
||||
};
|
||||
Grid.SetRow(outputLabel, 1); Grid.SetColumn(outputLabel, 0);
|
||||
Grid.SetRow(outputValue, 1); Grid.SetColumn(outputValue, 1);
|
||||
extGrid.Children.Add(outputLabel);
|
||||
extGrid.Children.Add(outputValue);
|
||||
|
||||
stack.Children.Add(extGrid);
|
||||
|
||||
// 4. 상태 안내 사유 (미비 시 경고 박스)
|
||||
if (!availability.IsReady && !string.IsNullOrEmpty(availability.Reason))
|
||||
{
|
||||
stack.Children.Add(new TextBlock
|
||||
var warnBox = new Border
|
||||
{
|
||||
Text = availability.Reason,
|
||||
FontSize = 11,
|
||||
Foreground = (Brush)Application.Current.FindResource("BadgeWarnBrush"),
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
Margin = new Thickness(0, 4, 0, 0),
|
||||
});
|
||||
Background = new SolidColorBrush(Color.FromArgb(0x1F, 0xF5, 0x9E, 0x0B)),
|
||||
BorderBrush = SafeBrush("FsAccentAmber", new SolidColorBrush(Color.FromRgb(0xF5, 0x9E, 0x0B))),
|
||||
BorderThickness = new Thickness(1),
|
||||
CornerRadius = new CornerRadius(6),
|
||||
Padding = new Thickness(10, 6, 10, 6),
|
||||
Margin = new Thickness(0, 8, 0, 0),
|
||||
Child = new TextBlock
|
||||
{
|
||||
Text = availability.Reason,
|
||||
FontFamily = (FontFamily?)TryFindResource("FsFontSans"),
|
||||
FontSize = 11,
|
||||
Foreground = SafeBrush("FsAccentAmber", new SolidColorBrush(Color.FromRgb(0xF5, 0x9E, 0x0B))),
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
},
|
||||
};
|
||||
stack.Children.Add(warnBox);
|
||||
}
|
||||
card.Content = stack;
|
||||
|
||||
card.Child = stack;
|
||||
return card;
|
||||
}
|
||||
|
||||
private async void OnRefreshClick(object sender, RoutedEventArgs e) => await PopulateAsync();
|
||||
private void OnCloseClick(object sender, RoutedEventArgs e) => Close();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,28 +1,43 @@
|
|||
<ResourceDictionary
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml">
|
||||
|
||||
<!-- Backgrounds -->
|
||||
<SolidColorBrush x:Key="FsBgBase" Color="#090A0C"/>
|
||||
<SolidColorBrush x:Key="FsBgPanel" Color="#131417"/>
|
||||
<SolidColorBrush x:Key="FsBgSurface" Color="#1C1E22"/>
|
||||
<SolidColorBrush x:Key="FsBgSurfaceHover" Color="#23252A"/>
|
||||
<SolidColorBrush x:Key="FsBgInput" Color="#0F1012"/>
|
||||
<!-- Windows 11 Flagship Acrylic & Neo Glass Backgrounds -->
|
||||
<SolidColorBrush x:Key="FsBgBase" Color="#D80A0C10"/>
|
||||
<SolidColorBrush x:Key="FsBgPanel" Color="#E211141D"/>
|
||||
<SolidColorBrush x:Key="FsBgSurface" Color="#171B26"/>
|
||||
<SolidColorBrush x:Key="FsBgSurfaceHover" Color="#222738"/>
|
||||
<SolidColorBrush x:Key="FsBgInput" Color="#0C0E14"/>
|
||||
|
||||
<!-- Neo Glass Rimlight Gradients -->
|
||||
<LinearGradientBrush x:Key="FsGlassBorderBrush" StartPoint="0,0" EndPoint="0,1">
|
||||
<GradientStop Color="#2EFFFFFF" Offset="0.0"/>
|
||||
<GradientStop Color="#0EFFFFFF" Offset="1.0"/>
|
||||
</LinearGradientBrush>
|
||||
|
||||
<LinearGradientBrush x:Key="FsGlassBorderBrushHover" StartPoint="0,0" EndPoint="0,1">
|
||||
<GradientStop Color="#6606B6D4" Offset="0.0"/>
|
||||
<GradientStop Color="#2206B6D4" Offset="1.0"/>
|
||||
</LinearGradientBrush>
|
||||
|
||||
<!-- Borders -->
|
||||
<SolidColorBrush x:Key="FsBorderSubtle" Color="#26282D"/>
|
||||
<SolidColorBrush x:Key="FsBorderStrong" Color="#3A3D45"/>
|
||||
<SolidColorBrush x:Key="FsBorderSubtle" Color="#232733"/>
|
||||
<SolidColorBrush x:Key="FsBorderStrong" Color="#3B4254"/>
|
||||
|
||||
<!-- Text -->
|
||||
<SolidColorBrush x:Key="FsTextPrimary" Color="#ECEEFA"/>
|
||||
<SolidColorBrush x:Key="FsTextSecondary" Color="#8B909A"/>
|
||||
<SolidColorBrush x:Key="FsTextTertiary" Color="#5D626C"/>
|
||||
<SolidColorBrush x:Key="FsTextPrimary" Color="#F8FAFC"/>
|
||||
<SolidColorBrush x:Key="FsTextSecondary" Color="#94A3B8"/>
|
||||
<SolidColorBrush x:Key="FsTextTertiary" Color="#64748B"/>
|
||||
|
||||
<!-- Accents -->
|
||||
<SolidColorBrush x:Key="FsAccentBlue" Color="#3B72FF"/>
|
||||
<SolidColorBrush x:Key="FsAccentGreen" Color="#10B981"/>
|
||||
<SolidColorBrush x:Key="FsAccentAmber" Color="#F59E0B"/>
|
||||
<SolidColorBrush x:Key="FsAccentRed" Color="#EF4444"/>
|
||||
<!-- Accents (Cybernetic Neon Cyan + Glowing Rims) -->
|
||||
<SolidColorBrush x:Key="FsAccentBlue" Color="#06B6D4"/>
|
||||
<SolidColorBrush x:Key="FsAccentCyan" Color="#06B6D4"/>
|
||||
<SolidColorBrush x:Key="FsAccentCyanHover" Color="#22D3EE"/>
|
||||
<SolidColorBrush x:Key="FsAccentCyanBg" Color="#083344"/>
|
||||
<SolidColorBrush x:Key="FsAccentGreen" Color="#10B981"/>
|
||||
<SolidColorBrush x:Key="FsAccentAmber" Color="#F59E0B"/>
|
||||
<SolidColorBrush x:Key="FsAccentRed" Color="#EF4444"/>
|
||||
|
||||
<!-- Format pills -->
|
||||
<SolidColorBrush x:Key="FsFmtPdf" Color="#E53E3E"/>
|
||||
|
|
@ -56,6 +71,27 @@
|
|||
<!-- 오디오 = 라이트 퍼플 (Seti audio=purple, 통념 오디오=보라); 기존 PNG/GIF보다 라이트 -->
|
||||
<SolidColorBrush x:Key="FsFmtAudio" Color="#B794F4"/>
|
||||
|
||||
<!-- 포맷 카테고리별 시그니처 뱃지 브러시 (designpaca Dark Instrument) -->
|
||||
<SolidColorBrush x:Key="FsBadgeImageBrush" Color="#06B6D4"/>
|
||||
<SolidColorBrush x:Key="FsBadgeImageBg" Color="#083344"/>
|
||||
<SolidColorBrush x:Key="FsBadgeDocBrush" Color="#10B981"/>
|
||||
<SolidColorBrush x:Key="FsBadgeDocBg" Color="#064E3B"/>
|
||||
<SolidColorBrush x:Key="FsBadgeVideoBrush" Color="#F59E0B"/>
|
||||
<SolidColorBrush x:Key="FsBadgeVideoBg" Color="#451A03"/>
|
||||
<SolidColorBrush x:Key="FsBadgeAudioBrush" Color="#A855F7"/>
|
||||
<SolidColorBrush x:Key="FsBadgeAudioBg" Color="#3B0764"/>
|
||||
<SolidColorBrush x:Key="FsBadgeArchiveBrush" Color="#EC4899"/>
|
||||
<SolidColorBrush x:Key="FsBadgeArchiveBg" Color="#500724"/>
|
||||
|
||||
<!-- Dark Instrument 정밀 계측기 랙마운트 카드 스타일 -->
|
||||
<Style x:Key="FsInstrumentCardStyle" TargetType="Border">
|
||||
<Setter Property="Background" Value="{StaticResource FsBgSurface}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource FsBorderHairline}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="CornerRadius" Value="8"/>
|
||||
<Setter Property="Padding" Value="12,10"/>
|
||||
</Style>
|
||||
|
||||
<!-- 손실 등급 토큰 (Radix dark; Container는 중립 회색 — 사용자 결정) -->
|
||||
<SolidColorBrush x:Key="FsLossLosslessDot" Color="#30A46C"/>
|
||||
<SolidColorBrush x:Key="FsLossLosslessText" Color="#3DD68C"/>
|
||||
|
|
@ -181,39 +217,46 @@
|
|||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Tab pill style -->
|
||||
<!-- Tab pill style (Refined Segmented Control) -->
|
||||
<Style x:Key="FsTabPillStyle" TargetType="ToggleButton">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource FsTextSecondary}"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="Padding" Value="14,6"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
<Setter Property="Padding" Value="12,5"/>
|
||||
<Setter Property="FontSize" Value="12"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ToggleButton">
|
||||
<Border x:Name="PART_Bd" CornerRadius="20"
|
||||
<Border x:Name="PART_Bd" CornerRadius="6"
|
||||
Padding="{TemplateBinding Padding}"
|
||||
Background="{TemplateBinding Background}">
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}">
|
||||
<ContentPresenter HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
TextElement.Foreground="{TemplateBinding Foreground}"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsChecked" Value="True">
|
||||
<Setter TargetName="PART_Bd" Property="Background" Value="{StaticResource FsAccentBlue}"/>
|
||||
<Setter Property="Foreground" Value="White"/>
|
||||
<Setter TargetName="PART_Bd" Property="Background" Value="#23262E"/>
|
||||
<Setter TargetName="PART_Bd" Property="BorderBrush" Value="{StaticResource FsBorderHairline}"/>
|
||||
<Setter TargetName="PART_Bd" Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource FsTextPrimary}"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="PART_Bd" Property="Background" Value="{StaticResource FsBgSurfaceHover}"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource FsTextPrimary}"/>
|
||||
</Trigger>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="IsChecked" Value="True"/>
|
||||
<Condition Property="IsMouseOver" Value="True"/>
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter TargetName="PART_Bd" Property="Background" Value="{StaticResource FsAccentBlue}"/>
|
||||
<Setter TargetName="PART_Bd" Property="Background" Value="#2A2E38"/>
|
||||
<Setter TargetName="PART_Bd" Property="BorderBrush" Value="{StaticResource FsBorderSubtle}"/>
|
||||
</MultiTrigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
|
|
@ -250,8 +293,8 @@
|
|||
|
||||
<!-- Primary button (Processing Queue / Run) -->
|
||||
<Style x:Key="FsPrimaryButtonStyle" TargetType="Button">
|
||||
<Setter Property="Background" Value="{StaticResource FsAccentBlue}"/>
|
||||
<Setter Property="Foreground" Value="White"/>
|
||||
<Setter Property="Background" Value="{StaticResource FsAccentCyan}"/>
|
||||
<Setter Property="Foreground" Value="#090A0C"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="Padding" Value="12"/>
|
||||
<Setter Property="FontSize" Value="13"/>
|
||||
|
|
@ -272,11 +315,11 @@
|
|||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter TargetName="PART_Bd" Property="Opacity" Value="0.5"/>
|
||||
<Setter TargetName="PART_Bd" Property="Opacity" Value="0.4"/>
|
||||
<Setter Property="Cursor" Value="Arrow"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="PART_Bd" Property="Background" Value="#2D5DDB"/>
|
||||
<Setter TargetName="PART_Bd" Property="Background" Value="{StaticResource FsAccentCyanHover}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
|
|
@ -318,11 +361,11 @@
|
|||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Tab badge -->
|
||||
<!-- Tab badge (Refined micro badge) -->
|
||||
<Style x:Key="FsTabBadgeStyle" TargetType="Border">
|
||||
<Setter Property="CornerRadius" Value="10"/>
|
||||
<Setter Property="Padding" Value="6,1"/>
|
||||
<Setter Property="Background" Value="{StaticResource FsBgSurface}"/>
|
||||
<Setter Property="CornerRadius" Value="4"/>
|
||||
<Setter Property="Padding" Value="5,1"/>
|
||||
<Setter Property="Background" Value="#14FFFFFF"/>
|
||||
</Style>
|
||||
|
||||
<!-- Path input box -->
|
||||
|
|
@ -406,21 +449,23 @@
|
|||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
</Style>
|
||||
|
||||
<!-- 큐/이력 row 공통 컨테이너: 투명 → hover 시 surface, 부드러운 fade -->
|
||||
<!-- 큐/이력 row 글래스 카드: Neo Glass + 림라이트 보더 + 부드러운 호버 글로우 -->
|
||||
<Style x:Key="FsListRowStyle" TargetType="Border">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="CornerRadius" Value="8"/>
|
||||
<Setter Property="Background" Value="{StaticResource FsBgSurface}"/>
|
||||
<Setter Property="CornerRadius" Value="10"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="BorderBrush" Value="Transparent"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource FsGlassBorderBrush}"/>
|
||||
<Setter Property="Margin" Value="0,0,0,8"/>
|
||||
<Setter Property="Padding" Value="12,10"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Background" Value="{StaticResource FsBgSurfaceHover}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource FsBorderHairline}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource FsGlassBorderBrushHover}"/>
|
||||
<Trigger.EnterActions>
|
||||
<BeginStoryboard>
|
||||
<Storyboard>
|
||||
<DoubleAnimation Storyboard.TargetProperty="Opacity"
|
||||
From="0.85" To="1" Duration="0:0:0.12"/>
|
||||
From="0.88" To="1" Duration="0:0:0.12"/>
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</Trigger.EnterActions>
|
||||
|
|
@ -428,7 +473,7 @@
|
|||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<!-- 32x32 아이콘 버튼(설정 ⚙, 삭제 ×): 투명 → hover surface, radius 6 -->
|
||||
<!-- 32x32 아이콘 버튼(설정, 삭제): 투명 → hover surface, radius 6 -->
|
||||
<Style x:Key="FsIconButtonStyle" TargetType="Button">
|
||||
<Setter Property="Width" Value="32"/>
|
||||
<Setter Property="Height" Value="32"/>
|
||||
|
|
@ -464,4 +509,164 @@
|
|||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Neo Glass Card Shell (Windows 11 Fluent 2 Acrylic, radius 12, 림라이트 보더) -->
|
||||
<Style x:Key="FsCardStyle" TargetType="Border">
|
||||
<Setter Property="Background" Value="{StaticResource FsBgSurface}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource FsGlassBorderBrush}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="CornerRadius" Value="12"/>
|
||||
<Setter Property="Padding" Value="16"/>
|
||||
<Setter Property="Margin" Value="0,0,0,16"/>
|
||||
</Style>
|
||||
|
||||
<!-- 실시간 기술 스펙 칩 (Live Spec Chip) 캡슐 스타일 -->
|
||||
<Style x:Key="FsSpecChipStyle" TargetType="Border">
|
||||
<Setter Property="Background" Value="{StaticResource FsAccentCyanBg}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource FsAccentCyan}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="CornerRadius" Value="6"/>
|
||||
<Setter Property="Padding" Value="8,3"/>
|
||||
<Setter Property="Margin" Value="0,0,6,6"/>
|
||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
</Style>
|
||||
|
||||
<!-- Standard Toolbar Button (Height 32px, unified icon+text vertical alignment) -->
|
||||
<Style x:Key="FsToolbarButtonStyle" TargetType="Button">
|
||||
<Setter Property="Background" Value="{StaticResource FsBgSurface}"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource FsTextPrimary}"/>
|
||||
<Setter Property="BorderBrush" Value="{StaticResource FsGlassBorderBrush}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Height" Value="32"/>
|
||||
<Setter Property="Padding" Value="12,0"/>
|
||||
<Setter Property="FontSize" Value="12"/>
|
||||
<Setter Property="FontWeight" Value="Medium"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="PART_Bd"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}"
|
||||
CornerRadius="8"
|
||||
Padding="{TemplateBinding Padding}">
|
||||
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
TextElement.Foreground="{TemplateBinding Foreground}"
|
||||
TextElement.FontSize="{TemplateBinding FontSize}"
|
||||
TextElement.FontWeight="{TemplateBinding FontWeight}"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="PART_Bd" Property="Background" Value="{StaticResource FsBgSurfaceHover}"/>
|
||||
<Setter TargetName="PART_Bd" Property="BorderBrush" Value="{StaticResource FsGlassBorderBrushHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter TargetName="PART_Bd" Property="Opacity" Value="0.4"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Windows 11 Fluent 2 Unified TitleBar Style (Zero Vertical Misalignment & True Caption Centering) -->
|
||||
<Style TargetType="{x:Type ui:TitleBar}">
|
||||
<Setter Property="Height" Value="42"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource FsTextPrimary}"/>
|
||||
<Setter Property="FontFamily" Value="{StaticResource FsFontSans}"/>
|
||||
<Setter Property="ButtonsForeground" Value="#D0D5DD"/>
|
||||
<Setter Property="ButtonsBackground" Value="#1FFFFFFF"/>
|
||||
<Setter Property="VerticalAlignment" Value="Stretch"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Stretch"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ui:TitleBar}">
|
||||
<Grid Background="{TemplateBinding Background}" Name="PART_MainGrid"
|
||||
HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
|
||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Left Icon Area -->
|
||||
<Grid Name="TitleGrid" Margin="{TemplateBinding Padding}" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0">
|
||||
<ContentPresenter Content="{TemplateBinding Icon}" Name="PART_Icon" Height="18" Width="18"
|
||||
VerticalAlignment="Center" Focusable="False"
|
||||
RenderOptions.BitmapScalingMode="HighQuality"
|
||||
AutomationProperties.AutomationId="TitleBarIcon"/>
|
||||
</Grid>
|
||||
|
||||
<Grid Grid.Column="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Header (Tabs + Telemetry) -->
|
||||
<ContentPresenter Content="{TemplateBinding Header}" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>
|
||||
|
||||
<!-- CenterContent (Wide Native Drag Area) -->
|
||||
<ContentPresenter Content="{TemplateBinding CenterContent}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="Center" Grid.Column="1"/>
|
||||
|
||||
<!-- TrailingContent (Action Buttons) -->
|
||||
<ContentPresenter Content="{TemplateBinding TrailingContent}" HorizontalAlignment="Right" VerticalAlignment="Center" Grid.Column="2"/>
|
||||
|
||||
<!-- Window Control Buttons: Stretch full height, icons centered on exact same centerline -->
|
||||
<Grid HorizontalAlignment="Right" VerticalAlignment="Stretch" Grid.Column="3">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<ui:TitleBarButton ButtonType="Help" Name="PART_HelpButton" AutomationProperties.AutomationId="TitleBarHelpButton" Grid.Column="0" VerticalAlignment="Stretch" Height="Auto" Width="46"/>
|
||||
<ui:TitleBarButton ButtonType="Minimize" Name="PART_MinimizeButton" AutomationProperties.AutomationId="TitleBarMinimizeButton" Grid.Column="1" VerticalAlignment="Stretch" Height="Auto" Width="46"/>
|
||||
<ui:TitleBarButton ButtonType="Maximize" Name="PART_MaximizeButton" IsHitTestVisible="True" AutomationProperties.AutomationId="TitleBarMaximizeButton" Grid.Column="2" VerticalAlignment="Stretch" Height="Auto" Width="46"/>
|
||||
<ui:TitleBarButton ButtonType="Close" MouseOverButtonsForeground="#FFFFFFFF" MouseOverBackground="#E81123" Name="PART_CloseButton" AutomationProperties.AutomationId="TitleBarCloseButton" Grid.Column="4" VerticalAlignment="Stretch" Height="Auto" Width="46"/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="Icon" Value="{x:Null}"/>
|
||||
<Condition Property="Title" Value="{x:Null}"/>
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter TargetName="TitleGrid" Property="Visibility" Value="Collapsed"/>
|
||||
</MultiTrigger>
|
||||
<Trigger Property="Icon" Value="{x:Null}">
|
||||
<Setter TargetName="PART_Icon" Property="Visibility" Value="Collapsed"/>
|
||||
</Trigger>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="ShowMaximize" Value="True"/>
|
||||
<Condition Property="IsMaximized" Value="True"/>
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter TargetName="PART_MaximizeButton" Property="ButtonType" Value="Restore"/>
|
||||
</MultiTrigger>
|
||||
<Trigger Property="ShowHelp" Value="False">
|
||||
<Setter TargetName="PART_HelpButton" Property="Visibility" Value="Collapsed"/>
|
||||
</Trigger>
|
||||
<Trigger Property="ShowMinimize" Value="False">
|
||||
<Setter TargetName="PART_MinimizeButton" Property="Visibility" Value="Collapsed"/>
|
||||
</Trigger>
|
||||
<Trigger Property="ShowMaximize" Value="False">
|
||||
<Setter TargetName="PART_MaximizeButton" Property="Visibility" Value="Collapsed"/>
|
||||
</Trigger>
|
||||
<Trigger Property="ShowClose" Value="False">
|
||||
<Setter TargetName="PART_CloseButton" Property="Visibility" Value="Collapsed"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
</ResourceDictionary>
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -70,6 +70,24 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
public ICommand BatchSelectAllCommand { get; }
|
||||
public ICommand BatchRemoveSelectedCommand { get; }
|
||||
public ICommand BatchClearCompletedCommand { get; }
|
||||
public ICommand ToggleInspectorCommand { get; }
|
||||
|
||||
private bool _isInspectorVisible = true;
|
||||
public bool IsInspectorVisible
|
||||
{
|
||||
get => _isInspectorVisible;
|
||||
set
|
||||
{
|
||||
if (_isInspectorVisible != value)
|
||||
{
|
||||
_isInspectorVisible = value;
|
||||
if (InspectorColumn != null)
|
||||
{
|
||||
InspectorColumn.Width = _isInspectorVisible ? new GridLength(380) : new GridLength(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string _searchText = "";
|
||||
public string SearchText
|
||||
|
|
@ -124,6 +142,7 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
BatchSelectAllCommand = new RelayCommand(p => BatchSelectAll(p));
|
||||
BatchRemoveSelectedCommand = new RelayCommand(_ => BatchRemoveSelected());
|
||||
BatchClearCompletedCommand = new RelayCommand(_ => BatchClearCompleted());
|
||||
ToggleInspectorCommand = new RelayCommand(_ => ToggleInspector());
|
||||
RemoveQueueItemCommand = new RelayCommand(p => RemoveQueueItem(p as QueueItem));
|
||||
OpenFolderCommand = new RelayCommand(p => OpenFolderForPath(p as string));
|
||||
TabCommand = new RelayCommand(p => ShowTab(p as string ?? "Past"));
|
||||
|
|
@ -138,6 +157,11 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
|
||||
InitializeComponent();
|
||||
|
||||
if (SmartPresetCombo is not null)
|
||||
{
|
||||
SmartPresetCombo.SelectionChanged += OnSmartPresetChanged;
|
||||
}
|
||||
|
||||
// ActiveQueueList/PastResultsList의 ItemsSource는 XAML이 ActiveQueue/PastResults에 바인딩(선언적).
|
||||
|
||||
InitializeOutputFormats();
|
||||
|
|
@ -220,6 +244,11 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
UpdatePastResultsVisibility();
|
||||
}
|
||||
|
||||
public void ToggleInspector()
|
||||
{
|
||||
IsInspectorVisible = !IsInspectorVisible;
|
||||
}
|
||||
|
||||
// ============== Drag & Drop ==============
|
||||
|
||||
private void HandleDragOver(DragEventArgs? e)
|
||||
|
|
@ -317,12 +346,12 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
var count = _activeQueue.Count;
|
||||
if (_cts is not null)
|
||||
{
|
||||
ProcessQueueButton.Content = $"Processing… ({count} files)";
|
||||
ProcessQueueButton.Content = $"변환 처리 중… ({count}개 파일)";
|
||||
ProcessQueueButton.IsEnabled = false;
|
||||
}
|
||||
else if (count == 0)
|
||||
{
|
||||
ProcessQueueButton.Content = "Idle — drop files to begin";
|
||||
ProcessQueueButton.Content = "대기 중 — 파일을 드래그하여 추가하세요";
|
||||
ProcessQueueButton.IsEnabled = false;
|
||||
}
|
||||
else if (string.IsNullOrEmpty(SelectedOutputExtension))
|
||||
|
|
@ -332,7 +361,7 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
}
|
||||
else
|
||||
{
|
||||
ProcessQueueButton.Content = $"Process Queue ({count})";
|
||||
ProcessQueueButton.Content = $"대기열 일괄 변환 시작 ({count}개) [Ctrl + Enter]";
|
||||
ProcessQueueButton.IsEnabled = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -577,6 +606,107 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
}
|
||||
}
|
||||
|
||||
private IReadOnlyList<FormatPreset> _currentFormatPresets = Array.Empty<FormatPreset>();
|
||||
private bool _suppressPresetChanged;
|
||||
|
||||
private void UpdateSmartPresetsForFormat(string? ext)
|
||||
{
|
||||
if (SmartPresetCombo is null) return;
|
||||
|
||||
_currentFormatPresets = FormatPresetEngine.GetPresetsForExtension(ext);
|
||||
_suppressPresetChanged = true;
|
||||
try
|
||||
{
|
||||
SmartPresetCombo.Items.Clear();
|
||||
foreach (var preset in _currentFormatPresets)
|
||||
{
|
||||
SmartPresetCombo.Items.Add(new ComboBoxItem
|
||||
{
|
||||
Content = preset.Title,
|
||||
Tag = preset.Id,
|
||||
ToolTip = preset.Description,
|
||||
});
|
||||
}
|
||||
if (SmartPresetCombo.Items.Count > 0)
|
||||
{
|
||||
SmartPresetCombo.SelectedIndex = 0;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_suppressPresetChanged = false;
|
||||
}
|
||||
|
||||
ApplySelectedSmartPreset();
|
||||
}
|
||||
|
||||
private void OnSmartPresetChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (_suppressPresetChanged) return;
|
||||
ApplySelectedSmartPreset();
|
||||
}
|
||||
|
||||
private void ApplySelectedSmartPreset()
|
||||
{
|
||||
if (SmartPresetCombo is null || SmartPresetCombo.SelectedIndex < 0) return;
|
||||
if (SmartPresetCombo.SelectedIndex >= _currentFormatPresets.Count) return;
|
||||
|
||||
var preset = _currentFormatPresets[SmartPresetCombo.SelectedIndex];
|
||||
preset.Apply(_options);
|
||||
|
||||
if (SmartPresetDescriptionText is not null)
|
||||
{
|
||||
SmartPresetDescriptionText.Text = preset.Description;
|
||||
}
|
||||
|
||||
if (SmartPresetChipsPanel is not null)
|
||||
{
|
||||
SmartPresetChipsPanel.Children.Clear();
|
||||
var chipStyle = TryFindResource("FsSpecChipStyle") as Style;
|
||||
var monoFont = TryFindResource("FsFontMono") as FontFamily;
|
||||
var cyanBrush = TryFindResource("FsAccentCyan") as Brush ?? Brushes.Cyan;
|
||||
|
||||
foreach (var chip in preset.SpecChips)
|
||||
{
|
||||
var border = new Border();
|
||||
if (chipStyle is not null)
|
||||
{
|
||||
border.Style = chipStyle;
|
||||
}
|
||||
else
|
||||
{
|
||||
border.CornerRadius = new CornerRadius(6);
|
||||
border.Padding = new Thickness(8, 3, 8, 3);
|
||||
border.Margin = new Thickness(0, 0, 6, 6);
|
||||
}
|
||||
|
||||
var tb = new TextBlock
|
||||
{
|
||||
Text = chip,
|
||||
FontSize = 11,
|
||||
Foreground = cyanBrush,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
};
|
||||
if (monoFont is not null)
|
||||
{
|
||||
tb.FontFamily = monoFont;
|
||||
}
|
||||
|
||||
border.Child = tb;
|
||||
SmartPresetChipsPanel.Children.Add(border);
|
||||
}
|
||||
}
|
||||
|
||||
if (QualitySlider is not null)
|
||||
{
|
||||
QualitySlider.Value = _options.Quality;
|
||||
}
|
||||
if (QualityValueText is not null)
|
||||
{
|
||||
QualityValueText.Text = _options.Quality.ToString(CultureInfo.InvariantCulture) + "%";
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyFilterCategory(string? categoryName)
|
||||
{
|
||||
if (Enum.TryParse<FilterCategory>(categoryName, true, out var cat))
|
||||
|
|
@ -1189,6 +1319,7 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
UpdateOutputDestHint(keepExt);
|
||||
UpdateCombineState(keepExt);
|
||||
UpdateProcessQueueButton();
|
||||
UpdateSmartPresetsForFormat(keepExt);
|
||||
|
||||
if (OutputFormatHint is not null)
|
||||
{
|
||||
|
|
@ -1233,6 +1364,7 @@ public partial class MainWindow : Wpf.Ui.Controls.FluentWindow
|
|||
UpdateOutputFormatBadge(ext);
|
||||
UpdateQualityPanelForFormat(ext);
|
||||
UpdateOutputDestHint(ext);
|
||||
UpdateSmartPresetsForFormat(ext);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue