AX Agent 프리뷰 UI를 claw-code 스타일로 정리하고 프리뷰 surface를 공통화
Some checks failed
Release Gate / gate (push) Has been cancelled
Some checks failed
Release Gate / gate (push) Has been cancelled
- AX Agent 권한 승인 프리뷰에 공통 preview surface helper를 도입해 제목/요약/본문 box 구성을 일관되게 정리함 - 우측 파일 프리뷰 패널에 파일명, 경로, 형식·크기 메타 헤더를 추가하고 텍스트 프리뷰를 bordered preview box 안에 렌더하도록 개선함 - README와 DEVELOPMENT 문서에 2026-04-06 01:08 (KST) 기준 변경 이력 반영 완료 - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ 경고 0 / 오류 0 확인
This commit is contained in:
@@ -1086,3 +1086,7 @@ MIT License
|
|||||||
- 업데이트: 2026-04-06 01:00 (KST)
|
- 업데이트: 2026-04-06 01:00 (KST)
|
||||||
- AX Agent 메시지 hover 액션을 보강해 복사/편집/재생성/수정 후 재시도/좋아요·싫어요가 실제로 보이도록 정리했다. 사용자/assistant 메시지 액션 바를 완전 숨김 대신 기본 저강도 노출 + hover 강조 방식으로 바꿔, 마우스를 올렸을 때 액션이 안 보이던 문제를 줄였다.
|
- AX Agent 메시지 hover 액션을 보강해 복사/편집/재생성/수정 후 재시도/좋아요·싫어요가 실제로 보이도록 정리했다. 사용자/assistant 메시지 액션 바를 완전 숨김 대신 기본 저강도 노출 + hover 강조 방식으로 바꿔, 마우스를 올렸을 때 액션이 안 보이던 문제를 줄였다.
|
||||||
- assistant 응답에는 응답시간과 총 토큰 수를 메시지 메타로 저장해 transcript 아래에 함께 표시되게 했다. 반영 위치는 [ChatModels.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Models/ChatModels.cs), [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 이다.
|
- assistant 응답에는 응답시간과 총 토큰 수를 메시지 메타로 저장해 transcript 아래에 함께 표시되게 했다. 반영 위치는 [ChatModels.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Models/ChatModels.cs), [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 이다.
|
||||||
|
- 업데이트: 2026-04-06 01:08 (KST)
|
||||||
|
- `claw-code`의 `SessionPreview`/`PreviewBox` 흐름을 참고해 AX Agent 프리뷰도 같은 시각 언어로 정리했다. 새 파일 [AgentPreviewSurfaceFactory.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/AgentPreviewSurfaceFactory.cs)를 추가해 권한 프리뷰 카드의 제목/요약/본문 박스 구조를 공통화했다.
|
||||||
|
- [PermissionRequestWindow.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/PermissionRequestWindow.cs)의 일반 프리뷰, 파일 편집 프리뷰, 파일 생성 2열 프리뷰를 이 공통 surface로 맞춰 `preview box` 언어를 통일했다.
|
||||||
|
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 우측 파일 프리뷰 패널에는 파일명/경로/형식·크기 메타를 보여주는 헤더를 추가하고, 텍스트 프리뷰 본문도 별도 bordered preview box 안에 렌더되게 바꿨다.
|
||||||
|
|||||||
@@ -4846,3 +4846,8 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
|
|||||||
- [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs) 의 `CommitAssistantMessage()` / `FinalizeAssistantTurn()`은 응답 메타를 함께 커밋하도록 확장했다.
|
- [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs) 의 `CommitAssistantMessage()` / `FinalizeAssistantTurn()`은 응답 메타를 함께 커밋하도록 확장했다.
|
||||||
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서는 실행 완료 시 `_llm.LastTokenUsage`, 누적 에이전트 토큰, 응답 경과 시간을 assistant 메시지에 저장하고, transcript 렌더 시 `응답시간 · 총 토큰` 메타를 assistant bubble 아래에 함께 표시하도록 연결했다.
|
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서는 실행 완료 시 `_llm.LastTokenUsage`, 누적 에이전트 토큰, 응답 경과 시간을 assistant 메시지에 저장하고, transcript 렌더 시 `응답시간 · 총 토큰` 메타를 assistant bubble 아래에 함께 표시하도록 연결했다.
|
||||||
- 사용자/assistant 메시지 액션 바는 완전 숨김(Opacity 0) 대신 기본 저강도 노출 + hover 시 100% 강조로 바꿨다. 이로써 메시지에 마우스를 올렸을 때 복사/편집/재생성/수정 후 재시도/좋아요·싫어요가 보이지 않던 UX 문제를 줄였다.
|
- 사용자/assistant 메시지 액션 바는 완전 숨김(Opacity 0) 대신 기본 저강도 노출 + hover 시 100% 강조로 바꿨다. 이로써 메시지에 마우스를 올렸을 때 복사/편집/재생성/수정 후 재시도/좋아요·싫어요가 보이지 않던 UX 문제를 줄였다.
|
||||||
|
- 업데이트: 2026-04-06 01:08 (KST)
|
||||||
|
- `claw-code`의 `SessionPreview.tsx`, `PreviewBox.tsx`를 참고해 AX Agent 프리뷰 surface를 공통화했다. [AgentPreviewSurfaceFactory.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/AgentPreviewSurfaceFactory.cs)를 추가해 `title + summary + preview box` 구조를 재사용 가능한 helper로 분리했다.
|
||||||
|
- [PermissionRequestWindow.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/PermissionRequestWindow.cs) 의 `BuildPreviewCard`, `BuildFileEditPreviewCard`, `BuildFileWriteTwoColumnPreviewCard`는 이 helper를 쓰도록 정리해 권한 승인 프리뷰가 같은 preview 언어를 따르도록 맞췄다.
|
||||||
|
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 의 우측 프리뷰 패널 헤더를 `파일명 / 경로 / 형식·크기 메타` 구조로 재배치하고, [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에 `SetPreviewHeader`, `SetPreviewHeaderState`를 추가해 현재 탭 파일 메타를 표시하도록 했다.
|
||||||
|
- 텍스트 프리뷰 본문도 bordered preview box 안에 렌더되게 바꿔, AX Agent 파일 프리뷰와 transcript/승인 프리뷰 사이 시각 언어를 더 가깝게 맞췄다.
|
||||||
|
|||||||
85
src/AxCopilot/Views/AgentPreviewSurfaceFactory.cs
Normal file
85
src/AxCopilot/Views/AgentPreviewSurfaceFactory.cs
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace AxCopilot.Views;
|
||||||
|
|
||||||
|
internal static class AgentPreviewSurfaceFactory
|
||||||
|
{
|
||||||
|
internal static Border CreateSurface(
|
||||||
|
string title,
|
||||||
|
string summary,
|
||||||
|
UIElement body,
|
||||||
|
Brush primary,
|
||||||
|
Brush secondary,
|
||||||
|
Brush itemBackground,
|
||||||
|
Brush borderBrush,
|
||||||
|
Thickness? margin = null)
|
||||||
|
{
|
||||||
|
return new Border
|
||||||
|
{
|
||||||
|
Background = itemBackground,
|
||||||
|
BorderBrush = borderBrush,
|
||||||
|
BorderThickness = new Thickness(1),
|
||||||
|
CornerRadius = new CornerRadius(12),
|
||||||
|
Padding = new Thickness(12, 10, 12, 10),
|
||||||
|
Margin = margin ?? new Thickness(0, 8, 0, 0),
|
||||||
|
Child = new StackPanel
|
||||||
|
{
|
||||||
|
Children =
|
||||||
|
{
|
||||||
|
new TextBlock
|
||||||
|
{
|
||||||
|
Text = title,
|
||||||
|
FontSize = 12,
|
||||||
|
FontWeight = FontWeights.SemiBold,
|
||||||
|
Foreground = primary,
|
||||||
|
},
|
||||||
|
new TextBlock
|
||||||
|
{
|
||||||
|
Text = summary,
|
||||||
|
FontSize = 11,
|
||||||
|
Foreground = secondary,
|
||||||
|
Margin = new Thickness(0, 2, 0, 8),
|
||||||
|
TextWrapping = TextWrapping.Wrap,
|
||||||
|
},
|
||||||
|
body
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static Border CreatePreviewBox(
|
||||||
|
string content,
|
||||||
|
Brush primary,
|
||||||
|
Brush secondary,
|
||||||
|
Brush borderBrush,
|
||||||
|
double maxHeight,
|
||||||
|
bool monospace = true)
|
||||||
|
{
|
||||||
|
var panel = new Border
|
||||||
|
{
|
||||||
|
Background = Brushes.Transparent,
|
||||||
|
BorderBrush = new SolidColorBrush(Color.FromArgb(0x20, 0x80, 0x80, 0x80)),
|
||||||
|
BorderThickness = new Thickness(1),
|
||||||
|
CornerRadius = new CornerRadius(8),
|
||||||
|
Padding = new Thickness(8, 6, 8, 6),
|
||||||
|
Child = new ScrollViewer
|
||||||
|
{
|
||||||
|
MaxHeight = maxHeight,
|
||||||
|
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
|
||||||
|
Content = new TextBlock
|
||||||
|
{
|
||||||
|
Text = string.IsNullOrWhiteSpace(content) ? "(empty)" : content,
|
||||||
|
Foreground = primary,
|
||||||
|
FontFamily = monospace ? new FontFamily("Consolas") : new FontFamily("Pretendard"),
|
||||||
|
FontSize = 11.2,
|
||||||
|
TextWrapping = TextWrapping.Wrap,
|
||||||
|
LineHeight = 18,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5240,21 +5240,29 @@
|
|||||||
BorderBrush="{DynamicResource BorderColor}"
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
BorderThickness="1,0,0,0">
|
BorderThickness="1,0,0,0">
|
||||||
<DockPanel LastChildFill="True">
|
<DockPanel LastChildFill="True">
|
||||||
<!-- 탭 바 + 도구 버튼 (DockPanel.Top — WebView2 위에 독립 레이어) -->
|
|
||||||
<Border DockPanel.Dock="Top" Background="{DynamicResource HintBackground}"
|
<Border DockPanel.Dock="Top" Background="{DynamicResource HintBackground}"
|
||||||
BorderBrush="{DynamicResource BorderColor}" BorderThickness="0,0,0,1"
|
BorderBrush="{DynamicResource BorderColor}" BorderThickness="0,0,0,1"
|
||||||
Padding="0" Panel.ZIndex="10" Focusable="True"
|
Padding="12,10,12,8">
|
||||||
PreviewMouseDown="PreviewTabBar_PreviewMouseDown">
|
<StackPanel>
|
||||||
<Grid>
|
<Grid Margin="0,0,0,8">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
<ColumnDefinition Width="Auto"/>
|
<ColumnDefinition Width="Auto"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Hidden"
|
<StackPanel>
|
||||||
VerticalScrollBarVisibility="Disabled" CanContentScroll="True">
|
<TextBlock x:Name="PreviewHeaderTitle"
|
||||||
<StackPanel x:Name="PreviewTabPanel" Orientation="Horizontal"/>
|
Text="미리보기"
|
||||||
</ScrollViewer>
|
FontSize="13"
|
||||||
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="4,0">
|
FontWeight="SemiBold"
|
||||||
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
<TextBlock x:Name="PreviewHeaderSubtitle"
|
||||||
|
Text="선택한 파일이 여기에 표시됩니다"
|
||||||
|
FontSize="11.5"
|
||||||
|
Margin="0,2,0,0"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"
|
||||||
|
TextTrimming="CharacterEllipsis"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="8,0,0,0">
|
||||||
<Button x:Name="BtnOpenExternal" Style="{StaticResource GhostBtn}" Padding="6"
|
<Button x:Name="BtnOpenExternal" Style="{StaticResource GhostBtn}" Padding="6"
|
||||||
Click="BtnOpenExternal_Click" ToolTip="외부 프로그램으로 열기" Cursor="Hand">
|
Click="BtnOpenExternal_Click" ToolTip="외부 프로그램으로 열기" Cursor="Hand">
|
||||||
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12"
|
<TextBlock Text="" FontFamily="Segoe MDL2 Assets" FontSize="12"
|
||||||
@@ -5267,16 +5275,53 @@
|
|||||||
</Button>
|
</Button>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
<Border Background="{DynamicResource LauncherBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1"
|
||||||
|
CornerRadius="10"
|
||||||
|
Padding="0"
|
||||||
|
Panel.ZIndex="10"
|
||||||
|
Focusable="True"
|
||||||
|
PreviewMouseDown="PreviewTabBar_PreviewMouseDown">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Hidden"
|
||||||
|
VerticalScrollBarVisibility="Disabled" CanContentScroll="True">
|
||||||
|
<StackPanel x:Name="PreviewTabPanel" Orientation="Horizontal"/>
|
||||||
|
</ScrollViewer>
|
||||||
|
<Border Grid.Column="1"
|
||||||
|
Margin="6,6,6,6"
|
||||||
|
Padding="8,4"
|
||||||
|
Background="{DynamicResource HintBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="999">
|
||||||
|
<TextBlock x:Name="PreviewHeaderMeta"
|
||||||
|
Text="파일 메타"
|
||||||
|
FontSize="10.5"
|
||||||
|
Foreground="{DynamicResource SecondaryText}"/>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<!-- 미리보기 콘텐츠 영역 (DockPanel.Fill — WebView2는 여기에만 존재) -->
|
<!-- 미리보기 콘텐츠 영역 (DockPanel.Fill — WebView2는 여기에만 존재) -->
|
||||||
<Grid ClipToBounds="True">
|
<Grid ClipToBounds="True" Background="{DynamicResource LauncherBackground}">
|
||||||
<wv2:WebView2 x:Name="PreviewWebView" Visibility="Collapsed"/>
|
<wv2:WebView2 x:Name="PreviewWebView" Visibility="Collapsed"/>
|
||||||
<ScrollViewer x:Name="PreviewTextScroll" Visibility="Collapsed"
|
<ScrollViewer x:Name="PreviewTextScroll" Visibility="Collapsed"
|
||||||
VerticalScrollBarVisibility="Auto" Padding="12,8">
|
VerticalScrollBarVisibility="Auto" Padding="16,14">
|
||||||
|
<Border Background="{DynamicResource HintBackground}"
|
||||||
|
BorderBrush="{DynamicResource BorderColor}"
|
||||||
|
BorderThickness="1"
|
||||||
|
CornerRadius="12"
|
||||||
|
Padding="12,10">
|
||||||
<TextBlock x:Name="PreviewTextBlock" TextWrapping="Wrap"
|
<TextBlock x:Name="PreviewTextBlock" TextWrapping="Wrap"
|
||||||
FontFamily="Consolas" FontSize="12"
|
FontFamily="Consolas" FontSize="12"
|
||||||
Foreground="{DynamicResource PrimaryText}"/>
|
Foreground="{DynamicResource PrimaryText}"/>
|
||||||
|
</Border>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
<DataGrid x:Name="PreviewDataGrid" Visibility="Collapsed"
|
<DataGrid x:Name="PreviewDataGrid" Visibility="Collapsed"
|
||||||
AutoGenerateColumns="True" IsReadOnly="True"
|
AutoGenerateColumns="True" IsReadOnly="True"
|
||||||
|
|||||||
@@ -17460,6 +17460,7 @@ public partial class ChatWindow : Window
|
|||||||
private async void LoadPreviewContent(string filePath)
|
private async void LoadPreviewContent(string filePath)
|
||||||
{
|
{
|
||||||
var ext = System.IO.Path.GetExtension(filePath).ToLowerInvariant();
|
var ext = System.IO.Path.GetExtension(filePath).ToLowerInvariant();
|
||||||
|
SetPreviewHeader(filePath);
|
||||||
|
|
||||||
// 모든 콘텐츠 숨기기
|
// 모든 콘텐츠 숨기기
|
||||||
PreviewWebView.Visibility = Visibility.Collapsed;
|
PreviewWebView.Visibility = Visibility.Collapsed;
|
||||||
@@ -17469,6 +17470,7 @@ public partial class ChatWindow : Window
|
|||||||
|
|
||||||
if (!System.IO.File.Exists(filePath))
|
if (!System.IO.File.Exists(filePath))
|
||||||
{
|
{
|
||||||
|
SetPreviewHeaderState("파일을 찾을 수 없습니다");
|
||||||
PreviewEmpty.Text = "파일을 찾을 수 없습니다";
|
PreviewEmpty.Text = "파일을 찾을 수 없습니다";
|
||||||
PreviewEmpty.Visibility = Visibility.Visible;
|
PreviewEmpty.Visibility = Visibility.Visible;
|
||||||
return;
|
return;
|
||||||
@@ -17510,6 +17512,7 @@ public partial class ChatWindow : Window
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
SetPreviewHeaderState("지원되지 않는 형식");
|
||||||
PreviewEmpty.Text = "미리보기할 수 없는 파일 형식입니다";
|
PreviewEmpty.Text = "미리보기할 수 없는 파일 형식입니다";
|
||||||
PreviewEmpty.Visibility = Visibility.Visible;
|
PreviewEmpty.Visibility = Visibility.Visible;
|
||||||
break;
|
break;
|
||||||
@@ -17517,11 +17520,39 @@ public partial class ChatWindow : Window
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
SetPreviewHeaderState("미리보기 오류");
|
||||||
PreviewTextBlock.Text = $"미리보기 오류: {ex.Message}";
|
PreviewTextBlock.Text = $"미리보기 오류: {ex.Message}";
|
||||||
PreviewTextScroll.Visibility = Visibility.Visible;
|
PreviewTextScroll.Visibility = Visibility.Visible;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetPreviewHeader(string filePath)
|
||||||
|
{
|
||||||
|
if (PreviewHeaderTitle == null || PreviewHeaderSubtitle == null || PreviewHeaderMeta == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var fileName = System.IO.Path.GetFileName(filePath);
|
||||||
|
var extension = System.IO.Path.GetExtension(filePath).TrimStart('.').ToUpperInvariant();
|
||||||
|
var fileInfo = new System.IO.FileInfo(filePath);
|
||||||
|
var sizeText = fileInfo.Exists
|
||||||
|
? fileInfo.Length >= 1024 * 1024
|
||||||
|
? $"{fileInfo.Length / 1024d / 1024d:F1} MB"
|
||||||
|
: $"{Math.Max(1, fileInfo.Length / 1024d):F0} KB"
|
||||||
|
: "파일 없음";
|
||||||
|
|
||||||
|
PreviewHeaderTitle.Text = string.IsNullOrWhiteSpace(fileName) ? "미리보기" : fileName;
|
||||||
|
PreviewHeaderSubtitle.Text = filePath;
|
||||||
|
PreviewHeaderMeta.Text = string.IsNullOrWhiteSpace(extension)
|
||||||
|
? sizeText
|
||||||
|
: $"{extension} · {sizeText}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetPreviewHeaderState(string state)
|
||||||
|
{
|
||||||
|
if (PreviewHeaderMeta != null && !string.IsNullOrWhiteSpace(state))
|
||||||
|
PreviewHeaderMeta.Text = state;
|
||||||
|
}
|
||||||
|
|
||||||
private bool _webViewInitialized;
|
private bool _webViewInitialized;
|
||||||
private static readonly string WebView2DataFolder =
|
private static readonly string WebView2DataFolder =
|
||||||
System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||||
@@ -17617,6 +17648,9 @@ public partial class ChatWindow : Window
|
|||||||
{
|
{
|
||||||
_previewTabs.Clear();
|
_previewTabs.Clear();
|
||||||
_activePreviewTab = null;
|
_activePreviewTab = null;
|
||||||
|
if (PreviewHeaderTitle != null) PreviewHeaderTitle.Text = "미리보기";
|
||||||
|
if (PreviewHeaderSubtitle != null) PreviewHeaderSubtitle.Text = "선택한 파일이 여기에 표시됩니다";
|
||||||
|
if (PreviewHeaderMeta != null) PreviewHeaderMeta.Text = "파일 메타";
|
||||||
PreviewColumn.Width = new GridLength(0);
|
PreviewColumn.Width = new GridLength(0);
|
||||||
SplitterColumn.Width = new GridLength(0);
|
SplitterColumn.Width = new GridLength(0);
|
||||||
PreviewPanel.Visibility = Visibility.Collapsed;
|
PreviewPanel.Visibility = Visibility.Collapsed;
|
||||||
|
|||||||
@@ -581,48 +581,19 @@ internal sealed class PermissionRequestWindow : Window
|
|||||||
Brush border,
|
Brush border,
|
||||||
UiExpressionProfile uiProfile)
|
UiExpressionProfile uiProfile)
|
||||||
{
|
{
|
||||||
return new Border
|
return AgentPreviewSurfaceFactory.CreateSurface(
|
||||||
{
|
title,
|
||||||
Background = itemBg,
|
summary,
|
||||||
BorderBrush = border,
|
AgentPreviewSurfaceFactory.CreatePreviewBox(
|
||||||
BorderThickness = new Thickness(1),
|
content,
|
||||||
CornerRadius = new CornerRadius(10),
|
primary,
|
||||||
Padding = new Thickness(10, 8, 10, 8),
|
secondary,
|
||||||
Margin = new Thickness(0, 8, 0, 0),
|
border,
|
||||||
Child = new StackPanel
|
uiProfile.PreviewMaxHeight),
|
||||||
{
|
primary,
|
||||||
Children =
|
secondary,
|
||||||
{
|
itemBg,
|
||||||
new TextBlock
|
border);
|
||||||
{
|
|
||||||
Text = title,
|
|
||||||
FontSize = 11.5,
|
|
||||||
FontWeight = FontWeights.SemiBold,
|
|
||||||
Foreground = primary,
|
|
||||||
},
|
|
||||||
new TextBlock
|
|
||||||
{
|
|
||||||
Text = summary,
|
|
||||||
FontSize = 11,
|
|
||||||
Foreground = secondary,
|
|
||||||
Margin = new Thickness(0, 2, 0, 6),
|
|
||||||
},
|
|
||||||
new TextBox
|
|
||||||
{
|
|
||||||
Text = content,
|
|
||||||
IsReadOnly = true,
|
|
||||||
BorderThickness = new Thickness(0),
|
|
||||||
Background = Brushes.Transparent,
|
|
||||||
Foreground = primary,
|
|
||||||
FontFamily = new FontFamily("Consolas"),
|
|
||||||
FontSize = 11,
|
|
||||||
MaxHeight = uiProfile.PreviewMaxHeight,
|
|
||||||
TextWrapping = TextWrapping.Wrap,
|
|
||||||
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Border BuildFileEditPreviewCard(
|
private static Border BuildFileEditPreviewCard(
|
||||||
@@ -679,41 +650,19 @@ internal sealed class PermissionRequestWindow : Window
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Border
|
return AgentPreviewSurfaceFactory.CreateSurface(
|
||||||
{
|
title,
|
||||||
Background = itemBg,
|
summary,
|
||||||
BorderBrush = border,
|
AgentPreviewSurfaceFactory.CreatePreviewBox(
|
||||||
BorderThickness = new Thickness(1),
|
string.Join("\n", body.Children.OfType<TextBlock>().Select(tb => tb.Text)),
|
||||||
CornerRadius = new CornerRadius(10),
|
primary,
|
||||||
Padding = new Thickness(10, 8, 10, 8),
|
secondary,
|
||||||
Margin = new Thickness(0, 8, 0, 0),
|
border,
|
||||||
Child = new StackPanel
|
uiProfile.PreviewMaxHeight),
|
||||||
{
|
primary,
|
||||||
Children =
|
secondary,
|
||||||
{
|
itemBg,
|
||||||
new TextBlock
|
border);
|
||||||
{
|
|
||||||
Text = title,
|
|
||||||
FontSize = 11.5,
|
|
||||||
FontWeight = FontWeights.SemiBold,
|
|
||||||
Foreground = primary,
|
|
||||||
},
|
|
||||||
new TextBlock
|
|
||||||
{
|
|
||||||
Text = summary,
|
|
||||||
FontSize = 11,
|
|
||||||
Foreground = secondary,
|
|
||||||
Margin = new Thickness(0, 2, 0, 6),
|
|
||||||
},
|
|
||||||
new ScrollViewer
|
|
||||||
{
|
|
||||||
MaxHeight = uiProfile.PreviewMaxHeight,
|
|
||||||
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
|
|
||||||
Content = body,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Border BuildFileWriteTwoColumnPreviewCard(
|
private static Border BuildFileWriteTwoColumnPreviewCard(
|
||||||
@@ -764,36 +713,14 @@ internal sealed class PermissionRequestWindow : Window
|
|||||||
Grid.SetColumn(newPanel, 2);
|
Grid.SetColumn(newPanel, 2);
|
||||||
grid.Children.Add(newPanel);
|
grid.Children.Add(newPanel);
|
||||||
|
|
||||||
return new Border
|
return AgentPreviewSurfaceFactory.CreateSurface(
|
||||||
{
|
title,
|
||||||
Background = itemBg,
|
summary,
|
||||||
BorderBrush = border,
|
|
||||||
BorderThickness = new Thickness(1),
|
|
||||||
CornerRadius = new CornerRadius(10),
|
|
||||||
Padding = new Thickness(10, 8, 10, 8),
|
|
||||||
Margin = new Thickness(0, 8, 0, 0),
|
|
||||||
Child = new StackPanel
|
|
||||||
{
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new TextBlock
|
|
||||||
{
|
|
||||||
Text = title,
|
|
||||||
FontSize = 11.5,
|
|
||||||
FontWeight = FontWeights.SemiBold,
|
|
||||||
Foreground = primary,
|
|
||||||
},
|
|
||||||
new TextBlock
|
|
||||||
{
|
|
||||||
Text = summary,
|
|
||||||
FontSize = 11,
|
|
||||||
Foreground = secondary,
|
|
||||||
Margin = new Thickness(0, 2, 0, 6),
|
|
||||||
},
|
|
||||||
grid,
|
grid,
|
||||||
}
|
primary,
|
||||||
}
|
secondary,
|
||||||
};
|
itemBg,
|
||||||
|
border);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Border BuildWriteColumn(
|
private static Border BuildWriteColumn(
|
||||||
@@ -1161,7 +1088,7 @@ internal sealed class PermissionRequestWindow : Window
|
|||||||
Owner = owner,
|
Owner = owner,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (owner.Resources.MergedDictionaries.Count > 0)
|
dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
||||||
dialog.Resources.MergedDictionaries.Add(owner.Resources);
|
dialog.Resources.MergedDictionaries.Add(owner.Resources);
|
||||||
|
|
||||||
dialog.ShowDialog();
|
dialog.ShowDialog();
|
||||||
|
|||||||
Reference in New Issue
Block a user