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));
}