AX Agent 프리셋 안내와 상단 탭 레이아웃 복구\n\n- Chat/Cowork 프리셋 빈 화면을 Stretch 기반으로 바꿔 카드 하단 잘림을 줄임\n- 선택한 대화 주제/작업 유형을 헤더 중앙 가이드로 다시 표시하도록 복구\n- 상단 탭 pill 그룹과 하단 사용자 영역 설정 버튼 크기를 키워 가독성 보정\n- README와 DEVELOPMENT 문서에 2026-04-05 19:59(KST) 기준 변경 이력 반영\n- 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0 / 오류 0)
Some checks failed
Release Gate / gate (push) Has been cancelled
Some checks failed
Release Gate / gate (push) Has been cancelled
This commit is contained in:
@@ -915,6 +915,12 @@ ow + toggle 시각 언어로 통일했습니다.
|
||||
- [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) 에서는 숨김 상태였던 inline/overlay 계획 모드 click/selection 잔재를 제거해 dead UI code를 더 줄였습니다. 사용자 노출 정책은 그대로 `off` 고정입니다.
|
||||
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0
|
||||
- 업데이트: 2026-04-05 19:49 (KST)
|
||||
- AX Agent 프리셋 첫 화면 레이아웃을 다시 정리했습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 `EmptyState` 를 `Stretch + ScrollViewer` 구조로 바꿔 Chat/Cowork 프리셋 카드 하단이 잘리던 문제를 줄였고, `TopicPresetScrollViewer` 최대 높이와 내부 패딩도 함께 키웠습니다.
|
||||
- 같은 파일에 헤더 중앙 `SelectedPresetGuide` 를 추가해, 대화 주제나 작업 유형을 선택하면 선택된 항목과 설명이 다시 상단 중앙에 안내되도록 복구했습니다. 상단 탭 pill 그룹도 배경/패딩/폰트를 다시 키워 이전보다 더 또렷하게 보이도록 보정했습니다.
|
||||
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에 `UpdateSelectedPresetGuide(...)` 를 추가하고 `UpdateChatTitle()`, `SelectTopic(...)` 에 연결했습니다. 이제 프리셋 선택 직후뿐 아니라 대화 재오픈/탭 전환 시에도 선택된 주제 안내가 다시 살아납니다.
|
||||
- 사이드바 하단 사용자 영역의 설정 버튼도 `32x32`, 아이콘 `15px` 기준으로 키워 너무 작게 보이던 문제를 함께 보정했습니다.
|
||||
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\` 경고 0 / 오류 0
|
||||
- 업데이트: 2026-04-05 19:59 (KST)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -4678,3 +4678,9 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
|
||||
- 이번 정리로 `PlanMode` 는 정책상 `off` 고정이라는 사실과 실제 런타임/UI 흐름이 더 일치하게 됐습니다. 남은 잔재는 메인 설정 구형 카드와 상태 저장 구조 쪽이라 다음 단계에서 `AppSettings / SettingsViewModel / AppStateService` 축으로 계속 줄이면 됩니다.
|
||||
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0
|
||||
- 업데이트: 2026-04-05 19:49 (KST)
|
||||
- AX Agent 프리셋 빈 화면 레이아웃을 다시 손봤습니다. [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 의 `EmptyState` 는 `VerticalAlignment="Stretch"` 와 `Grid.Row="*"` 기반으로 바뀌었고, `TopicPresetScrollViewer` 는 `Auto` 스크롤과 `MaxHeight=420`, 추가 패딩을 적용했습니다. Chat/Cowork 탭에서 카드 하단이 잘리거나 `프리셋 추가` 카드가 반쯤 잘려 보이던 현상을 줄이기 위한 조정입니다.
|
||||
- 같은 XAML에 헤더 중앙 안내 패널 `SelectedPresetGuide` 를 추가했습니다. 선택된 대화 주제/작업 유형과 한 줄 설명을 상단 중앙에 다시 보여주는 용도이며, 기존 좌측 대화 제목과 우측 프리뷰 토글 사이의 빈 공간을 쓰도록 3열 Grid 구조로 재배치했습니다.
|
||||
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에 `UpdateSelectedPresetGuide(ChatConversation?)` 를 추가했습니다. 이 메서드는 현재 탭과 conversation category를 기준으로 `PresetService.GetByTabWithCustom(...)` 결과를 조회해 라벨/설명을 복구하고, 코드 탭이거나 일치하는 프리셋이 없으면 안내를 숨깁니다. `UpdateChatTitle()` 와 `SelectTopic(...)` 에 연결해 새 선택, 대화 재오픈, 탭 전환 시 모두 동일하게 반영되도록 했습니다.
|
||||
- 상단 탭 그룹과 사이드바 설정 버튼도 다시 키웠습니다. `TopTabBtn` 은 폰트 `14.5`, 패딩 `24x10`, 최소 너비 `78` 기준으로 키우고 선택 상태 배경을 `ItemBackground` 로 바꿨으며, 탭 래퍼도 `HintBackground + Padding=6` 으로 복구했습니다. 하단 사용자 영역의 `BtnSidebarSettings` 는 `32x32`, 아이콘 `15px` 로 키워 기존보다 접근성이 좋아졌습니다.
|
||||
- 검증: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\verify\ -p:IntermediateOutputPath=obj\verify\` 경고 0 / 오류 0
|
||||
- 업데이트: 2026-04-05 19:59 (KST)
|
||||
|
||||
@@ -174,11 +174,12 @@
|
||||
<!-- 탭 버튼 -->
|
||||
<Style x:Key="TopTabBtn" TargetType="RadioButton">
|
||||
<Setter Property="Foreground" Value="{DynamicResource SecondaryText}"/>
|
||||
<Setter Property="FontSize" Value="13.5"/>
|
||||
<Setter Property="FontSize" Value="14.5"/>
|
||||
<Setter Property="FontWeight" Value="SemiBold"/>
|
||||
<Setter Property="Cursor" Value="Hand"/>
|
||||
<Setter Property="Margin" Value="2"/>
|
||||
<Setter Property="Padding" Value="20,8"/>
|
||||
<Setter Property="Margin" Value="2.5"/>
|
||||
<Setter Property="Padding" Value="24,10"/>
|
||||
<Setter Property="MinWidth" Value="78"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="RadioButton">
|
||||
@@ -197,7 +198,7 @@
|
||||
</Trigger>
|
||||
<!-- IsChecked를 뒤에 두어 호버보다 선택 상태가 항상 우선 적용 -->
|
||||
<Trigger Property="IsChecked" Value="True">
|
||||
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource LauncherBackground}"/>
|
||||
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource ItemBackground}"/>
|
||||
<Setter TargetName="Bd" Property="BorderBrush" Value="{DynamicResource BorderColor}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="FontWeight" Value="Bold"/>
|
||||
@@ -814,14 +815,14 @@
|
||||
<Button x:Name="BtnSidebarSettings"
|
||||
Grid.Column="2"
|
||||
Style="{StaticResource GhostBtn}"
|
||||
Width="24" Height="24"
|
||||
Width="32" Height="32"
|
||||
Margin="6,0,0,0"
|
||||
VerticalAlignment="Center"
|
||||
Click="BtnSettings_Click"
|
||||
ToolTip="AX Agent 설정">
|
||||
<TextBlock Text=""
|
||||
FontFamily="Segoe MDL2 Assets"
|
||||
FontSize="12"
|
||||
FontSize="15"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
@@ -850,8 +851,13 @@
|
||||
BorderBrush="{DynamicResource SeparatorColor}" BorderThickness="0,0,0,1"
|
||||
Padding="10,3,10,3">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<!-- 좌: 대화 제목 -->
|
||||
<StackPanel Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Center">
|
||||
<StackPanel Grid.Column="0" Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Center">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
|
||||
<Grid VerticalAlignment="Center">
|
||||
<TextBlock x:Name="ChatTitle" Text="" FontSize="12.25" FontWeight="SemiBold"
|
||||
@@ -899,8 +905,34 @@
|
||||
</Button>
|
||||
</WrapPanel>
|
||||
</StackPanel>
|
||||
<Border x:Name="SelectedPresetGuide"
|
||||
Grid.Column="1"
|
||||
Visibility="Collapsed"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Background="{DynamicResource HintBackground}"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="12"
|
||||
Padding="12,7"
|
||||
Margin="16,0">
|
||||
<StackPanel HorizontalAlignment="Center">
|
||||
<TextBlock x:Name="SelectedPresetGuideTitle"
|
||||
FontSize="12.5"
|
||||
FontWeight="SemiBold"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
TextAlignment="Center"/>
|
||||
<TextBlock x:Name="SelectedPresetGuideDesc"
|
||||
Margin="0,2,0,0"
|
||||
FontSize="11.5"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
TextAlignment="Center"
|
||||
TextTrimming="CharacterEllipsis"
|
||||
MaxWidth="320"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
<!-- 우: 프리뷰 토글 버튼 -->
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center">
|
||||
<Button x:Name="BtnPreviewToggle" Style="{StaticResource GhostBtn}"
|
||||
Click="BtnPreviewToggle_Click" ToolTip="미리보기 패널" Visibility="Collapsed"
|
||||
Padding="5,2.5" MinWidth="0">
|
||||
@@ -1093,10 +1125,10 @@
|
||||
<!-- 중앙: 탭 메뉴 -->
|
||||
<Border Grid.Column="1"
|
||||
HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
Background="{DynamicResource LauncherBackground}"
|
||||
Background="{DynamicResource HintBackground}"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="999" Padding="4"
|
||||
CornerRadius="999" Padding="6"
|
||||
WindowChrome.IsHitTestVisibleInChrome="True">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<RadioButton x:Name="TabChat" Content="채팅" Style="{StaticResource TopTabBtn}"
|
||||
@@ -1196,19 +1228,19 @@
|
||||
<!-- 빈 상태 -->
|
||||
<Grid x:Name="EmptyState" Grid.Row="3"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Center"
|
||||
VerticalAlignment="Stretch"
|
||||
MaxWidth="960"
|
||||
Margin="24,10,24,12">
|
||||
Margin="24,16,24,16">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="16"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="18"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<StackPanel Grid.Row="0"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Top"
|
||||
Margin="0,10,0,2">
|
||||
Margin="0,14,0,4">
|
||||
<Border x:Name="EmptyIcon" CornerRadius="12" Width="36" Height="36"
|
||||
HorizontalAlignment="Center" Margin="0,0,0,10"
|
||||
Background="{DynamicResource HintBackground}">
|
||||
@@ -1229,14 +1261,14 @@
|
||||
|
||||
<ScrollViewer x:Name="TopicPresetScrollViewer"
|
||||
Grid.Row="2"
|
||||
VerticalScrollBarVisibility="Disabled"
|
||||
VerticalScrollBarVisibility="Auto"
|
||||
HorizontalScrollBarVisibility="Disabled"
|
||||
MaxHeight="360"
|
||||
MaxHeight="420"
|
||||
Margin="0"
|
||||
Padding="0,2,0,0">
|
||||
Padding="0,4,0,8">
|
||||
<!-- 대화 주제 버튼 (프리셋에서 동적 생성) -->
|
||||
<WrapPanel x:Name="TopicButtonPanel" HorizontalAlignment="Center"
|
||||
Margin="0,0,0,4"/>
|
||||
Margin="0,0,0,8"/>
|
||||
</ScrollViewer>
|
||||
</Grid>
|
||||
|
||||
|
||||
@@ -4064,10 +4064,56 @@ public partial class ChatWindow : Window
|
||||
|
||||
private void UpdateChatTitle()
|
||||
{
|
||||
ChatConversation? conversation;
|
||||
lock (_convLock)
|
||||
{
|
||||
ChatTitle.Text = _currentConversation?.Title ?? "";
|
||||
conversation = _currentConversation;
|
||||
ChatTitle.Text = conversation?.Title ?? "";
|
||||
}
|
||||
|
||||
UpdateSelectedPresetGuide(conversation);
|
||||
}
|
||||
|
||||
private void UpdateSelectedPresetGuide(ChatConversation? conversation = null)
|
||||
{
|
||||
if (SelectedPresetGuide == null || SelectedPresetGuideTitle == null || SelectedPresetGuideDesc == null)
|
||||
return;
|
||||
|
||||
if (string.Equals(_activeTab, "Code", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
SelectedPresetGuide.Visibility = Visibility.Collapsed;
|
||||
SelectedPresetGuideTitle.Text = "";
|
||||
SelectedPresetGuideDesc.Text = "";
|
||||
return;
|
||||
}
|
||||
|
||||
conversation ??= _currentConversation;
|
||||
var category = conversation?.Category?.Trim();
|
||||
if (string.IsNullOrWhiteSpace(category))
|
||||
{
|
||||
SelectedPresetGuide.Visibility = Visibility.Collapsed;
|
||||
SelectedPresetGuideTitle.Text = "";
|
||||
SelectedPresetGuideDesc.Text = "";
|
||||
return;
|
||||
}
|
||||
|
||||
var preset = Services.PresetService.GetByTabWithCustom(_activeTab, _settings.Settings.Llm.CustomPresets)
|
||||
.FirstOrDefault(p => string.Equals(p.Category?.Trim(), category, StringComparison.OrdinalIgnoreCase));
|
||||
if (preset == null)
|
||||
{
|
||||
SelectedPresetGuide.Visibility = Visibility.Collapsed;
|
||||
SelectedPresetGuideTitle.Text = "";
|
||||
SelectedPresetGuideDesc.Text = "";
|
||||
return;
|
||||
}
|
||||
|
||||
SelectedPresetGuideTitle.Text = string.Equals(_activeTab, "Cowork", StringComparison.OrdinalIgnoreCase)
|
||||
? $"선택된 작업 유형 · {preset.Label}"
|
||||
: $"선택된 대화 주제 · {preset.Label}";
|
||||
SelectedPresetGuideDesc.Text = string.IsNullOrWhiteSpace(preset.Description)
|
||||
? (preset.Placeholder ?? "")
|
||||
: preset.Description;
|
||||
SelectedPresetGuide.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
// ─── 메시지 렌더링 ───────────────────────────────────────────────────
|
||||
@@ -12611,6 +12657,7 @@ public partial class ChatWindow : Window
|
||||
UpdateCategoryLabel();
|
||||
SaveConversationSettings();
|
||||
RefreshConversationList();
|
||||
UpdateSelectedPresetGuide();
|
||||
if (EmptyState != null)
|
||||
EmptyState.Visibility = Visibility.Collapsed;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user