1247 lines
100 KiB
XML
1247 lines
100 KiB
XML
<ui:FluentWindow x:Class="Everything2Everything.App.Views.MainWindow"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
|
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
|
|
Title="FormatShift Utility"
|
|
Icon="pack://application:,,,/Everything2Everything;component/Assets/app-icon.png"
|
|
Width="1280" Height="960"
|
|
MinWidth="1080" MinHeight="640"
|
|
ExtendsContentIntoTitleBar="True"
|
|
WindowBackdropType="Mica"
|
|
WindowCornerPreference="Round"
|
|
WindowStartupLocation="CenterScreen"
|
|
AllowDrop="True"
|
|
TextOptions.TextFormattingMode="Display"
|
|
UseLayoutRounding="True">
|
|
<Window.Resources>
|
|
<ResourceDictionary>
|
|
<ResourceDictionary.MergedDictionaries>
|
|
<ui:ControlsDictionary/>
|
|
<ResourceDictionary Source="FormatShiftTheme.xaml"/>
|
|
</ResourceDictionary.MergedDictionaries>
|
|
</ResourceDictionary>
|
|
</Window.Resources>
|
|
|
|
<Window.InputBindings>
|
|
<KeyBinding Key="O" Modifiers="Ctrl" Command="{Binding AddFilesCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
<KeyBinding Key="Enter" Modifiers="Ctrl" Command="{Binding ProcessQueueCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
<KeyBinding Key="Escape" Command="{Binding CloseCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
<KeyBinding Key="F5" Command="{Binding RefreshCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
</Window.InputBindings>
|
|
|
|
<i:Interaction.Triggers>
|
|
<i:EventTrigger EventName="DragOver">
|
|
<i:InvokeCommandAction Command="{Binding DragOverCommand, RelativeSource={RelativeSource AncestorType=Window}}" PassEventArgsToCommand="True"/>
|
|
</i:EventTrigger>
|
|
<i:EventTrigger EventName="DragLeave">
|
|
<i:InvokeCommandAction Command="{Binding DragLeaveCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
</i:EventTrigger>
|
|
<i:EventTrigger EventName="Drop">
|
|
<i:InvokeCommandAction Command="{Binding DropCommand, RelativeSource={RelativeSource AncestorType=Window}}" PassEventArgsToCommand="True"/>
|
|
</i:EventTrigger>
|
|
</i:Interaction.Triggers>
|
|
|
|
<Grid Background="{StaticResource FsBgBase}">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="42"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- ============== UNIFIED TOP BAR (Row 0: 42px) ============== -->
|
|
<ui:TitleBar x:Name="AppTitleBar" Title="" Height="42" Grid.Row="0"
|
|
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
|
|
ShowMaximize="True" ShowMinimize="True">
|
|
|
|
<!-- A. TitleBar.Header: Logo Mark + Segmented Tabs + Engine Telemetry Badge -->
|
|
<ui:TitleBar.Header>
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<!-- Crisp Brand Logo Mark (No redundant text or clunky panel box) -->
|
|
<Image Width="18" Height="18" Margin="14,0,12,0" VerticalAlignment="Center"
|
|
RenderOptions.BitmapScalingMode="HighQuality"
|
|
Source="pack://application:,,,/Everything2Everything;component/Assets/logo-mark.png"/>
|
|
|
|
<!-- Segmented Tabs (Active Queue / Past Results) -->
|
|
<Border VerticalAlignment="Center"
|
|
Background="{StaticResource FsBgInput}"
|
|
BorderBrush="{StaticResource FsBorderHairline}"
|
|
BorderThickness="1" CornerRadius="6" Padding="2">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ToggleButton x:Name="TabActiveBtn"
|
|
Style="{StaticResource FsTabPillStyle}"
|
|
Command="{Binding TabCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Active">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<TextBlock Text="Active Queue" VerticalAlignment="Center"/>
|
|
<Border Margin="6,0,0,0" Style="{StaticResource FsTabBadgeStyle}" VerticalAlignment="Center">
|
|
<TextBlock x:Name="TabActiveBadge" Text="0"
|
|
FontSize="10" FontWeight="SemiBold"
|
|
VerticalAlignment="Center"
|
|
Foreground="{StaticResource FsTextTertiary}"/>
|
|
</Border>
|
|
</StackPanel>
|
|
</ToggleButton>
|
|
<ToggleButton x:Name="TabPastBtn" Margin="2,0,0,0"
|
|
IsChecked="True"
|
|
Style="{StaticResource FsTabPillStyle}"
|
|
Command="{Binding TabCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Past">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<TextBlock Text="Past Results" VerticalAlignment="Center"/>
|
|
<Border Margin="6,0,0,0" Style="{StaticResource FsTabBadgeStyle}" VerticalAlignment="Center">
|
|
<TextBlock x:Name="TabPastBadge" Text="0"
|
|
FontSize="10" FontWeight="SemiBold"
|
|
VerticalAlignment="Center"
|
|
Foreground="{StaticResource FsTextTertiary}"/>
|
|
</Border>
|
|
</StackPanel>
|
|
</ToggleButton>
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<!-- Live Engine Status Telemetry Badge (Compact, Vertically Centered) -->
|
|
<Border x:Name="EngineTelemetryBadge"
|
|
Margin="10,0,0,0"
|
|
VerticalAlignment="Center"
|
|
Background="#08FFFFFF"
|
|
BorderBrush="{StaticResource FsBorderHairline}"
|
|
BorderThickness="1" CornerRadius="6" Padding="8,4">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<Ellipse Width="6" Height="6" Fill="{StaticResource FsAccentGreen}" VerticalAlignment="Center" Margin="0,0,6,0"/>
|
|
<TextBlock Text="엔진 활성" FontFamily="{StaticResource FsFontSans}" FontSize="11" FontWeight="SemiBold" Foreground="{StaticResource FsTextPrimary}" VerticalAlignment="Center"/>
|
|
<TextBlock Text=" · 12개 가동" FontFamily="{StaticResource FsFontSans}" FontSize="11" Foreground="{StaticResource FsTextSecondary}" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Border>
|
|
</StackPanel>
|
|
</ui:TitleBar.Header>
|
|
|
|
<!-- B. TitleBar.TrailingContent: Compact, Non-overlapping Action Buttons -->
|
|
<ui:TitleBar.TrailingContent>
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="0,0,8,0">
|
|
<Button Style="{StaticResource FsIconButtonStyle}"
|
|
Command="{Binding SettingsCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="설정">
|
|
<ui:SymbolIcon Symbol="Settings24" FontSize="14" VerticalAlignment="Center"/>
|
|
</Button>
|
|
<Button Style="{StaticResource FsIconButtonStyle}" Margin="2,0,0,0"
|
|
Command="{Binding RegisterCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="컨텍스트 메뉴 등록">
|
|
<ui:SymbolIcon Symbol="AppsAddIn24" FontSize="14" VerticalAlignment="Center"/>
|
|
</Button>
|
|
<Button Style="{StaticResource FsIconButtonStyle}" Margin="2,0,0,0"
|
|
Command="{Binding DiagnoseCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="진단 도구">
|
|
<ui:SymbolIcon Symbol="Stethoscope24" FontSize="14" VerticalAlignment="Center"/>
|
|
</Button>
|
|
<Button Style="{StaticResource FsIconButtonStyle}" Margin="2,0,0,0"
|
|
Command="{Binding ExportLogCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="로그 내보내기">
|
|
<ui:SymbolIcon Symbol="ArrowDownload24" FontSize="14" VerticalAlignment="Center"/>
|
|
</Button>
|
|
<Button x:Name="ClearAllButton" Margin="6,0,0,0"
|
|
Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Padding="8,0" Height="26" VerticalAlignment="Center"
|
|
Command="{Binding ClearAllCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="목록 비우기">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Delete24" FontSize="12" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
|
<TextBlock Text="비우기" FontSize="11" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
</StackPanel>
|
|
</ui:TitleBar.TrailingContent>
|
|
</ui:TitleBar>
|
|
|
|
<!-- ============== APP BODY (Row 1: Height *) ============== -->
|
|
<Grid Grid.Row="1">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="320"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<!-- ============== SIDEBAR ============== -->
|
|
<Border Grid.Column="0"
|
|
Background="{StaticResource FsBgPanel}"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="0,0,1,0">
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="*"/>
|
|
<RowDefinition Height="Auto"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- Sidebar content -->
|
|
<ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Auto" Padding="16,16,16,16">
|
|
<StackPanel>
|
|
<!-- Smart Conversion Deck: Output Format + Dynamic Presets + Live Spec Chips + Quality -->
|
|
<Border Style="{StaticResource FsCardStyle}">
|
|
<StackPanel>
|
|
<Grid Margin="0,0,0,12">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
<StackPanel Grid.Column="0" VerticalAlignment="Center">
|
|
<TextBlock Text="스마트 변환 덱" Style="{StaticResource FsLabelStyle}" Foreground="{StaticResource FsAccentCyan}"/>
|
|
<TextBlock Text="출력 포맷 및 실시간 맞춤 프리셋" Style="{StaticResource FsCaptionStyle}" Margin="0,2,0,0"/>
|
|
</StackPanel>
|
|
<ui:SymbolIcon Grid.Column="1" Symbol="Sparkle24" FontSize="15" Foreground="{StaticResource FsAccentCyan}" VerticalAlignment="Center"/>
|
|
</Grid>
|
|
|
|
<!-- 1. Output Format Selection -->
|
|
<TextBlock Text="출력 형식" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,6" FontWeight="SemiBold"/>
|
|
<Grid Margin="0,0,0,10">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
<Border x:Name="OutputFormatBadge" Grid.Column="0"
|
|
Width="38" Height="30" CornerRadius="6"
|
|
Background="{StaticResource FsFmtJpg}"
|
|
VerticalAlignment="Center">
|
|
<TextBlock x:Name="OutputFormatBadgeText"
|
|
Text="JPG" Foreground="White" FontSize="10"
|
|
FontWeight="Bold"
|
|
HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
|
</Border>
|
|
<ComboBox x:Name="OutputFormatCombo" Grid.Column="1"
|
|
Margin="8,0,0,0" VerticalAlignment="Center">
|
|
<i:Interaction.Triggers>
|
|
<i:EventTrigger EventName="SelectionChanged">
|
|
<i:InvokeCommandAction Command="{Binding OutputFormatChangedCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
</i:EventTrigger>
|
|
</i:Interaction.Triggers>
|
|
</ComboBox>
|
|
</Grid>
|
|
<TextBlock x:Name="OutputFormatHint" Margin="0,0,0,12"
|
|
Style="{StaticResource FsCaptionStyle}"
|
|
Text="모든 입력에서 변환 가능한 형식이 표시됩니다"/>
|
|
|
|
<Border Height="1" Background="{StaticResource FsBorderSubtle}" Margin="0,0,0,12"/>
|
|
|
|
<!-- 2. Dynamic Smart Preset Selector -->
|
|
<TextBlock Text="형식 맞춤 스마트 프리셋" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,6" FontWeight="SemiBold"/>
|
|
<ComboBox x:Name="SmartPresetCombo" Margin="0,0,0,6" VerticalAlignment="Center"/>
|
|
<TextBlock x:Name="SmartPresetDescriptionText" Style="{StaticResource FsCaptionStyle}"
|
|
Text="선택한 형식에 최적화된 프리셋입니다."
|
|
TextWrapping="Wrap" Margin="0,0,0,10" Foreground="{StaticResource FsTextSecondary}"/>
|
|
|
|
<!-- 3. Live Spec Chips Container -->
|
|
<WrapPanel x:Name="SmartPresetChipsPanel" Margin="0,0,0,10"/>
|
|
|
|
<Border Height="1" Background="{StaticResource FsBorderSubtle}" Margin="0,0,0,12"/>
|
|
|
|
<!-- 4. Quality & Combine Settings -->
|
|
<CheckBox x:Name="CombineToSingleCheck"
|
|
Margin="0,0,0,4"
|
|
Content="단일 파일로 결합 (큐 전체 → 한 파일)"
|
|
IsEnabled="False"
|
|
Command="{Binding CombineToggleCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
<TextBlock x:Name="CombineHint" Margin="0,0,0,10"
|
|
Style="{StaticResource FsCaptionStyle}"
|
|
Text="PDF/TIFF/GIF 출력에 한해 큐의 이미지들을 한 파일로 결합합니다"/>
|
|
|
|
<!-- Encoding Quality -->
|
|
<StackPanel x:Name="QualityPanel" Margin="0,4,0,0">
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
<TextBlock x:Name="QualityLabelText" Text="세부 압축 및 품질" Style="{StaticResource FsLabelStyle}"/>
|
|
<Border Grid.Column="1" CornerRadius="4"
|
|
Background="{StaticResource FsBgInput}"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="1" Padding="6,2">
|
|
<TextBlock x:Name="QualityValueText"
|
|
FontFamily="{StaticResource FsFontMono}" FontSize="12"
|
|
Foreground="{StaticResource FsAccentBlue}"
|
|
Text="{Binding Options.Quality, RelativeSource={RelativeSource AncestorType=Window}, StringFormat={}{0}%}"/>
|
|
</Border>
|
|
</Grid>
|
|
<Slider x:Name="QualitySlider" Margin="0,10,0,0"
|
|
Style="{StaticResource FsSliderStyle}"
|
|
Minimum="1" Maximum="100"
|
|
Value="{Binding Options.Quality, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"/>
|
|
<Grid Margin="0,4,0,0">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
<TextBlock Text="용량 우선" Style="{StaticResource FsCaptionStyle}"/>
|
|
<TextBlock Grid.Column="1" Text="품질 우선" Style="{StaticResource FsCaptionStyle}"/>
|
|
</Grid>
|
|
</StackPanel>
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<!-- Card 3: Output Destination & Conflict Rule -->
|
|
<Border Style="{StaticResource FsCardStyle}">
|
|
<StackPanel>
|
|
<TextBlock Text="저장 위치 및 충돌 규칙" Style="{StaticResource FsLabelStyle}"/>
|
|
<Grid Margin="0,10,0,0">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
<TextBox x:Name="OutputPathTextBox"
|
|
Style="{StaticResource FsPathInputStyle}"
|
|
Text="{Binding Options.CustomOutputDirectory, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
|
ToolTip="비워두면 원본 폴더 옆 서브폴더에 저장"/>
|
|
<Button Grid.Column="1" Margin="8,0,0,0" Width="36"
|
|
Content="…" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding PickOutputFolderCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
</Grid>
|
|
<TextBlock x:Name="OutputDestHint" Margin="0,6,0,0"
|
|
Style="{StaticResource FsCaptionStyle}"
|
|
Text="비워두면 원본 옆 _jpg 폴더에 저장됩니다"/>
|
|
|
|
<Border Height="1" Background="{StaticResource FsBorderSubtle}" Margin="0,14,0,14"/>
|
|
|
|
<TextBlock Text="FILE CONFLICT RULE" Style="{StaticResource FsLabelStyle}"/>
|
|
<Border Margin="0,8,0,0"
|
|
Background="{StaticResource FsBgInput}"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="1" CornerRadius="6" Padding="2">
|
|
<UniformGrid Rows="1" Columns="3">
|
|
<ToggleButton x:Name="ConflictSkipBtn" Content="Skip"
|
|
Style="{StaticResource FsSegmentStyle}"
|
|
Command="{Binding ConflictRuleCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Skip" ToolTip="건너뛰기"/>
|
|
<ToggleButton x:Name="ConflictRenameBtn" Content="Rename"
|
|
Style="{StaticResource FsSegmentStyle}"
|
|
IsChecked="True"
|
|
Command="{Binding ConflictRuleCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Rename" ToolTip="이름 변경"/>
|
|
<ToggleButton x:Name="ConflictReplaceBtn" Content="Replace"
|
|
Style="{StaticResource FsSegmentStyle}"
|
|
Command="{Binding ConflictRuleCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Replace" ToolTip="덮어쓰기"/>
|
|
</UniformGrid>
|
|
</Border>
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<!-- Card 4: AI Task -->
|
|
<Border Style="{StaticResource FsCardStyle}" Margin="0,0,0,16">
|
|
<StackPanel x:Name="AiTaskPanel">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<Image Width="15" Height="15" VerticalAlignment="Center" Margin="0,0,6,0"
|
|
RenderOptions.BitmapScalingMode="HighQuality"
|
|
Source="pack://application:,,,/Everything2Everything;component/Assets/glyph-ai.png"/>
|
|
<TextBlock Text="AI 작업" Style="{StaticResource FsLabelStyle}" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
<ComboBox x:Name="AiTaskCombo" Margin="0,8,0,0"
|
|
SelectedIndex="0">
|
|
<ComboBoxItem Content="요약"/>
|
|
<ComboBoxItem Content="번역"/>
|
|
<ComboBoxItem Content="교정"/>
|
|
</ComboBox>
|
|
<TextBlock x:Name="AiTaskHint" Margin="0,6,0,0"
|
|
Style="{StaticResource FsCaptionStyle}"
|
|
Text="텍스트(txt·md·docx) 출력 시 LLM이 적용합니다"/>
|
|
<StackPanel x:Name="AiTargetLangPanel" Margin="0,10,0,0">
|
|
<StackPanel.Style>
|
|
<Style TargetType="StackPanel">
|
|
<Setter Property="Visibility" Value="Collapsed"/>
|
|
<Style.Triggers>
|
|
<!-- 번역(인덱스 1)일 때만 대상 언어 입력 표시 -->
|
|
<DataTrigger Binding="{Binding SelectedIndex, ElementName=AiTaskCombo}" Value="1">
|
|
<Setter Property="Visibility" Value="Visible"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</StackPanel.Style>
|
|
<TextBlock Text="대상 언어" Style="{StaticResource FsCaptionStyle}"
|
|
Margin="0,0,0,4"/>
|
|
<TextBox x:Name="AiTargetLangBox"
|
|
Style="{StaticResource FsPathInputStyle}"
|
|
Text="영어"
|
|
ToolTip="번역 대상 언어 (예: 영어)"/>
|
|
</StackPanel>
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<!-- Card 5: 영상·오디오 인코딩 (출력이 영상/오디오일 때 동적 노출) -->
|
|
<Border x:Name="MediaPanel" Style="{StaticResource FsCardStyle}" Margin="0,0,0,16" Visibility="Collapsed">
|
|
<StackPanel>
|
|
<TextBlock Text="영상·오디오 인코딩" Style="{StaticResource FsLabelStyle}"/>
|
|
|
|
<!-- 영상 (영상 컨테이너 출력 시) -->
|
|
<StackPanel x:Name="VideoSubPanel" Margin="0,8,0,0">
|
|
<TextBlock Text="비디오 코덱" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.VideoCodecIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="자동 (H.264 / 고해상도 H.265)"/>
|
|
<ComboBoxItem Content="H.264 (최대 호환)"/>
|
|
<ComboBoxItem Content="H.265 / HEVC (고압축)"/>
|
|
<ComboBoxItem Content="VP9"/>
|
|
<ComboBoxItem Content="AV1 (최고 압축)"/>
|
|
<ComboBoxItem Content="원본 복사 (재인코딩 없음)"/>
|
|
</ComboBox>
|
|
|
|
<TextBlock Text="레이트 컨트롤" Style="{StaticResource FsCaptionStyle}" Margin="0,10,0,4"/>
|
|
<ComboBox x:Name="RateControlCombo" SelectedIndex="{Binding Options.RateControlIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="CRF (품질 기준 · 권장)"/>
|
|
<ComboBoxItem Content="평균 비트레이트 (ABR)"/>
|
|
<ComboBoxItem Content="제약 CRF (품질+상한)"/>
|
|
<ComboBoxItem Content="고정 비트레이트 (CBR)"/>
|
|
<ComboBoxItem Content="2패스 (최고 효율)"/>
|
|
</ComboBox>
|
|
|
|
<!-- CRF 슬라이더 (CRF / 제약CRF 모드) -->
|
|
<StackPanel Margin="0,10,0,0">
|
|
<StackPanel.Style>
|
|
<Style TargetType="StackPanel">
|
|
<Setter Property="Visibility" Value="Visible"/>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding SelectedIndex, ElementName=RateControlCombo}" Value="1"><Setter Property="Visibility" Value="Collapsed"/></DataTrigger>
|
|
<DataTrigger Binding="{Binding SelectedIndex, ElementName=RateControlCombo}" Value="3"><Setter Property="Visibility" Value="Collapsed"/></DataTrigger>
|
|
<DataTrigger Binding="{Binding SelectedIndex, ElementName=RateControlCombo}" Value="4"><Setter Property="Visibility" Value="Collapsed"/></DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</StackPanel.Style>
|
|
<Grid>
|
|
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
|
|
<TextBlock Text="품질 (CRF) — 낮을수록 고화질" Style="{StaticResource FsCaptionStyle}"/>
|
|
<TextBlock Grid.Column="1" FontFamily="{StaticResource FsFontMono}" FontSize="12" Foreground="{StaticResource FsAccentBlue}"
|
|
Text="{Binding Options.Crf, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
</Grid>
|
|
<Slider Minimum="0" Maximum="51" Margin="0,4,0,0"
|
|
Value="{Binding Options.Crf, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"/>
|
|
</StackPanel>
|
|
|
|
<!-- 비트레이트 입력 (ABR/제약CRF/CBR/2패스 모드) -->
|
|
<StackPanel Margin="0,10,0,0">
|
|
<StackPanel.Style>
|
|
<Style TargetType="StackPanel">
|
|
<Setter Property="Visibility" Value="Collapsed"/>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding SelectedIndex, ElementName=RateControlCombo}" Value="1"><Setter Property="Visibility" Value="Visible"/></DataTrigger>
|
|
<DataTrigger Binding="{Binding SelectedIndex, ElementName=RateControlCombo}" Value="2"><Setter Property="Visibility" Value="Visible"/></DataTrigger>
|
|
<DataTrigger Binding="{Binding SelectedIndex, ElementName=RateControlCombo}" Value="3"><Setter Property="Visibility" Value="Visible"/></DataTrigger>
|
|
<DataTrigger Binding="{Binding SelectedIndex, ElementName=RateControlCombo}" Value="4"><Setter Property="Visibility" Value="Visible"/></DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</StackPanel.Style>
|
|
<TextBlock Text="비디오 비트레이트 (kbps)" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<TextBox Style="{StaticResource FsPathInputStyle}"
|
|
Text="{Binding Options.VideoBitrateKbps, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
|
|
</StackPanel>
|
|
|
|
<TextBlock Text="인코딩 프리셋 (느릴수록 고압축)" Style="{StaticResource FsCaptionStyle}" Margin="0,10,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.PresetIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="UltraFast"/><ComboBoxItem Content="SuperFast"/><ComboBoxItem Content="VeryFast"/>
|
|
<ComboBoxItem Content="Faster"/><ComboBoxItem Content="Fast"/><ComboBoxItem Content="Medium"/>
|
|
<ComboBoxItem Content="Slow"/><ComboBoxItem Content="Slower"/><ComboBoxItem Content="VerySlow"/>
|
|
</ComboBox>
|
|
|
|
<Grid Margin="0,10,0,0">
|
|
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="10"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
|
|
<StackPanel Grid.Column="0">
|
|
<TextBlock Text="해상도" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.ResolutionIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="원본"/><ComboBoxItem Content="2160p (4K)"/><ComboBoxItem Content="1440p"/>
|
|
<ComboBoxItem Content="1080p"/><ComboBoxItem Content="720p"/><ComboBoxItem Content="480p"/>
|
|
</ComboBox>
|
|
</StackPanel>
|
|
<StackPanel Grid.Column="2">
|
|
<TextBlock Text="프레임레이트" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.FpsIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="원본"/><ComboBoxItem Content="24"/><ComboBoxItem Content="30"/><ComboBoxItem Content="60"/>
|
|
</ComboBox>
|
|
</StackPanel>
|
|
</Grid>
|
|
|
|
<CheckBox Margin="0,12,0,0" Content="웹 스트리밍 최적화 (Faststart)"
|
|
IsChecked="{Binding Options.FastStart, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"/>
|
|
<CheckBox Margin="0,6,0,0" Content="GPU 하드웨어 가속 (NVENC 등)"
|
|
IsChecked="{Binding Options.VideoPreferGpu, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"/>
|
|
|
|
<Expander Header="고급" Margin="0,10,0,0" Foreground="{StaticResource FsTextSecondary}">
|
|
<StackPanel Margin="0,8,0,0">
|
|
<TextBlock Text="회전 / 뒤집기" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.RotateIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="없음"/><ComboBoxItem Content="시계 90°"/><ComboBoxItem Content="반시계 90°"/>
|
|
<ComboBoxItem Content="180°"/><ComboBoxItem Content="좌우 반전"/><ComboBoxItem Content="상하 반전"/>
|
|
</ComboBox>
|
|
<TextBlock Text="디인터레이스" Style="{StaticResource FsCaptionStyle}" Margin="0,10,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.DeinterlaceIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="끔"/><ComboBoxItem Content="Yadif"/><ComboBoxItem Content="Bwdif (고품질)"/>
|
|
</ComboBox>
|
|
<CheckBox Margin="0,10,0,0" Content="적응형 양자화 (GPU 화질↑)"
|
|
IsChecked="{Binding Options.SpatialAq, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"/>
|
|
</StackPanel>
|
|
</Expander>
|
|
</StackPanel>
|
|
|
|
<!-- 오디오 (영상의 오디오 트랙 + 오디오 전용 출력) -->
|
|
<StackPanel x:Name="AudioSubPanel" Margin="0,14,0,0">
|
|
<TextBlock Text="오디오" Style="{StaticResource FsLabelStyle}"/>
|
|
<TextBlock Text="오디오 코덱" Style="{StaticResource FsCaptionStyle}" Margin="0,8,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.AudioCodecIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="자동"/><ComboBoxItem Content="AAC"/><ComboBoxItem Content="MP3"/>
|
|
<ComboBoxItem Content="Opus"/><ComboBoxItem Content="Vorbis"/><ComboBoxItem Content="FLAC (무손실)"/>
|
|
<ComboBoxItem Content="PCM (WAV)"/><ComboBoxItem Content="원본 복사"/>
|
|
</ComboBox>
|
|
<TextBlock Text="오디오 비트레이트" Style="{StaticResource FsCaptionStyle}" Margin="0,10,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.AudioBitrateIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="96 kbps"/><ComboBoxItem Content="128 kbps"/><ComboBoxItem Content="192 kbps"/>
|
|
<ComboBoxItem Content="256 kbps"/><ComboBoxItem Content="320 kbps"/>
|
|
</ComboBox>
|
|
<CheckBox Margin="0,8,0,0" Content="가변 비트레이트 (VBR)"
|
|
IsChecked="{Binding Options.AudioVbr, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"/>
|
|
<Grid Margin="0,10,0,0">
|
|
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="10"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
|
|
<StackPanel Grid.Column="0">
|
|
<TextBlock Text="샘플레이트" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.SampleRateIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="원본"/><ComboBoxItem Content="44.1 kHz"/><ComboBoxItem Content="48 kHz"/>
|
|
</ComboBox>
|
|
</StackPanel>
|
|
<StackPanel Grid.Column="2">
|
|
<TextBlock Text="채널" Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<ComboBox SelectedIndex="{Binding Options.ChannelsIndex, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}">
|
|
<ComboBoxItem Content="원본"/><ComboBoxItem Content="모노"/><ComboBoxItem Content="스테레오"/>
|
|
</ComboBox>
|
|
</StackPanel>
|
|
</Grid>
|
|
<CheckBox Margin="0,10,0,0" Content="음량 정규화 (EBU R128)"
|
|
IsChecked="{Binding Options.Loudnorm, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"/>
|
|
</StackPanel>
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<!-- Card 6: Stats Box -->
|
|
<Border Style="{StaticResource FsCardStyle}" Margin="0,0,0,16" Padding="16">
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
<StackPanel>
|
|
<TextBlock Text="오늘 변환된 파일"
|
|
FontFamily="{StaticResource FsFontSans}"
|
|
FontSize="10" FontWeight="SemiBold"
|
|
Foreground="{StaticResource FsTextSecondary}"/>
|
|
<TextBlock x:Name="ProcessedTodayText"
|
|
FontFamily="{StaticResource FsFontMono}"
|
|
FontSize="14"
|
|
Foreground="{StaticResource FsTextPrimary}"
|
|
Text="0" Margin="0,4,0,0"/>
|
|
</StackPanel>
|
|
<StackPanel Grid.Column="1">
|
|
<TextBlock Text="예상 절감 용량"
|
|
FontFamily="{StaticResource FsFontSans}"
|
|
FontSize="10" FontWeight="SemiBold"
|
|
Foreground="{StaticResource FsTextSecondary}"/>
|
|
<TextBlock x:Name="SpaceSavedText"
|
|
FontFamily="{StaticResource FsFontMono}"
|
|
FontSize="14"
|
|
Foreground="{StaticResource FsAccentGreen}"
|
|
Text="0 B" Margin="0,4,0,0"/>
|
|
</StackPanel>
|
|
</Grid>
|
|
</Border>
|
|
</StackPanel>
|
|
</ScrollViewer>
|
|
|
|
<!-- Sidebar footer -->
|
|
<Border Grid.Row="1" BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="0,1,0,0" Padding="24">
|
|
<StackPanel>
|
|
<TextBlock x:Name="CapabilityStatusText" Margin="0,0,0,12"
|
|
Style="{StaticResource FsCaptionStyle}"
|
|
TextWrapping="Wrap" Visibility="Collapsed"/>
|
|
|
|
<!-- Conversion progress (shown only while processing) -->
|
|
<StackPanel x:Name="ProcessingProgressPanel" Margin="0,0,0,12"
|
|
Visibility="Collapsed">
|
|
<Grid Margin="0,0,0,6">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
<TextBlock x:Name="ProcessingFileLabel"
|
|
Style="{StaticResource FsCaptionStyle}"
|
|
Foreground="{StaticResource FsTextPrimary}"
|
|
TextTrimming="CharacterEllipsis"
|
|
Text="처리 중…"/>
|
|
<TextBlock x:Name="ProcessingCountLabel" Grid.Column="1"
|
|
Margin="8,0,0,0"
|
|
FontFamily="{StaticResource FsFontMono}" FontSize="11"
|
|
Foreground="{StaticResource FsAccentBlue}"
|
|
Text="0 / 0"/>
|
|
</Grid>
|
|
<ProgressBar x:Name="ProcessingProgressBar"
|
|
Height="6" Minimum="0" Maximum="100" Value="0"/>
|
|
<Grid Margin="0,4,0,0">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
<TextBlock x:Name="ProcessingPercentLabel"
|
|
FontFamily="{StaticResource FsFontMono}" FontSize="10"
|
|
Foreground="{StaticResource FsTextSecondary}"
|
|
VerticalAlignment="Center"
|
|
Text="0%"/>
|
|
<Button x:Name="CancelProcessingButton" Grid.Column="1"
|
|
Content="취소" Padding="10,2"
|
|
Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding CancelProcessingCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
</Grid>
|
|
</StackPanel>
|
|
|
|
<Button x:Name="ProcessQueueButton"
|
|
Content="대기 중 — 파일을 드래그하여 추가하세요"
|
|
Style="{StaticResource FsPrimaryButtonStyle}"
|
|
IsEnabled="False"
|
|
Height="40"
|
|
Command="{Binding ProcessQueueCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
|
|
</StackPanel>
|
|
</Border>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<!-- ============== MAIN VIEW CONTENT ============== -->
|
|
<Grid Grid.Column="1" Background="{StaticResource FsBgBase}">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*" MinWidth="360"/>
|
|
<ColumnDefinition x:Name="InspectorColumn" Width="380"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<!-- 실시간 검색 & 카테고리 필터 툴바 -->
|
|
<Border Grid.Row="0" Grid.ColumnSpan="2"
|
|
Background="{StaticResource FsBgPanel}"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="0,0,0,1" Padding="24,8">
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="280"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
<!-- Search Box -->
|
|
<Grid Grid.Column="0">
|
|
<TextBox x:Name="SearchBox" Style="{StaticResource FsPathInputStyle}"
|
|
Padding="32,6,10,6" Text="{Binding SearchText, RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=PropertyChanged}"
|
|
ToolTip="파일명 또는 확장자로 검색"/>
|
|
<ui:SymbolIcon Symbol="Search24" FontSize="14" Foreground="{StaticResource FsTextTertiary}"
|
|
HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0,0,0" IsHitTestVisible="False"/>
|
|
</Grid>
|
|
<!-- Category Filter Chips & Inspector Toggle -->
|
|
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
|
|
<Button Margin="0,0,4,0" Padding="10,4" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding FilterCategoryCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="All">
|
|
<TextBlock Text="전체" FontSize="11" VerticalAlignment="Center"/>
|
|
</Button>
|
|
<Button Margin="0,0,4,0" Padding="10,4" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding FilterCategoryCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Image">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Image24" FontSize="12" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
|
<TextBlock Text="이미지" FontSize="11" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
<Button Margin="0,0,4,0" Padding="10,4" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding FilterCategoryCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Document">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Document24" FontSize="12" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
|
<TextBlock Text="문서" FontSize="11" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
<Button Margin="0,0,4,0" Padding="10,4" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding FilterCategoryCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Media">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Video24" FontSize="12" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
|
<TextBlock Text="미디어" FontSize="11" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
<Button Margin="0,0,4,0" Padding="10,4" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding FilterCategoryCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Data">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Database24" FontSize="12" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
|
<TextBlock Text="데이터" FontSize="11" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
<Border Width="1" Height="16" Background="{StaticResource FsBorderSubtle}" Margin="8,0"/>
|
|
<Button Padding="10,4" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding ToggleInspectorCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="미리보기 패널 접기/펼치기">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="PreviewLink24" FontSize="13" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
|
<TextBlock Text="미리보기" FontSize="11" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
</StackPanel>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<!-- 좌측: Active Queue OR Past Results -->
|
|
<Grid Grid.Row="1" Grid.Column="0">
|
|
<!-- Active Queue view -->
|
|
<Grid x:Name="ActiveQueueView" Visibility="Collapsed">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- Batch Action Bar -->
|
|
<Border x:Name="BatchActionBar" Grid.Row="0" Background="{StaticResource FsBgPanel}"
|
|
BorderBrush="{StaticResource FsBorderSubtle}" BorderThickness="0,0,0,1"
|
|
Padding="24,8" Visibility="Collapsed">
|
|
<Grid VerticalAlignment="Center">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="Auto"/>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
<CheckBox x:Name="BatchSelectAllCheck" Content="전체 선택" VerticalAlignment="Center"
|
|
Command="{Binding BatchSelectAllCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}"/>
|
|
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center">
|
|
<Button Margin="0,0,8,0" Padding="10,4" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding BatchRemoveSelectedCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="선택된 파일들을 큐에서 제거합니다">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Delete24" FontSize="12" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
|
<TextBlock Text="선택 항목 삭제" FontSize="11" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
<Button Padding="10,4" Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Command="{Binding BatchClearCompletedCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="변환이 완료된 항목들을 큐에서 정리합니다">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Checkmark24" FontSize="12" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
|
<TextBlock Text="완료 항목 정리" FontSize="11" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
</StackPanel>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<Grid Grid.Row="1">
|
|
<Grid x:Name="DropZoneEmpty">
|
|
<Border Background="{StaticResource FsBgBase}" Padding="32">
|
|
<!-- 점선 드롭존: 절제된 dashed 보더 + 중앙 정렬 안내 -->
|
|
<Grid MaxWidth="460"
|
|
HorizontalAlignment="Center"
|
|
VerticalAlignment="Center">
|
|
<!-- 점선 테두리(드롭존 느낌) -->
|
|
<Rectangle RadiusX="12" RadiusY="12"
|
|
Stroke="{StaticResource FsBorderHairline}"
|
|
StrokeThickness="1.5"
|
|
StrokeDashArray="5 4"
|
|
Fill="{StaticResource FsBgSurface}"/>
|
|
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"
|
|
Margin="48,44">
|
|
<Image Width="120" Height="120"
|
|
HorizontalAlignment="Center"
|
|
RenderOptions.BitmapScalingMode="HighQuality"
|
|
Source="pack://application:,,,/Everything2Everything;component/Assets/illus-empty.png"/>
|
|
<TextBlock Margin="0,16,0,0" FontSize="16" FontWeight="SemiBold"
|
|
Foreground="{StaticResource FsTextPrimary}"
|
|
HorizontalAlignment="Center"
|
|
Text="변환할 파일을 드래그하여 추가하세요"/>
|
|
<TextBlock Margin="0,6,0,0" Style="{StaticResource FsCaptionStyle}"
|
|
HorizontalAlignment="Center"
|
|
TextAlignment="Center"
|
|
Text="이미지 · 문서 · 데이터 · 영상 · 오디오 등 무엇이든"/>
|
|
<Button Margin="0,20,0,0"
|
|
HorizontalAlignment="Center"
|
|
Style="{StaticResource FsPrimaryButtonStyle}"
|
|
Padding="20,10"
|
|
Command="{Binding AddFilesCommand, RelativeSource={RelativeSource AncestorType=Window}}">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Add24" FontSize="14" VerticalAlignment="Center" Margin="0,0,6,0"/>
|
|
<TextBlock Text="파일 찾기…" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
<!-- 단축키 안내 칩 -->
|
|
<Border Margin="0,16,0,0" HorizontalAlignment="Center"
|
|
Background="{StaticResource FsBgPanel}"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="1" CornerRadius="12" Padding="12,4">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<TextBlock Text="단축키" Style="{StaticResource FsCaptionStyle}" Margin="0,0,6,0" VerticalAlignment="Center"/>
|
|
<Border Background="{StaticResource FsBgBase}" CornerRadius="4" Padding="6,2" Margin="0,0,4,0">
|
|
<TextBlock Text="Ctrl + O" FontFamily="{StaticResource FsFontMono}" FontSize="11" Foreground="{StaticResource FsAccentBlue}" VerticalAlignment="Center"/>
|
|
</Border>
|
|
<TextBlock Text="파일 열기 ·" Style="{StaticResource FsCaptionStyle}" Margin="0,0,4,0" VerticalAlignment="Center"/>
|
|
<Border Background="{StaticResource FsBgBase}" CornerRadius="4" Padding="6,2" Margin="0,0,4,0">
|
|
<TextBlock Text="Ctrl + Enter" FontFamily="{StaticResource FsFontMono}" FontSize="11" Foreground="{StaticResource FsAccentGreen}" VerticalAlignment="Center"/>
|
|
</Border>
|
|
<TextBlock Text="변환 시작" Style="{StaticResource FsCaptionStyle}" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Border>
|
|
</StackPanel>
|
|
</Grid>
|
|
</Border>
|
|
</Grid>
|
|
<ScrollViewer x:Name="ActiveQueueScroll" VerticalScrollBarVisibility="Auto"
|
|
Padding="24" Visibility="Collapsed">
|
|
<ItemsControl x:Name="ActiveQueueList"
|
|
ItemsSource="{Binding ActiveQueue, RelativeSource={RelativeSource AncestorType=Window}}">
|
|
<ItemsControl.ItemTemplate>
|
|
<DataTemplate>
|
|
<!-- row hover: FsListRowStyle Neo Glass 카드 + 좌측 형식색 accent bar -->
|
|
<Border x:Name="QueueRow" Style="{StaticResource FsListRowStyle}" Padding="0"
|
|
Cursor="Hand">
|
|
<i:Interaction.Triggers>
|
|
<i:EventTrigger EventName="PreviewMouseLeftButtonUp">
|
|
<i:InvokeCommandAction Command="{Binding QueueRowCommand, RelativeSource={RelativeSource AncestorType=Window}}" PassEventArgsToCommand="True"/>
|
|
</i:EventTrigger>
|
|
</i:Interaction.Triggers>
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="3"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
<!-- 좌측 3px 세로 accent bar: 해당 파일 형식색 -->
|
|
<Border Grid.Column="0"
|
|
Width="3"
|
|
Background="{Binding FormatBrush}"
|
|
CornerRadius="10,0,0,10"/>
|
|
<Grid Grid.Column="1" Margin="14,10">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="28"/>
|
|
<ColumnDefinition Width="40"/>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="100"/>
|
|
<ColumnDefinition Width="120"/>
|
|
<ColumnDefinition Width="40"/>
|
|
</Grid.ColumnDefinitions>
|
|
<CheckBox Grid.Column="0" IsChecked="{Binding IsSelected, Mode=TwoWay}"
|
|
VerticalAlignment="Center"/>
|
|
<Image Grid.Column="1" Width="34" Height="34" VerticalAlignment="Center"
|
|
RenderOptions.BitmapScalingMode="HighQuality"
|
|
Source="{Binding GlyphSource}"/>
|
|
<StackPanel Grid.Column="2" Margin="14,0,0,0"
|
|
VerticalAlignment="Center">
|
|
<TextBlock Text="{Binding FileName}"
|
|
Style="{StaticResource FsBodyStyle}"
|
|
FontWeight="SemiBold"
|
|
TextTrimming="CharacterEllipsis"/>
|
|
<StackPanel Orientation="Horizontal" Margin="0,4,0,0" VerticalAlignment="Center">
|
|
<!-- Format Category Badge Pill (designpaca R1/R3) -->
|
|
<Border x:Name="ItemCategoryBadge" Tag="CategoryPill"
|
|
Background="{Binding FormatBrush}"
|
|
CornerRadius="3" Padding="5,1" Margin="0,0,8,0"
|
|
VerticalAlignment="Center">
|
|
<TextBlock Text="{Binding FormatLabel}"
|
|
FontSize="10" FontWeight="Bold"
|
|
Foreground="White"
|
|
VerticalAlignment="Center"/>
|
|
</Border>
|
|
<TextBlock Text="{Binding MetaLine}"
|
|
Style="{StaticResource FsCaptionStyle}"
|
|
VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
<ProgressBar Height="2" Margin="0,5,0,0"
|
|
Minimum="0" Maximum="100"
|
|
Value="{Binding ProgressValue, Mode=OneWay}"
|
|
Visibility="{Binding ProgressVisibility, Mode=OneWay}"/>
|
|
</StackPanel>
|
|
<TextBlock Grid.Column="3" Text="{Binding SizeText}"
|
|
Style="{StaticResource FsMonoStyle}"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center"/>
|
|
<TextBlock Grid.Column="4" Text="{Binding StateText}"
|
|
FontFamily="{StaticResource FsFontMono}"
|
|
FontSize="12"
|
|
Foreground="{Binding StateBrush}"
|
|
VerticalAlignment="Center"/>
|
|
<Button Grid.Column="5"
|
|
Style="{StaticResource FsIconButtonStyle}"
|
|
Width="28" Height="28"
|
|
VerticalAlignment="Center"
|
|
HorizontalAlignment="Right"
|
|
ToolTip="큐에서 제거"
|
|
Command="{Binding RemoveQueueItemCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="{Binding}">
|
|
<Path Width="13" Height="13" Stretch="Uniform"
|
|
Stroke="{StaticResource FsTextTertiary}"
|
|
StrokeThickness="2"
|
|
Data="M18,6 L6,18 M6,6 L18,18"/>
|
|
</Button>
|
|
</Grid>
|
|
</Grid>
|
|
</Border>
|
|
</DataTemplate>
|
|
</ItemsControl.ItemTemplate>
|
|
</ItemsControl>
|
|
</ScrollViewer>
|
|
</Grid>
|
|
</Grid>
|
|
|
|
<!-- Past Results view (default) -->
|
|
<Grid x:Name="PastResultsContainer">
|
|
<!-- 빈 상태 안내 (Empty State) -->
|
|
<Grid x:Name="PastResultsEmpty" Visibility="Collapsed">
|
|
<Border Background="{StaticResource FsBgBase}" Padding="32">
|
|
<Grid MaxWidth="460" HorizontalAlignment="Center" VerticalAlignment="Center">
|
|
<Rectangle RadiusX="12" RadiusY="12"
|
|
Stroke="{StaticResource FsBorderHairline}"
|
|
StrokeThickness="1.5"
|
|
StrokeDashArray="5 4"
|
|
Fill="{StaticResource FsBgSurface}"/>
|
|
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="48,44">
|
|
<ui:SymbolIcon Symbol="History24" FontSize="48"
|
|
Foreground="{StaticResource FsTextTertiary}"
|
|
HorizontalAlignment="Center"/>
|
|
<TextBlock Margin="0,16,0,0" FontSize="16" FontWeight="SemiBold"
|
|
Foreground="{StaticResource FsTextPrimary}"
|
|
HorizontalAlignment="Center"
|
|
Text="변환 이력이 없습니다"/>
|
|
<TextBlock Margin="0,6,0,0" Style="{StaticResource FsCaptionStyle}"
|
|
HorizontalAlignment="Center"
|
|
TextAlignment="Center"
|
|
Text="파일을 변환하면 완료된 내역과 절감된 용량이 여기에 기록됩니다"/>
|
|
<Button Margin="0,20,0,0"
|
|
HorizontalAlignment="Center"
|
|
Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Padding="16,8"
|
|
Command="{Binding TabCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="Active">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="ArrowLeft24" FontSize="13" VerticalAlignment="Center" Margin="0,0,6,0"/>
|
|
<TextBlock Text="큐로 이동하여 파일 추가하기" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
</StackPanel>
|
|
</Grid>
|
|
</Border>
|
|
</Grid>
|
|
<ScrollViewer x:Name="PastResultsView" VerticalScrollBarVisibility="Auto"
|
|
Padding="24">
|
|
<ItemsControl x:Name="PastResultsList"
|
|
ItemsSource="{Binding PastResults, RelativeSource={RelativeSource AncestorType=Window}}">
|
|
<ItemsControl.ItemTemplate>
|
|
<DataTemplate>
|
|
<StackPanel Margin="0,0,0,40">
|
|
<!-- Date header -->
|
|
<Grid Margin="0,0,0,12">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
<TextBlock Text="{Binding DateTitle}"
|
|
FontFamily="{StaticResource FsFontSans}"
|
|
FontSize="14" FontWeight="SemiBold"
|
|
Foreground="{StaticResource FsTextPrimary}"/>
|
|
<Border Grid.Column="1" CornerRadius="20" Padding="10,4"
|
|
Background="#10B98122">
|
|
<TextBlock Text="{Binding SessionSavingsText}"
|
|
FontFamily="{StaticResource FsFontMono}"
|
|
FontSize="12"
|
|
Foreground="{StaticResource FsAccentGreen}"/>
|
|
</Border>
|
|
</Grid>
|
|
<Border Height="1" Background="{StaticResource FsBorderSubtle}"
|
|
Margin="0,0,0,12"/>
|
|
|
|
<!-- Rows: Elevated Neo Glass Cards -->
|
|
<ItemsControl ItemsSource="{Binding Entries}">
|
|
<ItemsControl.ItemTemplate>
|
|
<DataTemplate>
|
|
<Border Style="{StaticResource FsListRowStyle}"
|
|
Cursor="Hand">
|
|
<i:Interaction.Triggers>
|
|
<i:EventTrigger EventName="PreviewMouseLeftButtonUp">
|
|
<i:InvokeCommandAction Command="{Binding PastRowCommand, RelativeSource={RelativeSource AncestorType=Window}}" PassEventArgsToCommand="True"/>
|
|
</i:EventTrigger>
|
|
</i:Interaction.Triggers>
|
|
<Grid>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="42"/>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="100"/>
|
|
<ColumnDefinition Width="100"/>
|
|
<ColumnDefinition Width="100"/>
|
|
<ColumnDefinition Width="40"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<Image Width="34" Height="34" VerticalAlignment="Center"
|
|
RenderOptions.BitmapScalingMode="HighQuality"
|
|
Source="{Binding GlyphSource}"/>
|
|
|
|
<StackPanel Grid.Column="1" Margin="14,0,0,0"
|
|
VerticalAlignment="Center">
|
|
<TextBlock Text="{Binding FileName}"
|
|
Style="{StaticResource FsBodyStyle}"
|
|
FontWeight="SemiBold"
|
|
TextTrimming="CharacterEllipsis"/>
|
|
<StackPanel Orientation="Horizontal" Margin="0,4,0,0" VerticalAlignment="Center">
|
|
<Border Background="{Binding FormatBrush}"
|
|
CornerRadius="4" Padding="6,1" Margin="0,0,8,0"
|
|
VerticalAlignment="Center">
|
|
<TextBlock Text="{Binding FormatLabel}"
|
|
FontSize="10" FontWeight="Bold"
|
|
Foreground="White"
|
|
VerticalAlignment="Center"/>
|
|
</Border>
|
|
<TextBlock Text="{Binding MetaLine}"
|
|
Style="{StaticResource FsCaptionStyle}"
|
|
VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</StackPanel>
|
|
|
|
<TextBlock Grid.Column="2"
|
|
Text="{Binding SizeText}"
|
|
Style="{StaticResource FsMonoStyle}"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center"/>
|
|
|
|
<TextBlock Grid.Column="3"
|
|
Text="{Binding SavingsText}"
|
|
FontFamily="{StaticResource FsFontMono}"
|
|
FontSize="12"
|
|
Foreground="{StaticResource FsAccentGreen}"
|
|
HorizontalAlignment="Center"
|
|
VerticalAlignment="Center"/>
|
|
|
|
<Border Grid.Column="4" Background="#10B98122" CornerRadius="12"
|
|
Padding="8,3" HorizontalAlignment="Center" VerticalAlignment="Center">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<Path Width="10" Height="10" Stretch="Uniform"
|
|
Stroke="{StaticResource FsAccentGreen}"
|
|
StrokeThickness="2.5"
|
|
VerticalAlignment="Center"
|
|
Data="M20,6 L9,17 L4,12"/>
|
|
<TextBlock Text="완료" Margin="5,0,0,0"
|
|
FontSize="11" FontWeight="SemiBold"
|
|
Foreground="{StaticResource FsAccentGreen}"
|
|
VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Border>
|
|
|
|
<Button Grid.Column="5"
|
|
Style="{StaticResource FsIconButtonStyle}"
|
|
Width="32" Height="32"
|
|
VerticalAlignment="Center"
|
|
HorizontalAlignment="Right"
|
|
Command="{Binding OpenFolderCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
CommandParameter="{Binding RevealPath}"
|
|
ToolTip="출력 파일이 있는 폴더 열기">
|
|
<Path Width="14" Height="14" Stretch="Uniform"
|
|
Stroke="{StaticResource FsTextSecondary}"
|
|
StrokeThickness="1.8"
|
|
Data="M22,19 C22,20.1 21.1,21 20,21 L4,21 C2.9,21 2,20.1 2,19 L2,5 C2,3.9 2.9,3 4,3 L9,3 L11,6 L20,6 C21.1,6 22,6.9 22,8 Z"/>
|
|
</Button>
|
|
</Grid>
|
|
</Border>
|
|
</DataTemplate>
|
|
</ItemsControl.ItemTemplate>
|
|
</ItemsControl>
|
|
</StackPanel>
|
|
</DataTemplate>
|
|
</ItemsControl.ItemTemplate>
|
|
</ItemsControl>
|
|
</ScrollViewer>
|
|
</Grid>
|
|
|
|
</Grid>
|
|
<!-- /좌측 컬럼 끝 -->
|
|
|
|
<!-- 우측: Preview 컬럼 (항상 보임) -->
|
|
<Border Grid.Row="1" Grid.Column="1"
|
|
Background="{StaticResource FsBgPanel}"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="1,0,0,0">
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
<RowDefinition Height="Auto"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<!-- 헤더 -->
|
|
<Border Grid.Row="0" Padding="20,12,16,12"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="0,0,0,1">
|
|
<Grid VerticalAlignment="Center">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Left">
|
|
<Path Width="14" Height="14" Stretch="Uniform"
|
|
Stroke="{StaticResource FsTextSecondary}" StrokeThickness="2"
|
|
VerticalAlignment="Center"
|
|
Data="M1,12 C1,12 5,4 12,4 C19,4 23,12 23,12 C23,12 19,20 12,20 C5,20 1,12 1,12 Z M12,9 A3,3 0 1,1 12,15 A3,3 0 1,1 12,9 Z"/>
|
|
<TextBlock Text="PREVIEW" Margin="8,0,0,0"
|
|
Style="{StaticResource FsLabelStyle}"
|
|
VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
<Button HorizontalAlignment="Right" VerticalAlignment="Center"
|
|
Style="{StaticResource FsIconButtonStyle}"
|
|
Width="28" Height="28"
|
|
Command="{Binding ToggleInspectorCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="미리보기 패널 닫기">
|
|
<ui:SymbolIcon Symbol="Dismiss24" FontSize="14" Foreground="{StaticResource FsTextSecondary}"/>
|
|
</Button>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<!-- 이미지 영역 -->
|
|
<Grid Grid.Row="1" Margin="20,16,20,16" x:Name="PreviewImageArea">
|
|
<Border Background="{StaticResource FsBgInput}"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="1" CornerRadius="6">
|
|
<Grid>
|
|
<!-- Empty state -->
|
|
<StackPanel x:Name="PreviewEmpty" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="20">
|
|
<Path Width="36" Height="36" Stretch="Uniform"
|
|
Stroke="{StaticResource FsTextTertiary}" StrokeThickness="1.5"
|
|
Data="M1,12 C1,12 5,4 12,4 C19,4 23,12 23,12 C23,12 19,20 12,20 C5,20 1,12 1,12 Z M12,9 A3,3 0 1,1 12,15 A3,3 0 1,1 12,9 Z"/>
|
|
<TextBlock Margin="0,12,0,0" FontSize="13" FontWeight="SemiBold"
|
|
Foreground="{StaticResource FsTextSecondary}"
|
|
HorizontalAlignment="Center"
|
|
Text="No selection"/>
|
|
<TextBlock Margin="0,4,0,0" Style="{StaticResource FsCaptionStyle}"
|
|
HorizontalAlignment="Center" TextAlignment="Center"
|
|
TextWrapping="Wrap" MaxWidth="240"
|
|
Text="Active Queue 항목을 클릭하면 여기에 미리보기가 표시됩니다."/>
|
|
</StackPanel>
|
|
|
|
<!-- Loading -->
|
|
<StackPanel x:Name="PreviewLoading" Visibility="Collapsed"
|
|
HorizontalAlignment="Center" VerticalAlignment="Center">
|
|
<ProgressBar IsIndeterminate="True" Width="180" Height="3"
|
|
Foreground="{StaticResource FsAccentBlue}"
|
|
Background="{StaticResource FsBgSurface}"/>
|
|
<TextBlock Margin="0,12,0,0" Style="{StaticResource FsCaptionStyle}"
|
|
HorizontalAlignment="Center"
|
|
Text="미리보기 생성 중…"/>
|
|
</StackPanel>
|
|
|
|
<!-- Image -->
|
|
<Image x:Name="PreviewImage" Stretch="Uniform" Margin="16"
|
|
Visibility="Collapsed"/>
|
|
|
|
<!-- Reason -->
|
|
<StackPanel x:Name="PreviewReason" Visibility="Collapsed"
|
|
HorizontalAlignment="Center" VerticalAlignment="Center" Margin="20">
|
|
<Image x:Name="PreviewGlyph" Width="84" Height="84"
|
|
HorizontalAlignment="Center" Visibility="Collapsed"
|
|
RenderOptions.BitmapScalingMode="HighQuality"/>
|
|
<Path x:Name="PreviewWarnIcon" Width="32" Height="32" Stretch="Uniform"
|
|
Stroke="{StaticResource FsAccentAmber}" StrokeThickness="1.5"
|
|
Data="M12,2 L22,20 L2,20 Z M12,9 L12,14 M12,17 L12,17.01"/>
|
|
<TextBlock x:Name="PreviewReasonText" Margin="0,12,0,0"
|
|
Style="{StaticResource FsBodyStyle}"
|
|
FontSize="12"
|
|
HorizontalAlignment="Center" TextAlignment="Center"
|
|
TextWrapping="Wrap" MaxWidth="280"/>
|
|
</StackPanel>
|
|
</Grid>
|
|
</Border>
|
|
</Grid>
|
|
|
|
<!-- 메타 -->
|
|
<Border Grid.Row="2" Padding="20,12,20,20"
|
|
BorderBrush="{StaticResource FsBorderSubtle}"
|
|
BorderThickness="0,1,0,0">
|
|
<StackPanel>
|
|
<TextBlock x:Name="PreviewFileName"
|
|
Style="{StaticResource FsBodyStyle}"
|
|
FontWeight="SemiBold" TextWrapping="NoWrap"
|
|
TextTrimming="CharacterEllipsis"
|
|
Text="—"/>
|
|
<TextBlock x:Name="PreviewFilePath" Margin="0,4,0,0"
|
|
FontFamily="{StaticResource FsFontMono}" FontSize="11"
|
|
Foreground="{StaticResource FsTextTertiary}"
|
|
TextTrimming="CharacterEllipsis" MaxHeight="32"/>
|
|
|
|
<Border Margin="0,12,0,12" Height="1"
|
|
Background="{StaticResource FsBorderSubtle}"/>
|
|
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
</Grid.RowDefinitions>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="Auto"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<TextBlock Grid.Row="0" Grid.Column="0" Text="Format"
|
|
Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<TextBlock x:Name="PreviewFormatText" Grid.Row="0" Grid.Column="1"
|
|
FontFamily="{StaticResource FsFontMono}" FontSize="12"
|
|
Foreground="{StaticResource FsTextPrimary}" Margin="0,0,0,4"/>
|
|
|
|
<TextBlock Grid.Row="1" Grid.Column="0" Text="Size"
|
|
Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<TextBlock x:Name="PreviewSizeText" Grid.Row="1" Grid.Column="1"
|
|
FontFamily="{StaticResource FsFontMono}" FontSize="12"
|
|
Foreground="{StaticResource FsTextPrimary}" Margin="0,0,0,4"/>
|
|
|
|
<TextBlock Grid.Row="2" Grid.Column="0" Text="Dimensions"
|
|
Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,4"/>
|
|
<TextBlock x:Name="PreviewDimText" Grid.Row="2" Grid.Column="1"
|
|
FontFamily="{StaticResource FsFontMono}" FontSize="12"
|
|
Foreground="{StaticResource FsTextPrimary}" Text="—"
|
|
Margin="0,0,0,4"/>
|
|
|
|
<TextBlock Grid.Row="3" Grid.Column="0" Text="Pages"
|
|
Style="{StaticResource FsCaptionStyle}"/>
|
|
<TextBlock x:Name="PreviewPageText" Grid.Row="3" Grid.Column="1"
|
|
FontFamily="{StaticResource FsFontMono}" FontSize="12"
|
|
Foreground="{StaticResource FsTextPrimary}" Text="—"/>
|
|
</Grid>
|
|
|
|
<Grid Margin="0,16,0,0">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="8"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
<Button Grid.Column="0"
|
|
Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Padding="12,8"
|
|
Command="{Binding PreviewOpenFileCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="기본 프로그램으로 파일 열기">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="Open24" FontSize="13" VerticalAlignment="Center" Margin="0,0,6,0"/>
|
|
<TextBlock Text="열기" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
<Button Grid.Column="2"
|
|
Style="{StaticResource FsSecondaryButtonStyle}"
|
|
Padding="12,8"
|
|
Command="{Binding PreviewOpenFolderCommand, RelativeSource={RelativeSource AncestorType=Window}}"
|
|
ToolTip="탐색기에서 파일 위치 열기">
|
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
|
<ui:SymbolIcon Symbol="FolderOpen24" FontSize="13" VerticalAlignment="Center" Margin="0,0,6,0"/>
|
|
<TextBlock Text="폴더에서 보기" VerticalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Button>
|
|
</Grid>
|
|
</StackPanel>
|
|
</Border>
|
|
</Grid>
|
|
</Border>
|
|
|
|
<!-- Drop hint overlay (전체 덮음) -->
|
|
<Border x:Name="DropHintOverlay" Visibility="Collapsed" Grid.RowSpan="2" Grid.ColumnSpan="2"
|
|
Background="#CC090A0C" IsHitTestVisible="False">
|
|
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
|
|
<Path Width="64" Height="64" Stretch="Uniform"
|
|
Stroke="{StaticResource FsAccentBlue}" StrokeThickness="2"
|
|
Data="M21,15 L21,19 C21,20.1 20.1,21 19,21 L5,21 C3.9,21 3,20.1 3,19 L3,15 M7,10 L12,15 L17,10 M12,15 L12,3"/>
|
|
<TextBlock Text="Drop to add to queue" Margin="0,16,0,0"
|
|
FontSize="18" FontWeight="SemiBold"
|
|
Foreground="{StaticResource FsTextPrimary}"
|
|
HorizontalAlignment="Center"/>
|
|
</StackPanel>
|
|
</Border>
|
|
</Grid>
|
|
</Grid>
|
|
</Grid>
|
|
</ui:FluentWindow>
|