1
0
Fork 0

refactor(P5b-6): 옵션/탭/충돌/결합 핸들러 5개 → 선언적 바인딩·커맨드 (의존성 0)

새 패키지 없이 회귀 없는 핸들러 제거/전환:
- OnQualityChanged 제거 → QualityValueText.Text를 Options.Quality에 StringFormat 바인딩.
- OnAiTaskChanged 제거 → AiTargetLangPanel.Visibility를 AiTaskCombo.SelectedIndex DataTrigger로.
- OnTabClick 제거 → TabCommand(ToggleButton.Command + CommandParameter "Active"/"Past").
- OnConflictSegmentClick → SetConflictRule + ConflictRuleCommand(CommandParameter "Skip/Rename/Replace").
- OnCombineToggleChanged 제거 → CombineToggleCommand(CheckBox.Command, 토글 시 발화).
- 검증: 빌드 0/0, 83 테스트 그린, publish 후 메인 창 크래시 없이 로드(언핸들드 로그 없음).
- 잔여: 동적 포맷 콤보 SelectionChanged, 드래그앤드롭, 행 미리보기 클릭(IsInsideButton 가드), 복합 ProcessQueue 버튼.
This commit is contained in:
Yun Chan 2026-06-02 10:12:26 +09:00
parent a05bbcf709
commit ccba168f9a
2 changed files with 38 additions and 50 deletions

View file

@ -107,8 +107,7 @@
Margin="0,12,0,0"
Content="단일 파일로 결합 (큐 전체 → 한 파일)"
IsEnabled="False"
Checked="OnCombineToggleChanged"
Unchecked="OnCombineToggleChanged"/>
Command="{Binding CombineToggleCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
<TextBlock x:Name="CombineHint" Margin="0,4,0,0"
Style="{StaticResource FsCaptionStyle}"
Text="PDF/TIFF/GIF 출력에 한해 큐의 이미지들을 한 파일로 결합합니다"/>
@ -129,14 +128,13 @@
<TextBlock x:Name="QualityValueText"
FontFamily="{StaticResource FsFontMono}" FontSize="12"
Foreground="{StaticResource FsAccentBlue}"
Text="85%"/>
Text="{Binding Options.Quality, RelativeSource={RelativeSource AncestorType=Window}, StringFormat={}{0}%}"/>
</Border>
</Grid>
<Slider x:Name="QualitySlider" Margin="0,12,0,0"
Style="{StaticResource FsSliderStyle}"
Minimum="1" Maximum="100"
Value="{Binding Options.Quality, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"
ValueChanged="OnQualityChanged"/>
Value="{Binding Options.Quality, RelativeSource={RelativeSource AncestorType=Window}, Mode=TwoWay}"/>
<Grid Margin="0,4,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
@ -178,17 +176,17 @@
<UniformGrid Rows="1" Columns="3">
<ToggleButton x:Name="ConflictSkipBtn" Content="Skip"
Style="{StaticResource FsSegmentStyle}"
Click="OnConflictSegmentClick"
Tag="Skip"/>
Command="{Binding ConflictRuleCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="Skip"/>
<ToggleButton x:Name="ConflictRenameBtn" Content="Rename"
Style="{StaticResource FsSegmentStyle}"
IsChecked="True"
Click="OnConflictSegmentClick"
Tag="Rename"/>
Command="{Binding ConflictRuleCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="Rename"/>
<ToggleButton x:Name="ConflictReplaceBtn" Content="Replace"
Style="{StaticResource FsSegmentStyle}"
Click="OnConflictSegmentClick"
Tag="Replace"/>
Command="{Binding ConflictRuleCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="Replace"/>
</UniformGrid>
</Border>
</StackPanel>
@ -202,8 +200,7 @@
<TextBlock Text="AI 작업" Style="{StaticResource FsLabelStyle}" VerticalAlignment="Center"/>
</StackPanel>
<ComboBox x:Name="AiTaskCombo" Margin="0,8,0,0"
SelectedIndex="0"
SelectionChanged="OnAiTaskChanged">
SelectedIndex="0">
<ComboBoxItem Content="요약"/>
<ComboBoxItem Content="번역"/>
<ComboBoxItem Content="교정"/>
@ -211,8 +208,18 @@
<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"
Visibility="Collapsed">
<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"
@ -338,7 +345,8 @@
<StackPanel Orientation="Horizontal">
<ToggleButton x:Name="TabActiveBtn"
Style="{StaticResource FsTabPillStyle}"
Click="OnTabClick" Tag="Active">
Command="{Binding TabCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="Active">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Active Queue" VerticalAlignment="Center"/>
<Border Margin="8,0,0,0" Style="{StaticResource FsTabBadgeStyle}">
@ -351,7 +359,8 @@
<ToggleButton x:Name="TabPastBtn" Margin="8,0,0,0"
IsChecked="True"
Style="{StaticResource FsTabPillStyle}"
Click="OnTabClick" Tag="Past">
Command="{Binding TabCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="Past">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Past Results" VerticalAlignment="Center"/>
<Border Margin="8,0,0,0" Style="{StaticResource FsTabBadgeStyle}">