From 7f8a0755532f160890800a81f44de237adb0ee12 Mon Sep 17 00:00:00 2001 From: lacvet Date: Sun, 5 Apr 2026 19:49:53 +0900 Subject: [PATCH] =?UTF-8?q?AX=20Agent=20=EC=9E=91=EC=97=85=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=ED=8C=9D=EC=97=85=20=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 작업 폴더 선택 팝업을 검색과 요약 스트립 중심 구조에서 최근 폴더 목록 중심 구조로 재구성했다. 현재 선택 체크가 보이는 최근 폴더 목록과 다른 폴더 선택 액션만 남겨 캡처와 비슷한 빠른 선택 흐름으로 정리했다. README와 DEVELOPMENT 문서에 변경 이력과 시점을 반영했다. 검증: dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ (경고 0 / 오류 0) --- README.md | 2 + docs/DEVELOPMENT.md | 2 + src/AxCopilot/Views/ChatWindow.xaml | 39 +++----------- src/AxCopilot/Views/ChatWindow.xaml.cs | 72 ++++++++++---------------- 4 files changed, 37 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 9908145..fad1d1a 100644 --- a/README.md +++ b/README.md @@ -1023,3 +1023,5 @@ MIT License - AX Agent 빈 상태 상단 심볼은 더 크게 키우고, 대화 주제/작업 유형 프리셋 카드 내부 아이콘은 한 단계 줄여 시각 균형을 조정했다. - 업데이트: 2026-04-05 19:46 (KST) - 모델 빠른 설정 팝업에서 하단 중복 모델 칩 줄을 제거하고, 하단 모델 라벨은 서비스+모델 조합 대신 현재 모델명만 보이도록 더 심플하게 정리했다. +- 업데이트: 2026-04-05 19:53 (KST) + - 작업 폴더 선택 팝업을 검색/요약 중심 구조에서 `최근 폴더 목록 + 현재 선택 체크 + 다른 폴더 선택` 형태로 단순화해 더 빠르게 고를 수 있게 정리했다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index f98419c..e521869 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4768,3 +4768,5 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎. - `ChatWindow` 빈 상태 상단 심볼 크기를 확대하고, 프리셋 카드/기타/프리셋 추가 카드의 내부 아이콘 크기를 축소해 화면 비율을 정리했다. - 업데이트: 2026-04-05 19:46 (KST) - `ChatWindow` 모델 선택 팝업의 중복 `InlineModelChipPanel`을 제거하고, 하단 `ModelLabel`은 현재 모델명 중심으로 단순화해 Claude류의 간결한 표시 방식에 가깝게 조정했다. +- 업데이트: 2026-04-05 19:53 (KST) + - `ChatWindow` 작업 폴더 팝업을 최근 목록 중심 UI로 재구성하고, 검색 박스와 요약 스트립을 제거해 `최근 폴더 + 다른 폴더 선택` 흐름으로 단순화했다. diff --git a/src/AxCopilot/Views/ChatWindow.xaml b/src/AxCopilot/Views/ChatWindow.xaml index 4e76600..24c4bc2 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml +++ b/src/AxCopilot/Views/ChatWindow.xaml @@ -1502,48 +1502,23 @@ AllowsTransparency="True" PopupAnimation="Fade"> + BorderThickness="1" + CornerRadius="16" + MinWidth="286" + MaxWidth="332"> - - - - - - - - - - - + Padding="10,0,10,10"> diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index c8c3156..345f6b3 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -72,8 +72,6 @@ public partial class ChatWindow : Window private readonly HashSet _sessionPermissionRules = new(StringComparer.OrdinalIgnoreCase); private readonly Dictionary _sessionMcpEnabledOverrides = new(StringComparer.OrdinalIgnoreCase); private readonly Dictionary _sessionMcpAuthTokens = new(StringComparer.OrdinalIgnoreCase); - private string _folderMenuSearchText = ""; - // 경과 시간 표시 private readonly DispatcherTimer _elapsedTimer; private DateTime _streamStartTime; @@ -1360,14 +1358,12 @@ public partial class ChatWindow : Window private void FolderPathLabel_Click(object sender, MouseButtonEventArgs e) => ShowFolderMenu(); private void FolderMenuSearchBox_TextChanged(object sender, TextChangedEventArgs e) { - _folderMenuSearchText = FolderMenuSearchBox?.Text?.Trim() ?? ""; - RenderFolderMenuItems(_folderMenuSearchText); + RenderFolderMenuItems(null); } private void ShowFolderMenu() { - _folderMenuSearchText = FolderMenuSearchBox?.Text?.Trim() ?? ""; - RenderFolderMenuItems(_folderMenuSearchText); + RenderFolderMenuItems(null); FolderMenuPopup.IsOpen = true; } @@ -1378,8 +1374,6 @@ public partial class ChatWindow : Window var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue; var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.White; var secondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; - var query = (searchText ?? "").Trim(); - var maxDisplay = Math.Clamp(_settings.Settings.Llm.MaxRecentFolders, 3, 30); var currentFolder = GetCurrentWorkFolder(); var conversationFolders = _storage.LoadAllMeta() @@ -1394,31 +1388,13 @@ public partial class ChatWindow : Window .Concat(conversationFolders) .Concat(string.IsNullOrWhiteSpace(currentFolder) ? Enumerable.Empty() : new[] { currentFolder }) .Distinct(StringComparer.OrdinalIgnoreCase) - .Where(path => - string.IsNullOrWhiteSpace(query) - || path.Contains(query, StringComparison.OrdinalIgnoreCase) - || System.IO.Path.GetFileName(path).Contains(query, StringComparison.OrdinalIgnoreCase)) - .Take(maxDisplay * 3) + .Take(maxDisplay * 2) .ToList(); var filteredRecent = recentFolders - .Where(path => - string.IsNullOrWhiteSpace(query) - || path.Contains(query, StringComparison.OrdinalIgnoreCase) - || System.IO.Path.GetFileName(path).Contains(query, StringComparison.OrdinalIgnoreCase)) .Take(maxDisplay) .ToList(); - var currentWorkspaceName = string.IsNullOrWhiteSpace(currentFolder) - ? "없음" - : System.IO.Path.GetFileName(currentFolder.TrimEnd('\\', '/')); - FolderMenuItems.Children.Add(CreatePopupSummaryStrip(new[] - { - ("현재", currentWorkspaceName, "#F8FAFC", "#E2E8F0", "#475569"), - ("최근", filteredRecent.Count.ToString(), "#EFF6FF", "#BFDBFE", "#1D4ED8"), - ("전체", workspaceFolders.Count.ToString(), "#F5F3FF", "#DDD6FE", "#6D28D9"), - })); - void AddWorkspaceRows(IEnumerable folders) { foreach (var folder in folders) @@ -1426,9 +1402,9 @@ public partial class ChatWindow : Window var isActive = folder.Equals(currentFolder, StringComparison.OrdinalIgnoreCase); var displayName = System.IO.Path.GetFileName(folder); if (string.IsNullOrEmpty(displayName)) displayName = folder; - var detailText = isActive ? $"현재 선택 · {folder}" : folder; + var detailText = folder; var itemBorder = CreatePopupMenuRow( - isActive ? "\uE73E" : "\uE8B7", + "\uE8B7", displayName, detailText, isActive, @@ -1454,7 +1430,6 @@ public partial class ChatWindow : Window if (filteredRecent.Count > 0) { - FolderMenuItems.Children.Add(CreatePopupSectionLabel($"최근 워크스페이스 · {filteredRecent.Count}", new Thickness(10, 6, 10, 4))); AddWorkspaceRows(filteredRecent); } @@ -1464,46 +1439,51 @@ public partial class ChatWindow : Window if (remainingFolders.Count > 0) { - var workspaceLabel = filteredRecent.Count > 0 - ? $"전체 워크스페이스 · {remainingFolders.Count}" - : $"워크스페이스 · {remainingFolders.Count}"; - FolderMenuItems.Children.Add(CreatePopupSectionLabel(workspaceLabel, new Thickness(10, 6, 10, 4))); - AddWorkspaceRows(remainingFolders); - FolderMenuItems.Children.Add(new Border { Height = 1, Background = TryFindResource("BorderColor") as Brush ?? Brushes.Gray, - Margin = new Thickness(8, 4, 8, 4), - Opacity = 0.5, + Margin = new Thickness(8, 4, 8, 8), + Opacity = 0.45, }); + AddWorkspaceRows(remainingFolders); } - else if (filteredRecent.Count == 0) + + if (filteredRecent.Count == 0 && remainingFolders.Count == 0) { FolderMenuItems.Children.Add(new TextBlock { - Text = "검색 결과가 없습니다.", + Text = "최근 작업 폴더가 없습니다.", FontSize = 11.5, Foreground = secondaryText, - Margin = new Thickness(10, 8, 10, 10), + Margin = new Thickness(10, 6, 10, 10), }); } - // 폴더 찾아보기 버튼 + FolderMenuItems.Children.Add(new Border + { + Height = 1, + Background = TryFindResource("BorderColor") as Brush ?? Brushes.Gray, + Margin = new Thickness(8, 8, 8, 8), + Opacity = 0.45, + }); + + // 다른 폴더 선택 버튼 var browseSp = new StackPanel { Orientation = Orientation.Horizontal }; browseSp.Children.Add(new TextBlock { - Text = "\uED25", + Text = "\uE710", FontFamily = new FontFamily("Segoe MDL2 Assets"), - FontSize = 14, + FontSize = 13, Foreground = accentBrush, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 8, 0), }); browseSp.Children.Add(new TextBlock { - Text = "폴더 찾아보기...", - FontSize = 14, + Text = "다른 폴더 선택", + FontSize = 13, + FontWeight = FontWeights.SemiBold, Foreground = primaryText, VerticalAlignment = VerticalAlignment.Center, });