ux: FormatShift Utility 디자인을 메인 윈도우에 충실히 재현
새 메인 윈도우 (1280x960, dark minimal): - 320px 사이드바 — Target Format(JPG), Encoding Quality 슬라이더(파란색 fill + 흰 thumb), Output Destination, Skip/Rename/Replace 세그먼트, Stats Box, Processing Queue 버튼(disabled→enabled 상태 전이) - 메인 영역 — pill 탭 3개(Active Queue / Preview / Past Results), 액션 버튼 (Register Menu / Diagnose / Export Log / Clear All) - Past Results — 날짜별 그룹화, "Today/Yesterday" 헤더 + Session Savings 뱃지, 파일 아이콘(PDF/PNG/HEIC/JPG/...), 사이즈/savings/status 컬럼 - Active Queue — 빈 상태 드롭존 + 파일 행, 행 클릭 시 Preview 자동 전환 - Drop hint overlay — 파일 끌어올 때 흐릿한 가이드 표시 핵심 신규 인프라: - FormatShiftTheme.xaml — 디자인 토큰(색/타이포/슬라이더 스타일/탭 pill 스타일/ 세그먼트 스타일/primary·secondary 버튼) 전부 - PreviewService — 이미지/RAW(Magick), HEIC(libheif decode), PDF(PDFium)을 720px 긴변 BitmapSource로 렌더. DOCX/HWP/HTML은 안내 문구 fallback - HistoryStore — 변환 결과 누적(메모리), 날짜별 group + session savings 합산 - Export Log — Past Results를 CSV/JSON으로 저장 기존 기능 통합: - 사이드바 옵션이 ConvertOptions에 매핑 (Quality, Output Path, Conflict) - Process Queue 버튼이 ConvertManyAsync 호출 → 결과를 History에 누적 - Register Menu / Diagnose 액션 유지 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
8065bf7373
commit
01467a4d27
5 changed files with 1701 additions and 278 deletions
|
|
@ -2,110 +2,636 @@
|
|||
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"
|
||||
Title="EverythingToJpeg"
|
||||
Width="880" Height="640"
|
||||
MinWidth="640" MinHeight="480"
|
||||
Title="FormatShift Utility"
|
||||
Width="1280" Height="960"
|
||||
MinWidth="1080" MinHeight="640"
|
||||
ExtendsContentIntoTitleBar="True"
|
||||
WindowBackdropType="Mica"
|
||||
WindowBackdropType="None"
|
||||
WindowCornerPreference="Round"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
AllowDrop="True"
|
||||
Drop="OnFilesDropped"
|
||||
DragOver="OnDragOver"
|
||||
DragLeave="OnDragLeave">
|
||||
<Grid>
|
||||
DragLeave="OnDragLeave"
|
||||
TextOptions.TextFormattingMode="Display"
|
||||
UseLayoutRounding="True">
|
||||
<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="32"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<ui:TitleBar Grid.Row="0" Title="EverythingToJpeg">
|
||||
<ui:TitleBar.Icon>
|
||||
<ui:SymbolIcon Symbol="ImageMultiple24"/>
|
||||
</ui:TitleBar.Icon>
|
||||
</ui:TitleBar>
|
||||
<!-- Title bar (window controls only) -->
|
||||
<ui:TitleBar Grid.Row="0" Title="" ShowMaximize="True" ShowMinimize="True"/>
|
||||
|
||||
<Grid Grid.Row="1" Margin="32,16,32,32">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<!-- App body -->
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="320"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Hero -->
|
||||
<StackPanel Grid.Row="0" Margin="0,0,0,24">
|
||||
<TextBlock Text="모든 것을 JPEG로." Style="{StaticResource TextTitleLarge}"/>
|
||||
<TextBlock Margin="0,4,0,0" Style="{StaticResource TextBody}"
|
||||
Foreground="{DynamicResource TextFillColorSecondaryBrush}">
|
||||
파일을 우클릭하면 끝. PNG · GIF · HEIC · RAW · PDF · DOCX 가 모두 한 번에 변환됩니다.
|
||||
</TextBlock>
|
||||
</StackPanel>
|
||||
<!-- ============== SIDEBAR ============== -->
|
||||
<Border Grid.Column="0"
|
||||
Background="{StaticResource FsBgPanel}"
|
||||
BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="0,0,1,0">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="56"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Drop zone -->
|
||||
<Border x:Name="DropZone" Grid.Row="1"
|
||||
BorderBrush="{DynamicResource ControlStrokeColorDefaultBrush}"
|
||||
BorderThickness="2"
|
||||
Background="{DynamicResource ControlFillColorDefaultBrush}"
|
||||
CornerRadius="12"
|
||||
Padding="32,24"
|
||||
Margin="0,0,0,20">
|
||||
<Border.Style>
|
||||
<Style TargetType="Border">
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsDraggingOver, RelativeSource={RelativeSource AncestorType=Window}}" Value="True">
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource SystemFillColorAttentionBrush}"/>
|
||||
<Setter Property="Background" Value="{DynamicResource SubtleFillColorSecondaryBrush}"/>
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Border.Style>
|
||||
<StackPanel HorizontalAlignment="Center">
|
||||
<ui:SymbolIcon Symbol="ImageArrowCounterclockwise24" FontSize="36"
|
||||
Foreground="{DynamicResource AccentTextFillColorPrimaryBrush}"
|
||||
HorizontalAlignment="Center"/>
|
||||
<TextBlock Text="여기에 파일이나 폴더를 끌어다 놓으세요"
|
||||
Style="{StaticResource TextSubtitle}"
|
||||
HorizontalAlignment="Center" Margin="0,12,0,4"/>
|
||||
<TextBlock Style="{StaticResource TextCaption}" HorizontalAlignment="Center">
|
||||
또는
|
||||
<Hyperlink Click="OnPickFilesClick">파일 선택</Hyperlink>
|
||||
</TextBlock>
|
||||
</StackPanel>
|
||||
<!-- Sidebar header -->
|
||||
<Border Grid.Row="0" BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="0,0,0,1" Padding="24,0">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<Path Width="18" Height="18" Stretch="Uniform"
|
||||
Stroke="{StaticResource FsAccentBlue}" StrokeThickness="2"
|
||||
Data="M3,3 L21,3 L21,21 L3,21 Z M12,8 L12,16 M8,12 L16,12"/>
|
||||
<TextBlock Margin="8,0,0,0" FontSize="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource FsTextPrimary}"
|
||||
FontFamily="{StaticResource FsFontSans}">
|
||||
FormatShift
|
||||
<Run Foreground="{StaticResource FsTextTertiary}" FontWeight="Medium"
|
||||
Text=" Utility"/>
|
||||
</TextBlock>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Sidebar content -->
|
||||
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" Padding="24,24,24,24">
|
||||
<StackPanel>
|
||||
<!-- Target Format -->
|
||||
<StackPanel Margin="0,0,0,32">
|
||||
<TextBlock Text="TARGET FORMAT" Style="{StaticResource FsLabelStyle}"/>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,8,0,0" VerticalAlignment="Center">
|
||||
<Border Width="24" Height="24" CornerRadius="4"
|
||||
Background="{StaticResource FsFmtJpg}">
|
||||
<TextBlock Text="JPG" Foreground="White" FontSize="8"
|
||||
FontWeight="SemiBold"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
<TextBlock Text="JPEG Image" Margin="8,0,0,0"
|
||||
Style="{StaticResource FsBodyStyle}"
|
||||
FontWeight="Medium" VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Encoding Quality -->
|
||||
<StackPanel Margin="0,0,0,32">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="ENCODING QUALITY" 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="85%"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
<Slider x:Name="QualitySlider" Margin="0,12,0,0"
|
||||
Style="{StaticResource FsSliderStyle}"
|
||||
Minimum="1" Maximum="100" Value="85"
|
||||
ValueChanged="OnQualityChanged"/>
|
||||
<Grid Margin="0,4,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="Smaller File" Style="{StaticResource FsCaptionStyle}"/>
|
||||
<TextBlock Grid.Column="1" Text="Higher Quality" Style="{StaticResource FsCaptionStyle}"/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Output Destination -->
|
||||
<StackPanel Margin="0,0,0,32">
|
||||
<TextBlock Text="OUTPUT DESTINATION" Style="{StaticResource FsLabelStyle}"/>
|
||||
<Grid Margin="0,8,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="OutputPathTextBox"
|
||||
Style="{StaticResource FsPathInputStyle}"
|
||||
ToolTip="비워두면 원본 폴더 안 _jpeg 하위에 저장"/>
|
||||
<Button Grid.Column="1" Margin="8,0,0,0" Width="36"
|
||||
Content="…" Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Click="OnPickOutputFolderClick"/>
|
||||
</Grid>
|
||||
<TextBlock Margin="0,6,0,0"
|
||||
Style="{StaticResource FsCaptionStyle}"
|
||||
Text="비워두면 원본 옆 _jpeg 폴더에 저장됩니다"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- File Conflict Rule -->
|
||||
<StackPanel Margin="0,0,0,32">
|
||||
<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}"
|
||||
Click="OnConflictSegmentClick"
|
||||
Tag="Skip"/>
|
||||
<ToggleButton x:Name="ConflictRenameBtn" Content="Rename"
|
||||
Style="{StaticResource FsSegmentStyle}"
|
||||
IsChecked="True"
|
||||
Click="OnConflictSegmentClick"
|
||||
Tag="Rename"/>
|
||||
<ToggleButton x:Name="ConflictReplaceBtn" Content="Replace"
|
||||
Style="{StaticResource FsSegmentStyle}"
|
||||
Click="OnConflictSegmentClick"
|
||||
Tag="Replace"/>
|
||||
</UniformGrid>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Stats Box -->
|
||||
<Border Background="{StaticResource FsBgInput}"
|
||||
BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="1" CornerRadius="6" Padding="12">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel>
|
||||
<TextBlock Text="PROCESSED TODAY"
|
||||
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="EST. SPACE SAVED"
|
||||
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="2" BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="0,1,0,0" Padding="24">
|
||||
<Button x:Name="ProcessQueueButton"
|
||||
Content="Idle — drop files to begin"
|
||||
Style="{StaticResource FsPrimaryButtonStyle}"
|
||||
IsEnabled="False"
|
||||
Click="OnProcessQueueClick"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- Provider list -->
|
||||
<ui:Card Grid.Row="2" Padding="0">
|
||||
<DockPanel>
|
||||
<Grid DockPanel.Dock="Top" Margin="20,16,20,12">
|
||||
<!-- ============== MAIN ============== -->
|
||||
<Grid Grid.Column="1" Background="{StaticResource FsBgBase}">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="56"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Nav bar -->
|
||||
<Border Grid.Row="0" BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="0,0,0,1" Padding="24,0">
|
||||
<Grid VerticalAlignment="Center">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="지원 형식" Style="{StaticResource TextSubtitle}"/>
|
||||
<TextBlock Grid.Column="1" Style="{StaticResource TextCaption}"
|
||||
VerticalAlignment="Center">
|
||||
준비된 형식만 우클릭 메뉴에 등록됩니다
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="20,0,20,16">
|
||||
<ItemsControl x:Name="ProvidersList"/>
|
||||
</ScrollViewer>
|
||||
</DockPanel>
|
||||
</ui:Card>
|
||||
|
||||
<!-- Action bar -->
|
||||
<StackPanel Grid.Row="3" Orientation="Horizontal"
|
||||
HorizontalAlignment="Right" Margin="0,20,0,0">
|
||||
<ui:Button Content="진단" Icon="{ui:SymbolIcon Stethoscope24}"
|
||||
Click="OnDiagnoseClick" Margin="0,0,8,0"/>
|
||||
<ui:Button x:Name="UnregisterButton" Content="컨텍스트 메뉴 해제"
|
||||
Icon="{ui:SymbolIcon DismissCircle24}"
|
||||
Click="OnUnregisterClick" Margin="0,0,8,0"/>
|
||||
<ui:Button x:Name="RegisterButton" Content="컨텍스트 메뉴 등록"
|
||||
Icon="{ui:SymbolIcon CheckmarkCircle24}"
|
||||
Appearance="Primary" Click="OnRegisterClick"/>
|
||||
</StackPanel>
|
||||
<!-- Tabs -->
|
||||
<Border HorizontalAlignment="Left"
|
||||
Background="{StaticResource FsBgPanel}"
|
||||
BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="1" CornerRadius="20" Padding="4">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<ToggleButton x:Name="TabActiveBtn"
|
||||
Style="{StaticResource FsTabPillStyle}"
|
||||
Click="OnTabClick" Tag="Active">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="Active Queue" VerticalAlignment="Center"/>
|
||||
<Border Margin="8,0,0,0" Style="{StaticResource FsTabBadgeStyle}">
|
||||
<TextBlock x:Name="TabActiveBadge" Text="0"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource FsTextTertiary}"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</ToggleButton>
|
||||
<ToggleButton x:Name="TabPreviewBtn" Margin="8,0,0,0"
|
||||
Style="{StaticResource FsTabPillStyle}"
|
||||
Click="OnTabClick" Tag="Preview">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="Preview" VerticalAlignment="Center"/>
|
||||
<Border Margin="8,0,0,0" Style="{StaticResource FsTabBadgeStyle}">
|
||||
<TextBlock x:Name="TabPreviewBadge" Text="0"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource FsTextTertiary}"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</ToggleButton>
|
||||
<ToggleButton x:Name="TabPastBtn" Margin="8,0,0,0"
|
||||
IsChecked="True"
|
||||
Style="{StaticResource FsTabPillStyle}"
|
||||
Click="OnTabClick" Tag="Past">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="Past Results" VerticalAlignment="Center"/>
|
||||
<Border Margin="8,0,0,0" Style="{StaticResource FsTabBadgeStyle}">
|
||||
<TextBlock x:Name="TabPastBadge" Text="0"
|
||||
FontSize="10" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource FsTextTertiary}"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</ToggleButton>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Actions -->
|
||||
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
||||
<Button Content="Register Menu" Margin="0,0,8,0"
|
||||
Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Click="OnRegisterClick"/>
|
||||
<Button Content="Diagnose" Margin="0,0,8,0"
|
||||
Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Click="OnDiagnoseClick"/>
|
||||
<Button Content="Export Log" Margin="0,0,8,0"
|
||||
Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Click="OnExportLogClick"/>
|
||||
<Button x:Name="ClearAllButton" Content="Clear All"
|
||||
Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Click="OnClearAllClick"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- View content -->
|
||||
<Grid Grid.Row="1">
|
||||
<!-- Active Queue view -->
|
||||
<Grid x:Name="ActiveQueueView" Visibility="Collapsed">
|
||||
<Grid x:Name="DropZoneEmpty">
|
||||
<Border Background="{StaticResource FsBgBase}">
|
||||
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
Margin="48">
|
||||
<Path Width="48" Height="48" Stretch="Uniform"
|
||||
Stroke="{StaticResource FsAccentBlue}" StrokeThickness="1.5"
|
||||
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 Margin="0,16,0,0" FontSize="16" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource FsTextPrimary}"
|
||||
HorizontalAlignment="Center"
|
||||
Text="Drop files anywhere to queue"/>
|
||||
<TextBlock Margin="0,4,0,0" Style="{StaticResource FsCaptionStyle}"
|
||||
HorizontalAlignment="Center"
|
||||
Text="PNG · JPG · GIF · HEIC · RAW · PDF · DOCX · HTML · HWP/HWPX"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
<ScrollViewer x:Name="ActiveQueueScroll" VerticalScrollBarVisibility="Auto"
|
||||
Padding="24" Visibility="Collapsed">
|
||||
<ItemsControl x:Name="ActiveQueueList">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Border Margin="0,0,0,8" Padding="12,10" CornerRadius="6"
|
||||
Background="{StaticResource FsBgPanel}"
|
||||
BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="1"
|
||||
Cursor="Hand"
|
||||
MouseLeftButtonUp="OnQueueRowClick"
|
||||
Tag="{Binding}">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="40"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="100"/>
|
||||
<ColumnDefinition Width="120"/>
|
||||
<ColumnDefinition Width="40"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Border Width="32" Height="32" CornerRadius="4"
|
||||
Background="{Binding FormatBrush}"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding FormatLabel}"
|
||||
Foreground="White" FontSize="10"
|
||||
FontWeight="SemiBold"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
<StackPanel Grid.Column="1" Margin="16,0,0,0"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding FileName}"
|
||||
Style="{StaticResource FsBodyStyle}"
|
||||
FontWeight="Medium"
|
||||
TextTrimming="CharacterEllipsis"/>
|
||||
<TextBlock Text="{Binding MetaLine}"
|
||||
Style="{StaticResource FsCaptionStyle}"
|
||||
Margin="0,2,0,0"/>
|
||||
</StackPanel>
|
||||
<TextBlock Grid.Column="2" Text="{Binding SizeText}"
|
||||
Style="{StaticResource FsMonoStyle}"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Center"/>
|
||||
<TextBlock Grid.Column="3" Text="{Binding StateText}"
|
||||
FontFamily="{StaticResource FsFontMono}"
|
||||
FontSize="12"
|
||||
Foreground="{Binding StateBrush}"
|
||||
VerticalAlignment="Center"/>
|
||||
<Button Grid.Column="4"
|
||||
Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Background="Transparent"
|
||||
BorderThickness="0"
|
||||
Padding="6"
|
||||
Click="OnRemoveQueueItem"
|
||||
Tag="{Binding}">
|
||||
<Path Width="14" Height="14" Stretch="Uniform"
|
||||
Stroke="{StaticResource FsTextTertiary}"
|
||||
StrokeThickness="2"
|
||||
Data="M18,6 L6,18 M6,6 L18,18"/>
|
||||
</Button>
|
||||
</Grid>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
|
||||
<!-- Preview view -->
|
||||
<Grid x:Name="PreviewView" Visibility="Collapsed" Background="{StaticResource FsBgBase}">
|
||||
<Grid Margin="32">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="320"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Image area -->
|
||||
<Border Background="{StaticResource FsBgPanel}"
|
||||
BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="1" CornerRadius="8">
|
||||
<Grid>
|
||||
<!-- Empty state -->
|
||||
<StackPanel x:Name="PreviewEmpty" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<Path Width="40" Height="40" 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="14" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource FsTextSecondary}"
|
||||
HorizontalAlignment="Center"
|
||||
Text="No preview selected"/>
|
||||
<TextBlock Margin="0,4,0,0" Style="{StaticResource FsCaptionStyle}"
|
||||
HorizontalAlignment="Center" TextAlignment="Center"
|
||||
Text="Active Queue 항목을 클릭하면
여기에 미리보기가 표시됩니다."/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Loading -->
|
||||
<StackPanel x:Name="PreviewLoading" Visibility="Collapsed"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<ProgressBar IsIndeterminate="True" Width="200" Height="3"
|
||||
Foreground="{StaticResource FsAccentBlue}"
|
||||
Background="{StaticResource FsBgInput}"/>
|
||||
<TextBlock Margin="0,12,0,0" Style="{StaticResource FsCaptionStyle}"
|
||||
HorizontalAlignment="Center"
|
||||
Text="미리보기 생성 중…"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Image -->
|
||||
<Image x:Name="PreviewImage" Stretch="Uniform" Margin="24"
|
||||
Visibility="Collapsed"/>
|
||||
|
||||
<!-- Reason / fallback -->
|
||||
<StackPanel x:Name="PreviewReason" Visibility="Collapsed"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<Path Width="36" Height="36" 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}"
|
||||
HorizontalAlignment="Center" TextAlignment="Center"
|
||||
TextWrapping="Wrap" MaxWidth="360"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- Meta panel -->
|
||||
<Border Grid.Column="1" Margin="16,0,0,0"
|
||||
Background="{StaticResource FsBgPanel}"
|
||||
BorderBrush="{StaticResource FsBorderSubtle}"
|
||||
BorderThickness="1" CornerRadius="8" Padding="20">
|
||||
<StackPanel>
|
||||
<TextBlock Text="FILE DETAIL" Style="{StaticResource FsLabelStyle}"/>
|
||||
<TextBlock x:Name="PreviewFileName" Margin="0,8,0,0"
|
||||
Style="{StaticResource FsBodyStyle}"
|
||||
FontWeight="SemiBold" TextWrapping="Wrap"
|
||||
Text="—"/>
|
||||
<TextBlock x:Name="PreviewFilePath" Margin="0,4,0,0"
|
||||
FontFamily="{StaticResource FsFontMono}" FontSize="11"
|
||||
Foreground="{StaticResource FsTextTertiary}"
|
||||
TextWrapping="Wrap"/>
|
||||
|
||||
<Border Margin="0,16,0,16" 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,6"/>
|
||||
<TextBlock x:Name="PreviewFormatText" Grid.Row="0" Grid.Column="1"
|
||||
FontFamily="{StaticResource FsFontMono}" FontSize="12"
|
||||
Foreground="{StaticResource FsTextPrimary}" Margin="0,0,0,6"/>
|
||||
|
||||
<TextBlock Grid.Row="1" Grid.Column="0" Text="Size"
|
||||
Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,6"/>
|
||||
<TextBlock x:Name="PreviewSizeText" Grid.Row="1" Grid.Column="1"
|
||||
FontFamily="{StaticResource FsFontMono}" FontSize="12"
|
||||
Foreground="{StaticResource FsTextPrimary}" Margin="0,0,0,6"/>
|
||||
|
||||
<TextBlock Grid.Row="2" Grid.Column="0" Text="Dimensions"
|
||||
Style="{StaticResource FsCaptionStyle}" Margin="0,0,0,6"/>
|
||||
<TextBlock x:Name="PreviewDimText" Grid.Row="2" Grid.Column="1"
|
||||
FontFamily="{StaticResource FsFontMono}" FontSize="12"
|
||||
Foreground="{StaticResource FsTextPrimary}" Text="—"
|
||||
Margin="0,0,0,6"/>
|
||||
|
||||
<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>
|
||||
|
||||
<Border Margin="0,20,0,16" Height="1" Background="{StaticResource FsBorderSubtle}"/>
|
||||
|
||||
<Button Content="Open in Explorer"
|
||||
Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Click="OnPreviewOpenFolder"
|
||||
HorizontalAlignment="Stretch"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
<!-- Past Results view (default) -->
|
||||
<ScrollViewer x:Name="PastResultsView" VerticalScrollBarVisibility="Auto"
|
||||
Padding="24">
|
||||
<ItemsControl x:Name="PastResultsList">
|
||||
<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 -->
|
||||
<ItemsControl ItemsSource="{Binding Entries}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Border BorderBrush="#0DFFFFFF"
|
||||
BorderThickness="0,0,0,1" Padding="0,12">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="40"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="100"/>
|
||||
<ColumnDefinition Width="100"/>
|
||||
<ColumnDefinition Width="120"/>
|
||||
<ColumnDefinition Width="40"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Border Width="32" Height="32" CornerRadius="4"
|
||||
Background="{Binding FormatBrush}"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding FormatLabel}"
|
||||
Foreground="White" FontSize="10"
|
||||
FontWeight="SemiBold"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
|
||||
<StackPanel Grid.Column="1" Margin="16,0,0,0"
|
||||
VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding FileName}"
|
||||
Style="{StaticResource FsBodyStyle}"
|
||||
FontWeight="Medium"
|
||||
TextTrimming="CharacterEllipsis"/>
|
||||
<TextBlock Text="{Binding MetaLine}"
|
||||
Style="{StaticResource FsCaptionStyle}"
|
||||
Margin="0,2,0,0"/>
|
||||
</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}"
|
||||
VerticalAlignment="Center"/>
|
||||
|
||||
<StackPanel Grid.Column="4" Orientation="Horizontal"
|
||||
VerticalAlignment="Center">
|
||||
<Path Width="12" Height="12" Stretch="Uniform"
|
||||
Stroke="{StaticResource FsAccentGreen}"
|
||||
StrokeThickness="3"
|
||||
Data="M20,6 L9,17 L4,12"/>
|
||||
<TextBlock Text="Success" Margin="6,0,0,0"
|
||||
FontSize="11" FontWeight="Medium"
|
||||
Foreground="{StaticResource FsAccentGreen}"/>
|
||||
</StackPanel>
|
||||
|
||||
<Button Grid.Column="5"
|
||||
Style="{StaticResource FsSecondaryButtonStyle}"
|
||||
Background="Transparent"
|
||||
BorderThickness="0"
|
||||
Padding="6"
|
||||
Click="OnOpenFolderClick"
|
||||
Tag="{Binding SourcePath}"
|
||||
ToolTip="원본 폴더 열기">
|
||||
<Path Width="14" Height="14" Stretch="Uniform"
|
||||
Stroke="{StaticResource FsTextTertiary}"
|
||||
StrokeThickness="2"
|
||||
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>
|
||||
|
||||
<!-- Drop hint overlay -->
|
||||
<Border x:Name="DropHintOverlay" Visibility="Collapsed"
|
||||
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>
|
||||
</Grid>
|
||||
</ui:FluentWindow>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue