Files
AX-Copilot/src/AxCopilot/ViewModels/LauncherViewModel.Widgets.cs
lacvet 72b92b905c [Phase L3-9 + 버그] AX Agent 오류 수정 + 런처 미니 위젯 4종 구현
AX Agent 오류 수정:
- AgentSettingsPanel.xaml에 <UserControl.Resources> 추가
- ToggleSwitch 스타일 자체 정의 (SettingsWindow 리소스 미접근 문제 해결)
- 원인: XamlParseException — 'ToggleSwitch' 리소스 찾을 수 없음 (CS 로그 확인)

PerformanceMonitorService.cs (신규, 138줄):
- GetSystemTimes P/Invoke → CPU% (이전/현재 샘플 델타 계산)
- GlobalMemoryStatusEx P/Invoke → RAM% + "6.1/16GB" 형식 텍스트
- DriveInfo → C: 드라이브 사용률/용량 텍스트
- 2초 폴링, StartPolling/StopPolling 제어

PomodoroService.cs (신규, 179줄):
- 집중(25분)/휴식(5분) 타이머, 상태: Idle/Focus/Break
- pomodoro.json 영속성 (경과 시간 자동 보정)
- StateChanged 이벤트 → 위젯 실시간 갱신

ServerStatusService.cs (신규, 124줄):
- Ollama(/api/version), LLM API, 첫 번째 MCP 서버 15초 주기 핑
- HttpClient 1.5초 타임아웃, StatusChanged 이벤트

PomoHandler.cs (신규, 130줄):
- pomo prefix: 상태보기/start/break/stop/reset
- PomodoroService 직접 연동

LauncherViewModel.Widgets.cs (신규, 81줄):
- Widget_PerfText, Widget_PomoText, Widget_PomoRunning
- Widget_NoteText, Widget_OllamaOnline, Widget_LlmOnline, Widget_McpOnline
- UpdateWidgets() — 5틱마다 메모 건수 갱신 (파일 I/O 최소화)

LauncherWindow.Widgets.cs (신규, 143줄):
- IsVisibleChanged 이벤트로 위젯 자동 시작/중지
- DispatcherTimer 1초마다 UpdateWidgets + 서버 상태 dot 색상 직접 갱신
- 위젯 클릭 → 해당 prefix 자동 입력 (perf→info, pomo→pomo, note→note, server→port)

LauncherWindow.xaml:
- RowDefinition 6개 → 7개
- Row 6: 위젯 바 (시스템모니터/뽀모도로/메모/서버 4열)

빌드: 경고 0, 오류 0
2026-04-04 09:28:07 +09:00

82 lines
3.7 KiB
C#

using AxCopilot.Handlers;
using AxCopilot.Services;
namespace AxCopilot.ViewModels;
/// <summary>
/// Phase L3-9: 런처 하단 미니 위젯 데이터 바인딩 프로퍼티.
/// LauncherWindow.Widgets.cs의 타이머에서 UpdateWidgets()를 호출합니다.
/// </summary>
public partial class LauncherViewModel
{
// ─── 시스템 모니터 ────────────────────────────────────────────────────────
/// <summary>위젯 텍스트 예: "CPU 34% RAM 62% C:42%"</summary>
public string Widget_PerfText
{
get
{
var p = PerformanceMonitorService.Instance;
return $"CPU {p.CpuPercent:F0}% RAM {p.RamPercent:F0}% {p.DiskCText}";
}
}
// ─── 뽀모도로 ─────────────────────────────────────────────────────────────
/// <summary>위젯 텍스트 예: "집중 18:42" / "휴식 04:58" / "대기 25:00"</summary>
public string Widget_PomoText
{
get
{
var p = PomodoroService.Instance;
var rem = p.Remaining;
var timeStr = $"{(int)rem.TotalMinutes:D2}:{rem.Seconds:D2}";
return p.Mode switch
{
PomodoroMode.Focus => $"집중 {timeStr}",
PomodoroMode.Break => $"휴식 {timeStr}",
_ => $"대기 {timeStr}",
};
}
}
/// <summary>뽀모도로 실행 중이면 true → 위젯 색상 강조에 사용</summary>
public bool Widget_PomoRunning => PomodoroService.Instance.IsRunning;
// ─── 빠른 메모 ────────────────────────────────────────────────────────────
private int _noteCount;
/// <summary>위젯 텍스트 예: "메모 3건" / "메모 없음"</summary>
public string Widget_NoteText => _noteCount > 0 ? $"메모 {_noteCount}건" : "메모 없음";
// ─── 서버 상태 ────────────────────────────────────────────────────────────
public bool Widget_OllamaOnline => ServerStatusService.Instance.OllamaOnline;
public bool Widget_LlmOnline => ServerStatusService.Instance.LlmOnline;
public bool Widget_McpOnline => ServerStatusService.Instance.McpOnline;
public string Widget_McpName => ServerStatusService.Instance.McpName;
// ─── 갱신 메서드 ──────────────────────────────────────────────────────────
/// <summary>1초마다 LauncherWindow.Widgets.cs에서 호출 — UI 바인딩 갱신.</summary>
public void UpdateWidgets()
{
// 메모 건수 갱신 (파일 I/O 최소화: 5회마다 1회만)
_widgetRefreshTick++;
if (_widgetRefreshTick % 5 == 0)
_noteCount = NoteHandler.GetNoteCount();
OnPropertyChanged(nameof(Widget_PerfText));
OnPropertyChanged(nameof(Widget_PomoText));
OnPropertyChanged(nameof(Widget_PomoRunning));
OnPropertyChanged(nameof(Widget_NoteText));
OnPropertyChanged(nameof(Widget_OllamaOnline));
OnPropertyChanged(nameof(Widget_LlmOnline));
OnPropertyChanged(nameof(Widget_McpOnline));
OnPropertyChanged(nameof(Widget_McpName));
}
private int _widgetRefreshTick;
}