런처 클립보드 이미지 미리보기 창을 추가하고 개발 문서 이력 기록 규칙을 반영\n\n- Phase L2-3로 클립보드 이미지 전용 미리보기 창 ClipboardImagePreviewWindow를 신규 추가\n- 원본 해상도 이미지 표시, Ctrl+휠 및 + / - / 0 / F / Esc 단축키 기반 줌 조작 지원\n- PNG, JPEG, BMP 저장과 클립보드 복사 기능을 미리보기 창에서 바로 수행 가능하도록 구현\n- LauncherWindow에서 # 클립보드 이미지 항목 선택 후 Shift+Enter로 미리보기 창을 여는 흐름 추가\n- 단축키 도움말에 클립보드 이미지 미리보기 동작을 반영\n- 런처 CenterOnScreen을 마우스가 위치한 모니터 기준으로 보정해 다중 디스플레이 표시 위치를 개선\n- AGENTS.md에 README.md, docs/DEVELOPMENT.md 이력 선반영 및 업데이트 날짜/시간 기록 규칙을 추가\n- README.md, docs/DEVELOPMENT.md, docs/LAUNCHER_ROADMAP.md에 v0.7.3 이력과 2026-04-04 10:05 (KST) 업데이트 시각 반영\n- dotnet build 경고 0 / 오류 0, dotnet test 436 통과 확인
Some checks failed
Release Gate / gate (push) Has been cancelled

This commit is contained in:
2026-04-04 10:12:15 +09:00
parent 442e8c2415
commit c56a841549
9 changed files with 630 additions and 80 deletions

View File

@@ -0,0 +1,214 @@
<Window x:Class="AxCopilot.Views.ClipboardImagePreviewWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="클립보드 이미지 미리보기"
Width="1080"
Height="760"
MinWidth="760"
MinHeight="560"
WindowStyle="None"
AllowsTransparency="True"
ResizeMode="CanResizeWithGrip"
Background="Transparent"
WindowStartupLocation="CenterOwner"
KeyDown="Window_KeyDown">
<Grid Margin="14">
<Border CornerRadius="18"
Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1">
<Border.Effect>
<DropShadowEffect BlurRadius="24" ShadowDepth="4" Opacity="0.22" Color="Black"/>
</Border.Effect>
</Border>
<Border Background="{DynamicResource LauncherBackground}"
CornerRadius="18"
ClipToBounds="True">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="56"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="44"/>
</Grid.RowDefinitions>
<Border Grid.Row="0"
CornerRadius="18,18,0,0"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="0,0,0,1"
MouseLeftButtonDown="TitleBar_MouseLeftButtonDown">
<Grid Margin="18,0,12,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Border Background="{DynamicResource AccentColor}"
CornerRadius="8"
Padding="7,4"
Margin="0,0,10,0">
<TextBlock Text="&#xE91B;"
FontFamily="Segoe MDL2 Assets"
FontSize="14"
Foreground="White"/>
</Border>
<StackPanel>
<TextBlock x:Name="TitleText"
Text="클립보드 이미지 미리보기"
FontSize="14"
FontWeight="SemiBold"
Foreground="{DynamicResource PrimaryText}"/>
<TextBlock x:Name="MetaText"
Text="원본 이미지"
Margin="0,2,0,0"
FontSize="11"
Foreground="{DynamicResource SecondaryText}"/>
</StackPanel>
</StackPanel>
<StackPanel Grid.Column="1"
Orientation="Horizontal"
VerticalAlignment="Center">
<Border Width="34"
Height="34"
Margin="0,0,6,0"
Background="Transparent"
CornerRadius="9"
Cursor="Hand"
MouseLeftButtonUp="BtnResetZoom_MouseLeftButtonUp">
<TextBlock Text="100%"
FontSize="10.5"
FontWeight="SemiBold"
Foreground="{DynamicResource SecondaryText}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
<Border Width="34"
Height="34"
Background="Transparent"
CornerRadius="9"
Cursor="Hand"
MouseLeftButtonUp="BtnClose_MouseLeftButtonUp">
<TextBlock Text="&#xE711;"
FontFamily="Segoe MDL2 Assets"
FontSize="10"
Foreground="{DynamicResource SecondaryText}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
</StackPanel>
</Grid>
</Border>
<Border Grid.Row="1"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="0,0,0,1"
Padding="16,12">
<WrapPanel VerticalAlignment="Center" ItemHeight="36">
<Button x:Name="BtnCopyImage"
Content="클립보드 복사"
Margin="0,0,8,8"
Padding="12,6"
MinWidth="108"
Click="BtnCopyImage_Click"/>
<Button x:Name="BtnSavePng"
Content="PNG 저장"
Margin="0,0,8,8"
Padding="12,6"
MinWidth="96"
Click="BtnSavePng_Click"/>
<Button x:Name="BtnSaveJpeg"
Content="JPEG 저장"
Margin="0,0,8,8"
Padding="12,6"
MinWidth="96"
Click="BtnSaveJpeg_Click"/>
<Button x:Name="BtnSaveBmp"
Content="BMP 저장"
Margin="0,0,8,8"
Padding="12,6"
MinWidth="96"
Click="BtnSaveBmp_Click"/>
<Button x:Name="BtnZoomIn"
Content="확대"
Margin="0,0,8,8"
Padding="12,6"
MinWidth="72"
Click="BtnZoomIn_Click"/>
<Button x:Name="BtnZoomOut"
Content="축소"
Margin="0,0,8,8"
Padding="12,6"
MinWidth="72"
Click="BtnZoomOut_Click"/>
<Button x:Name="BtnFit"
Content="창에 맞춤"
Margin="0,0,8,8"
Padding="12,6"
MinWidth="96"
Click="BtnFit_Click"/>
</WrapPanel>
</Border>
<Border Grid.Row="2"
Background="{DynamicResource LauncherBackground}">
<Grid Margin="14">
<Border CornerRadius="16"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1">
<ScrollViewer x:Name="ImageScrollViewer"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
PreviewMouseWheel="ImageScrollViewer_PreviewMouseWheel"
SizeChanged="ImageScrollViewer_SizeChanged">
<Grid x:Name="ImageHost"
Background="{DynamicResource LauncherBackground}"
Width="{Binding ElementName=ImageScrollViewer, Path=ViewportWidth}"
Height="{Binding ElementName=ImageScrollViewer, Path=ViewportHeight}">
<Image x:Name="PreviewImage"
Stretch="None"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RenderOptions.BitmapScalingMode="HighQuality">
<Image.RenderTransform>
<ScaleTransform x:Name="ImageScaleTransform"
ScaleX="1"
ScaleY="1"/>
</Image.RenderTransform>
</Image>
</Grid>
</ScrollViewer>
</Border>
</Grid>
</Border>
<Border Grid.Row="3"
Background="{DynamicResource ItemBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="0,1,0,0"
Padding="16,0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="StatusText"
VerticalAlignment="Center"
FontSize="11.5"
Foreground="{DynamicResource SecondaryText}"/>
<TextBlock Grid.Column="1"
VerticalAlignment="Center"
FontSize="11"
Foreground="{DynamicResource SecondaryText}"
Text="Ctrl+휠 확대/축소 · + / - · 0 원본 · F 맞춤 · Esc 닫기"/>
</Grid>
</Border>
</Grid>
</Border>
</Grid>
</Window>