AX Agent 좌측 패널 드래그 리사이즈 지원 추가
Some checks failed
Release Gate / gate (push) Has been cancelled

- 좌측 사이드바와 본문 사이 경계선에 GridSplitter 추가
- 사이드바가 열려 있을 때만 드래그 가능하도록 splitter 표시 상태 연동
- 사용자가 조절한 폭을 저장해 사이드바를 닫았다 다시 열어도 마지막 너비 유지
- 열기/닫기 애니메이션이 현재 폭과 저장 폭을 함께 사용하도록 정리
- README 및 DEVELOPMENT 문서에 2026-04-05 23:15 (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:
2026-04-05 20:33:09 +09:00
parent 891133a6bf
commit 00d284b725
4 changed files with 43 additions and 4 deletions

View File

@@ -1049,3 +1049,5 @@ MIT License
- AX Agent 새 대화 전환 경로를 실제 fresh conversation 생성 기준으로 수정했다. 기존에는 현재 대화를 저장한 뒤 LoadOrCreateConversation()을 다시 호출해 최신 저장 대화를 재로드하는 경로가 섞여 있어, 첫 화면이 잠깐 깜빡인 뒤 기존 대화가 그대로 남는 문제가 있었다. 이제 ClearCurrentConversation() 뒤에는 항상 새 대화를 생성하고, 대화별 설정/압축 메트릭/앱 상태를 새 conversation 기준으로 다시 동기화한 후 빈 transcript를 렌더한다. - AX Agent 새 대화 전환 경로를 실제 fresh conversation 생성 기준으로 수정했다. 기존에는 현재 대화를 저장한 뒤 LoadOrCreateConversation()을 다시 호출해 최신 저장 대화를 재로드하는 경로가 섞여 있어, 첫 화면이 잠깐 깜빡인 뒤 기존 대화가 그대로 남는 문제가 있었다. 이제 ClearCurrentConversation() 뒤에는 항상 새 대화를 생성하고, 대화별 설정/압축 메트릭/앱 상태를 새 conversation 기준으로 다시 동기화한 후 빈 transcript를 렌더한다.
- 업데이트: 2026-04-05 23:09 (KST) - 업데이트: 2026-04-05 23:09 (KST)
- AX Agent 좌측 패널의 타이포를 전반적으로 키웠다. 헤더, 새 대화, 검색, 상단 필터, 탭별 보조 메뉴, 전체 삭제, 하단 사용자 영역 폰트와 아이콘 크기를 함께 조정하고, 사이드바 폭도 소폭 넓혀 더 이상 지나치게 작고 빽빽하게 보이지 않도록 정리했다. 대화 목록 카드 제목/시간/실행 메타도 함께 키워 실제 읽을 수 있는 수준으로 보정했다. - AX Agent 좌측 패널의 타이포를 전반적으로 키웠다. 헤더, 새 대화, 검색, 상단 필터, 탭별 보조 메뉴, 전체 삭제, 하단 사용자 영역 폰트와 아이콘 크기를 함께 조정하고, 사이드바 폭도 소폭 넓혀 더 이상 지나치게 작고 빽빽하게 보이지 않도록 정리했다. 대화 목록 카드 제목/시간/실행 메타도 함께 키워 실제 읽을 수 있는 수준으로 보정했다.
- 업데이트: 2026-04-05 23:15 (KST)
- AX Agent 좌측 패널과 본문 사이 경계선을 드래그해 사이드바 폭을 직접 조절할 수 있게 했다. 사이드바가 열려 있을 때만 splitter가 보이며, 사용자가 조절한 폭은 닫았다 다시 열어도 유지된다.

View File

@@ -4795,3 +4795,6 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
- 업데이트: 2026-04-05 23:09 (KST) - 업데이트: 2026-04-05 23:09 (KST)
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 AX Agent 좌측 사이드바 기본 폭을 246 -> 262로 넓히고, AX Agent 헤더, 새 대화, 검색, 상단 공통 필터, 탭별 보조 메뉴, 전체 삭제, 하단 사용자/설정 영역의 폰트와 아이콘 크기를 전반적으로 상향 조정했다. - [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에서 AX Agent 좌측 사이드바 기본 폭을 246 -> 262로 넓히고, AX Agent 헤더, 새 대화, 검색, 상단 공통 필터, 탭별 보조 메뉴, 전체 삭제, 하단 사용자/설정 영역의 폰트와 아이콘 크기를 전반적으로 상향 조정했다.
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 대화 목록 렌더에서도 그룹 헤더, 대화 카드 제목, 날짜, 실행 상태, 실행 요약, 편집 아이콘 크기를 함께 키우고 카드 내부 패딩을 늘려 좌측 패널 텍스트가 지나치게 작게 보이던 문제를 보정했다. - [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 의 대화 목록 렌더에서도 그룹 헤더, 대화 카드 제목, 날짜, 실행 상태, 실행 요약, 편집 아이콘 크기를 함께 키우고 카드 내부 패딩을 늘려 좌측 패널 텍스트가 지나치게 작게 보이던 문제를 보정했다.
- 업데이트: 2026-04-05 23:15 (KST)
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 에 AX Agent 좌측 패널과 본문 사이를 드래그할 수 있는 SidebarResizeSplitter를 추가했다.
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서 사이드바 마지막 확장 폭을 _sidebarExpandedWidth로 기억하도록 하고, 열기/닫기 애니메이션과 splitter 드래그 완료 이벤트가 같은 폭 상태를 공유하도록 정리했다. 이제 사용자가 경계선을 조절한 뒤 사이드바를 닫았다 다시 열어도 마지막 너비가 유지된다.

View File

@@ -837,6 +837,20 @@
</Grid> </Grid>
</Border> </Border>
<GridSplitter x:Name="SidebarResizeSplitter"
Grid.Column="1"
Width="8"
HorizontalAlignment="Right"
VerticalAlignment="Stretch"
Background="Transparent"
ResizeDirection="Columns"
ResizeBehavior="PreviousAndNext"
ShowsPreview="False"
Cursor="SizeWE"
Visibility="Visible"
DragCompleted="SidebarResizeSplitter_DragCompleted"
Panel.ZIndex="40"/>
<!-- ══════════════════════════════════════════════════════ --> <!-- ══════════════════════════════════════════════════════ -->
<!-- 우측: 메시지 영역 --> <!-- 우측: 메시지 영역 -->
<!-- ══════════════════════════════════════════════════════ --> <!-- ══════════════════════════════════════════════════════ -->

View File

@@ -34,6 +34,7 @@ public partial class ChatWindow : Window
private CancellationTokenSource? _streamCts; private CancellationTokenSource? _streamCts;
private bool _isStreaming; private bool _isStreaming;
private bool _sidebarVisible = true; private bool _sidebarVisible = true;
private double _sidebarExpandedWidth = 262;
private string _selectedCategory = ""; // "" = 전체 private string _selectedCategory = ""; // "" = 전체
private readonly Dictionary<string, string> _tabSelectedCategory = new(StringComparer.OrdinalIgnoreCase) private readonly Dictionary<string, string> _tabSelectedCategory = new(StringComparer.OrdinalIgnoreCase)
{ {
@@ -2854,25 +2855,33 @@ public partial class ChatWindow : Window
IconBarColumn.Width = new GridLength(0); IconBarColumn.Width = new GridLength(0);
IconBarPanel.Visibility = Visibility.Collapsed; IconBarPanel.Visibility = Visibility.Collapsed;
SidebarPanel.Visibility = Visibility.Visible; SidebarPanel.Visibility = Visibility.Visible;
SidebarResizeSplitter.Visibility = Visibility.Visible;
var targetWidth = Math.Max(190, _sidebarExpandedWidth);
if (animated) if (animated)
{ {
AnimateSidebar(0, 220, () => SidebarColumn.MinWidth = 168); AnimateSidebar(0, targetWidth, () => SidebarColumn.MinWidth = 168);
} }
else else
{ {
SidebarColumn.MinWidth = 168; SidebarColumn.MinWidth = 168;
SidebarColumn.Width = new GridLength(220); SidebarColumn.Width = new GridLength(targetWidth);
} }
return; return;
} }
var currentWidth = SidebarColumn.ActualWidth > 0 ? SidebarColumn.ActualWidth : SidebarColumn.Width.Value;
if (currentWidth > 0)
_sidebarExpandedWidth = Math.Max(190, currentWidth);
SidebarColumn.MinWidth = 0; SidebarColumn.MinWidth = 0;
if (animated) if (animated)
{ {
AnimateSidebar(248, 0, () => AnimateSidebar(currentWidth > 0 ? currentWidth : _sidebarExpandedWidth, 0, () =>
{ {
SidebarPanel.Visibility = Visibility.Collapsed; SidebarPanel.Visibility = Visibility.Collapsed;
SidebarResizeSplitter.Visibility = Visibility.Collapsed;
IconBarColumn.Width = new GridLength(52); IconBarColumn.Width = new GridLength(52);
IconBarPanel.Visibility = Visibility.Visible; IconBarPanel.Visibility = Visibility.Visible;
}); });
@@ -2881,11 +2890,22 @@ public partial class ChatWindow : Window
{ {
SidebarColumn.Width = new GridLength(0); SidebarColumn.Width = new GridLength(0);
SidebarPanel.Visibility = Visibility.Collapsed; SidebarPanel.Visibility = Visibility.Collapsed;
SidebarResizeSplitter.Visibility = Visibility.Collapsed;
IconBarColumn.Width = new GridLength(52); IconBarColumn.Width = new GridLength(52);
IconBarPanel.Visibility = Visibility.Visible; IconBarPanel.Visibility = Visibility.Visible;
} }
} }
private void SidebarResizeSplitter_DragCompleted(object sender, DragCompletedEventArgs e)
{
if (!_sidebarVisible)
return;
var currentWidth = SidebarColumn.ActualWidth > 0 ? SidebarColumn.ActualWidth : SidebarColumn.Width.Value;
_sidebarExpandedWidth = Math.Clamp(currentWidth, 190, 420);
SidebarColumn.Width = new GridLength(_sidebarExpandedWidth);
}
private void AnimateSidebar(double from, double to, Action? onComplete = null) private void AnimateSidebar(double from, double to, Action? onComplete = null)
{ {
var duration = 200.0; var duration = 200.0;