using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using EmbyToolbox.Services; namespace EmbyToolbox.ViewModels; /// UI вкладки «Логи». Поток записей — (тот же , без дублирования). public sealed class LogsViewModel : INotifyPropertyChanged { private readonly LoggingService _logging; private int _scrollPulse; public LogsViewModel(LoggingService logging) { _logging = logging; RefreshLogViewCommand = new RelayCommand(ExecuteRefreshScroll); OpenLogsFolderCommand = new RelayCommand(ExecuteOpenLogsFolder); ClearUiLogCommand = new RelayCommand(ExecuteClearUiLog, () => UiEntries.Count > 0); } /// Инкремент для умного принудительного скролла вниз (кнопка «Обновить»). public int ScrollPulse { get => _scrollPulse; private set { if (_scrollPulse == value) { return; } _scrollPulse = value; OnPropertyChanged(); } } /// Тот же , что и у главного окна. public ObservableCollection UiEntries => _logging.UiEntries; public RelayCommand RefreshLogViewCommand { get; } public RelayCommand OpenLogsFolderCommand { get; } public RelayCommand ClearUiLogCommand { get; } public event PropertyChangedEventHandler? PropertyChanged; private void ExecuteRefreshScroll() => ScrollPulse++; private void ExecuteOpenLogsFolder() { Directory.CreateDirectory(_logging.LogsDirectory); Process.Start(new ProcessStartInfo { FileName = "explorer.exe", Arguments = _logging.LogsDirectory, UseShellExecute = true }); _logging.Info("открыта папка логов", "ui.log"); } private void ExecuteClearUiLog() { _logging.ClearUi(); _logging.Info("UI-лог очищен", "ui.log"); } public void RaiseClearCommandState() => ClearUiLogCommand.RaiseCanExecuteChanged(); private void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }