From cc121772521c4500078cf433505229aef4727844 Mon Sep 17 00:00:00 2001 From: lacvet Date: Mon, 6 Apr 2026 19:29:09 +0900 Subject: [PATCH] =?UTF-8?q?=ED=85=8C=EB=A7=88=20=EA=B8=80=EB=A1=9C?= =?UTF-8?q?=EC=9A=B0=20=EC=84=A4=EC=A0=95=EC=9D=98=20=EC=8B=A4=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EB=B0=98=EC=98=81=20=EB=88=84=EB=9D=BD=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 런처가 SettingsChanged 이벤트를 직접 받아 테두리, 아이콘 애니메이션, 무지개 글로우, 선택 글로우를 즉시 다시 적용하도록 보강함 - AX Agent는 저장된 설정을 다시 읽을 때 스트리밍 중 입력창 글로우 설정도 즉시 반영하도록 RefreshFromSavedSettings 흐름을 정리함 - README와 DEVELOPMENT 문서를 2026-04-06 19:02 (KST) 기준으로 갱신하고 Release 빌드에서 경고 0 / 오류 0을 확인함 --- README.md | 3 +++ docs/DEVELOPMENT.md | 1 + src/AxCopilot/Views/ChatWindow.xaml.cs | 4 +++ src/AxCopilot/Views/LauncherWindow.xaml.cs | 30 +++++++++++++++++++--- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 50fe6d8..ddc960b 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,9 @@ Windows 전용 시맨틱 런처 & 워크스페이스 매니저 - 런처 색인에서 `.git`, `node_modules`, `bin`, `obj`, `dist`, `packages`, `venv`, `__pycache__`, `target` 같은 무거운 폴더를 스캔/감시 대상에서 제외해 유휴 CPU와 재색인 부담을 줄였습니다. - 런처 무지개 글로우 갱신 주기를 낮추고, AX Agent는 창 크기 변화 시 메시지 전체 재렌더를 짧게 묶어서 한 번만 반영하도록 바꿔 창 조작 시 버벅이는 느낌을 줄였습니다. +- 업데이트: 2026-04-06 19:02 (KST) +- 설정-테마의 글로우 관련 항목이 저장만 되고 열린 창에 바로 반영되지 않던 문제를 수정했습니다. 런처는 설정 변경 이벤트를 직접 받아 테두리/아이콘 애니메이션/무지개 글로우/선택 글로우를 즉시 다시 적용하고, AX Agent도 스트리밍 중 입력창 글로우 설정을 바로 반영합니다. + - 업데이트: 2026-04-06 15:26 (KST) - AX Agent 채팅/코워크/코드 하단 안내 문구를 현재 구현 기준으로 다시 정리했습니다. 입력창 워터마크는 탭 종류와 작업 폴더 선택 여부에 따라 실제 가능한 작업을 더 정확히 안내합니다. - 선택된 프리셋 안내도 placeholder 문구 대신 실제 설명 중심으로 정리해, 프리셋 설명 카드와 입력창 워터마크가 서로 다른 역할로 보이도록 맞췄습니다. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index b85acd4..cb39ab5 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -3,6 +3,7 @@ - Document update: 2026-04-06 18:46 (KST) - Tightened launcher indexing for real-world projects by ignoring `.git`, `.vs`, `node_modules`, `bin`, `obj`, `dist`, `packages`, `venv`, `__pycache__`, and `target` directories during both watcher handling and full scans. The launcher now skips noisy build/cache trees instead of reacting to them like searchable content. - Document update: 2026-04-06 18:46 (KST) - Replaced the launcher's recursive `EnumerateFiles(..., AllDirectories)` walk with an ignore-aware manual traversal so large repos avoid descending into dependency and build folders, and slowed the rainbow glow timer from `20ms` to `40ms`. - Document update: 2026-04-06 18:46 (KST) - Added a deferred responsive-layout timer to `ChatWindow` so AX Agent no longer calls `RenderMessages()` on every `SizeChanged` event. Resizing and layout changes are now coalesced into a single update after a short delay, reducing the heavy-window feel during agent-window manipulation. +- Document update: 2026-04-06 19:02 (KST) - Fixed theme glow settings so they apply to already-open windows instead of only affecting the next open. `LauncherWindow` now listens to `SettingsChanged` and reapplies border, icon animation, rainbow glow, and selection glow immediately, while `ChatWindow.RefreshFromSavedSettings()` now re-evaluates chat rainbow glow during active streaming. - Document update: 2026-04-06 15:31 (KST) - Removed the visible outer border from the Cowork/Code footer permission selector so it reads as a flatter inline action in the bottom work bar. - Document update: 2026-04-06 15:26 (KST) - Reworked bottom guidance copy for Chat/Cowork/Code around the actual AX Agent behavior. Input watermark text now comes from a shared helper that considers the active tab and whether a work folder is selected, instead of using overly broad static text. - Document update: 2026-04-06 15:26 (KST) - Adjusted the selected preset guide so it prefers concise preset descriptions over raw placeholder prompts, keeping the footer guide and the composer watermark in distinct roles. diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs index 32f51ba..1d5ad40 100644 --- a/src/AxCopilot/Views/ChatWindow.xaml.cs +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -9914,6 +9914,10 @@ public partial class ChatWindow : Window BuildBottomBar(); RefreshDraftQueueUi(); RefreshConversationList(); + if (_isStreaming && _settings.Settings.Llm.EnableChatRainbowGlow) + PlayRainbowGlow(); + else + StopRainbowGlow(); }, DispatcherPriority.Input); } diff --git a/src/AxCopilot/Views/LauncherWindow.xaml.cs b/src/AxCopilot/Views/LauncherWindow.xaml.cs index 4aa7623..c9fccab 100644 --- a/src/AxCopilot/Views/LauncherWindow.xaml.cs +++ b/src/AxCopilot/Views/LauncherWindow.xaml.cs @@ -80,6 +80,9 @@ public partial class LauncherWindow : Window }); }; } + + if (CurrentApp?.SettingsService != null) + CurrentApp.SettingsService.SettingsChanged += OnSettingsChanged; } private void Window_Loaded(object sender, RoutedEventArgs e) @@ -175,7 +178,20 @@ public partial class LauncherWindow : Window } }); - // 런처 테두리 표시 설정 + ApplyVisualSettings(); + } + + private void OnSettingsChanged(object? sender, EventArgs e) + { + Dispatcher.BeginInvoke(() => + { + ApplyTheme(); + ApplyVisualSettings(); + }, System.Windows.Threading.DispatcherPriority.Input); + } + + private void ApplyVisualSettings() + { if (_vm.ShowLauncherBorder) { MainBorder.BorderThickness = new Thickness(1); @@ -187,12 +203,12 @@ public partial class LauncherWindow : Window MainBorder.BorderBrush = System.Windows.Media.Brushes.Transparent; } - if (_vm.EnableIconAnimation) + if (_vm.EnableIconAnimation && IsVisible) ApplyRandomIconAnimation(); else ResetIconAnimation(); - if (_vm.EnableRainbowGlow) + if (_vm.EnableRainbowGlow && IsVisible) StartRainbowGlow(); else StopRainbowGlow(); @@ -1663,6 +1679,14 @@ public partial class LauncherWindow : Window if (_vm.CloseOnFocusLost) Hide(); } + protected override void OnClosed(EventArgs e) + { + if (CurrentApp?.SettingsService != null) + CurrentApp.SettingsService.SettingsChanged -= OnSettingsChanged; + + base.OnClosed(e); + } + private void Window_LocationChanged(object sender, EventArgs e) { UpdateRememberedPositionCache();